C语言实验报告 函数.docx

上传人:b****8 文档编号:9484581 上传时间:2023-02-04 格式:DOCX 页数:26 大小:105.62KB
下载 相关 举报
C语言实验报告 函数.docx_第1页
第1页 / 共26页
C语言实验报告 函数.docx_第2页
第2页 / 共26页
C语言实验报告 函数.docx_第3页
第3页 / 共26页
C语言实验报告 函数.docx_第4页
第4页 / 共26页
C语言实验报告 函数.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

C语言实验报告 函数.docx

《C语言实验报告 函数.docx》由会员分享,可在线阅读,更多相关《C语言实验报告 函数.docx(26页珍藏版)》请在冰豆网上搜索。

C语言实验报告 函数.docx

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;i

scanf("%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;j

scanf("%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;j

sum[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;j

if(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1