长沙理工大学2010C语言实验报告参考答案实验一熟悉C语言程序开发环境及数据描述四、程序清单1.编写程序实现在屏幕上显示以下结果:ThedressislongTheshoesarebigThetrousersareblack答案:#includestdio.hmain(){printf(Thedressislong\n);printf(Theshoesarebig\n);printf(Thetrousersareblack\n);}2.改错题(将正确程序写在指定位置)正确的程序为:#includestdio.hmain(){printf(商品名称价格\n);printf(TCL电视机¥7600\n);printf(美的空调¥2000\n);printf(SunRose键盘¥50.5\n);}2.编写程序:a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。答案:#includestdio.hmain(){inta,b,c,x,y;a=150;b=20;c=45;x=a/b;y=a/c;printf(a/b的商=%d\n,x);printf(a/c的商=%d\n,y);x=a%b;y=a%c;printf(a/b的余数=%d\n,x);printf(a/c的余数=%d\n,y);}4.设变量a的值为0,b的值为-10,编写程序:当ab时,将b赋给c;当a=b时,将a赋给c。(提示:用条件运算符)答案:#includestdio.hmain(){inta,b,c;a=0;b=-10;c=(ab)?b:a;printf(c=%d\n,c);}五、调试和测试结果1.编译、连接无错,运行后屏幕上显示以下结果:ThedressislongTheshoesarebigThetrousersareblack3、编译、连接无错,运行后屏幕上显示以下结果:a/b的商=7a/c的商=3a/b的余数=10a/c的余数=154.编译、连接无错,运行后屏幕上显示以下结果:c=-10实验二顺序结构程序设计四、程序清单1.键盘输入与屏幕输出练习问题1D。问题2改printf(%c,%c,%d\n,a,b,c);这条语句改成:printf(%c%c%d\n,a,b,c);问题3改scanf(%c%c%d,&a,&b,&c);这条语句改为:scanf(%c,%c,%d,&a,&b,&c);问题4改printf(%c,%c,%d\n,a,b,c);这条语句改成:printf(\’%c\’\’%c\’%d\n,a,b,c);2(1)从键盘输入两个八进制数,计算两数之和并分别用十进制和十六进制数形式输出。#includestdio.hintmain(){inta,b,c;printf(Enteraandb:);scanf(%o%o,&a,&b);c=a+b;printf(d:%d\n,c);printf(x:%x\n,c);return0;}2(2)编写程序:从键盘输入两个实数a和x,按公式计算并输出y的值:axexaaxay)ln()sin(5#includestdio.h#includemath.hintmain(){floata,x,y;scanf(%f%f,&a,&x);y=pow(a,5)+sin(a*x)+exp(a*x)+log(a+x);printf(y=%f\n,y);return0;}3.改错题正确的程序为:#includestdio.hmain(){inta,b,c,s;scanf(%d%d%d,&a,&b,&c);s=a+b+c;printf(%d=%d+%d+%d\n,s,a,b,c);/*输出s=a+b+c*/printf(%d+%d+%d=%d\n,a,b,c,s);/*输出a+b+c=s*/}五、调试和测试结果2(1)输入:1214输出:261a2(2)输入:10输出:2.000000实验三选择结构程序设计四、设计流程(算法描述)(请写出上机内容2(2)题的算法描述)主要是两两比较,然后得出最大的数五、程序清单2(1)输入整数x和a,计算并输出下列分段函数f(x)的值(保留2位小数),请调用log函数求自然对数,调用fabs函数求绝对值。axaxxaxaaxf0ln21)(程序为:#includestdio.h#includemath.hmain(){intx,a;doubley;printf(Enteraandx:);scanf(%d%d,&a,&x);if(fabs(x)!=a)y=log(fabs((a+x)/(a-x)))/(2*a);elsey=0;printf(a=%d,f(%d)=%.2f\n,a,x,y);}(2)输入a、b、c三个整数,输出最大数。#includestdio.hmain(){inta,b,c,x;scanf(%d%d%d,&a,&b,&c);if(a=b)x=a;elsex=b;if(xc)x=c;printf(themaxnumberis:%d\n,x);return0;}3.改错题正确程序为:#includestdio.hmain(){doublen;printf(Entern:);scanf(%lf,&n);if(n0)printf(nislessthan0\n);elseif(n==0)printf(nisequalto0\n);elseprintf(nisgreater0\n);}六、调试和测试结果2(1)Enteraandx:56a=5,f(6)=0.24Enteraandx:55a=5,f(5)=0.002(2)输入:321输出:themaxnumberis:3输入:231输出:themaxnumberis:3输入:123输出:themaxnumberis:3实验四循环结构程序设计四、设计流程(算法描述)(请写出上机内容2的算法描述)首先求出每一个给定数的所有因子和,然后从2到5000循环,那一个数x与因子之和相等,就是完数。五、程序清单1.编写程序:求1+2+3+…+100和12+22+33+…+1002。#includestdio.h#includemath.hintmain(){inti,j,sum;sum=0;for(i=1;i=100;i++)sum+=i;printf(thesumis:%d\n,sum);sum=0;for(i=1;i=100;i++){j=pow(i,2);sum+=j;}printf(thesquaresumis:%d\n,sum);return0;}2.一个数如果恰好等于它的因子之和,这个数就称为“完数”,编写程序找出2~5000中的所有完数。#includestdio.h#includemath.hmain(){inti,j,sum=0;for(i=2;i=5000;i++)//遍历从2到5000的所有数{sum=0;for(j=1;j=i/2;j++)//找出给定整数X的所有因子和{if(i%j==0)sum+=j;}if(i==sum)//sum为因子和,如果和i相等,则输出printf(%d,i);}return0;}3.改错题正确的程序为:#includestdio.hmain(){intn=1;intfind=0;while(!find){if(n%5==1&&n%6==5&&n%7==4&&n%11==10){printf(n=%d\n,n);find=1;}n++;}}六、调试和测试结果1:结果:thesumis:5050thesquaresumis:3383502:结果:628496实验五函数和预处理命令四、设计流程(算法描述)(请写出上机内容1的算法描述)利用循环将m乘n次五、程序清单1.编写自定义函数longpower(intm,intn),计算nm的值。利用此函数编程序实现:从键盘输入两个整数m和n,计算出nm的值。#includestdio.hlongpower(intm,intn)//要返回的是long型{inti;longs;//因为是要返回的数,所以这里也定义为long型s=1;for(i=1;i=n;i++){s*=m;}returns;}intmain(void){intm,n;scanf(%d%d,&m,&n);printf(s=%ld\n,power(m,n));return0;}2、写出两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。1.源程序如下:intzdgys(intn1,intn2){inty,i;for(i=n2;i=1;i--)if(n1%i==0&&n2%i==0){y=i;break;}returny;}intzxgbs(intn1,intn2){inty,i;for(i=n1;i=n1*n2;i++)if(i%n1==0&&i%n2==0){y=i;break;}returny;}main(){intn1,n2,t;scanf(n1=%dn2=%d,&n1,&n2);if(n1n2){t=n1;n1=n2;n2=t;}printf(zdgys=%dzxgbs=%d,zdgys(n1,n2),zxgbs(n1,n2));}3、改错题正确程序如下:#includestdio.hintfact(intn);intmulti(intn);main(){inti;doublesum,item,eps;eps=1E-6;sum=1;item=1;for(i=1;item=eps;i++){item=fact(i)/multi(2*i+1);sum=sum+item;}printf(“PI=%0.5lf\n”,sum*2);return0;}intfact(intn){inti;intres=1;for(i=0;i=n;i++)res=res*i;returnres;}intmulti(intn){inti;intres=1;for(i=3;i=n;i=i+2)res=res*i;returnres;}六、调试和测试结果1、输入:23输出:s=82、输入:n1=24n2=16输出:zdgys=8zxgbs=482.3、输出结果为:实验六数组四、设计流程(算法描述)(请写出上机内容1的算法描述)设置两个变量分别指示头和尾。第一个和最后一个元素值互换,然后头和尾变量向里移动,最终到两变量相遇为止。五、程序清单1.编写程序:从键盘输入一串整数保存到数组中,调用函数antitone()将数组反序输出。自定义函数voidantitone(inta[],intn)实现将数组中的n个数据按逆序存放。voidantitone(inta[],intn){inti,j;intk;i=0;j=n-1;while(ij){k=a[i];a[i]=a[j];a[j]=k;i+=1;j-=1;}}2.已知某数列的前两项为2和3,其后每一项为其前两项之积。编程实现:从键盘输入一个整数x,判断并输出x最接近数列的第几项?#includestdio.h#includemath.hvoidMad(inta[],intn){inti;a[0]=2;a[1]=3;for(i=2;in;i++){a[i]=a[i-1]*a[i-2];}}intmain(void){inta[100],x,k1,k2;inti;Mad(a,100);//产生序列printf(inputx:);scanf(%d,&x);i=0;for(;xa[i];i++);k1=abs(x-a[i-1]);k2=abs(x-a[i]);if(k1k2)printf(x最接近第%d项\n,i+1);elseprintf(x最接近第%d项\n,i);return0;}3、源程序如下:#includestdio.hmai