C语言程序实验报告.docx
- 文档编号:26205335
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:16
- 大小:47.86KB
C语言程序实验报告.docx
《C语言程序实验报告.docx》由会员分享,可在线阅读,更多相关《C语言程序实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
C语言程序实验报告
学计算机与信息学院实验报告
实验函数
一、实验目的和要求
1•掌握定义函数的方法;
2•掌握函数实参和形参的对应关系,以及"值传递"的方式;
3•掌握函数的嵌套调用和递归调用的方法;
4•掌握全局变量和局部变量、动态变量、静态变量的概念和使用方法;
5.学习对多文件的程序的编译和运行.
二、实验内容和原理
编程序并上机调试运行之。
写一个判别素数的函数,在主函数输入一整数,输出是否素数的信息(本题是教材第8章习题8.2).
本题应当准备以下数据进行测试:
17、34、2、1、0.分别运行并检查
结果是否正确。
用一个函数来实现将一行字符串中最长的单词输出。
此行字符器具人主函数传
递给该函数(本题是教材第8章习题8.10).
把两个函数放在同一个程序文件中,作为一个文件进行编译和运行.
把两个分别放在两个程序文件中,伯为两面个文件进行编译、连接、运行.
用递归法将一个整数n转换成字符串.例如,输入483,应输出字符串"48
3".n的位数不确定,可以是任意的整数(本题是教材第8章习题8.17).
求两个整数的最大公约数和最小公倍数,用一个函数求最大公约数.用另一函数根据求出大公约数求最小公倍数(本题是教材第8章习题8.17).
1不用全局变量,分别用两个函数求最大公约数和最小公倍数.两个整数在主函数中输入,函数1,求出的最大公约数返回主函数,然后再与两个整数一起伯为
实参传递给函数2,以求出最小公倍数,返回到主函数输出最大公约数和最小公倍数.
2用全局变量的方法,分别用两个函数求最大公约数和最小公倍数,但其值不由函数带不回.将最大公约数和最小公倍数都设为全局变量,在主函数中输出它们的值.
1.写一函数,输入一个十六进制数,输出相应的十进制数(本题是教材第8章习
题8.16).
2.用seanf函数从键盘输入数组各元素的值,检查结果是否正确.题目并末指定二维数组的行数和列数中程序应能处理任意行数和列数的数组.因此,从理论上来说,应当准备许多种不同行数和列数的数组数组数据,但这样的工作量太大,一般来说不需要这样做,只需准备典型的数据即可.
如果已指定了数组的行数和列数,可以在程序中对数组元素赋初值,而不必用scanf函数.请读者个性程序以实现之.
三、实验环境
1.硬件环境:
每生一台品牌机
2.软件环境:
TurboC3.0
四、算法描述及实验步骤
(1)该程序的算法描述如下:
#include
voidmain()
{intn;
intsu(int);
printf("inputanumber:
\n");
scanf("%d",&n);
su(n);
if(su(n))
printf("%disaprime\n",n);
else
printf("%disnotaprime\n",n);
}intsu(intn)
{inti,flag=1;
for(i=1;i return(flag); } 输入: 34 预期输出: 34isnotaprime实际输出: 34isnotaprime 输入: 17 预期输出: 17isaprime实际输出: : 17isaprime 输入: 1 输入: 2 预期输出: 1isaprime 实际输出: : 1isaprime 输入: o 预期输出: oisaprime 实际输出: : oisaprime (2)编写程序,算法描述如下: #nelude #include voidmain() {voidIongest(char[]); chars[100]; printf("inputastring: \n");scanf("%s",&s); Iongest(s); } 预期输出: 2isaprime 实际输出: 2isaprime 输入: 38 预期输出: 38isnoaprime实际输出: 38isnotaprime voidIongest(chars[]) {inti=O,j=O,length=O,len=0,poit=0;for(i=0;i<=strlen(s);i++) {if(s[i]>='a'&&s[i]v='z'||s[i]>='A'&&s[i]<='Z')len++; else {if(length<=len) length=len; len=0; poit=i; } } printf("theIongestwordis: %s\n");for(j=i-length-1;j } 输入: Therearestudents 预期输出: students 实际输出: students (3)编写程序,其算法描述如下: #include voidmain() {voidchange(int); intn; printf("inputanumber: \n"); scanf("%d",&n); if(n<0) {putchar('-'); n=-n; change(n); } else change(n); } voidchange(intn) {inti; if((i=n/10)! =0) change(i); putchar(n%10+'0'); 输入: —3457预期输出: —3457实际输出: —3457 } 输入: 2632 预期输出: 2632 实际输出: 2632 (4)编写程序,其算法描述如下: A)不用全局变量: #include voidmain() {intm,n,b,l; intyue(int,int); intbei(int,int,int); printf("intput2number: \n"); scanf("%d,%d",&m,&n); b=yue(m,n); printf("zuidagongyueshu: %d\n",b); l=bei(m,n,b); printf("zuexiaogongbeishu: %d\n",l); } intyue(intm,intn){inti; while(i! =0) {i=m%n; m=n; n=i; } return(m); } intbei(intm,intn,intb) {return(m*n/b); } 输入: m=9,n=3 预期输出: zuidagongyueshu: 3zuixiaogongbeishu: 9 实际输出: zuidagongyueshu: 3zuixiaogongbeishu: 9 B)用全局变量: #include #defineYUE(m,n)while(i! =0){i=m%n;m=n;n=i;} #defineBEI(k,m)k/m voidmain() {intm,n,i,k; printf("intput2number: \n"); scanf("%d,%d",&m,&n); k=m*n; YUE(m,n); printf("zuidagongyueshu: %d\n",m); printf("zuexiaogongbeishu: %d\n",BEI(k,m)); } 输入: m=9,n=3 预期输出: zuidagongyueshu: 3 zuixiaogongbeishu: 9 实际输出: zuidagongyueshu: 3 zuixiaogongbeishu: 9 (5)编写程序,其算法描述如下: #include voidmain() {intchange(chars[]); inti=O,flag=1; charc[100]; printf("intputaHEXnumber: \n"); scanf("%s",&c); for(i=0;i<100&&flag==1&&c[i]! ='\0';i++) {if(c[i]<=9&&c[i]>='0'||c[i]>='a'&&c[i]v='f||c[i]>='A'&&c[i]<='F')continue; else flag=0; } if(flag==1) printf("thechangednumberis: %5d\n",change(c)) if(! flag) printf("inputerror! \n"); } intchange(chars[]) {inti,n=0; for(i=0;s[i]! ='\0';i++){if(s[i]>='0'&&s[i]<=9)n=n*16+s[i]-'0'; if(s[i]>='a'&&s[i]<='f)n=n*16+s[i]-'a'+10; if(s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10; return(n); } 输入: 10 预期输出: 16 实际输出: 16 输入: f11 预期输出: 2577 实际输出: 2577 预期输出: 实际输出: 输入: f 15 15 五、编译和调试过程 1.编译过程 在步骤 (1)中修改前的程序如附录 (一)所示。 运行后提示第3行发生错误。 经修改后发现,是对Iongest函数声明的语法是错误的,所附录所示,将void Iongesr(char改为voidIongest(char[])即可。 程序运行后: 输入: x1=1.5 预期输出: Therootis: 2.00 实际输出: 0 分析: 检查程序发现编程序时方程输入错误。 经改正后,如步骤(3)所示。 运 行得正确结果。 2.调试过程 步骤 (2)中修改前的程序如附录 (二)所示,将第三行修正后运行, 输入: Theyarestudents 预期输出: students 实际输出: tudents 分析: 会出现这样的错误是因为第23行(即倒数第3行)中出错,由于此时poit=i所指的位置是students后面的一个字符‘\0'而不是s;输出的是s[i-poit]~s[i],所以输出tudents只要改为输出s[i—poit-1]~s[i-1]就可以了,即把第23行改为for(j=i—poit-1;j (2)的算描述。 步骤(4)A中修改前的程序如附录(三)所示, 输入: m=9,n=3 预期输出: zuidagongyueshu: 3 zuixiaogongbeishu: 9 实际输出: zuidagongyueshu: 0 Divideerror 分析: 修改过程中发现是求最大公约数中出错,如附录(三)中的在intyeu(intm,intn)函数中,return(n),返回值是n,由于n=i,而i=0,所以n=0,即所得到的最大公约数为0,实际上只要返回m值就得到最在公约数。 修改后的程序如步骤(4)A所示。 步骤(5) 输入: 10 预期输出: 中修改前的程序如附录(四)所示, 输入: f11输入: f 16预期输出: 2577预期输出: 15 实际输出: inputerror! 实际输出: inputerror! 实际输出: input error! 分析: 实际输出与预期输出不同,查找原因,发现是第8行发生了错误,必须把a<=9&&a>=0改为a<=9&&a>='0',这是因为在这里0和9都是字符所以都要给它们加双引号。 修改后再测试: 预期输出: 16预期输出: 2577预期输出: inputerror! 实际输出: 1实际输出: f实际输出: inputerror! 分析: 实际输出与预期输出还是不同,输出的结果只依据每次输入值的第一个 数,由此可知是输入时出错,于是把字符串的输入改为用seanf函数输入。 修改后 的程序如步骤(5),运行可得到正确结果 六、实验结果 输入: 0 预期输出: 输入: 38 0isaprime预期输出: 38isnoaprime 实际输出: : 0isaprime实际输出: 38isnotaprime 结果分析: 该程序要求输入一个数,并判断该数是否是素数,显然该程序已经达到 了实验要求。 步骤 (2) 输入: weloveourfamily. 预期输出: family 实际输出: family 结果分析: 程序要求输入一个字符串,输出其中最长的一个单词,由此可见,程序是正确的。 步骤(3) 输入: 2632输入: —3457 预期输出: 2632预期输出: —3457 实际输出: 2632实际输出: —3457 结果分析: 结果是正确的。 程序要求输入一个整型数据,然后以一个字符串输出,因此由以上的结果可知程序是正确的。 步骤(4) 输入: m=9,n=3 预期输出: zuidagongyueshu: 3zuixiaogongbeishu: 9 实际输出: zuidagongyueshu: 3zuixiaogongbeishu: 9 由此可见 结果分析: 结果是正确的。 求输入两个数的最小公约数的最大公倍数, 程序是正确的 步骤(5) 输入: 10 预期输出: 输入: f11输入: f 16预期输出: 2577预期输出: 15 实际输出: 16实际输出: 2577实际输出: 15 结果分析: 结果是正确的。 输入一个十六进制数,要求输出的其十进制的数值。 经验算可知程序是正确的 七、总结 这次实验掌握了定义函数的方法;还有函数实参和形参的对应关系,以及"值传递"的方式;学习了函数的嵌套调用和递归调用的方法;了解了全局变量和局部变量、动态变量、静态变量的概念和使用方法;学习对多文件的程序的编译和运行。 附录: (1)、步骤 (1) #include voidmain() {intn,flag; voidsu(intn) printf("inputanumber: \n"); scanf("%d",&n); su(n); if(! flag) printf("%disaprime\n",n); if(flag) printf("%disnotaprime\n",n); } voidsu(intn) {inti,flag=1; for(i=1;i flag=0; return(flag) } (2)、步骤 (2) #include #include voidmain() {voidIongest(char); chars[100]; printf("inputastring: \n"); scanf("%s",&s); Iongest(s); } voidIongest(chars[]) {inti=0,j=0,length=0,len=0,poit=0; for(i=0;i<=strlen(s);i++) {if(s[i]>='a'&&s[i]v='z'||s[i]>='A'&&s[i]<='Z')len++; else {if(length<=len) length=len; len=0; poit=i;} } printf("theIongestwordis: %s\n");for(j=i-length;jv=i;j++)printf("%c",s[j]); } (3)步骤(4) #include voidmain() {intm,n,b,l; intyue(int,int); intbei(int,int,int); printf("intput2number: \n"); scanf("%d,%d",&m,&n); b=yue(m,n); printf("zuidagongyueshu: %d\n",b); l=bei(m,n,b); printf("zuexiaogongbeishu: %d\n",l); } intyue(intm,intn) {inti; while(i! =0) {i=m%n; m=n; n=i; } return(n); } intbei(intm,intn,intb) {return(m*n/b); } (四八步骤(5) #include voidmain() {intchange(chars[]); inti=O,flag; charc,s[100]; printf("intputaHEXnumber: \n");while((c=getchar())! ='\0') {if(c<=9&&c>=0||c>='a'&&c<='z'||c>='A'&&c<='Z'){flag=1; s[i]=c; i++;} else flag=0; break;} if(flag) printf("thechangednumberis: \n%d",change(s));if(! flag) printf("inputerror! ");} intchange(chars[]) {inti,n=0; for(i=0;s[i]! ='\0';i++) {if(s[i]>='0'&&s[i]<=9) n=n*16+s[i]-'0'; if(s[i]>='a'&&s[i]<='z') n=n*16+s[i]-'a'+10; if(s[i]>='A'&&s[i]<='Z') n=n*16+s[i]-'A'+10;} return(n);}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 程序 实验 报告