函数1.docx
《函数1.docx》由会员分享,可在线阅读,更多相关《函数1.docx(11页珍藏版)》请在冰豆网上搜索。
函数1
运城学院公共计算机教学部
实验报告
(2011/2012学年第一学期)
课程名称
C语言程序设计
实验名称
实验八函数
(1)
实验类型
验证性/设计性/综合性
课内实验学时
2
课外实验学时
1
实验时间
2011-11-1
一、实验目的和要求
1、熟练掌握应用if语句和switch语句构成的多分支选择结构程序设计。
2、两两交互算法及打擂算法程序设计。
二、实验环境(实验设备)
硬件:
微型计算机
软件:
MicrosoftVisualC++6.0
三、实验过程
训练目标1:
(30分钟)
1、阅读并运行有返回值函数的程序,分析程序的执行过程。
2、分析常量或简单变量作实参时,函数间数据通过值传递的调用方式。
3、理解标准库函数的功能并学会使用库函数。
实验题目1:
(15分钟)
C语言提供了许多标准库函数提供给用户使用。
阅读并运行下面程序,指出该程序相当于哪个库函数的功能。
#include"stdio.h"/*调用头文件的命令行*/
intsign(intn)
{if(n>0)return1;
elseif(n<0)return-1;
elsereturn0;
}
voidmain()
{intx;
printf("enterx:
");
scanf("%d",&x);
printf("%d:
%d\n",x,sign(x));
}
题目1运行结果截图:
(本程序保存为8-1.c):
问题1:
sign函数的功能是什么?
问题2:
可以使用条件表达式来实现sign函数的功能,函数定义如何表示?
解答:
问题一
输入正数,返回值为1;输入负数,返回值为-1;输入0,返回值为0
问题二
#include
intsign(intn)
{
}
voidmain()
{intx,n;
printf("enterx");
scanf("%d",&x);
if(x>0)n=1;
elseif(x<0)n=-1;
elsen=0;
printf("%d:
%d\n",x,n);
}
实验题目2:
(15分钟)
运行下面程序,输入一个整数,根据输入数据和输出数据分析程序的功能。
#include
#include
longfun(longnum)/*函数的定义*/
{
longk=1;
num=fabs(num);
do{
k*=num%10;
num/=10;
}while(num);
return(k);
}
voidmain()
{longn;
printf("\nPleaseenteranumber:
");
scanf("%ld",&n);
printf("\nTheproductofitsdigitsis%ld.",fun(n));/*函数调用*/
}
题
目2运行结果截图:
(本程序保存为8-2.c):
问题1:
程序的功能是什么?
问题2:
如果把语句k*=num%10;改为k+=num%10;那么程序的功能是什么?
解答:
问题一将一个多位数每个数位上的数相乘的积。
问题二将一个多位数每个数位上的数相加的和。
训练目标2:
(50分钟)
4、编写递推算法函数解决问题,利用通用函数实现此类问题的求解。
5、编写枚举算法函数解决问题,利用通用函数实现此类问题的求解。
6、编写求极值算法的通用函数,利用通用函数实现求极值。
7、编写求累加和算法的通用函数,利用通用函数实现求累加和。
8、编写求平均值算法的通用函数,利用通用函数实现求平均值。
实验题目3:
(15分钟)
下面函数pi的功能是:
根据以下公式,返回满足精度(小于等于0.0005)要求的π值,请将程序补充完整,使程序具有指定的功能。
=1+
+
+
+
+……
#include
#include
doublepi(doubleeps)/*求π的值*/
{doublesum,t;
intn;
for(①;t>eps;n++)/*通过累加计算π/2的值*/
{sum+=t;
t=n*t/(2*n+1);/*求累加项t*/
}
return(②);/*返回π的值*/
}
voidmain()
{doublex;
printf("\nPleaseenteraprecision:
");/*提示输入精度*/
scanf("%lf",&x);
printf("\neps=%lf,pi=%lf",x,pi(x));
}
题目3源程序代码和运行结果截图:
(本程序保存为5-3.c):
#include
#include
doublepi(doubleeps)/*求π的值*/
{doublesum,t;
intn;
for(sum=0,n=1,t=1;t>eps;n++)/*通过累加计算π/2的值*/
{sum+=t;
t=n*t/(2*n+1);/*求累加项t*/
}
return(2*sum);/*返回π的值*/
}
voidmain()
{doublex;
printf("\nPleaseenteraprecision:
");/*提示输入精度*/
scanf("%lf",&x);
printf("\neps=%lf,pi=%lf",x,pi(x));
}
实验题目4:
(20分钟)
编写一个函数判断一个整数是否为素数,调用该函数输出1000以内所有的素数。
题目4源程序代码和运行结果截图:
(本程序保存为8-4c):
#include
#include
intprime(intx)
{
inti;
printf("请输入一个大于1的正整数:
\n");
scanf("%d",&x);
for(i=2;i<=sqrt(x);i++)
if(x%i==0)break;
if(i>sqrt(x))printf("%d是素数。
\n",x);
elseprintf("%d不是素数。
\n",x);
}
voidmain()
{
intx,i,n,f;
prime(x);
printf("1000以内的素数为:
\n");
for(n=2;n<1000;n++)
{
f=1;
for(i=2;i<=sqrt(n)&&f;i++)
if(n%i==0)f=0;
if(f)
printf("%5d",n);
}
}
问题1:
程序中判断某数是否为素数时,用的是标记变量法还是循环变量终止法?
问题2:
采用另一种方法如何实现?
解答:
问题一
标记变量法
问题二#include
#include
voidsushu()
{
intk,n,i=0;
for(n=2;n<1000;n++)
{
for(k=2;k<=sqrt(n);k++)
if(n%k==0)break;
if(n%k!
=0){i++;printf("%5d",n);}
}
printf("\n\n1000之内有%d个素数\n",i);
}
voidmain()
{
sushu();
}
实验题目5:
(15分钟)
在统计学生的学习成绩时,我们经常需要统计某课程的最高分、最低分、平均值,各分数段的百分比,及格率等数据。
编写一个函数实现求若干个学生成绩的最高分、最低分、平均值的功能。
在main函数中调用该函数,实现统计功能。
(课外完成,要求学生实验课后两天内上交)
题目5源程序代码和运行结果截图:
(本程序保存为8-5.c):
#include
floatmax,min,ave;
floatmark()
{intx,i=2;
floatsum=0,score;
printf("请输入学生人数:
\n");
scanf("%d",&x);
printf("请输入第1个学生成绩:
\n");
scanf("%f",&score);
max=score;
min=score;
while(i<=x)
{printf("请输入第%d个学生成绩:
\n",i);
scanf("%f",&score);
if(score>max)max=score;
if(scoresum=sum+score;
i=i+1;
}
ave=sum/x;
printf("这%d个学生的最大值为:
%f\n",x,max);
printf("这%d个学生的最小值为:
%f\n",x,min);
printf("这%d个学生的平均值为:
%f\n",x,ave);
}
intmain(void)
{
mark();
}
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
应该多灵活运用各种方法对一种编程的多解,多理解各变量的含义,
批阅人
李妮
日期
2011.11.7