1、8 return 0;9 long sum_fac(int n)10 11 long s=0;12 int i;13 long fac;14 for(i=1;i=n;i+)15 fac*=i;16 s+=fac;17 return s;18解答:(1)错误修改1)未声明函数sum_fac(int n)的情况下,就调用函数。2)第8行中,return 0;语句应放在主函数中。3)第15,16行,应该被括号括起来,否则程序意义不是计算阶乘的和。 (2)修改错误后的程序为 #includelong sum_fac(int n);int main(void) int k; long sum_fac(i
2、nt n); for(k=1; printf( return 0;long sum_fac(int n) long s=0; int i; long fac=1; for(i=1; fac*=i; s+=fac; return s;(3)运行结果 图1 3.2.1程序运行截图3.2.2源程序修改替换(1)修改第1题中sum_fac函数,使其计算量最小。1)将long设为静态局部变量,当退出函数时,long的值被保存在内存中,再次调用函数时,不用再对long初始化,静态局部变量的值具有记忆性。替换后的程序如下所示:#include int k; static long s=0;2)运行截图及说明
3、 图2 3.2.2(1)程序运行截图(2)修改第1题中sum_fac函数,计算。1)第1题计算的是阶乘的和,而现在需要计算阶乘的倒数的和。只需将s+=fac替换为s+=1.0/fac即可。 double sum_fac(int n);k=%dtthe sum is %lfn double sum_fac(int n) double s=0; s+=1.0/fac;图3 3.2.2(2)程序运行截图3.2.3跟踪调试计算fabonacci数列前n项和的程序如下:其中,long sum=0,*p=∑声明p为长整型指针并用&sum取出sum的地址对p初始化。*p表示引用p所指的变量(*p即s
4、um)。;long fabonacci(int n); int i,k; long sum=0,*p=& scanf(%d,&k);=k;i+) sum+=fabonacci(i);i=%dtthe sum is %ldn,i,*p);return0;long fabonacci(int n) if(n=1 | n=2) return 1; else return fabonacci(n-1)+fabonacci(n-2);单步执行程序,观察p,i,sum,n值。(1)刚执行完scanf(语句,p,i值是多少?p=(long int)0x28ff00 i=60(2)从fabonacci函数返回
5、后光条停留在哪个语句上? 光条停留在语句printf(3)进入fabonacci函数,watch窗口显示的是什么? 输入k=6时,i与sum的值的变化。(4)当i=3,从调用fabonacci函数到返回,n值如何变化?3.2.4程序设计(1)编程让用户输入两个整数,计算两个数的最大公约数并且输出之(要求用递归函数实现求最大公约数)。同时以单步方式执行该程序,观察递归过程。1)解题思路1.输入两个整数x,y。2.判断x与y的大小,若xy,将x与y对换。3.如果x%y=0,输出y。4.否则,yueshu(y,x%y)。2)程序清单。int main() int x,y;请输入两个不为0的整数:);
6、%d%dx,&y);这两个整数的最大公约数是%d,yueshu(x,y);int yueshu(int x,int y) int z; if(xy) z=x; x=y; y=z; if(x%y=0) return y; return yueshu(y,x%y);3)测试。测试用例输入的两个整数 应输出的理论结果用例1 24 78 6用例2 98 28 14 图4 3.2.4(1)用例1程序运行截图 图5 3.2.4(1)用例2程序运行截图(2)编程验证歌德巴赫猜想:一个大于等于4的偶数都是两个素数之和。1.先输入一个大于等于4的偶数z, n的起始值为0。2.将z分为相等两部分,x1为z/2+n
7、,另一部分为z-x1。3.先判断x1是不是质数,如果不是,则n+1,直到n=z/2。4.如果x1是质数,再判断x2是不是质数。5.如果是质数,输出x1,x2。6.n+1, 直到n=z/2。回到第2步。2)程序清单:#include int x1,x2,z,n,i,k;请输入一个大于等于4的偶数:z); for(n=0;n=4 is the sum of two primes.10=3+712=5+720=3+171)解题思路:1输入符号常量BEGIN和END。2定义偶数z为BEGIN+j,j的初始值为0。3判断j是否小于END-BEGIN。4若小于END-BEGIN,将z分为相等两部分,x1为
8、z/2+n,另一部分为z-x1,n的初始值为0。5先判断x1是不是质数,如果不是,则n+1,直到n=z/2。6如果x1是质数,再判断x2是不是质数。7如果是质数,输出x1,x2。8j=j+2,回到第3步。 2)程序清单: int x1,x2,z,n,i,k,j; int BEGIN,END;BEGIN,&END);n=4 is the sum of two primes.n for(z=BEGIN;z=END;z=z+2) for(n=1; if(k=x2)%d=%d+%dn,z,x2,x1);图11 3.2.4(3)用例1程序运行截图 图12 3.2.4(3)用例2程序运行截图3.2.5选做
9、题假设一个C程序由file1.c、file2.c两个源文件和一个file.h头文件组成,file1.c、file2.c和file.h的内容分别如下,试编辑该多文件C程序,并编译和链接。然后运行生成的可执行文件。源文件file1.c的内容为:#include file.hint x,y; /* 外部变量的定义性说明 */char ch; x=10; y=20; ch=getchar();in file1 x=%d,y=%d,ch is %cn,x,y,ch);func1();return 0;源文件file2.c的内容为:void func1(void) x+; y+; ch+;in file2
10、 x=%d,y=%d,ch is %cn头文件file.h的内容为:extern int x,y; /* 外部变量的引用性说明 */extern char ch;void func1(void); /* func1函数原型 */1)程序清单:2)运行结果: 图13 3.2.5程序运行截图 图14 3.2.5程序运行截图3.3实验小结 在编写程序时,一定要十分小心,尤其在循环语句的编写中,要注意循环继续和终止的条件。如果出现错误,要仔细的调试,一步一步的来,不能急躁。在编写程序时,尽量使程序的计算量要小,这需要掌握好变量的种类运用。通过这次实验,我对程序调试的熟练度大大增加,了解了多文件程序的编译与链接。并且了解一些新的算法思想。这使我的思维角度大大拓宽。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1