C语言程序设计实验报告3.docx
- 文档编号:11462268
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:21
- 大小:910.12KB
C语言程序设计实验报告3.docx
《C语言程序设计实验报告3.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实验报告3.docx(21页珍藏版)》请在冰豆网上搜索。
C语言程序设计实验报告3
实验3函数与程序结构实验
3.1实验目的
(1)熟悉和掌握函数的定义、声明;函数调用与参数传递方法;以及函数返回值类型的定义和返回值使用。
(2)熟悉和掌握不同存储类型变量的使用。
(3)熟悉多文件编译技术。
3.2实验内容及要求
3.2.1源程序改错
下面是计算s=1!
+2!
+3!
+…+n!
的源程序,在这个源程序中存在若干语法和逻辑错误。
要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。
1#include
2intmain(void)
3{
4intk;
5for(k=1;k<6;k++)
6printf("k=%d\tthesumis%ld\n",k,sum_fac(k));
7}
8return0;
9longsum_fac(intn)
10{
11longs=0;
12inti;
13longfac;
14for(i=1;i<=n;i++)
15fac*=i;
16s+=fac;
17returns;
18}
解答:
(1)错误修改
1)未声明函数sum_fac(intn)的情况下,就调用函数。
2)第8行中,return0;语句应放在主函数中。
3)第15,16行,应该被括号括起来,否则程序意义不是计算阶乘的和。
(2)修改错误后的程序为
#include
longsum_fac(intn);
intmain(void)
{
intk;
longsum_fac(intn);
for(k=1;k<6;k++)
printf("k=%d\tthesumis%ld\n",k,sum_fac(k));
return0;
}
longsum_fac(intn)
{
longs=0;
inti;
longfac=1;
for(i=1;i<=n;i++)
{
fac*=i;
s+=fac;
}
returns;
}
(3)运行结果
图13.2.1程序运行截图
3.2.2源程序修改替换
(1)修改第1题中sum_fac函数,使其计算量最小。
解答:
1)将long设为静态局部变量,当退出函数时,long的值被保存在内存中,再次调用函数时,不用再对long初始化,静态局部变量的值具有记忆性。
替换后的程序如下所示:
#include
longsum_fac(intn);
intmain(void)
{
intk;
for(k=1;k<6;k++)
printf("k=%d\tthesumis%ld\n",k,sum_fac(k));
return0;
}
longsum_fac(intn)
{
staticlongs=0;
inti;
longfac=1;
for(i=1;i<=n;i++)
fac*=i;
s+=fac;
returns;
}
2)运行截图及说明
图23.2.2
(1)程序运行截图
(2)修改第1题中sum_fac函数,计算
。
解答:
1)第1题计算的是阶乘的和,而现在需要计算阶乘的倒数的和。
只需将s+=fac替换为s+=1.0/fac即可。
替换后的程序如下所示:
#include
intmain(void)
{
intk;
doublesum_fac(intn);
for(k=1;k<6;k++)
printf("k=%d\tthesumis%lf\n",k,sum_fac(k));
return0;
}
doublesum_fac(intn)
{
doubles=0;
inti;
longfac=1;
for(i=1;i<=n;i++)
{
fac*=i;
s+=1.0/fac;
}
returns;
}
2)运行截图及说明
图33.2.2
(2)程序运行截图
3.2.3跟踪调试
计算fabonacci数列前n项和的程序如下:
其中,longsum=0,*p=∑声明p为长整型指针并用&sum取出sum的地址对p初始化。
*p表示引用p所指的变量(*p即sum)。
#include
intmain(void)
longfabonacci(intn);
{
inti,k;
longsum=0,*p=∑
scanf("%d",&k);
for(i=1;i<=k;i++){
sum+=fabonacci(i);
printf("i=%d\tthesumis%ld\n",i,*p);
}
return0;
}
longfabonacci(intn)
{
if(n==1||n==2)
return1;
else
returnfabonacci(n-1)+fabonacci(n-2);
}
单步执行程序,观察p,i,sum,n值。
(1)刚执行完scanf("%d",&k);语句,p,i值是多少?
p=(longint)0x28ff00i=60
(2)从fabonacci函数返回后光条停留在哪个语句上?
光条停留在语句printf("i=%d\tthesumis%ld\n",i,*p);
(3)进入fabonacci函数,watch窗口显示的是什么?
输入k=6时,i与sum的值的变化。
(4)当i=3,从调用fabonacci函数到返回,n值如何变化?
3.2.4程序设计
(1)编程让用户输入两个整数,计算两个数的最大公约数并且输出之(要求用递归函数实现求最大公约数)。
同时以单步方式执行该程序,观察递归过程。
解答:
1)解题思路
1.输入两个整数x,y。
2.判断x与y的大小,若x 3.如果x%y=0,输出y。 4.否则,yueshu(y,x%y)。 2)程序清单。 intmain() { intx,y; printf("请输入两个不为0的整数: "); scanf("%d%d",&x,&y); printf("这两个整数的最大公约数是%d",yueshu(x,y)); return0; } intyueshu(intx,inty) { intz; if(x z=x; x=y; y=z; } if(x%y==0) returny; else returnyueshu(y,x%y); } 3)测试。 测试用例 输入的两个整数 应输出的理论结果 用例1 2478 6 用例2 9828 14 图43.2.4 (1)用例1程序运行截图 图53.2.4 (1)用例2程序运行截图 (2)编程验证歌德巴赫猜想: 一个大于等于4的偶数都是两个素数之和。 解答: 1)解题思路 1.先输入一个大于等于4的偶数z,n的起始值为0。 2.将z分为相等两部分,x1为z/2+n,另一部分为z-x1。 3.先判断x1是不是质数,如果不是,则n+1,直到n=z/2。 4.如果x1是质数,再判断x2是不是质数。 5.如果是质数,输出x1,x2。 6.n+1,直到n=z/2。 回到第2步。 2)程序清单: #include intmain() { intx1,x2,z,n,i,k; printf("请输入一个大于等于4的偶数: "); scanf("%d",&z); for(n=0;n x1=z/2+n; for(i=2;i if(x1%i==0)break; } if(i==z/2){ x2=z-x1; for(k=2;k if(x2%k==0)break; } if(k==x2) printf("该偶数是质数%d和质数%d之和\n",x1,x2); } } } 3)测试。 测试用例 输入的偶数的值 应输出的理论结果 用例1 8 5,3 用例2 用例3 14 38 7,711,3 19,1931,3 用例4 44 31,1337,741,3 用例5 86 43,4367,1979,783,3 图63.2.4 (2)用例1程序运行截图 图73.2.4 (2)用例2程序运行截图 图83.2.4 (2)用例3程序运行截图 图93.2.4 (2)用例4程序运行截图 图103.2.4 (2)用例5程序运行截图 (3)编写一个程序证明对于在符号常量BEGIN和END之间的偶数这一猜测成立。 例如,如果BEGIN为10,END为20,程序的输出应为: GOLDBACH'SCONJECTURE: Everyevennumbern>=4isthesumoftwoprimes. 10=3+7 12=5+7 …… 20=3+17 解答: 1)解题思路: 1.输入符号常量BEGIN和END。 2.定义偶数z为BEGIN+j,j的初始值为0。 3.判断j是否小于END-BEGIN。 4.若小于END-BEGIN,将z分为相等两部分,x1为z/2+n,另一部分为z-x1,n的初始值为0。 5.先判断x1是不是质数,如果不是,则n+1,直到n=z/2。 6.如果x1是质数,再判断x2是不是质数。 7.如果是质数,输出x1,x2。 8.j=j+2,回到第3步。 2)程序清单: #include intmain() { intx1,x2,z,n,i,k,j; intBEGIN,END; scanf("%d%d",&BEGIN,&END); printf("GOLDBACH'SCONJECTURE: \n"); printf("Everyevennumbern>=4isthesumoftwoprimes.\n"); for(z=BEGIN;z<=END;z=z+2){ for(n=1;n x1=z/2+n; for(i=2;i if(x1%i==0)break; } if(i==z/2){ x2=z-x1; for(k=2;k if(x2%k==0)break; } if(k==x2) printf("%d=%d+%d\n",z,x2,x1); } } } } 3)测试。 图113.2.4(3)用例1程序运行截图 图123.2.4(3)用例2程序运行截图 3.2.5选做题 假设一个C程序由file1.c、file2.c两个源文件和一个file.h头文件组成,file1.c、file2.c和file.h的内容分别如下,试编辑该多文件C程序,并编译和链接。 然后运行生成的可执行文件。 源文件file1.c的内容为: #include"file.h" intx,y;/*外部变量的定义性说明*/ charch;/*外部变量的定义性说明*/ intmain(void) { x=10; y=20; ch=getchar(); printf("infile1x=%d,y=%d,chis%c\n",x,y,ch); func1(); return0; } 源文件file2.c的内容为: #include"file.h" voidfunc1(void) { x++; y++; ch++; printf("infile2x=%d,y=%d,chis%c\n",x,y,ch); } 头文件file.h的内容为: #include externintx,y;/*外部变量的引用性说明*/ externcharch;/*外部变量的引用性说明*/ voidfunc1(void);/*func1函数原型*/ 解答: 1)程序清单: 源文件file1.c的内容为: #include"file.h" intx,y; charch; intmain(void) { x=10; y=20; ch=getchar(); printf("infile1x=%d,y=%d,chis%c\n",x,y,ch); func1(); return0; } 源文件file2.c的内容为: #include"file.h" voidfunc1(void) { x++; y++; ch++; printf("infile2x=%d,y=%d,chis%c\n",x,y,ch); } 头文件file.h的内容为: #include externintx,y; externcharch; voidfunc1(void); 2)运行结果: 图133.2.5程序运行截图 图143.2.5程序运行截图 3.3实验小结 在编写程序时,一定要十分小心,尤其在循环语句的编写中,要注意循环继续和终止的条件。 如果出现错误,要仔细的调试,一步一步的来,不能急躁。 在编写程序时,尽量使程序的计算量要小,这需要掌握好变量的种类运用。 通过这次实验,我对程序调试的熟练度大大增加,了解了多文件程序的编译与链接。 并且了解一些新的算法思想。 这使我的思维角度大大拓宽。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 实验 报告