实验名:函数的定义及调用
一、实验目的
1、掌握C语言函数定义及调用的规则。
2、理解参数传递的过程。
二、实验内容
(一))题目1
1、题目内容描述
1、上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。
main()
{
int,y;
printf(“%d\n”,sum(x+y));
int sum(a,b)
{
int a,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 <stdio.h>
int main()
{
int sum(int a,int b);          //对被调用函数sum 的声明
int x,y,z;
scanf("%d,%d",&x,&y);
z=sum(x,y);              //调用sum 函数,将其值赋给z
printf("%d\n",z);        //输出函数结果z
return 0;//返回值为0
}
int sum(int a,int b)        //定义sum函数
{
return(a+b);            //将a+b的值作为返回值返回到调用sum的位置}
4、程序调试
错误序号错误信息(列出出错语句以及出错
提示)
是否
解决
解决方法
1 In function 'main':|
int,y;
是改为int x,y;
2 error: stray '\241' in program|
error: expected expression
before '%' token|
error: stray '\' in program|
printf(“%d\n”,sum(x+y));是将整段改为
int sum(int a , int b);
int x,y,z;
z=sum(x,y);
printf("%d\n",z);
3 error: 'a' redeclared as
different kind of symbol|
error: 'b' redeclared as
different kind of symbol|
int a,b;
是去掉整句话
4 warning: 'x' is used
uninitialized in this function
[-Wuninitialized]|
scanf输入整型数组是加上scanf("%d,%d",&x,&y);
5 error: static declaration of
'sum' follows non-static
declaration|
是将int及后面的语句块都移到main外面
5、测试与结果分析
(1)
、测试数据与结果
测试序号测试用例选取原
测试输入数
测试输出结果是否
正确
结果分析
1 测试用例4,5 9 是可运算范围内
2 测试用例55555,793
3 63488 是可运算范围内
3 测试用例-89,-79 -168 是可运算范围内
(2)
、相关问题回答
2、编写并调试一个求n!(n为整数)的递归函数,希望能在程序运行过程中动态地显示递归函数被调用的轨迹。
1、输入和输出信息描述及数据类型确定;
(1)
、输入数据
序号输入数据描述数据类型
1 n int
2 result long
(2)输出数据
序号输出数据描述数据类型
1 result long
3、程序源代码(填写程序调试正确后的代码)
#include <stdio.h>
long fact (long n);                    //对被调用的函数fact的声明
int main()
{
int n;
long result;                        //定义result为长型整数
printf("Input n:");
scanf("%d",&n);
result=fact(n);                      //调用fact函数
if (result==-1)
printf("n<0,data error!\n");    //fact函数返回值即result为-1时输出此句话    else
printf("%d!=%ld\n",n,result);    //fact函数返回值即result不为-1时输出此句
return 0;                            //主函数返回值为0
}
long fact(long n)                        //定义fact函数函数值和n都为长整型
{
if (n<0)
return -1;                      //若n为负则返回值为-1
else if (n==0 || n==1)
return 1;                      //若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: control reaches end of
non-void function
[-Wreturn-type]|
printf("n<0,data error!\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[30float
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<stdio.h>
int GetFail(int num[],float score[],char name[],int n);  //对被调用函数Getfial的声明
float GetAver(float score[],int n);                      //对被调用函数Getaver的声明
int GetAboveAver(int num[],float score[],char name[],int n);//对被调用函数Getaboveaver的声明void GetPerct(float score[],int n);                      //对被调用函数Getperct的声明
int main()
{
int i,n,fail,AboveAver;
int num[30];
float score[30],aver;
char name[30];
printf("请输入学生人数:");
scanf("%d",&n);
printf("请按如下格式输入\n");
printf("学号名字成绩\n");
for(i=0;i<n;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函数
return 0;                                      //返回值为0
}
int GetFail(int num[],float score[],char name[],int n)  //定义函数
{
int i,count;
count=0;
printf("不及格的人为:\n");
for(i=0;i<n;i++)
{
if(score[i]<60)                          //打印不及格的人
{
printf("%d %c %f\n",num[i],name[i],score[i]);
count++;                              //统计不及格的人数
}
}
if(count==0)
printf("无\n");                            //若没有不及格的人则输出无

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。