C语言程序设计第三版——谭浩强习题答案集

上传人:枫** 文档编号:577909323 上传时间:2024-08-23 格式:PDF 页数:133 大小:8.91MB
返回 下载 相关 举报
C语言程序设计第三版——谭浩强习题答案集_第1页
第1页 / 共133页
C语言程序设计第三版——谭浩强习题答案集_第2页
第2页 / 共133页
C语言程序设计第三版——谭浩强习题答案集_第3页
第3页 / 共133页
C语言程序设计第三版——谭浩强习题答案集_第4页
第4页 / 共133页
C语言程序设计第三版——谭浩强习题答案集_第5页
第5页 / 共133页
点击查看更多>>
资源描述

《C语言程序设计第三版——谭浩强习题答案集》由会员分享,可在线阅读,更多相关《C语言程序设计第三版——谭浩强习题答案集(133页珍藏版)》请在金锄头文库上搜索。

1、C 程序设计第三版课后习题答案全解File-New-Project在打开的New Project对话框中最左侧一栏中选择VisualC+下面的C L R ,之后在其右侧的区域中选择CLR EmptyApplication并在下面的三个文本框中填入工程名称(Name) ,工程位置( Location) 以及解决方案名称( Solution Name)之后单击OK然后可以解决方案浏览器中看到刚才新建的工程, 右击工程名 ,选 择 Properties( 属性) ,在打开的对话框中选择Configuration Properties( 配置属性) 下面的 General( 一般) ,然后将右边对话框

2、中的Common Language Runtime Support( CLR 支持) 改为NoCommon Language Runtime Support”,然后点击确定退出接下来右击工程中的Source Files,选择Add-New Item.,在打开的对话框中选择 C+ File( .cpp)n, 并在下方输入一个以.c结尾的文件名,之后点击A dd,之后就可以在这个文件中加入C语言代码,按F5就可以调试运行了。1.5请参照本章例题,编写一个C程序,输出以下信息: ! ! ! 1 ! 1* 1*rj* rjw rjw rjw rjw rj rjw rjw rj rjw rjw rj r

3、j rjw rj rj* rjwVery Good!1* *! *! *1* ! ! ! ! 1 ! 1* 1*rj* rjw rjw rjw rjw rj rjw rjw rj rjw rjw rj rj rjw rj rj* rjw解:main()pr jntf( *)printf(HnH);printf(HVery Good!nH);printf(HnH);printf(*”)1 .6编写一个程序,输入a、b、c三个值,输出其中最大值。解:main()int a,b,c,max;printf( 请输入三个数 a,b,c:nH);scanf(H%d,%d,%dH,&a,&b,&c);max

4、=a;if(maxb)max=b;if(max c2 c3、c4、c 5分别变为,G :T、,n f、T、并输出。解:#include main() char cl=,C,c2=,h,c3=,i,c4=,n,c5=,a,;cl+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf(n 密码是 %c%c%c%c% cn n,cl,c2,c3,c4,c5);运行结果:密码是Glmre3.9求下面算术表达式的值。(1) x+a%3*(int)(x+y)%2/4设 x=2.5,a=7,y=4.7(2) (float)(a+b)/2+(int)x%(int)y设 a=2,b=3,x=3.5

5、,y=2.5(1) 2.5(2) 3.53.10写出程序运行的结果。main()inti=8;j=10;m=+i;n=j+;printf(H%d,%d,%d,%dH,i,j,m,n);解:9, 11, 9, 103.12写出下面表达式运算后a 的值, 设原来a=12o设 a 和 n都已定义为整型变量。(1) a+=a (2) a-=2 (3) a*=2+3 (4) a/=a+a(5) a%=(n%=2), n 的值等于 5(6) a+=a-=a*=a解:(1) 24 (2) 10 (3) 60 (4)0 (5)0 (6)0第四章4. 4 若 a=3, b=4, c=5, x=1.2, y=2.

6、4, z=-3.6, u=51274,n=128765, cl=W, c2=% 想得到以下输出格式和结果,请写出程序( 包括定义变量类型和设计输出) 。a=_3_ b=_4_ c=_5x=1.200000,y=2.400000,z=-3.600000x+y=_3.600_ y+z=-1.20_ z+x=-2.40cl= x a x _or_97(ASCII)c2= b _or_98(ASCII)main()int a=3,b=4,c=5;long int u=51274,n=128765;float x=1.2,y=2.4,z=3.6;char cl=,ac2=,b,;printf(Ha=%2

7、d b=%2d c=%2dnH,a,b,c);printf(Hx=% f,y=% f,z= % fn ,x,y,z);printf(Hx+y=%5.2f y+z=%5.2f z+x= % 5.2fn* * ,x+y,y+z,z+x);printf(Hu=%61d n=%91dnH,u,n);printf(H%s %s %d%snH,Hcl=,a,H,HorH,cl,H(ASCII)H);printf(H%s %s %d%snH,Hc2=,a,H,HorH,c2,H(ASCII)H);)4. 7用scanf下面的函数输入数据,使a=3, b=7, x=8.5,y=71.82, cl= A , c

8、2二 a ,问在键盘上如何输入?main()(int a, b; float x, y; char clc2;scanf (Ha=%d_b=%dn, &a, &b);scanf (H_x=%f_y=%en,&x, &y);scanf (H_cl=%c_c2=%cn, &cL &c2);)a=3_b=7_x=8.5_y=71.82_cl=A_c2=a4. 8设圆半径r= 1 .5 ,圆柱高h = 3 ,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。main()float r,h,Cl,Sa,Sb,Va,Vb

9、;scanf(H%f,%fH,&r,&h);Cl=2*3.14*r;Sa=3.14*r*r;Sb=4*Sa;Va=4*3.14*r*r*r/3;Vb=Sa*h;printf(HCl=% .2fnH,Cl);printf(HSa=%.2fnSb=% .2fnVa= % .2fn Vb= % .2fn, 1 ,Sa,Sb,Va,Vb);)4. 9输入一个华氏温度,要求输出摄氏温度。公式为c=5(F-32)/9输出要求有文字说明,取位2小数。main()float F,c;scanf(H%fH,&F);c=5*(F-32)/9;printf(Hc=%.2fH,c);)4. 10编程序,用getcha

10、r函数读入两个字符给c l、c 2 ,然后分别用函数和函数输出这两个字符。并思考以下问题:(1 )变 量c l、c 2应定义为字符型或整形?抑二者皆可?(2 )要求输出c l和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?(3 )整形变量与字符变量是否在任何情况下都可以互相代替?如:char cl, c2;与int cl, c2;是否无条件的等价?#include * stdio.h * *main()char cl,c2;cl=getchar() ;c2=getchar();putchar(cl);putchar(,n,);putchar(c2);putchar

11、(,n,);#include * stdio.h1 *main()char cl,c2;cl=getchar() ;c2=getchar();printf(Hcl=% d c2=%dnH,cl,c2);printf(,cl=% c c2=%cnH,cl,c2);)第五章5 . 1 什么是算术运算?什么是关系运算?什么是逻辑运算?解:略。5.2 C语言中如何表示” 真” 和“ 假 ?系统如何判断一个量的“ 真” 和“ 假” ?解:设有一个逻辑表达式,若其结果为“ 真“ ,则以1表示;若其结果为“ 假“ , 则以0表示。 但是判断一个逻辑量的值时,以0代表“ 真“ ,以非0代表“ 假 。例如3&

12、& 5的值为“ 真” ,系统给出3& & 5的值为1。5 . 3 写出下面各逻辑表达式的值。设 a=3, b=4, c=5o(1) a+bc&b=c(2) allb+c&b-c(3) !(ab)&!clll(4) !(x=a)&(y=b)&0(5) !(a+b)+c-l&b+c/2解:(1) 0(2) 1(3) 1(4) 0(5) 15 . 4 有 3 个整数a、 b、 c , 由键盘输入, 输出其中最大的数。解:方法一#include main() int a,b,c;printf( ” 请输入3个整数:” ) ;scanf(H %d,%d,%dH,&a,&b,&c);if(ab)if(bc

13、) printf(Hmax=%dnH,c);else printf(Hmax=%dnH,b);else if(ac) printf( * * max= % dn H ,c);else printf(Hmax=%dnH,a);方法二:使用条件表达式,可以使程序更加简明、清晰。程序如下:#include main() int a,b,c,temp,max;printf( ” 请输入3个整数:” ) ;scanf(H %d,%d,%dH,&a,&b,&c);temp=(ab)?a:b; / * 将 a 和 b 中的大者存人temp中 * /max=(tempc)?temp:c; / * 将a和b中的

14、大者与c比较,取最大者* /printf(n3 个整数的最大数是dn”,max) ;5 . 5 有一函数:写一程序,输入x 值,输出y 值。解:#include main()int x,y;printf( 输入 x:”);scanf(H%dH,&x);if(xl) /* xl */y=x;printf(Hx=%3d, y=x=%dnH,x,y);else if (x10)/* lx-10 */y=2*x-l;printf(Hx=%3d, y=2*x-l=%dnM,x,y);)else /* xlO */y=3*x-ll;printf(Hx=%3d, y=3*x-ll=%dnH,x,y);5 .

15、6 给一个百分制成绩,要求输出等级公, 、E 。90分 以 上 为 8090分为, BT 7079分为, CT 60分以下为 。解:程序如下:#include main() float score;char grade;printf( ” 请输入学生成绩:” ) ;scanf(H %fH,&score);while(score100ll(score0) printf(Hn输入有误, 请重新输入:” ) ;scanf(H %fH,&score);)switch(int)(score/10) case 10:case 9: grade=,A,;break;case 8: grade=,B,;bre

16、ak;case 7: grade=*C,;break;case 6: grade=*D*;break;case 5:case 4:case 3:case 2:case 1:case 0: grade=*E*;)printf( 成 绩 是 相 应 的 等 级 是 c。nn,score,grade);说明:对输入的数据进行检查,如小于0或大于1 0 0 ,要求重新输入。(int) ( score/10) 的作用是将(score/10)的值进行强制类型转换,得到一个整型值。5 .7 给定一个不多于5 位的正整数, 要求: 求它是几位数;分别打印出每一位数字;按逆序打印出各位数字。例如原数为3 2 1

17、 ,应输出123。解:#include main() long int num;ini indiv,ten,hundredjhousand,ten_thousand,place;/ * 分W ?别Ae代总表A*个? 位? 、隹十。 ? 位? 、隹百广位? 、酒千心位? 、怜万 。 位 ? 和 位 ?数。y*/printf( 请? 输。 ? 入” ? 一。 ? 个? 整? 数。y (e;0-99999) e?: eo);scanf(%ld&num);while(num99999llnum9999) place=5:else if(num999) place=4;else if(num99) pl

18、ace=3;else if(num9) place=2;else place= 1;printf(place =%dnH, place);ten_thousand=num/10000;thousand=num/1000% 10;hundred=num/l 00% 10;ten=num% 100/10;indiv=num%10;switch(place) case 5: printf(n%d,%d,%d,%cl,%d,ten_thousand,thousand,hundred,ten,indiv);printf(n反口海序“ 。 数。y字A?为a; g?);printf(%d%d%d%d%dn,

19、indiv,ten,hundred,thousand,ten_thousand);break;case 4: printf(%d,%d,%d,%d,thousand,hundred,tenjndiv);printf(n反口源序 。 数。y字A?为a: eo);printf(%d%d%d%dn,indiv,ten,hundred,thousand);break;case 3: printf(%d,%d,%d,hundred,ten,indiv);printf(n反a 源序 。 数。y字A?为a: eoM);printf(%d%d%dn,indiv,ten,hundred);break;case

20、2: printf(%d,%dn,ten,indiv);printf(n反对总序“ 。 数Oy字A?为a: eoH);printf(%d%( lnM,indiv,ten);break;case 1: printf(%dn,indiv);prinlf(n反口海序 。 数。y字A?为a: eon);printf(%dn,indiv);break;)scanf(%ld,&num);)5 .8 企业发放的奖金根据利润提成。 利润I 低于或等于10万元时,奖金可提成10% ;利润高于10万元,低于20万元(1000001000000时,超 过 100万元的部分按1%提成。从键盘输入当月利润L求应发放奖金

21、总数。要求:(1)用if语句编程序; 用switch语句编程序。解:计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中有10万元按10%的比例提成,另外5万元则按7.5%提成。(1 )用if语句编程序。#include main() long i;float bonus,bonl,bon2,bon4,bon6,bonl0;bonl=100000*0.1;金* /bon2=bonl+100000*0.075;奖金* /bon4=bon2+200000*0.05;奖金* /bon6=bon4+200000*0.03;/ * 利润为10万元时的奖/ * 利 润 为2 0万元时的

22、/ * 利 润 为4 0万元时的/ * 利 润 为6 0万元时的奖金* /bonl0=bon6+400000*0.015;奖金* / * 利 润 为100万元时的printf( 请输入利润i: ” ) ;scanf(M%Id,&i);if(i=100000)bonus=i*0.1;0.1提成奖金* /else if(i=200000)bonus=bonl+(i-100000)*0.075;时的奖金* /else if(i=400000)bonus=bon2+(i-200000)*0.05;时的奖金* /else if(i=600000)bonus=bon4+(i-400000)*0.03;时的

23、奖金* /else if(i bon2 bon4 bon6、honlO;然后再加上各区间附加部分的奖金。 用 switch语句编程序。输入利润L 确定相应的提成等级branch根据branch确定奖金值o 奖金=i*o.i1 奖金=bonl+(i-105)*0.0752 奖金; bon2+(i-2*105)*0.0534 奖金; bon4+(i-4*105)*0.0356 奖金; bon6+(i-6*105)*0.01578910 奖金=bonl0+(i-106)*0.01输出奖金#include main() long i;float bonus, bonl, bon2, bon4, bon

24、6, bonlO;int c;bonl=100000*0.1;bon2=bonl+100000*0.075;bon4=bon2+200000*0.05;bon6=bon4+200000*0.03;bonl0=bon6+400000*0.015;printf( ” 请输入利润i: ” ) ;scanf(M%ld,&i);c=i/100000;if(c10) c=10;switch(c) case 0: bonus=l*0.1 ;break;case 1: bonus=bonl+(i-100000)*0.075;break;case 2 :case 3: bonus=bon2+(i-200000)

25、*0.05; break;case 4:case 5: bonus=bon4+(i-400000)*0.03;break;case 6:case 7:case 8:case 9: bonus=bon6+(i-600000)*0.015;break;case 10: bonus=bonl0+(i-1000000)*0.01;)printf(n 奖金是 % 10.2fH,bonus);)5 . 9 输入4 个整数,要求按由大到小的顺序输出。解:此题采用依次比较的方法排出其大小顺序。在学习了循环和数组以后,可以有更多的排序方法。#include main() int t,a,b,c,d;printf

26、( ” 请输入4个整数:” ) ;scanf(H%d,%d,%d,%dH,&a,&b,&c,&d);printf(Hn a= % d,b=% d,c= % d,d= % dn* ,a,b,c,d);if(ab) t=a; a=b; b=t;if(ac) t=a; a=c; c=t;if(ad) t=a; a=d; d=t;if(bc) t=a; b=c; c=t;if(bd) t=b; b=d; d=t;if(cd) t=c; c=d; d=t;printf( 排序结果如下:nn);printf(H%d, %d, %d, %dnH,a,b,c,d);)5.10 有4个圆塔,圆心分别为(2, 2

27、)、(-2, 2)、(2 ,2)、(-2,-2 ),圆半径为1。这4个塔的高度分别为10m。塔以外无建筑物。 今输入任一点的坐标, 求该点的建筑高度( 塔外的高度为零) 。程序如下:#include main() int h=10;floatxl=2,yl=2,x2=-2,y2=2,x3=-2,y3=-2,x4=-2,y4=-2,x,y,dl,d2,d3,d4;printf( 请输入一个点(x,y):);scanf(H%f,%fH,&x,&y);dl=(x-xl)*(x-xl)+(y-yl)*(y-yl); / * 求该点到各中心点的距离* /d2=(xx2)*(xx2)+(y+y2)*(y+

28、y2);d3=(x+x3)*(x+x3)+(y-y3)*(y-y3);d4=(x+x4)*(x-x4)*(y+y4)*(y+y4);if(dll&d2l&d3l&d4l) h=0; / * 判断该点是否在塔外刃printf(该点高度为 dn”,h);)第 八 早第六章循环控制6.1输入两个正整数m 和 n ,求其最大公约数和最小公倍数。main()long m,n,i=lj,s;scanf(H%ld,%ldH,&m,&n);for(;i=m&i=n) j=m;else j=n;for(;! (j % m=0&j% n=0) ;j+);printf(Hs=%ldj=%ldnH,sJ);)6 .2

29、 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。#include * stdio.h * *main()char c;int i=O,j=O,k=O,l=O;while(c=getchar ()!=*n *)if(c=65&c=97&c=48&c=57) j+;else if(c=32) k+;else 1+;printf(Hi=%dJ=%d,k=%d,l=%dnH,ij,k,l);)6.3 求 Sn=a+aa+aaa+, , ,+aa , , aaa ( 有 n 个 a )之值,其中 a是一个数字。例如:2+22+222+2222+22222 (n=5), n 由键盘输入

30、。#includeH math.hmain()int n,sum=0,i=l,s=2;scanf(H%dH,&n);while(i=n)sum=sum+s;s=s+2*pow(10,i);i+;printf(Hsum=%dnH,sum);)6.4 求 ,( 即求 l!+2!+3!+4!+5!+20!)main()int n,i=l;long sum=O,s=l;scanf(H%dH,&n);while(i=n) s=s*i;sum=sum+s;i+;printf (* * sum= % ldn * * ,sum);)6 .5 求main()double i=lj=l,k=l,sl=0,s2=0

31、,s3=0,sum;for(;i=100;i+) sl=sl+i;for(;j=50;j+) s2=s2+j*j;for(;k=100&x1000)a=0.01*x;b=10*(0.01*x-a);c=x-100*a-10*b;if(x=(pow(a,3)+pow(b,3)+pow(c,3) printf(M%5dM,x);x+;)6.7 一个数如果恰好等于它的因子之和, 这个数就称为“ 完数例如,6的因子为1、2、3 ,而6=1+2+3,因此6是“ 完数” 。编程序找出1000之内的所有完数,并按下面格式输出其因子:6 its factors are 1、2、3main()int m,i,j

32、,s;for(m=6;m10000;m+)s=l;for(i=2;im;i+)if(m%i=O) s=s+i;if(m-s=O)printf(H%5d its fastors are 1 * ,m) ;for (j=2; j m; j+)if(m%j=0)printf(M%d HJ);printf(HnH);)或main()int m,i,j,s;for(m=6;m1000;m+)s=m-l;for(i=2;im;i+)if(m%i=0) s=s-i;if(s=0)printf(H%5d its fastors are 1 * ,m) ;for (j=2; j m; j+)if(m%j=0)p

33、rintf(M%d HJ);printf(HnH);6.8 有一分数序列:求出这个数列的前20项之和。main()(int i=l,n;double t,x=hy=2,s,sum=0;scanf(n%ld,&n);while(i=n)(s=y/x;sum=sum+s;t=y;y=y+x; x=t;i+;)printf(%fn,sum);scanf(ld”,&n);)6.9 一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第 10次反弹多高?main()int i,n;double h=100,s=100;scanf(H%dH,&n);for(i

34、=l;i=n;i+)h*=0.5;if(i=l) continue;s=2*h+s;printf(Hh=% f,s= %fnH,h,s);6.10 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。main()int i=l,sum=0;for(;i=0.00001);printf(H%.3fnH,xl);)6.12 用牛顿迭代法求方程在1.5附近的根。main()double x,y;x=1.5;doy=2*x*

35、x*x-4*x*x+3*x-6;x=x-y/(6*x*x-8*x+3);while(y!=0);printf(Hx=%.3fnH,x);)6.13 用二分法求方程在(-10, 10)之间的根main()double xl,x2,yl,y2;xl=-10;x2=10;doyl=2*xl*xl*xl-4*xl*xl+3*xl-6;xl=xl-yl/(6*xl*xl-8*xl+3);while(yl!=O);doy2=2*x2*x2*x2-4*x2*x2+3*x2-6;x2=x2-y2/(6*x2*x2-8*x2+3);while(y2!=0);printf(Hxl=%.3f,x2=%.3fnH,x

36、l,x2);)6.14打印以下图案*#includeH math.h main()int ij,k;for(i=0;i=3;i+)for(j=0;j=2-i;j+)printf(H );for(k=0;k=2*i;k+)printf(,*M);printf(HnH);)for(i=0;i=2;i+)for(j=0;j=i;j+)printf(H H);for(k=0;k=4-2*i;k+)printf(,*M);printf(HnH);第七章第七章数组7 .1用筛法求之内的素数。main()intij,a100;for(i=2;i100;i+) ai=i;for(j=2;j=i;j+) ifg

37、 )if(ai%j=O)break;if(ai-j=O)printf(H%5dH,ai);)printf(HnH);)或#includeH math.h main()static int i,j,k,a98;for(i=2;i100;i+)ai=i;k=sqrt(i);for(j=2;j=ai;j+)ifO=k+l)printf(, ,%5d,ai);)printf(HnH);)7.2用选择法对10个整数从小到大排序。main() int ij,a10,t;for(i=0;i10;i+)scanf(H%dH,&ai);for(j=l;j10;j+)for(i=0;iai+l)t=ai+l;ai

38、+l=ai;ai=t;for(i=0;i10;i+)printf(, ,%5d,ai);或main()static int a10,iJ,k,t;for(i=l;ill;i+)scanf(H%dH,&ai);for(j=l;j10;j+)for(i=l;iai+l)t=ai+l;ai+l=ai;ai=t;for(i=l;ill;i+)printf(H%dH,ai);printf(HnH);)7.3求一个3X 3矩阵对角线元素之和。main()int i=0j=0,a33,sl,s2;for(i=0;i3;i+)for(j=0;j3;j+)scanf(H%dH,&aij);sl=a00+all+

39、a22;s2=a02+all+a20;printf(Hsl=%d,s2=%dnH,sl,s2);)或main()(static int i,j,sl,s2,a33;for(i=l;i=3;i+)for(j=l;j0;i-)if(aiai-l)t=ai-l;ai-l=ai;ai=t;for(i=0;i10;i+)printf(H%5d,ai);printf(HnH);)或main()(static int a5=l,4,5,6,7;intscanf(H%dH,&b);for(i=0;i5;i+)if(b=ai)t=ai;ai=b;b=t;printf(H%d H,ai);printf(H%dH,

40、b);)7.5将一个数组的值按逆序重新存放, 例如, 原来顺序为: 8,6, 5, 4, lo 要求改为:1, 4, 5, 6, 8omain()int i,b10;for(i=0;i-l;i )printf(H%5dH,bi);printf(HnH);7.6打印出以下杨辉三角形( 要求打印出10行) 。11 11 2 113 3 11 4 6 4 11 5 10 10 5 1*main() static int m,n,k,b1515;bOl=l;for(m=l;m15;m+)for(n=l ;n=m;n+) bmn=bm-ln-l+bm-ln;printf(H%-5dH,bmn);prin

41、tf(HnH);或main()intij,n,k,a1010;static ,1,1,1,1,1,1,1,1;all=l;for(k=2,kll ;k+)for(i=2;i=k;i+)for(j=2;j=i;j+)aiU=ai-lU-l+ai-lU;for(k=l ;kll ;k+)for(i=l;i=k;i+)for(j=l;j=i;j+)7 . 7打印“ 魔方阵 , 所谓魔方阵是指这样的方阵, 它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为8 1 63 5 74 9 2要求打印出由1n 2的自然数构成的魔方阵。解:#include main() int a1616,i,i,k,p

42、,m,n;P=l;while(p=l) / * 要求阶数为 115的商数* / printf(HEnter n(n=115):”);scanf(n%dn,&n);if(n!=0)&(n=15)&(n%2!=0) p=0;)for(i=l;i=n;i+) / * 初始化* /for(j=l;j=n;j+) aij=O;j=n/2+l; / * 建立魔方阵* /alj=l;for(k=2;k=n*n;k+)j=j+l;if(in)i=i+2;j=j-l;else if(in) j= l;)if(aij=O) aij=k;else i=i+2;j=j-l;aij=k;)for(i=l;i=n;i+)

43、 for(j=l;j=n;j+)printf(H%4dH,aij);printf(HnH);/ * 输出魔方阵7 .8找出一个二位数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。main()int a55,b5,c5,d55,k=0,l=0;int ij;for(i=0;i5;i+)for(j=0;j5;j+)scanf(H%dH,&dij);for(i=0;i5;i+)for(j=0;j5;j+,aij=dij);for(i=0,k=0;i5;i+,k+)for(j=0;j=aij+l)bk=aij+l=aij;elsebk=aiU+l;)for(j=0,l=0;j

44、5;j+,l+)for(i=0;i4;i+)if(aij=ai+lj)cl=ai+lj=aij;elsecl=ai+lj;)for(i=0,k=0;i5;i+,k+)for(j=0,l=0;j5;j+,l+)if(dij-bk=O)if(dij-cl=O)prmtf(Hd%d%d=%dnH,i,j,dij);elseprintf(Hd%d%d=%d isnot andinH,ij,dij);7.9有个15数按由小到大顺序存放在一个数组中, 输入一个数,要求用折半查找法找出该数组中第几个元素的值。如果该数不在数组中,则打印出“ 无此数”#includeH math.h main()static

45、intij,m,a15=l,4,9,13,21,34,55,89,144,233,377,570,671,703,812) ;scanf(, ,%d,&m);for(j=0;j15;j+)printf(H%4dH,aj);printf(HnH);i:7;while(fabs(i-7)8)if(ma7)if(ai-m=O)printf(*it is at (%d)nH,i+l);break;i+;elseprintf(H8nH);)if(fabs(i-7)-8=0)printf(HThere is notnH);)7.10有一篇文章,共有3行文字,每行有个8 0字符。要求分别统计出其中英文大写字

46、母、小写字母、空格以及其它字符的个数。main()int i,j=0,k=0,l=0,m=0,n=0;charstr0301,strl100,str2100,str3100;gets(str 1) ;gets(str2) ;gets(str3);strcat(str0,strl);strcat(str0,str2);strcat(str0,str3);for(i=0;str0i!=,0,;i+)if(str0i=65&str0i=97&str0i=48&str0i=57) 1+;else if(str0i=32) m+;else n+;printf(HDaxie Xiaoxie Shuzi K

47、ongge QitanH);printf(H%5d %7d %5d %6d %4dnHJ,k,l,m,n);7.11打印以下图案* * * * * * * * * * * * * * * * *main()int ij,k;char a55;for(i=0;i5;i+)for(j=0;j5;j+)printf(HnH);for(k=l ;kZ a-zB-Y b-yC-X c-x 即第一个字母变成第2 6个字母, 第i个字母变成第(26-i+l)个字母。非字母字符不变,要求编程序将密码回原文,并打印出密码和原文。main() int i;char strl100,str2100;gets(str

48、l);for(i=0;strli!=,0,;i+)if(strl i=65& &strl i=97&strliS2,输出一个正数;S 1 = S 2 ,输出0; S 1 S 2 ,输出一个负数。不要用strcp y函数。 两个字符串用g e ts函数读入。 输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的A S C II码的差值。例如,A,与,C相比,由 于 应 输 出 负 数 ,由于公, 与,C的码差值为2 , 因此应输出“ 2。同理:“And和“ Aid”比较,根据第 2 个字符比较结果,笃比宇大5 , 因此应输出“5”。#include #include main() int

49、i,resu;charsl100,s2100;printf(nn input stringl :);gets(sl);printf(nn Input string2 : ) ;gets(s2);i=0;while(sli=s2i&sli!=,0,) i+;if(sli=,0,&s2i=,0,) resu=O;else resu=sli-s2i;printf(nn result: %dnn,resu);7.15编写一个程序, 将字符数组s2中的全部字符拷贝到字符数组s i 中, 不用strcpy函数。 拷贝时, a0他要拷贝过去, 人 ( T后面的字符不拷贝。解:#include stdio.h

50、main()charsl80,s280;int i;printf(*Input s2: );scanf(H%sH,s2);for(i=0 ;istrlen(s2) ;i+)sli=s2i;printf(ns l: %sn*,sl);)第八章第 八 章 函 数1 .1 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。maxyueshu(m,n)int m,n; int i=l,t;for(;i=m&i=n) j=m;else j=n;for(;! (j % m=0&j% n=0) ;j+);return j;)main()int a,b,

51、max,min;printf(Henter two number is:);scanf(H%d,%dH,&a,&b);max=maxyueshu(a,b);min=minbeishu(a,b);printf(H max= % d,min= % dn H,max,min);8.2求方程的根,用三个函数分别求当b2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。#includeH math.h float yishigen(m,n,k)float m,n,k;float xl,x2;xl=(-n+sqrt(k)/(2*m);x2=(-n-sqrt(k)/(2*m);

52、printf(Htwo shigen is xl=% .3f and x2=%.3fnH,xl,x2);)float denggen(m,n)float m,n;float x;x=-n/(2*m);printf(Hdenggen is x=%.3fnH,x);)float xugen(m,n,k)float m,n,k;float x,y;x=-n/(2*m);y=sqrt(-k)/(2*m);printf(utwo xugen is xl=%.3f+%.3fi andx2=%.3f-% .3fin n,x,y,x,y);)main()float a,b,c,q;printf(input a

53、 b c is n);scanf(H%f,%f,%fn,&a,&b,&c);printf(nnH);q=b*b-4*a*c;if(q0) yishigen(a,b,q);else if(q=0) denggen(a,b);else xugen(a,b,q);)8 .2 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。psushu(m)int m;int i=2,t;for(;i=m;i+)if(m % i=0&im) break;if(m-i=O) t=l;else t=0;return m;)main()int a,s;printf(Henter sushu is nH);

54、scanf(H%dH,&a);s=psushu(a);if(s=l) printf(Ha is sushunH);else printf(Hs is not sushunH);)8 .4 写一个函数,使给定的一个二维数组(3 X 3 ) 转置,即行列互换。int zhuangzhi(b)int b33;int ij,t;for(i=0;i=i&j3-i;j+)t=biU;bij=bUi;bUi=t;)main()inta33;int ij;for(i=0;i3;i+)for(j=0;j3;j+)scanf(H%dH,&aij);for(i=0;i3;i+)for(j=0;j3;j+)print

55、fC, %d,aij);printf(HnH);zhuangzhi(a);for(i=0;i3;i+)for(j=0;j-l ;i+,j-)strli=str2j;)8.6写一函数,将两个字符串连接。lianjie(a,b)chara100,b100;strcat(a,b);)main()char strl100,str2100;gets(strl);gets(str2);lianjie(strl,str2);puts(strl);8 .7 写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出。fuzhi(a,b)chara100,b100;int iJ=O;for(i=0;ai!=

56、,0,;i+)if(ai=97llai=101llai=105llai=lllllai=117llai=6511ai=69llai=73llai=85) bj=ai;j+;)main()char strl100,str2100;gets(strl);fuzhi(strl,str2);puts(str2);)8 .8 写一函数,输入一个四位数字,要求输出这四个数字字符, 但每两个数字间空格。 如输入1990,应输出“1_9_9_0”。char f(b)char b4;int i=0;for(;i=65&strOi=97&strOi=48&str0i=57) bl+;else if(str0i=3

57、2) b2+;else b3+;)main()char strl100;static int i,a4;gets(strl);tongji(strl,a);printf(Hzimu Shuzi Kongge QitanH);for(i=0;i=97&strli=65&strli=t) strcpy(wordO,wordl);)main()char str0100,longword15;gets(strO);cechang(strO,longword);puts(longword);)8.11写一函数用起泡法对输入的个字符按由小到大的顺序排列。int paixu(x)int x;int ij,t

58、;forg=l;j10;j+)for(i=0;ixi+l) t=xi+l;xi+l=xi;xi=t;)main()int y10;int i;for(i=0;i10;i+)scanf(H%dH,&yi);paixu(y);for(i=0;i10;i+)printf(H%5dH,yi);printf(HnH);)8.12用牛顿迭代法求根。方程为: ,系数a, b, c, d 由主函数输入。 求 X 在 1 附近的一个实根。 求出后由主函数输出。double qigen(s,t,u,v)int s,t,u,v;double x,y;x=l;doy=s*x*x*x+t*x*x+u*x+v;x=x-y

59、/(3*s*x*x+2*t*x+u);while(y!=O);return x;)main()int a,b,c,d;double x;scanf(H%d,%d,%d,%dH,&a,&b,&c,&d);x=qigen(a,b,c,d);printf(Hx=%.3fnH,x);)8.13用递归方法求n阶勒让德多项式的值递归公式为float p(xO,n)int n;float xO;float y;if(n=0lln=l) if(n=l) y=xO;else y=l;else y=(2*n-l)*x0*p(x0,n-l)-(n-l)*p(x0,n-2)/n;return(y);main()flo

60、at x,yO;int a,i;scanf(H%f,%dH,&x,&a);yO=p(x,a);printf(HyO=%.3fnH,yO);)8.14输入10个学生5门课的成绩,分别用函数求:每个学生平均分;每门课的平均分;找出最高分所对应的学生和课程;求平均分方差:6 =SXiA2/n-(SXi/n)A2 ,为一学生的平均分float xl10,x25;float pp(),cc(),find(),xx();main()char name1020,class520;floatscore105,o,k=0,max5;int a5,i,j;for(i=0;i10;i+)gets(namei);fo

61、r(j=0;j5;j+) gets(classj);for(i=0;i10;i+)for(j=0;j5;j+)scanf(H%fH,&scoreij);pp(score);cc(score);find(score,max,a);o=xx(k);for(i=0;i10;i+)puts(namei);printf(H%.3fnH,xli);for(j=0;j5;j+)puts(classj);printf(H%.3fnH,x2j);for(j=0;j5;j+) prmtf(H%.3fnH,maxj);puts(nameaj);puts(classj);printf(Ho=%.3fnH,o);)fl

62、oat pp(f)float f105;float sum=0;int ij;for(i=0,sum=0;i10;i+)for(j=0;j5;j+)sum=sum+fij;xli=sum/5;float cc(y)float y105;float sum=0;int ij;for(j=0;j5;j+)for(i=0;i10;i+)sum=sum+yij;xlj=sum/10;)float find(z,s,t)float z105,s5;int t5;int ij;for(j=0,sj=z0j;j5;j+)for(i=0;i10;i+)if(sUziUD sj=zij;tj=i;)float

63、xx(q)float q;float f=0,e=0;int i;for(i=0;i10;i+)e=xli*xli+e;f=f+xli;q=e/10-(f/10)*(n0);return(q);)8.15写几个函数:输个职工的姓名和职工号;按职工号由小到大顺序排序,姓名顺序也随之调整;要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。#define N 10find(a,b)inta,b;inti,j,s,t,cN2;for(i=0;iN;i+)cil=ai;cil=i;for(i=0;iN;i+)for(j=0;jci+l0)t=ci0;ci0=ci+

64、l0;ci+l0=t;s=cil;cil=ci+ll;ci+ll=s;for(i=0;iN;i+)bi=cil;return;)lookfor(h,k)int h,k;int ij;for(i=0;iN;i+)if(hi-k=0) j=i;return j;)main()int numberN,xN,iJ,u,p;char nameN20;for(i=0;iN;i+)gets(namei);scanf( %dn,&numberi);scanf(H%dH,&p);find(number,x);u=Iookfor(number,p);for(i=0;i-l;i+)if if(48=shui=57)

65、 sum=sum+(shui-48)*pow(16,(i-l);else if(65=shui=90) sum=sum+(shui-55)*pow(16,(i-l);else if(97=shui0.1 ;j+,b/=10);pf(a,j-l);for(i=0,k=j-l;i-l ;i-J+)xi=(int)(unsigned long)(m/pow(10,j)% 10)+48;return;)main()unsigned long a,b;int j,i;scanf(H%ldH,&a);for(j=0,b=a;b0.1 ;j+,b/=10);pf(aj);puts(x);printf(M %

66、dnn j);或#includeH math.h int x10;unsigned long m;pf(n)int n;int y;if(n=O) y=m%10;x0=y;else y=(unsigned long)(m-pf(n-l)/pow(10,n)%10;xn=y;return(y);)main()unsigned long a;int i,j,k;char cll;scanf(H%ldH,&m);for(j=0,a=m;a0.1;j+,a/=10);pfO-1);for(i=0,k=j-l;ij;i+,k-)ci=xk+48;c10=,0,;puts(c);8.18给出年、月、日,计

67、算该日是该年的第几天。int find(x,y,z)int x,y,z; int i,t,s,days=0;if(x%4=0) t=l;else t=0;for(i=l;i b、c为三角形的三边。定义两个带参的宏S, 一个用来求a r e a ,另一个宏用来求。写程序,在程序中用带实参的宏名来求面积areao#includeH math.h #define SSS(m,n,k) (m+n+k)/2#define AQRT(m,n,k)sqrt(SSS(m,n,k)*(SSS(m,n,k)-m)*(SSS(m,n,k)-n)*(SSS(m,n,k)-k)main()float a,b,c,s,a

68、rea;scanf(H%f %f %fH,&a,&b,&c);s=SSS(a,b,c);area=AQRT (a,b,c);printf(Hs=%.3f area=% .3fn11 ,s,area);)或#includeH math.h #define SSS(m,n,k) (m+n+k)*0.5#define AQRT(m,n,k)sqrt(m+n+k)/2)*(m+n+k)/2-m)*(m+n+k)/2-n)*(m+n+k)/2-k)main()float a,b,c,t,area;scanf(H%f %f %fH,&a,&b,&c);t=SSS(a,b,c);area=AQRT (a,b

69、,c);printf(Ht=% .3f;area= % .3fn ,t,area);或#includeH math.h #define SSS(m,n,k) (m+n+k)/2)#defineAQRT(m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k)sqrt(SSS*(SSS-m)*(SSS-n)*(SSS-k)main()float a,b,c,t,area;scanf(H%f %f %fH,&a,&b,&c);t=SSS(a,b,c);area=AQRT(a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,

70、b,c,a,b,c,a,b,c) ;printf(Ht=% .3f;area= % .3fn ,t,area);)9.4给年份y e a r ,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y ,既定义宏的形式为#define LEAP_YEAR(y)( 读者设计的字符串)在程序中用以下语句输出结果:if (LEAP_YEAR(year) printf(H%d is a leap year,year);else printf (H%d is not a leap year,year);#define LEAPYEAR(y) y%4main()int y;sca

71、nf(H%dH,&y);if(LEAPYEAR(y) printf(H%d is a not leap yearn,y);else printf(H%d is a lear yearnH,y);)9 .6 请设计输出实数的格式,包括:一行输出一个实数;一行内输出两个实数;一行内输出三个实数。实数用6.2f”格式输出。#define PRl(x) printf(H%6.2fnH,x)#define PR2(x) printf(H % 6.2ft% 6.2fnH ,x,x)#define PR3(x) printf(H % 6.2ft% 6.2ft% 6.2fnH ,x,x,x)main()flo

72、at a;scanf(H %fH,&a);PRl(a);PR2(a);PR3(a);)9 .7 设计所需的各种各样的输出格式( 包括整数、实属、字符串等) ,用一个文件名fornat.h,把信息都放到这个文件内,另编一个程序文件,用命令#inchide fornat.h”以确保能使用这些格式。分别用函数和带参的宏,从三个数中找出最大的数。#define MAX(a,b,c) (a(bc)? b:c)? a:(bc)? b:c)main()float x,y,z,t;scanf(H%f,%f,%fH,&x,&y,&z);t=MAX(x,y,z);printf(H%.4fnH,t);)9.10用条

73、件编译方法实现以下功能:输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母( 如W变成b 我变成, a , 其它字符不变) 。用命令来控制是否要译成密码。例如:#define CHANGE 1则输出密码。若:#define CHANGE 0则不译为密码,按原码输出。#define CHANGE 1main()char str80,c;int i=0;gets(str);while(stri!=,O,)#if CHANGEif(stri=90llstri=122) stri=stri-25;else if(stri=65&stri=97&stri=65&*c=97&*c*

74、p2)t=pl;pl=p2;p2=t;if(*pl*p3)t=pl;pl=p3;p3=t;if(*p2*p3)t=p2;p2=p3;p3=t;printf(H%d,%d,%dnH,*pl,*p2,*p3);或main()int a,b,c,*pl,*p2,*p3,t;scanf(H %d,%d,%dH,&a,&b,&c);pl=&a;p2=&b;p3=&c;if(ab)t=*pl;*pl=*p2;*p2=t;if(ac)t=*pl;*pl=*p3;*p3=t;if(bc)t=*p2;*p2=*p3;*p3=t;printf(M % d, % d, % dnH,a,b,c);)10.2输入三个字

75、符串,按由小到大的顺序输出#define N 3#define M 20main()char strONM,strlM,*p,*q;intq=strO;for(;p0)strcpy(strl,q);strcpy(q,q+l);strcpy(q+l,strl);m=strcmp(q,q+2);if(m0)strcpy(strl ,q);strcpy(q,q+2);strcpy(q+2,strl);n=strcmp(q+l,q+2);if(n0)strcpy(strl,q);strcpy(q+l,q+2);strcpy(q+2,q+l);for(p=q;pq+N ;p+)puts(p);)10.3

76、输入1 0个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数;输入10个数;进行处理;输出10个数。f(x,n)int x,n;int *p0,*pl,ij,t,y;i=j=x0;p0=pl=x;for(y=0;yi)i=xy;pO=&xy;else if(xyj)j=xy;pl=&xy;t=*pO;*pO=xn-l;xn-l=t;t=*pl;*pl=xO;xO=t;return;)main()int a10,u,*r;for(u=0;u10;u+)scanf(H%dH,&au);f(a,10);for(u=0,r=a;u10;u+,r+)printf(M %dH,a

77、u);printf(HnH);)10.4有n个整数, 使前面各数顺序向后移m个位置, 最后m个数变成前面m个数,见图。写一函数:实现以上功能, 在主函数中输入n个数和输出调整后的n个数。#define N 10void shift(p,x)float *p;int x;float aN,*q,*o;int i;o=a;q=p;for(i=0;i=q;p-)*p=*(p-x);for(i=0;ix;i+)*(q+i)=*(o+i);return;main()float shuzhuN,*u,*v;int h,i;u=v=shuzhu;scanf(H%fH,&h);for(;uv+N;u+)sca

78、nf(H%fH,u);shift(v,h);for(u=v;uv+N ;u+)printf(M%.2f M,*u);printf(HnH);10.5有 n 人围成一圈,顺序排号。从第1 个人开始报数( 从1 到 3 报数) , 凡报到3 的人退出圈子,问最后留下的是原来的第几号的那位。#define N 5main()int i,j,k,aN+l,*p;for(i=0,p=a;p(a+N)p=a+l;if(*p!=0)i+;if(i-3)=0)*p=0;i=0;k-;P+;)for(i=l;i=3)days+=l;printf( Hn % d/% d is the %dth dayin%d.H

79、,date.month,data.day,days,date,year);11.2写一个函数days,实现上面的计算。由主函数将年、月、日传递给d ays函数,计算后将日数传回主函数输出。解:struct y_m_dint year:int month;int day;date;intdays(struct y_m_d datel)int sum;switch(data.month)case l:sum=datel.day;break;case 2:sum=datel.day+31;break;case 3:sum=datel.day+59;break;case 4:sum=datel.day

80、+90;break;case 5:sum=datel.day+120;break;case 6:sum=datel.day+151;break;case 7:sum=datel.day+181;break;case 8:sum=datel.day+212;break;case 9:sum=datel.day+243;breakcase 10:sum=datel.day+243;breakcase 11 :sum=datel.day+243;breakcase 12:sum=datel.day+243;break) ;11.3编写一个函数print,打印一个学生的成绩数,该数组中有 5 个学生的

81、数据记录, 每个记录包括num、 name、 sore3,用主函数输入这些记录,用 print函数输出这些记录。解:#define N 5struct studentchar num6;char name8;int score4;stuN;main()int IJ ;for(I=0;IN;I+)printf(HInput score of student %d:nH,I+l);printf(Hno.:H);scanf(H %sH,stui.num);printf(Hname:H);scanf(H %sH,stui.name);for(j=0;j3;j+)printf(Hscore%d:Hj+l

82、);scanf(H%dH,&stui.scorej);)printf(HnH);)print(stu);)print(struct student stu6)int IJ;printf(H%5s%10sH,stui.num,stui.name);for(j=0;j3;j+)printf(H %9dH,stui.scorej);print(HnH);)11.4在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。解:#define N 5struct studentchar num6;char name8;int score4stuN;input(struct student st

83、u)int IJ;for(I=0;IN;I+)printf(Hinput scores of student %d:nH,I+l);printf(HNO.:H);scanf(H %sH,stui.num);printf(Hname:);scanf(H%sH, stui.name);for(j=0;j3;j+)printf(Hscore%d:HJ+);scanf(H%dH, &stui.scorej);)printf(HnH);11.5有1 0个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据( 包括学号、姓名、3

84、门课成绩)解:#define N 10struct studentchar num6char name8int score4float avr;stuN;main()int IJ,max,maxi,sum;float average;for(I=0;IN;I+)printf(HnInput scores of student %d:nH,I+l);printf(HNO.:n);scanf(H %sH,stui.num);printf(HnameH);scanf(H %sH,stui.name);for(j=0;j3;j+)printf(Hscore %d:H,j+l);scanf(H%dH,

85、&stui.scorej);average=O;max=O;maxi=O;for(i=0;i3;i+)sum=O;for(j=0;jmax)max=sum;maxi=I;)average/=N;printf(HNO. name scorel score2averagell);for(I=0;IN;I+)printf(H%5s%10sH,stui.num, stui.name);score3for(j=0;j3;j+)printf(H %9dH,stui.scorej);printf(H %8.2fnH,stui.avr);)printf(H average= % 6.2fn ,average)

86、;printf(HThe highest score is: % s,scoretotal: %d.Hstumaxi.name,max);)11.6编写一个函数new,对 n 个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。New(n)表示分配n 个字节的内存空间。解:new函数如下:#define NULL 0#define NEWSIZE 1000char newbuf NEWSIZE;char *newp=newbuf;char *new(int n)if (newp+n=newbuf)&(pnewbuf+NEWSIZE)newp=p;)11.8 已有a、b 亮光链

87、表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。解:#include#define NULL 0#define LENsizeof(struct student)strut studentlong num;int scor;struct student *next);struct student listA,listB;int n,sum=O;main()struct student *creat(void);struct student *insert(struct student *,struct student *);void print(struct stude

88、nt *);stuct student *ahead , *bhead,*abh;printf(Hninput list a:nH);ahead=creat();sum=sum+ln;abh=insert(ahead,bhead);print(abh);)struct student *creat(void)struct student *pl,*p2,*head;n=0;pl=p2=(struct student *)malloc(LEN);printf(input number&scores of student:nH);printf(Hif number Is 0,stop inputi

89、ng.nH);scanf(H%ld,%dH,&pl-num,&pl-score);head=NULL;while(pl-num!=O)n=n+l;if(n=l)head=pl;else p2-next =pl;p2=pl;pl=(struct student *)malloc(LEN);scanf(H%ld%dH,&pl-num,&pl-score);)p2-next=NULL;return(head);)struct student *insert(struct student *ah,struct student *bh)struct student *pal, *pa2,*pbl,*pb

90、2;pa2=pal=ah;pb2=pbl=bh;dowhile(pbl-numpal-num)&(pal-next!=NULL)pa2=pal;pal=pal-next;)if(pb-numnum)if(ah=pal)ah=pbl;else pa2-next=pbl;pbl=pbl-next;pb2-next=pal;pa2=pb2;pb2=pbl;)while(pal-next!=NULL)ll(pal=NULL&pbl!=NULL);if(pbl-numpal-num)&(pal-next=NULl)apl-next=pbl;return(ah);)void print(struct st

91、udent *head)struct student *p;printf(H%ld% dn * * ,p-num,p-score);p=p-next;while(p!=NULL);)11.9 13个人围成一圈,从第1 个人开始顺序报号1、2、3 o凡报到“3”者退出圈子。找出最后留在圈子中的人原来的序号。解:#define N 13struct personint number;int nextop;linkN+l;main()int I,count,h;for(I=l;I=N;I+)if(I=N)linki.nextp=l;elselinki.nextp=I+l;linki.number=I

92、;)printf(HnH);count=0;h=N;printf(sequence that person! leave the circle:nH);while(countN-l)1=0;while(I!=3)h=linkh.nextp;if(linkh.number)I+;)printf(H %4dH,linkh.number);linkh.number=O;count+;)printf(HnThe last one isH);for(I=l;ii=N;I+)if(linki.number)printf(H %3dH,lini.number);)11.10有两个链表a和b,设结点中包含学号

93、、姓名。从1链表中删去与b链表中有相同学号的那些结点。解:# define LA 4# define LB 5# define NULL 0struct studentchar nump6;char name8;struct student *next;ALA,bLB;main()struct studentaLA=H101H,nWangH,H102H,HL r,H105H,zhangH,H106H,HWeiH;structstudentbLB=H103H,HZhangH,H104H,HMaH,H105H,HChen,H107H,HGuoH,H108H,HLuiH;int IJ;struct

94、student *p, *pl,*p2,*pt,*headl,*head2;headl=a;head2=b;printf(Hlist a :nH);for(pl=headl,i=l;plnext=a+I;printf(H%8s%8snH,pl-num,pl-name);pl=pl-next;p-next=NULL;printf(Hn list b:nH);for(p2=head2,I=l ;p2next=b+I;printf(H%8s% 8sn * * ,p2-num,p2-name);p2=pa-next;)p-next=NULL;printf(HnH);pl=headl;while(pl!

95、=NULL)p2=head2;while(p2!=NULL&strcmp(pl-num,p2-num)!=0)p2=p2-next;if(strcmp(pl-num,p2-num=0)if(pl=headl)headl=pl-next;elsep-next=pl-next;P=P1;pl=pl-next;pl=hedadl;printfHn result:nH;while(pl!=NULL)printf(H%7s %7snH,pl-num,pl-name);pl=pl-next;)11.11建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄

96、,则将此结点删去。解:#define NULL 0#define LEN sizeof(struct student)struct studentchar num6;char name8;char sex2;int age;stuct student *next;stu10;main()struct student *p,*pt,*head;int I,length,iage,flag=l;int find=O;while(flag=l)printf(Hinput length of list ( 1 0 ) ;scanf(H %dH,&length);if(length10)flag=0;)

97、for(I=0;Inext=p;pt=P;ptintf(HNO:H);scanf(H %sH,p-num);prntf(Hname:H);scanf(H %sH,p-name);printf(Hsex:H);scanf(H %sH,p-sex);printf(Hage:H);scanf(H %sH,p-age);p-next=NULL;p=head;printf(Hn NO. name sex agenH);while(p!=NULL)printf(H%4s%8s%6s%6dnH,p-num, p-name, p-sex,P-age);p=p-next;)printf(HInput age:*

98、);scanf(M %dn,&iage);pt=head;P=pt;if(pt-age=iage)p=pt-next;head=pt=p;find=l;)elsept=pt-next;while(pt!=NULL)if(pt-age=iage)p-next=pt-next;find=l;)else p=pt;pt=pt-next;)if(!find)printf(HNot found%d.H,iage);p=head;printf(Hn NO.name sex agenH);while(p!=NULL)(printf(H % 4s % 8s * ,p-num,p-name);printf(H%

99、6s%6dH,p-sex,p-age);p=p-next;)11.12将一个链表按逆序排列,即将链头当链尾,链尾当链头。解:# define NULL 0struct stuint num;struct stu *next;)main()int len=llstruct stu *pl,*p2,*head,*new,*newhead;pl=p2=head=(struct stu * )malloc(sizeof(strct stu);printf(Hinput number(O:list end):);scanf(H %dH,&pl-num);while(pl-num!=o)pl=(struc

100、t stu*)malloc(sizeof(struct stu);printf(H input number(n :listend):H);scanf(H %dH,&pl-num);if(pl-num=O)p2-next=null;elsep2=next=pl;p2=pl;len+;pl=head;pritnf(Hn the original list:nH);doprintf(H %4dH,pl-num);if(pl-next!=NULL)pl=pl-next;)while(pl-next!=NULL)p2=pl;pl=pl-next;)if(I=0)newhead=new=pl;elsen

101、ew=nes-next=pl;p2-next=NULL;)printf(nn The new listLn);pl=newhead;for(I=01 ;InumH);pl=pl-next,printf(HnH);第12章12. 1编写一个函数getbits,从一个16位的 单元中取出某几位( 即该几位保留原值,其余位为0 )。函数调用形式为:getbits(vahie,nl,n2洪 中value为该16位单元中的数据值,m为欲取出的起始位,n 2为欲取出的结束位。解:main()unsingned int a;int nl,n2;printf(Hinput an octal number:);

102、scanf(H%oH,&a);printf(Hinput nl,n2:H);scanf(H %d,%dH,&nl,&n2);printf(H result: % on H,getbits(a,n 1-1 ,n2);)getbits(unsigned value,int nl,n2)unsigned int z;z二 0;z=(znl)&(z(16-n2);return(z);)12.2写一个函数, 对一个16位的二进制数驱除它的奇数位。解:main()unsigned getbits(unsigned);unsigne int a;printf(Hninput an octal number:

103、*);scanf(H%oH,&a);printf(H result: % on getbits(a);)unsigner getbits(unsigned value)int I,j,m,n;unsigned int z,a q;z=0;for(I=l;I=15;I+=2)q=i;for(j=l;j0)moveright(a,n);printf(H result: % on H,moveright(a,n);)elsen=-n;moveleft(a,n);printf(H result: % on H,moveleft(a,n);unsigned moveright(unsigned valu

104、e,int n)unsigned z;z=(valuen)l(value(16-n);return(z);)unsigned moveleft(unsigned value,int n )unsigned z;z=(value(16-n)l(valuen);return(z);)12.5设计一个函数,使给出一个数的原码,能得到该数的补码。解:main()unsigned int a;unsigned int getbits(unsigned);pritf(nnlnput an octal number:*);scanf(H%oH,&a);printf(H result: % on H,getb

105、its(a);)unsigned int getbits(unsigned value)unsigned int z;z=value&0100000;if(z=0100000)z=-value+l;elsez=value;return(z);)第十三章13.4从键盘输入一个字符串, 将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件 test”中保存。输入的字符串以“ ! “ 结束。解:#include main()(File *fp;Char str100;Int1=0;If(fp=fopen(HtestH,HwH)=NULL)printf(HCan not open the fil

106、enH);exit(O);printf(HInput a string:nH);gets(str);while(stri!=,I,)if (stri=,a,&stri=,z,)stri=strI-32;fputc(stri,fp);I+;)fclose(fp);fp=fopen(HtestH,HrH);fgets(str,strlen(str)+l ,fp);printf(H%snH,str);fclose(fp);)13.5有两个磁盘文件“A“和“B”,各存放一行字母,要求把这两个文件中的信息合并( 按字母顺序排列) ,输出到一个新文件 C”中。解:#includemain()FILE *f

107、p;Int I,j,n,il;Char c100,t ,ch;If(fp=fopen(Ha lH,HrH)=NULL)printf(Hcan not open the filenH);exit(O);)printf(Hn file A:nH);for(I=0;(ch=fgetc(fp)!=EOF ;I+)ci=ch;putchar(ci);)fclose(fp);il=I;if(fp=fopen(Hb lH,HrH)=NULL)printf(Hn can not ipen the file);exit(O);)printf(Hn file B:nH);for(I=il;(ch=fgenc(fp

108、)!=EOF;I+)ci=ch;putchar(ci);fclose(fp);n=I;for(i=0;In;I+)for(j=I+l;jcj)t=ci;ci=cj;cj=t;printf(Hn file C:nH);fp=fopen(HclH,nwH);for(I=0;In;I+)putc(ci,fp);putchar(ci);)fclose(fp);)13.6有 5 个学生,每个学生有3 门课的成绩,从键盘输入以上数据( 包括学生号、姓名、三门课成绩) ,计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。解:#includestruct studentchar num10

109、;char name8;int score3;float ave;stu5;main()int IJ,sum;FILE *fp;For(I=0;I5;I+)printf(Hn input score of student%d:nH,I+l);printf(HNO.:n);scanf(H %sH,stui.num);printf(Hname:H);scanf(H %sH,stui.name);sum=0;for(j=0;j3;j+)printf(Hscore %d :Hj+l);scanf(H%dH,&stui.scorej);sum+=stu i.scorej;stui.ave=sum/3.0

110、)fp=fopen(HstudH,nwH);for(I=0;I5;I+)if(fwrite(&stui,sizeof(struct student),l,fp)!=l)printf(HFile write errornH);fclose(fp);fp=fopen(HstudH,nrH);for(I=0;I5;I+)fread(&stui,sizeof(struct student),l,fp);printf(H % s, % s, % d, % d, % d, % 6.2fnH,stui.num,stui.name,stui.score0, stui.scorel, stui.score2 ,

111、stui.ave);)13.7将上题stud文件中的学生数据按平均分进行排序处理,并将已排序的学生数据存入一个新文件stu-sort中。解:#include #define N 10struct studentchar num10;char name8;int score3;float ave;stN,temp;main()(FILE *fp;Int I,j,n;If(fp=fopen(HstudH,nrH)=NULL)printf(Mcan not open the file);exit(O);)printf(Hn file stud:);for(l=0;fread(&sti,sizef(s

112、truct student), 1 ?fp) I =0 ;I+)printf (* *n % 8s % 8s * * ,sti .nums ti .name);for(j=0;j3;j+)printf(H %8dH,sti.scorej);printf(H % 10.fH,sti.ave);fclose(fp);n=I;for(I=0;In;I+)for(j=I+l;jn;j+)if(sti.avestj.ave)temp=sti;sti=stj;stj=temp;)printf(Hnnow:n);fp=fopen(Hstu-sortH,HwH);for(I=0;In;I+)fwrite(&s

113、ti,sizeof(struct student),l,fp);printf(Hn % 8s % 8sH ,sti.num,sti.name);for(j=0;j3;j+)printf(H %8dH,sti.scorej);printf(M % 10.2fn,sti.ave);fclose(fp);)13.8将上题以排序的学生成绩文件进行插入处理。 插入一个学生的3门课成绩,程序先计算新插入学生的平均成绩,然后将它按平均成绩高低顺序插入,插入后建立一个新文件。解:#include struct studentchar num10;char name8;int score3;float ave;

114、st10,s;main()FILE *fp, * fpl ;int IJ,t,n;printf(Mn NO.:M);scanf(H %sH,s.num);printf(Hname:H);scanf(H %sH,s.name);printf(Hscorel,score2,score3:H);scanf(H %d,%d,%dH,&s, score0, &s. scorel, &s.score2);s.ave=(s.score0+s.scorel+s.score2)/3.0;if(fp=fopen(Hstu_sortH,nrH)=NULL)printf(Hcan not open file.);ex

115、it(O);)printf(Horiginal data:nH);for(l=0;fread(&sti,sizeof(struct student),l,fp)!=O;I+)printf(1 1n % 8s % 8s H ,sti .num,sti.name);for(j=0;js.ave&tn;t+);printf(Hnnow:nH);fpl=fopen(Hsortl.datH,HwH);for(I=p;jt;I+)fwrite(&sti,sizeof(stuct student),l,fpl);print(Hn % 8s % 8s * * ,sti,num,sti.name);for(j=

116、0;j3;j+)ptintf(H %8dH,sti.scorej);printf(M % 10.2fH,sti.ave);)fwrite(&s,sizeof(struct student),l,fpl);printf(Hn %8s%7s%7d%7d%7d% 10.2f * ,s.num,s.name,s.score0,s.scorel,s.score2,s.ave);for(I=t;In;I+)fwrite(&sti,sizeof(struct student),1 ?fpl);printf(Hn %8s%8sH,sti.num,sti.name);for(j=0;j3;j+)printf(H

117、 %8dH,sti.scorej);printf(H 10.2fH,sti.ave);fclose(fp);fclose(fpl);)13.9上题结果仍存入原有的stu_sort文件而不另建立新文件。解: #includestruct studentchar num10;char name8;int score3;float ave;st10,s;main()FILE *fp, *fpl;int I J,t,n;printf(HnNO.:H);scanf(H %s*,s.num);printf(Hname:H);scanf(H %s*,s.name);printf(H score 1 ,sco

118、re2,score3:H);scanf(n%d%d%dH,&s,score0+&s.scorel+&s.scorel,&s,score2);s.ave=( s.score0+ s.scorel+ s.score2)/3.0;if(fp=fopen(Hstu=sortH,HrH)=NULL)printf(Hcan not open the file.);exit(O);)printf(Horiginal data:nH);for(l=0;fread(&sti,sizeof(struct student),l,fp)!=O;I+)printf(* *n % 8s % 8s* * ,sti .num

119、,sti .name);for(j=0;js.ave+&tn;t+);ptintf(Hnnow:nH);fp=fopen(H stu_sortH J w );for(I=0;It;I+)fwrite(&sti,sizeof(struct student),l,fp);printf(Hn %9s%8s%8d%8d%8d% 10.2f * ,s.num,s.name,s.score0,s.scorel s.score2 s.ave);for(I=t;In;I+)fwrit(&sri,sizeof(struct srudent),l?fp);printf(Hn %8s%8sH,sti.num,sti

120、.name);for(j=0;j3;j+)printf(H %8dH,sti.scorej);printf(M % 10.2fH,sti.ave);)fclose(fp);)13.10有一磁盘文件emploee,内存放职工的数据。每个职工的数据包括:职工姓名、职工号、性别、年龄、住址、工资、健康状况、文化程度。要求将职工名和工资的信息单独抽出来另建一个简明的职工工资文件。解:#includestruct emploeechar num6;char name10;char sex2;int age;char addr20;int salary;char health8;char class10;

121、en10;struct empchar name10;int salary;em-case10;main()FILE *fpl, *fp2;int I,j;if(fpl=fopen(HemploeeH,HrH)=NULL)printf(Hcan not open the file.);exit(O);)printf(Hn NO. name sex age addr salary healthclassnH);for(l=0;fread(&emi,sizeof(struct emploee),l,fpl)!=p;I+)printf(Hn%4s%8s%4s%6s%10s%6s%10s%8sH,em

122、i.num,emi.name,emi.sex, emi.age, emi.addr, emi.salary,emi.health, emi.class);strcpy(em_casei.name, emi.name);em_casei.salary=eni.salary; A f f 4 %nr * 、nn4不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不);if(fp2=fopen(Hemp_salaryH,HwbH)=NULL)printf(Hcan not open the fi

123、le.);exit(O);forg=0;jI;j+)if(fwri阳 &en_casej,sizeof(stnict emp),l,fp2)!=l)printf(H error!);printf(Hn %12s%10dH,em_casej.name,em_casej.salary); A * 1 f f % y y y” );fclose(fpl);fclose(fp2);13.11从上题的“ 职工工资文件” 中删区一个职工的数据,再存回原文件。解:#incude #incude struct emploeechar name10;int salary;emp20;main()FILE *fp

124、;int I,j,n,flag;char name10;int salary;if(fp=fopen(H emp_salaryH,HrbH )=NULL)printf(Hcan not open file.);exit(O);)printf(Hn original data:);for(l=0;fead(&empi,sizeof(struct emploee),l,fp)!=O;I+)printf(Hn %8s %7dH,empi.name,empi.salary);fclose(fp);n=I;printf(Hn input name deleted:*);scanf(H %sH,name)

125、;for(fiag=l,I=0;flag&In;I+)if(strcmp(name,empi.name)=O)for(j=I;jn-l;j+)strcmp(name,empi.name)=Ofor(j=I;jn-l;j+)strcpy(empj.name,empj+l.name);empj.salary=empj+l.salary;)flag=O;)if(!flag)n=n-l;elseprintf(Hn Now,the content of file:nH);fp=fopen(Hemp-dalaryH,HwbH);for(I=p;In;I+)fwrite(&empi,sizeof(struc

126、t emploee),l,fp);fclose(fp);fp=fopen(H emp_salary Jr);for(l=0;fread(&empi,sezeof(struct emploee),l,fp)!=0;l+)printf(Hn%8s%7dH,empi.name,empi.salary);fclose(fp);)13.12从键盘输入若干行字符( 每行长度不等) , 输入后把它们存储到一磁盘文件中。再从该文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。解: #includemain()int I,flag;char str80,c;FILE *fp;Fp=fopen(H

127、textH,HwH);Flag=l;While(flag=l)printf(Hn Input string:nH);ges(str);fprintf(fp,H %sH,str);printf( * XnContinue? * *);c=getchar();if(c=,N,)ll(c=,n,)flag=0;getchar();)fcolse()fp;fp=fopen(HtextH,HrH);while(fscanf(fp,n%sH ,str) !=EOF)for(I=0;stri!=,0,;I+)if(stri=,a,)& (stri=,z,)stri-=32;printf (Hn % sn * * ,str);fclose(fp);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号