C语言实验报告 函数.docx
《C语言实验报告 函数.docx》由会员分享,可在线阅读,更多相关《C语言实验报告 函数.docx(26页珍藏版)》请在冰豆网上搜索。
![C语言实验报告 函数.docx](https://file1.bdocx.com/fileroot1/2023-2/3/be334a49-df58-483d-ad0f-2a3dd0a7c623/be334a49-df58-483d-ad0f-2a3dd0a7c6231.gif)
C语言实验报告函数
实验名:
函数的定义及调用
一、实验目的
1、掌握C语言函数定义及调用的规则。
2、理解参数传递的过程。
二、实验内容
(一))题目1
1、题目内容描述
1、上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。
main()
{
int,y;
printf(“%d\n”,sum(x+y));
intsum(a,b)
{
inta,b;
return(a+b);
}
}
2、编写并调试一个求n!
(n为整数)的递归函数,希望能在程序运行过程中动态地显示递归函数被调用的轨迹。
三、分析讨论
1、针对以上实验内容写出相应的参数传递过程并分析结果。
2、讨论参数的传递的几种形式。
2、输入和输出信息描述及数据类型确定;
(1)、输入数据
序号
输入数据描述
数据类型
1
x,y
int
2
a,b
int
(2)输出数据
序号
输出数据描述
数据类型
1
x+y
int
3、程序源代码(填写程序调试正确后的代码)
#include
intmain()
{
intsum(inta,intb);//对被调用函数sum的声明
intx,y,z;
scanf("%d,%d",&x,&y);
z=sum(x,y);//调用sum函数,将其值赋给z
printf("%d\n",z);//输出函数结果z
return0;//返回值为0
}
intsum(inta,intb)//定义sum函数
{
return(a+b);//将a+b的值作为返回值返回到调用sum的位置
}
4、程序调试
错误序号
错误信息(列出出错语句以及出错提示)
是否解决
解决方法
1
Infunction'main':
|
int,y;
是
改为intx,y;
2
error:
stray'\241'inprogram|
error:
expectedexpressionbefore'%'token|
error:
stray'\'inprogram|
printf(“%d\n”,sum(x+y));
是
将整段改为
intsum(inta,intb);
intx,y,z;
z=sum(x,y);
printf("%d\n",z);
3
error:
'a'redeclaredasdifferentkindofsymbol|
error:
'b'redeclaredasdifferentkindofsymbol|
inta,b;
是
去掉整句话
4
warning:
'x'isuseduninitializedinthisfunction[-Wuninitialized]|
是
加上scanf("%d,%d",&x,&y);
5
error:
staticdeclarationof'sum'followsnon-staticdeclaration|
是
将int及后面的语句块都移到main外面
5、测试与结果分析
(1)、测试数据与结果
测试序号
测试用例选取原因
测试输入数据
测试输出结果
是否正确
结果分析
1
测试用例
4,5
9
是
可运算范围内
2
测试用例
55555,7933
63488
是
可运算范围内
3
测试用例
-89,-79
-168
是
可运算范围内
(2)、相关问题回答
2、编写并调试一个求n!
(n为整数)的递归函数,希望能在程序运行过程中动态地显示递归函数被调用的轨迹。
1、输入和输出信息描述及数据类型确定;
(1)、输入数据
序号
输入数据描述
数据类型
1
n
int
2
result
long
(2)输出数据
序号
输出数据描述
数据类型
1
result
long
3、程序源代码(填写程序调试正确后的代码)
#include
longfact(longn);//对被调用的函数fact的声明
intmain()
{
intn;
longresult;//定义result为长型整数
printf("Inputn:
");
scanf("%d",&n);
result=fact(n);//调用fact函数
if(result==-1)
printf("n<0,dataerror!
\n");//fact函数返回值即result为-1时输出此句话
else
printf("%d!
=%ld\n",n,result);//fact函数返回值即result不为-1时输出此句
return0;//主函数返回值为0
}
longfact(longn)//定义fact函数函数值和n都为长整型
{
if(n<0)
return-1;//若n为负则返回值为-1
elseif(n==0||n==1)
return1;//若n为0或1则返回值为1
else
{
printf("fact(%ld)=%ld*fact(%ld)\n",n,n,n-1);//输出函数被调用的n的变化
return(n*fact(n-1));//否则返回n!
的值
}
}
3、程序调试
错误序号
错误信息(列出出错语句以及出错提示)
是否解决
解决方法
1
warning:
controlreachesendofnon-voidfunction[-Wreturn-type]|
printf("n<0,dataerror!
\n");
是
改为return-1;
此处是要有返回值的
5、测试与结果分析
(1)、测试数据与结果
测试序号
测试用例选取原因
测试输入数据
测试输出结果
是否正确
结果分析
1
测试用例
4
是
可运算范围内,程序无误
2
测试用例
10
是
可运算范围内
3
测试用例
7
是
可运算范围内
(二))题目2
1、题目内容描述
从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别统计下列内容:
(1)统计不及格人数并打印不及格学生名单;
(2)统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单;
(3)统计各分数段的学生人数及所占的百分比;
2、输入和输出信息描述及数据类型确定;
(1)、输入数据
序号
输入数据描述
数据类型
1
n
Int
2
num[30]
int
3
score[30
float
4
name[30]
char
(2)输出数据
序号
输出数据描述
数据类型
1
count
int
2
(float)stu[j]/(float)n*100)
float
4、函数解释
(1)函数Getfail函数功能:
统计不及格人数并打印不及格学生的名单
函数参数:
整数型数组num,储存学生学号;实型数组score,储存学生成绩;字符型变量name,学生名字;整型变量n,学生总数
函数返回值:
不及格人数
(2)函数GetAver函数功能:
计算全班平均分
函数参数:
实型数组score,储存学生成绩;整型变量n,学生总数
函数返回值:
平均分
(3)函数GetAboveAver函数功能:
统计分数在全班平均分以上的学生人数并打印学生名单
函数参数:
整数型数组num,储存学生学号;实型数组score,储存学生成绩;整型变量n,学生总数
函数返回值:
分数在全班平均分以上的学生人数
(4)函数GetPerct函数功能:
统计各分数段的学生人数及所占百分比
函数参数:
实型数组score,储存学生成绩;整型变量n,学生总数
函数返回值:
无
6、程序源代码(填写程序调试正确后的代码)
#include
intGetFail(intnum[],floatscore[],charname[],intn);//对被调用函数Getfial的声明
floatGetAver(floatscore[],intn);//对被调用函数Getaver的声明
intGetAboveAver(intnum[],floatscore[],charname[],intn);//对被调用函数Getaboveaver的声明
voidGetPerct(floatscore[],intn);//对被调用函数Getperct的声明
intmain()
{
inti,n,fail,AboveAver;
intnum[30];
floatscore[30],aver;
charname[30];
printf("请输入学生人数:
");
scanf("%d",&n);
printf("请按如下格式输入\n");
printf("学号名字成绩\n");
for(i=0;iscanf("%d%c%f",&num[i],&name[i],&score[i]);//输入学号名字成绩的格式
fail=GetFail(num,score,name,n);//调用Getfial函数并将其赋值给fial
printf("不及格人数为:
%d\n",fail);
aver=GetAver(score,n);//调用Getaver函数并将其赋值给aver
printf("平均分为%f\n",aver);
AboveAver=GetAboveAver(num,score,name,n);//调用Getabovaver函数并将其赋值给aboveaver
printf("在平均分之上的人数为:
%d\n",AboveAver);
printf("分数段学生人数百分比(百分之)\n");
GetPerct(score,n);//调用Getperct函数
return0;//返回值为0
}
intGetFail(intnum[],floatscore[],charname[],intn)//定义函数
{
inti,count;
count=0;
printf("不及格的人为:
\n");
for(i=0;i{
if(score[i]<60)//打印不及格的人
{
printf("%d%c%f\n",num[i],name[i],score[i]);
count++;//统计不及格的人数
}
}
if(count==0)
printf("无\n");//若没有不及格的人则输出无
returncount;//将count的值作为返回值返回到调用位置
}
floatGetAver(floatscore[],intn)//定义函数
{
inti;
floatsum;
sum=0;
for(i=0;i{
sum=sum+score[i];//计算总分
}
returnsum/n;//将平均分作为返回值返回到调用位置
}
intGetAboveAver(intnum[],floatscore[],charname[],intn)//定义函数
{
inti,count;
floataver;
count=0;
aver=GetAver(score,n);//调用GetAver函数
printf("平均分在班平均分以上:
\n");
for(i=0;i{
if(score[i]>=aver)//打印分数高于平均分的人
{
printf("%d%c%f\n",num[i],name[i],score[i]);
count++;
}
}
returncount;//将人数count作为返回值返回到调用位置
}
voidGetPerct(floatscore[],intn)//定义函数
{
inti,j,k;
intstu[6]={0};
for(i=0;i{
if(score[i]<60)k=0;
elsek=((int)score[i]-50)/10;
switch(k)
{
case0:
stu[0]++;break;//统计k=0即不及格的人数
case1:
stu[1]++;break;//统计k=1即分数在60-69的人数
case2:
stu[2]++;break;//......
case3:
stu[3]++;break;//......
case4:
stu[4]++;break;//......
case5:
stu[5]++;break;//......
}
}
for(j=0;j<6;j++)
{
if(j==0)
printf("<60%d%f\n",stu[j],(float)stu[j]/(float)n*100);//不及格的人
elseif(j==5)
printf("100%d%f\n",stu[j],(float)stu[j]/(float)n*100);//100分的人
else
printf("%d~%d%d%f\n",(j+5)*10,(j+5)*10+9,stu[j],(float)stu[j]/(float)n*100);
//60-99之间的人,利用数组stu[j]输出不同等级分类
}
}
7、程序调试
错误序号
错误信息(列出出错语句以及出错提示)
是否解决
解决方法
1
error:
expectedidentifieror'('before','token|
intn,,fail,AboveAver,count;
是
去掉两个逗号的一个
2
error:
expected';'before'Perct'|
printf("分数段学生人数百分比")
是
改为printf("分数段学生人数百分比\n");
3
error:
voidvaluenotignoredasitoughttobe|
warning:
variable'perct'setbutnotused[-Wunused-but-set-variable]|
perct=GetPerct(score,n);
是
去掉perct=
4
warning:
format'%c'expectsargumentoftype'int',butargument3hastype'char*'[-Wformat=]|
printf("%d%c%f\n",num[i],name,score[i]);
是
Name后面加上【i】
5
warning:
toomanyargumentsforformat[-Wformat-extra-args]|
printf("学号姓名成绩\n",num[i],name[i],score[i]);
是
改为printf("%d%c%f\n",num[i],name[i],score[i]);
6
intstu[6];
是
初始化
7
warning:
toomanyargumentsforformat[-Wformat-extra-args]|
printf("平均分在班平均分以上:
\n",count);
是
改为printf("平均分在班平均分以上:
%d\n",count);
8、测试与结果分析
(1)、测试数据与结果
测试序号
测试用例选取原因
测试输入数据
测试输出结果
是否正确
结果分析
1
测试用例
如下图
是
程序无误
2
测试用例
如下图
是
程序无误
(三))题目3
1、题目内容描述
某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。
考试后要求:
(1)计算每个学生的总分和平均分;
(2)按总分成绩由高到低排出成绩的名次;
(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
2、输入和输出信息描述及数据类型确定;
(1)、输入数据
序号
输入数据描述
数据类型
1
num[STU],score[STU][COURSE]
Int
(2)输出数据
序号
输出数据描述
数据类型
1
num[STU],score[STU][COURSE],sum[STU]
int
2
aver[STU]
float
3、函数解释
Getsumaver:
函数功能:
计算每个学生的总分和平均分
函数参数:
整型数组score,存放学生成绩
整型变量n,存放学生人数
整型数组sum,存放每个学生的总分
实型数组aver,存放每个学生的平均分
函数返回值:
无
Sort:
函数功能:
排名次
函数参数:
整型数组num,存放学生学号
整型数组score,存放学生成绩
整型变量n,存放学生人数
整型数组sum,存放每个学生的总分
实型数组aver,存放每个学生的平均分
函数返回值:
无
Print:
函数功能:
输出成绩表
函数参数:
:
整型数组num,存放学生学号
整型数组score,存放学生成绩
整型变量n,存放学生人数
整型数组sum,存放每个学生的总分
实型数组aver,存放每个学生的平均分
函数返回值:
无
Search:
函数功能:
名次查询
函数参数:
:
整型数组num,存放学生学号
整型变量n,存放学生人数
长整型变量x,存放名次
函数返回值:
无
6、程序源代码(填写程序调试正确后的代码)
#include
#defineSTU30
#defineCOURSE3
voidGetsumaver(intscore[][COURSE],intn,intsum[],floataver[]);
voidSort(intnum[],intscore[][COURSE],intn,intsum[],floataver[]);
voidPrint(intnum[],intscore[][COURSE],intn,intsum[],floataver[]);
intSearch(intnum[],intn,intx);//函数声明
intmain()
{
intn,pos,x,i,j;
intnum[STU],score[STU][COURSE],sum[STU];
floataver[STU];//定义变量
printf("请输入学生人数:
\n");
scanf("%d",&n);
printf("请输入学生的学号和成绩\n");
printf("学号数学英语物理\n");//输出成绩表表头
for(i=0;i{
scanf("%d",&num[i]);
for(j=0;jscanf("%d",&score[i][j]);//输入学生的成绩
}
Getsumaver(score,n,sum,aver);//调用函数,计算总分和平均分
printf("总分和平均分:
\n");
Print(num,score,n,sum,aver);//调用函数
Sort(num,score,n,sum,aver);//调用函数,排名次
printf("名次表:
\n");
Print(num,score,n,sum,aver);//调用函数
printf("请输入待查找的学生的学号:
");
scanf("%d",&x);
pos=Search(num,n,x);//调用函数,名次查询
if(pos!
=-1)//返回值为-1时输出成绩表
{
printf("名次\t学号\t数学\t英语\t物理\t总分\t平均分\n");
printf("%d\t%d\t%4d\t%4d\t%3d\t%3d\t%3f\n",pos+1,num[pos],score[pos][0],score[pos][1],score[pos][2],sum[pos],aver[pos]);
}
else
printf("未找到!
\n");//否则找不到
return0;
}
voidGetsumaver(intscore[][COURSE],intn,intsum[],floataver[])//定义函数
{
inti,j;
for(i=0;i{
sum[i]=0;
for(j=0;jsum[i]=sum[i]+score[i][j];//求每行即每人的总分
aver[i]=(float)sum[i]/COURSE;//求平均分
}
}
voidSort(intnum[],intscore[][COURSE],intn,intsum[],floataver[])//定义函数
{
inti,j,k,m,t1,t2;
floatt3;
for(i=0;i{
k=i;
for(j=i+1;jif(sum[j]>sum[k])k=j;
if(k!
=i)
{
t1=sum[k];
sum[k]=sum[i];
sum[i]=t1;
t2=num[k];
num[k]=num[i];
num[i]=t2;
t3=aver[k];
aver[k]=aver[i];
aver[i]=t3;
for(m=0;m{
t1=score[k][m];
score[k][m]=score[i][m];
score[i][m]=t1;
}
}
}
}
voidPrint(intnum[],intscore[][COURSE],intn,intsum[],floataver[])//定义函数
{
inti,j;
printf("分数:
\t学号\t数学\t英语\t物理\t总分\t平均分\n");
for(i=0;i{
pri