《某科技大学计算机学院C语言和程序设计实验报告(含源代码).pdf》由会员分享,可在线阅读,更多相关《某科技大学计算机学院C语言和程序设计实验报告(含源代码).pdf(119页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、律 卡 科 技 人 客课程实验报告课程名称:C语言程序设计实验_ _ _ _ _ _ _ _ _专业班级:计算机1709班学 号:U201714759姓 名:_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _指导教师:甘早斌报告日期:2018/1/10计算机科学与技术学院华中科技大学计算机学院 C语言程序设计实验报告目录1表达式和标准输入输出实验1.1 实验目的.1.2 实验内容.1.3 实验小结.2 流程控制实验.2.1 实验目的.2.2实 验内容.2.3实 验小结.3 函数与程序结构实验.3.1 实验目的.3.2实 验内容.3.3 实验小结.4 编译
2、预处理实验.4.1 实验目的.4.2实 验内容.4.3 实验小结.5 数组实验.5.1 实验目的.5.2实 验内容.5.3 实验小结.6 指针实验.6.1 实验目的.6.2实 验内容.6.3实 验小结.7 结构与联合实验.7.1 实验目的.7.2实 验内容.7.3实 验小结.8 文件实验.8.1 实验目的.8.2实 验内容.8.3 实验小结.参考文献.2.2.2.11“1错误!未定义书签。错误!未定义书签。2 错误!未定义书签。2.25.26.26.26.37.38.38.38.46.47.47.47.60.61.6错误!未定义书签。.6错误!未定义书签。.77.错误!未定义书签。8.78.7
3、811错误!未定义书签。.112.错误!未定义书签。12.错误!未定义书签。12.错误!未定义书签。17.118华中科技大学计算机学院 C语言程序设计实验报告1表达式和标准输入与输出实验1.1实验目的(1)熟练掌握各种运算符的运算功能,操作数的类型,运算结果的类型及运算过程中的类型转换,重点是C 语言特有的运算符,例如位运算符,问号运算符,逗号运算符等;熟记运算符的优先级和结合性。(2)掌握 getchar,putchar,scanf 和 printf 函数的用法。(3)掌握简单C 程序(顺序结构程序)的编写方法。1.2实验内容1.2.1 源程序改错下面给出了一个简单C语言程序例程,用来完成以
4、下工作:(1)输入华氏温度f,将它转换成摄氏温度c 后输出;(2)输入圆的半径值r,计算并输出圆的面积s;(3)输入短整数k、p,将 k 的高字节作为结果的低字节,p 的高字节作为结果的高字节,拼成一个新的整数,然后输出;在这个例子程序中存在若干语法和逻辑错误。要求参照1.3和 1.4的步骤对下面程序进行调试修改,使之能够正确完成指定任务。1#include2#define PI 3.14159;3 voidmain(void)45 int f;6 short p,k;7 double c,r,s;8/*for task 1 */9 printffInput Fahrenheit:);10 s
5、canfT%d”,f);11 c=5/9*(f-32);2华中科技大学计算机学院 C 语言程序设计实验报告12 printf(u n%d(F)=%.2f(C)nn”,f,c);13/*for task 2*/14 printf(ninput the radius r:n);15 scanf(u%f&r);16 s=PI*r*r;17 printf(MnThe acreage is%.2fnnu,&s);18/*for task 3*/19 printf(ninput hex int k,p:);20 scanf(*%x%xn,&k,&p);21 newint 二(p&0 xff00)|(k&0
6、 xff00)8;22 printf(nnew int=%xnn,newint);)解答:(1)错误修改:1)第 2 行的符号常量定义后不能有分号,正确形式为:#define PI 3.141592)第 3 行的voidmain(void)的返回类型和函数名应分开,正确形式为:int main(void)3)第 10行的scanf(%d,f);在输入内容时指向地址应使用&,正确形式为:scanf(%d,&f);4)第 11行的c=5/9*(f-32)油 于 f 是 int型,在运算时右侧表达式会被截去小数部分,正确形式为:c=5.0/9*(f-32);5)第 12行的printf(n%d(F)
7、=%.2f(C)nn”,f,c);由于c是双精度浮点型变量应使用占位符I f,正确形式为:printf(n n%d(F)=%.21f(C)nn,f,c);6)第 15行的scanf(%f,&r);由于r 是双精度浮点型变量应使用占位符If,正确形式为:scanf(%lf,&r);7)第 17行的printf(nThe acreage is%.2Rnn,&s);变量s 为长浮点型,且输出不需要取址符,正确形式为:3华中科技大学计算机学院 C 语言程序设计实验报告printf(nThe acreage is%.21fnnn,s);8)第21行newint变量未声明,且数学表达式错误,正确形式为:s
8、hort newint;newint=(p&0 xff00)|(k&0 xff00)8);9)第2 0行、第22行的变量为短整型,x应为hx,正确形式为:20 scanf(n%hx%hx,&k,&p);22 printf(new int=%hxnn,newint);(2)错误修改后运行结果:F C:UsersMLDesktopMy filesEX001binDebugEX001.exeInput Fahrenheit:8080(F)=26.67(C)input the radius r:1The acreage is 3.14input hex int k,p:200 200newint=20
9、2Process returned 0(0 x0)execution time:7.647 sPress any key to continue.1.2.2源程序修改替换下面的程序利用常用的中间变量法实现两数交换,请改用不使用第3个变量4华中科技大学计算机学院 C语言程序设计实验报告的方法实现。该程序中t是中间变量,要求将定义语句中的t删除,修改下划线处的语句,使之实现两数对调的操作。#includevoid main()(int a,b,t;printfiflnput two integers:);scanf(“d%d,&a,&b);t=a;a=b;b=t;prinfC4na=%d,b=%d
10、,a,b);)解答:替换后的程序如下所示:#includevoid main()(int a,b;printfiflnput two integers:);scanf(%d%d,&a,&b);a=a+b;b=a-b;a=a-b;printfift4na=%d,b=%d,a,b);I n pu t t w o i n t e g e r s:4 6a=6,b=41.2.3程序设计(1)编写一个程序,输入字符c,如果c 是大写字母,则将c 转换成对应的小写,否则C的值不变,最后输出C。5华中科技大学计算机学院 C语言程序设计实验报告解答:1)算法流程如图1.1所示。测试用例程 序 输 入理 论 结
11、 果运 行 结 果用 例 1Eee用例2eee用例31116华中科技大学计算机学院 C 语言程序设计实验报告2)程序清单#includeint main()(int c;printf(输入字符,如果它是大写字母,则将它转换成对应的小写,否则原样输出:);c=getchar();通过getchar。来获得字符对应的ASCII码if(c=A)判断字符c 是否为大写字母c-CA-a);将大写字母变为小写printf(处理 结 果 是:%c,c);return 0;3)测试(a)测试数据:表 1-1编程题1 的测试数据测试用例程序输入理论值运行结果用例1Bbb用例2bbb用例3111(b)用例1 的运
12、行结果如图1.2所示|输入字符,如果它是大写字母.则将它转换成对应的小写,否则原样输出:B处理结果是:b图 1.2用例2 的运行结果如图1.2所示输入字符,如果 匕是大与字母,则将 匕转换成对应的小写,否则原样输出:b处理结果是:b图 1.3用例3 的运行结果如图1.2所示7华中科技大学计算机学院 C语言程序设计实验报告输入字行,如果 匕是大与子母,则将 匕转换成对卜乂的小与,否则原样输出:1处理结果是:1图 1.4运行结果与理论分析结果一致,验证了程序的正确性。(2)编写一个程序,输入无符号短整数x,m,n(0 m 15,1 n 16-m),取出x 从第m位开始向左的n 位(m从右至左编号为
13、015),并使其向左端(第15位)靠齐。1)解题思路:A.输入 x,m,nB.如果输入合理,转 a,否则转Ca 准备使用位运算,先准备逻辑尺b 为利用按位与计算,将非预变换位变为0c 使用生成的逻辑尺与预变换数进行按位与运算,达到取出所需部分的目的d 将取出的部分向左靠齐e 输出结果C.提示输入错误D.结束2)程序清单#includeint main()(unsigned short x,m,n,i;printf(输入 x(10 进制)、m(0-1 5)和 n(1 16-m):”);scanf(H%hu%hu%hu,&x,&m,&n);if(m=0&m=1&n=16-m)判断输入是否合理i=O
14、xffff;i =m;i =16-n;i =16-m-n;x&二 i;准备位运算所需逻辑尺/确定变换起始位置/确定变换作用长度进入变换位置8华 中 科 技 大 学 计 算 机 学 院 C 语 言 程 序 设 计 实 验 报 告x =1 6 -m -n;/左移pr i n t f(经过变换得到:%h u ,x);)e l s e pr i n t f(输入错误,请检查您的输入)提示输入不合理r e t u r n 0;)3)测试(a)测试数据:测试 序 输 入理 论绝果三二军XmX用用10000 0000 0001 1001(25)32BJE 至果 1100 0000 00000000 虻491
15、524915月例211010101 1000 0011(54659)161输入错澳Cm值超方驾)检查卷弓例311010101 1000 0011(54659)135场入槽强Cn值无酒考)(b)对应测试测试用例1 的运行结果如图2-2 所示。输入x (1 0 进 制)、m (0 1 5)和n (1 1 6-m):2 5 3 2经过变换得到:4 9 1 5 2图2-2 编程题2的测试用例一的运行结果对应测试测试用例2的运行结果如图2-3 所示。输入x (1 0 进 制)、m (0 1 5)和n (1 1 6-m):5 4 6 5 9 1 6 1输入错误,请检查您的输入图2-3 编程题2的测试用例二
16、的运行结果对应测试测试用例3的运行结果如图2-4 所示。输入x (1 0 进 制)、m (0 1 5)和n (1 1 6-m):5 4 6 5 9 1 3 5输入错误,请检查您的输入图2-4 编程题2的测试用例三的运行结果9华中科技大学计算机学院 C语言程序设计实验报告运行结果与理论分析结果一致,验证了程序的正确性。(3)IP地址通常是4个用句点分隔的小整数(即点分十进制),如32.55.1.102。这些地址在机器中用无符号长整形表示。编写一个程序,以机器存储的形式读入一个互联网IP地址,对其译码,然后用常见的句点分隔的4部分的形式输出。解答:1)解题思路:A.输入变为整型数的IPB为4个by
17、te准备4个逻辑尺C.用这4个逻辑尺分别取出各byte中二进制数D将二进制数统一移到最低八位E按要求的格式与顺序输出ip地址2)程序清单#includeint main()(unsigned long int ip,ml,m2,m3,m4,p 1 ,p2,p3,p4;printf(输入 IP 地址:);scanf(%lu,&ip);ml=OxffOOOOOO;各分段逻辑尺m2=OxOOffOOOO;各分段逻辑尺m3=OxOOOOffOO;/各分段逻辑尺m4=OxOOOOOOff;/各分段逻辑尺pl=(ip&m l)24;取出各部分二进制数p2=(ip&m2)16;/取出各部分二进制数p3=(i
18、p&m3)8;/取出各部分二进制数p4=(ip&m4);取出各部分二进制数printf(这个 IP 地址常规形式为:%lu.%lu.%lu.%lu”,p4,p3,p2,pl);/按要求格式输出return 0;3)测试10华中科技大学计算机学院 C语言程序设计实验报告(a)测试数据:测试用例程 序 输 入理 论 结 果运 行 结 果用例14564561345.127.184.245.127.184.2用例212345678921.205.91.721.205.91.7用例378965432149.43.17.4749.43.17.47(b)对应测试测试用例1 的运行结果如图3-2所示。谕入IP
19、地址:45645613这个IP地址常规形式为:45.127.184.2图3-2编程题3 的测试用例一的运行结果对应测试测试用例2 的运行结果如图1-3所示。输入IP地址:123456789这个IP地址常规形式为:21.205.9L 7图3-3编程题3 的测试用例二的运行结果对应测试测试用例3 的运行结果如图3-4所示。|输入 IP地址:789654321这个IP地址常规形式为:49.43.17.47图3-4编程题3 的测试用例三的运行结果运行结果与理论分析结果一致,验证了程序的正确性。1.3实验小结(1)对基本集成开发环境的运用更加熟练;(2)体会到写程序前先理清思路的重要性;(3)体会到了判
20、断输入值对程序的重要性;(4)掌握了书写实验报告的基本方法。华中科技大学计算机学院 C语言程序设计实验报告实验2流程控制实验2.1实验目的(1)掌握if-else,do-while,switch-case等流程控制语句之用法。(2)能正确理解各流程控制语句所包含的逻辑关系。(3)能正确理解各流程控制语句之间不同,并用这些不同优化自己的程序。(4)能用流程控制语句编写简单的C语言程序。2.2实验内容及要求2.2.1源程序改错下面是计算s=n!的源程序,在这个源程序中存在若干语法和逻辑错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。例如,8!=40320。1#includ
21、e 2 int main(void)34 int i,n,s=l;5 printf(Please enter n:n);6 scanf(n%dn,n);7 for(i=l,i=n,i+)8 s=s*i;9 printf(H%d!=%dn,n,s);10)11 return;解答:(1)错误修改:1)第6行的scanf在输入时应指向单元地址而非单元名称,正确形式为:scanf(%dH,&n);12华中科技大学计算机学院 C语言程序设计实验报告2)第 7 行的for语句表达式之间应用;分隔,正确形式为:for(i=l;i=n;i+)3)第 10行的return 0;和第11行的 位置错误,大括号应
22、该在整段代码的末尾,正确形式为:10 return 0;11)(2)错误修改后运行结果:见图2-1Please enter n:88!=40320图2-1修改后的运行结果2.2.2源程序修改替换(1)修改第1题,分别用while和 do-while语句替换for语句。解答:在使用while语句时,将 for语句中赋i 初值的语句放到while循环之前,每次改变i 的值的语句放在循环的最后一条语句即可,而在其他的地方,则与经for语句的处理基本一致,替换后的程序如下所示:#include int main(void)(int i=l,n,s=l;printf(Please enter n:);s
23、canf(%d,&n);while(i=n)(s=s*i;i+;)printf(%d!=%d,n,s);return 0;运行结果见图2-2华中科技大学计算机学院 C语言程序设计实验报告Please enter n:88!=40320图2-2 while结构下的运行结果在使用do-while语句时,其与while语句的差异特别体现在无论n 的值为何值,其都会进行一次循环,但值得注意的是,这一次额外的循环(发生于输入n=0时)在i 的初值为1时,并不会改变s 的值,从而并不需要进行额外的处理,调换循环体与条件的位置即可,替换后的程序如下所示:#include int main(void)(int
24、 i=l,n,s=l;printf(nPlease enter n:n);scanf(n%d,&n);dos=s*i;i+;)while(i=n);printf(u%d!=%dn,n,s);return 0;运行结果见图2-3Please enter n:88!=40320图2-3 do-while结构的运行结果(2)修改第1题,要求输入改为“整数s,输出改为“满足n!N s的最小整数n”。例如,输入整数为40310,输出结果为n=8。解答:这个问题,从本质上来说,是要找到一个数,使它的阶乘的值大于等于所输入的n 的值,且要求这个数的值最小。阶乘的实现,可借助之前编写的程序,只需修改一下输入和
25、输出,及增加一个输出条件。程序如下所示:#includeint main()14华中科技大学计算机学院 C 语言程序设计实验报告int j,n=O,s,m=l;printf(Please enter s:u);scanf(u%dH,&s);for(j=l;j+)(m=m*j;n+;if(m=s)(printf(,n=%d,n);break;)return 0;运行结果见图2-4Please enter s:40320n=8图2-4第2题程序的运行结果2.2.3程序设计(1)假设工资税金按以下方法计算:x 1000元,不收取税金;1000 Wx 20 0 0,收取 5%的税金;2000 W x
26、3 0 0 0,收取 10%的税金;3000 W x5000,收取25%的税金。编写一个程序,输入工资金额,输出应收取税金额度,要求分别用if语句和switch语句来实现解答:在if-else结构下,对x的区间划分比较显然,但由于switch语句只能选择整数,结合x的分段区间宽度均为100 0,于是将x除以1000后再强制转换类型为int类型在进入各个case语句进行运算,流程图如下:华中科技大学计算机学院 C 语言程序设计实验报告程序如下所不:(if)#include float tax(float x);int main(void)(float x;printf(Please input
27、your salary:);scanf(H%fn,&x);printf(nYou should pay%f yuan.nn,tax(x);return 0;float tax(float x)华中科技大学计算机学院 C语言程序设计实验报告float n;if(x0)n=0;else if(x2000)n=0.05;else if(x3000)n=0.1;else if(x4000)n=0.15;else if(x5000)n=0.2;else n=0.25;return n*x;)(switch)#include float tax(float x)(float a;switch(int)(x
28、/1000)(case 0:a=0;break;case l:a=0.05;break;case 2:a=0.1;break;case 3:a=0.15;break;case 4:a=0.2;break;default:a=0.25;return a*x;)int main(void)float x;17华中科技大学计算机学院 C 语言程序设计实验报告printf(Please input your salary:);scanf(n%f;&x);printf(You should pay%f yuan.n,tax(x);return 0;程序运行结果:Please input your sal
29、ary:1000You should pay 50.000000 yuan.Please input your salary:2000You should pay 200.000000 yuan.Please input your salary:3000You should pay 450.000000 yuan.Please input your salary:4000You should pay 800.000000 yuan.Please input your salary:5000You should pay 1250.000000 yuan.Please input your sal
30、ary:6000You should pay 1500.000000 yuan.图2-5编 程 题1的测试用例一的运行结果(2)编写一个程序,将输入的一行字符复制到输出,复制过程中将一个以上的空格字符用一个空格代替。解答:使用状态机通过判断空格的个数选择不同状态,从而实现消去空格的作用。流程图如下:华中科技大学计算机学院 C语言程序设计实验报告#include enum COPY,START,SPACE;int main()(char c;int state=COPY;printPlease input a char:nH);while(c=getchar()!=n)switch(state)
31、case COPY:if(c=*)state=START;else putchar(c);break;case START:putchar,);if(c=)state=SPACE;elsestate=COPY;putchar(c);break;case SPACE:19华中科技大学计算机学院 C语言程序设计实验报告i f(c!=)s t a t e=COPY;p u t c h a r(c);el s e s t a t e=SPA CE;b r ea k;)r et u r n 0;程序运行结果如下:Please input a char:I love youI love you!图2-6编
32、程题2的测试用例的运行结果(3)编写一个程序,打印如下的杨辉三角形。11 11 2 1/*第0行*/*第1行*/*第2行*/1 3 3 11 4 6 4 11 5 1 0 1 0 5 11 6 1 5 2 0 1 5 6 11 7 2 1 3 5 3 5 2 1 7 11 8 2 8 5 6 7 0 5 6 2 8 8 11 93 6 8 4 1 2 6 1 2 6 8 4 3 691每个数据值可以由组合G 计算(表示第i行第j列位置的值),而G,的计算如下:C,0=1(i=0,l,2,.)C/=C/-*(i-j+l)/j 2,3,i)20华中科技大学计算机学院 C语言程序设计实验报告说明:本
33、程序中为了打印出金字塔效果,要注意空格的数目。一位数之间是3 个空格,两位数之间有2 个空格,3 位数之间只有一个空格,程序编制过程中要注意区分。解答:首先,应该用一个循环控制每一行的输出,而每一行中应该分为空格的输出和数字的输出,空格的输出根据规律应该为每行输出2*(总行数-当前行数)个 空 格,而数字的输出则按照给定的公式循环输出即可。故一共两个内循环分别控制每行数字前的空格输出和数字输出,还有一个外循环控制每一行。程序如下:#include#define n 10int main(void)(int i,j,k,c,m;for(i=0;in;i+)(fbr(m=O;mn-i;m+)(p
34、rin tf();)for(j=0;j=i;j+)(if(j=O)c=l;else c=c*(i+l-j)4;printf(n%4dn,c);)printf(n);)return 0;程序运行结果如下:华中科技大学计算机学院 C 语言程序设计实验报告图2-7编程题3 的运行结果(4)编写一个程序,将用户输入的任意正整数逆转,例如,输入1234,输出 4321o解答:利用同余除法的特性,求出输入数据除以十的余数并将其输出,而后将输入的数字除以十,由于输入是int型,从而除以十的结果等效于消除了最后一位数字,再求出新的数字除以10的余数,如此循环下去,便可输出被逆转的整数,考虑到循环的逻辑简明,故
35、采用while语句。流程图如下:Y T程序如下:#include int main(void)long n,m;printf(Please intput an integer n(n0):);22华中科技大学计算机学院 C 语言程序设计实验报告scanf(H%ld,&n);printf(The new integer is:”);while(n0)(m=n%10;printf(%ld,m);n=n/10;)return 0;)程序运行结果如下:Pl ea s e i n t p u t a n i n t eger n(n 0):1 2 3 4Th e n ew i n t eger i s:
36、4 3 2 1图2-8编程题4的运行结果2.2.4选做题编写一个程序,用牛顿迭代法求方程八X)=3*3-4-5+13=满足精度e=10-6的一个近似根,并在屏幕上输出所求近似根。牛顿迭代法求方程近似根的迭代公式为:x0=aXk+=Xk f(Xk V f)其中,f(X)是函数f(x)的导函数。牛顿迭代法首先任意设定的一个实数。来作为近似根的迭代初值X 0,然后用迭代公式计算下一个近似根X lo如此继续迭代计算X2,X3,X n,直 到 归 精 度e,此时值Xn即为所求的近似根。解答:首先,定义两个函数分别用来计算函数f(X)和 广(X)的值,定义一个循环,考虑到先执行再判断精度是否达到要求,用d
37、 o w h ile循环,先按照题目所给公式执行再判断,当精度达到要求即跳出循环。需要注意的是,需用另一个变量记录X k的值,因为每次经过计算后X k+1的值会覆盖X k的值。23华中科技大学计算机学院 C语言程序设计实验报告程序如下:#include#define E 0.000001double fO(double x)(return 3*x*x*x-4*x*x-5*x+13;)double fl(double x)(return 9*x*x-8*x-5;int main(void)(double x,y;scanf(n%lf&x);do(y=x;x=x-f0(x)/fl(x);while
38、(x-y)E|(x-y)(-E);printf(%lf,x);return 0;)程序运行结果如下:24华中科技大学计算机学院 C语言程序设计实验报告2.3实验小结(1)掌握了流程控制语句的基本用法。(2)实践中运用调试功能找出了程序的低级错误,明白了学会调试的重要性。(3)初步理解了在编程时利用各程序语句的特点优化程序的重要性与必要性。(4)在平时写程序时就应该思考对于一个问题有没有多种解决方案,使用不同的逻辑结构多种尝试寻求最优解。25华中科技大学计算机学院 C语言程序设计实验报告3函数与程序结构实验3.1 实验目的(1)熟悉和掌握函数的定义、声明;函数调用与参数传递方法;以及函数返回值类
39、型的定义和返回值使用。(2)熟悉和掌握不同存储类型变量的使用。(3)熟悉多文件编译技术。3.2 实验内容3.2.1 源程序改错题下面是计算s=l!+2!+3!+.+n!的源程序,在这个源程序中存在若干语法和逻辑错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。1#include stdio.h”2 void main(void)34 int k;5 for(k=l;k6;k+)6 printf(k=%dtthe sum is%ldnn,k,sum_fac(k);7 )8 long sum_fac(int n)910 long s=0;11 inti;12 long fa
40、c;13 for(i=l;i=n;i+)14 fac*=i;15 s+=fac;16 return s;-26-华中科技大学计算机学院 C 语言程序设计实验报告17)解答:(1)缺少对函数的声明,应该在第1行与第2行之间加上如下代码:long sum_fac(int n);(2)第7行前少了一个return。;语句,在第6行与第7行之间加上:return 0;(3)第14、15行两条语句应该都包括在for循环内,正确形式为:14 fac*=i;15 s+=fac;修改后程序运行结果:|k=lt h es u m i s1k=2t h es u m i s3k=3t h es u m i s9k
41、=4t h es u m i s3 3|k=5t h es u m i s1 5 33.2.2源程序修改替换题(1)修 改 第1题 中sum_fac函数,使其计算量最小。解答:利 用static变量类型对循环进行化简,保留上一个值,避免多次重复循环。流程图如下:开始k=l,s=0,fac=lfac*=k;S+=fc;输出S结束27华中科技大学计算机学院 C语言程序设计实验报告程序代码如下:#include long sum_fac(int n);int main()(int k;for(k=l;k6;k+)printf(k=%dtthe sum is%ldnn,k,sum_fac(k);ret
42、urn 0;)static long s=0,fac=l;long sum_fac(int n)(fac*=n;s+=fac;return s;)程序运行结果如下:eeeeehhhhhttttt12345一-=-KKKKKmmmmmuuuuussssssssssi1113353931(2)修 改 第 1题 中 sum_fac函数,计算s=1 +,+工+工。2!3!!相比较于源程序,变动之处在于求的是阶乘的倒数和,则在循环中多一步求倒数的过程,并对倒数求和。需要注意的是函数的类型应改变为flo a t,变 量 s也需要改成float类型,还需再声明一个额外的float型变量i 用来存放1/fac
43、的值。流程图如下:28华中科技大学计算机学院 C语言程序设计实验报告开始k=l,s=O,fac=l,i=l结束程序代码如下:#include long sum_fac();int main()(int k;for(k=l;k6;k+)printf(*k=%dtthe sum is%ldnn,k,sum_fac(k);return 0;)static long s=0,fac=l;long sum_fac(int n)fac*=n;s+=fac;return s;)程序运行结果如下:29华中科技大学计算机学院 C语言程序设计实验报告k=lt he s um is1.0 0 0 0 0 0k=2t
44、 he s um is1.5 0 0 0 0 0k=3t he s um is1.6 6 6 6 6 7k=4t he s um is1.7 0 8 3 3 3k=5t he s um is1.7 1 6 6 6 73.2.3跟踪调试题下面是计算fabo nacci数列前n项和的源程序,现要求单步执行该程序,观察 p,i,s um,n 值,即:(1)刚执行完s canf(%d,&k);语句,p,i值是多少?(2)从fabo nacci函数返回后光条停留在哪个语句上?(3)进入fabo nacci函数时,wat ch窗口显示的是什么?(4)当i=3时,从调用fabo nacci函数到返回,n值如
45、何变化?解答:Qi =0()P=(long*)0 x62fe38(2)*Ti=2p=(long*)0 x62fe38k=5n x 2(4)n=3-*n=2-*n=1 n=3源程序vo id main(vo id)(int i,k;lo ng s um=0,*p=&s um;s canf(n%dM,&k);fo r(i=l;i=k;i+)s um+二fabo nacci;p r int f(ni=%dt t he s um is%ldnn,i,*p);s unK=fabo nacci ;回回回回30华中科技大学计算机学院 C语言程序设计实验报告long fabonacci(int n)if(n=
46、l|n=2)return 1;elsereturn fabonacci(n-l)+fabonacci(n-2);)其中,long sum=0,*p=∑声 明p为长整型指针并用&sum取 出sum的地址对p初始化。*p表示引用p所 指 的 变 量(*p即sum)。3.2.4编程设计题(1)编程让用户输入两个整数,计算两个数的最大公约数并且输出之(要求用递归函数实现求最大公约数)。同时以单步方式执行该程序,观察递归过程。解答:(1)用辗转相除法求最大公约数,程序框图如下:开始取两个数中的较大数除以较小数得到余数若余数不为零,去余数和被除数,重复上一步操作V余数为零后,取被除数,即为最大公约
47、数结束程序代码如下:#includeint GCD(int m,int n);华中科技大学计算机学院 C语言程序设计实验报告int main(void)(int m,n;printf(HPlease input two integers:nH);scanf(%d%d,&m,&n);printf(The GCD is%d,GCD(m,n);return 0;)int GCD(int m,int n)(if(mn)int t;t=m;m=n;n=t;)if(m%n=0)return n;else(int r;r=m%n;m=n;n=r;return GCD(m,n);)程序运行结果如下:32华中科
48、技大学计算机学院 C语言程序设计实验报告P leas e inp ut t wo int eger s:6 8T he G C D is 2P leas e inp ut t wo int eger s:k 2T he G C D is 2(2)编程验证歌德巴赫猜想:一个大于等于4 的偶数都是两个素数之和。解答:首先编写一个函数用来判断一个数n 是否为质数(可用从2 到根号n 的每个整数去除n,判断是否有余数),如果是质数,则返回1,不是则返回0.在主函数里再接受x 的输入,首先判断x 是否为偶数,不是偶数则直接结束程序;是偶数,再判断i 和 x-i是否都是质数,若都是则符合要求,输出。i 从
49、 1开始一直循环至x/2.程序框图如下如下:开始代码如下:#includeint prime(int n)int i;华中科技大学计算机学院 C 语言程序设计实验报告for(i=2;i*i=n;i+)if(n%i=O)return 0;return 1;)int main(void)(int x,i;scanf(%d,&x);if(x%2=0)(for(i=2;i=4 is the sum of two primes.10=3+712=5+720=3+1734华中科技大学计算机学院 C 语言程序设计实验报告解答:思路:本题可借助上题的大部分程序,只需去掉上题中的输入部分,换成一个循环,将上题由
50、输入获取的X用作控制循环的变量,X 从 BEGIN的值循环到 EN D的值。需要注意的是,因为需要验证的是偶数,因此循环条件中应该为x=x+2而不是x+.程序代码如下:#include#define BEGIN 10#define END 20int prime(int n)(int i;for(i=2;i*i=4 is the sum oftwo primes.);for(x=BEGIN;x=END;x=x+2)(fdr(i=2;i=x/2;i+)(if(prime(i)&prime(x-i)printf(H%d=%d+%dnn,x,i,x-i);return 0;华中科技大学计算机学院 C