C语言实验报告8.docx
《C语言实验报告8.docx》由会员分享,可在线阅读,更多相关《C语言实验报告8.docx(12页珍藏版)》请在冰豆网上搜索。
C语言实验报告8
洛阳理工学院实验报告
系部
计算机系
班级
B130503
学号
B13050326
姓名
课程名称
高级语言程序设计
实验日期
2014.4.28
实验名称
函数的应用
成绩
实验目的:
1.掌握定义和声明函数的方法。
2.掌握函数实参与形参的对应关系,以及“值传递”的方式。
3.掌握函数的嵌套调用和递归调用的方法。
4.掌握全局变量和局部变量的概念和用法。
实验条件:
电脑一台,VC++6.0
实验内容与步骤:
内容:
1.写一个判别素数的函数,在主函数输入一个正整数,输出是否为素数的信息。
本程序应准备以下测试数据:
17、34、2、1、0,分别输入数据,运行程序并检查结果是否正确。
程序提示:
(1)求素数函数:
intprime(intn)
{inti,flag;
/*i循环变量,flag标记n是否为素数,1是素数,0不是素数*/
ifn<2flag=0;/*小于2的数一定不是素数*/
elseifn==2||n==3flag=1;/*2或3是素数*/
else
{
for(i=2;i<=n/2;i++)
/*从2开始扫描,到n/2为止,若都不能整除n,则n是素数,否则不是素数*/
ifn能被i整除flag=0;break;
ifi>n/2flag=1;/*i一直不能整除n,此时n一定是素数*/
}
}
问:
函数prime的for循环中,“i<=n/2”的“=”能否去掉,去掉会出现什么问题?
break语句能否去掉,试分析。
(2)要求所编写的程序主函数的位置在其他函数之前,在主函数中对其所调用的函数作声明。
(3)保留判别素数的函数,修改主函数,要求实现输出100-200之间的素数。
2.编写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出。
程序提示:
(1)输入程序,编译和运行程序,分析结果。
(2)分析函数声明中参数的写法。
先后用以下两种形式:
函数声明中参数的写法与定义函数时的形式完全相同,如:
voidcpy(chars[],charc[]);
函数声明中参数的写法与定义函数时的形式完全相同,省略数组名。
如:
voidcpy(chars[],char[]);
分析编译和运行,分析结果。
(3)思考形参数组为什么可以不指定数组大小,如:
voidcpy(chars[80],char[])
如果随便指定数组大小行不行,如:
voidcpy(chars[40],char[40])
请分别上机试一下。
3.输入10个学生5门课的成绩,分别用函数实现下列功能:
计算每个学生平均分。
计算每门课的平均分。
③找出所有50个分数中最高的分数所对应的学生和课程。
4.写一个函数,输入一个4位数,要求输出这4位数字字符,但每两个数字间空一个空格。
5.编写一个函数,由实参传来一个字符串,统计此字符串字母、数字、空格和其他字符的个数,在主函数中输入一串字符串以及输出上述的结果。
步骤:
第1题步骤:
Step1:
输入一个正整数n,定义一个变量flag;
Step2:
进入子函数如果n等于1,给flag赋值为0;
Step3:
判断n可以整除除了1和n之外的数;如果可以则给flag赋值为0,否则赋值为1;将flag的值返回给主函数;
Step4:
如果flag=1,输出该数是素数,否则输出该数不是素数.
第2题步骤:
Step1:
定义两个数组a[80],b[40];
Step2:
输入一个字符串,赋给数组a;
Step3:
进入子函数,将数组a中的元音字母挑选出来复制给数组b;
Step4:
输出数组b.
第3题步骤:
Step1:
定义一个二维数组a[10][5],输入是个学生的成绩赋值给数组a;
Step2:
进入子函数floataver1(floata[][5])计算出每位学生的平均成绩,将值赋值给aver1并返回给主函数,输出平均成绩;
Step3:
进入子函数floataver2(floata[][5])计算出学生的每门科目的平均成绩,将值赋给aver2并返回给主函数,输出平均成绩;
Step4:
在子函数floatmax(floata[][5])中将最高分选出来,之后将其对应数组行和竖求出来输出,将最高分返回给主函数并输出。
第4题步骤:
Step1:
定义两个数组chara[10],charb[10],并输入一个四位数,将其赋值给数组a;
Step2:
进入子函数,将数组a里的值赋给数组b的偶数位与第0为,奇数位赋值为空格并将之返回给主函数;
Step3:
输出返回值.
第5题步骤:
Step1:
输入一个字符串;
Step2:
进入子函数,判断字符串中的字符的类型;
Step3:
输出各类字符串的字符串数.
运行结果:
第一题结果:
第二题结果:
第三题结果:
第四题结果:
第五题结果:
实验总结:
1.第二题中忘了c[j]='\0';使得输出的字符串后出现乱码。
2.第三题一开始定义i,j,x,y时没有将它们定义为全局变量,都是在主函数里和子函数里定义的,之后结果不对。
在考虑它们是主函数与子函数都使用的变量后,将其定义为全局变量,结果对了。
3.第三题的最后一问中在比较一位学生的每门成绩,if((a[i][j-1]>a[i][j]){x=i;y=j-1;a[i][j]=a[i][j-1];};else{x=i;y=j;}这种做法使得如果前面的数大,要换位,之后如果还是前面的数大则标记就会出错。
改为if(a[i][j-1]>a[i][j])a[i][j]=a[i][j-1];else{x=i;y=j;}结果对了。
4.第四题的j+=2;一开始输成了j++;这就使得结果错误,结果数字之间没有空格,因为数字间要有空格,所以在复制时应将数组a中的值赋值一个,空一个格。
附:
源程序:
第一题:
#include
intmain()
{
intprime(int);
intn,flag;
printf("输入一个正整数:
\n");
scanf("%d",&n);
if(flag==1)
printf("是素数\n");
else
printf("不是素数\n");
}
intprime(intn)
{
inti,flag;
if(n==1)flag=0;
else
for(i=2;i<=n/2;i++)
{
if(n%i==0)flag=0;
elseflag=1;
}
return(flag);
}
第二题:
#include
intmain()
{
voidcpy(char[],char[]);
chara[80];
charc[40];
printf("请输入一个字符串:
\n");
gets(a);
cpy(a,c);
printf("其中元音字母为:
%s\n",c);
}
voidcpy(chara[],charc[])
{
inti=0,j=0;
while(a[i]!
='\0')
{
if(a[i]=='a'||a[i]=='A'||a[i]=='e'||a[i]=='E'||
a[i]=='i'||a[i]=='I'||a[i]=='o'||a[i]=='O'||
a[i]=='u'||a[i]=='U')
{
c[j]=a[i];
j++;
}
i++;
}
c[j]='\0';
}
第三题:
#include
inti,j,x,y;
intmain()
{
floataver1(floata[][5]);
floataver2(floata[][5]);
floatmax(floata[][5]);
floata[10][5];
printf("请按照科目顺序输入学生成绩:
\n");
for(i=0;i<10;i++)
{
printf("第%d位学生成绩:
",i+1);
for(j=0;j<5;j++)
scanf("%f",&a[i][j]);
}
for(i=0;i<10;i++)
printf("第%d位学生的平均成绩为:
%6.2f\n",i+1,aver1(a));
for(j=0;j<5;j++)
printf("第%d门科目的平均成绩为:
%6.2f\n",j+1,aver2(a));
printf("最高分为:
%6.2f\n",max(a));
}
floataver1(floata[][5])
{
floataver1,sum=0;
for(j=0;j<5;j++)
sum=sum+a[i][j];
aver1=sum/5;
return(aver1);
}
floataver2(floata[][5])
{
floatsum=0,aver2;
for(i=0;i<10;i++)
sum=sum+a[i][j];
aver2=sum/10;
return(aver2);
}
floatmax(floata[][5])
{
floatmax,b[10];
intx,y,z=0;
for(i=0;i<10;i++)
{
x=i;y=0;
for(j=1;j<5;j++)
{
if(a[i][j-1]>a[i][j])a[i][j]=a[i][j-1];
elsex=i;y=j;
}
b[z]=a[x][y];
z++;
}
max=b[0];
for(z=1;z<10;z++)
{
if(b[z-1]>b[z])b[z]=b[z-1];
elsemax=b[z];
}
i=0;
for(j=0;j<5;j++)
{
if(max==a[i][j])break;
if(j==4){i++;j=0;}
if(i==10)break;
}
printf("第%d位学生的第%d门科目分数最高,",i+1,j+1);
return(max);
}
第四题:
#include
intmain()
{
voidkg(chara[10],charb[10]);
chara[10],b[10];
intj;
printf("请输入一个4位数:
");
gets(a);
kg(a,b);
b[8]='\0';
printf("%s\n",b);
return0;
}
voidkg(chara[10],charb[10])
{
inti,j,k;
i=0,j=0;
while(a[i]!
='\0')
{
for(k=0;k<8;k++)
if(k%2!
=0)b[k]='';
b[j]=a[i];
i++;
j+=2;
}
}第五题:
#include
intmain()
{
voidfun(chara[]);
chara[30];
printf("请输入字符串:
");
gets(a);
fun(a);
}
voidfun(chara[])
{
inti,b=0,c=0,d=0,e=0;
for(i=0;a[i]!
='\0';i++)
{
if((a[i]<='z'&&a[i]>='a')||(a[i]<='Z'&&a[i]>='A'))b++;
elseif(a[i]<='9'&&a[i]>='0')c++;
elseif(a[i]=='')d++;
elsee++;
}
printf("字母数为:
%d;\t数字数为:
%d;\t空格数为:
%d;\t其他符号数为:
%d\n",b,c,d,e);
}