1、C语言程序设计第三版谭浩强课后习题答案完整版1.6C语言程序设计第三版谭浩强编写一个程序,输入 a、b、c 三个值, 输出其中最大值。main()课后习题答案完整版第一章1.5 请参照本章例题,编写一个 C 程序, 输出以下信息:*Very Good!*解:mian()int a,b,c,max;printf( “请输入三个数 a,b,c:n ” );scanf( “%d,%d,%”d ,&a,&b,&c);c1=a,c2=b,c3= c,c4= 101 ,c5= 116;printf( “a%cb%c n”,c1,c2,c3);printf( “ b%c %c” ,c4,c5);解:aa 口
2、 bb 口口口 cc 口口口口口口 abcA 口 N3.7要将 China 译成密码,译码规律是: 用原来字母后面的第 4 个字母代替原来的 字母例如,字母 A 后面第 4 个字母是 E . E代替A。因此,China应译为 Glmre 。请编一程序,用赋初值的方法使 cl 、c2、c3、c4、c5 五个变量的值分别为, C、h、i 、n、a经过运算,使 cl、c2、c3、c4、c5分别变为G、 I 、 m r、 e,并输出。main() charc1= C ,c2= h ,c3= i ,c4= n ,c 5= a ;c1+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf(
3、密 码是 c%c%c%c%cn,c1,c2,c3,c4,c5);运行结果:密码是 GImre解:1 )x+a%3*(int)(x+y)%2/43.9 求下面算术表达式的值。设 x=2.5,a=7,y=4.73.12 写出下面表达式运算后 a 的值,设原y+z=%5.2fJ II I! a,o rJ II I! a,o rmain()int a=3,b=4,c=5;long int u=51274,n=128765;float x=1.2,y=2.4,z=3.6;char c1= a,c2= b;printf(a=%2d b=%2d c=%2dn,a,b,c);printf(x=%f,y=%f,
4、z=%fn,x,y,z);printf(x+y=%5.2fz+x=%5.2fn,x+y,y+z,z+x);printf(u=%6ld n=%9ldn,u,n);n,c1= ,c1,(ASCII);n,c2= ,c2,(ASCII);47 用 scanf 下面的函数输入数据, 使 a=3,b=7, x=8.5 , y=71.82 , c仁/ Ax, c2= x amain()int a , b; float x , y;char c1c2 ;scanf ( a=%d_b=%d, &a, &b);scanf ( _x=%f_y=%e,&x, &y);scanf (_c1 =%c_c2=%c , &
5、c1, &c2);a=3_b=7_x=8.5_y=71.82_c1=A_c2=a4. 8设圆半径r=1.5,圆柱高h=3,求圆周 长、圆面积、圆球表面积、圆球体积、圆柱 体积。用 scanf 输入数据,输出计算结果, 输出时要求文字说明,取小数点后两位数 字。请编程序。main()float r,h,C1,Sa,Sb,Va,Vb;C1=2*3.14*r;Sa=3.14*r*r;Sb=4*Sa;Va=4*3.14*r*r*r/3;Vb=Sa*h;printf(C1=%.2fn,C1);printf(Sa=%.2fnSb=%.2fnVa=%.2fnVb=%.2fn,Sa,Sb,Va,Vb);4 9
6、 输入一个华氏温度,要求输出摄氏温度。公式为c=5(F-32)/9输出要求有文字说明,取位 2 小数。printf(c=%.2f,c);410 编程序,用 getchar 函数读入两个字符给cl、c2,然后分别用函数和函数输出 这两个字符。并思考以下问题:(1)变量 c1 、 c2 应定义为字符型或整形?抑二者皆 可?(2)要求输出cl和c2值的ASCII码, 应如何处理?用 putchar 函数还是 printf 函数? (3)整形变量与字符变量是否在任 何情况下都可以互相代替?如:char c1 , c2;与int c1 , c2;是否无条件的等价?#includestdio.hmain(
7、)main()float F,c;char c1,c2;scanf(%f,&F);c1=getchar();c2=getchar();putchar(c1);putchar( n);putchar(c 示。但是判断一个逻辑量的值时, 以 0 代表2);putchar( n);#includestdio.hmain()char c1,c2;c1=getchar();c2=getchar();printf(c1=%d c2=%dn,c1,c2);printf(c1=%c c2=%cn,c1,c2);第五章5.1什么是算术运算?什么是关系运算?什么是逻辑运算?解:略。5.2C 语言中如何表示“真”和
8、“假”? 系统如何判断一个量的“真”和“假”?“真”,以非 0 代表“假”。例如 3&5的值 为“真”,系统给出 3&5的值为 1。5.3写出下面各逻辑表达式的值。设 a=3, b=4,c=5。(1)a+bc&b=c(2)a|b+c&b-c(3)!(ab)&!c|1(4)!(x=a)&(y=b)&0(5)!(a+b)+c-1&b+c/2解:(1) 0(2)1(3)1(4)0(5)1解:设有一个逻辑表达式, 若其结果为“真”,5.4有3个整数a b、c,由键盘输入,#include 方法二: 使用条件表达式, 可以使程序更加 main() 简明、清晰。int x,y; 程序如下:方法一 int
9、a,b,c,temp,max;#include printf( 请输入 3个整数: );1main()scanf(%d,%d,%d,&a,&b,&c); int a,b,c;temp=(ab)?a:b; /*将a和b中printf( 请输入 3个整数: );的大者存人 temp 中 */scanf(%d,%d,%d,&a,&b,&c);max=(tempc)?temp:c; /* 的大者与 c 比较,取最大者 */将a和b中if(ab)printf(3 个整数的最大数是%dn”,max);if(bc) printf(max=%dn,c);else printf(max=%dn,b);5.5 有
10、一函数:else if(ac) printf(max=%dn,c);写一程序,输入 x 值,输出 y值。else printf(max=%dn,a);解:printf( 输入 x:);#include scanf(%d,&x);A、B、C、D、E。90分以上为A ,if(x1) /*x1 */ y=x;printf(x=%3d, y=x=%dn,x,y);else if (x10) /* 1 x-10 */8090分为 B, 7079分为 C, 60分以 下为 D。解:程序如下:#include main() float score; y=2*x-1;printf(x=%3d, y=2*x-1
11、=%dn,x,y);else /* x 10 */ y=3*x-11;printf(x=%3d, y=3*x-11=%dn,x,y);char grade;printf( 请输入学生成绩: );scanf(%f,&score);while(score100|(score0) printf(n 输入有误 , 请重新输入: );scanf(%f,&score);switch(int)(score/10) 求它是几位数; 分别打印出每一位数case 8: grade= B;break;case 7: grade= C;break;case 6: grade= D;break;case 5:case
12、4:case 3:case 2:case 1:case 0: grade= E;printf( 成绩是 %5.1f ,相应的等级是 %c。 n,score,grade);说明:对输入的数据进行检查, 如小于 0 或 大于 100,要求重新输入。 (int)(score/10) 的作用是将 (score/10) 的值进行强制类 型转换,得到一个整型值。字; 按逆序打印出各位数字。例如原数为 321,应输出 123。解:#include main() long int num;intindiv,ten,hundred,thousand,ten_thousand,place;/* 分别代表个位、 十
13、位、百位、千位、万位和位数 */printf( 请输入一个整数(099999):);scanf(%ld,&num);if (num9999) place=5;else if(num999) place=4;else if(num99) place=3;else place=1;,ten,indiv);printf(place =%dn, place);printf(n反序数字为: );ten_thousand=num/10000;printf(%d%d%d%dn,indiv,ten,hundredthousand=num/1000%10;,thousand);hundred=num/100%1
14、0;break;ten=num%100/10;case3indiv=num%10;printf(%d,%d,%d,hundred,ten,indiv);switch(place)printf(n反序数字为: ); case 5: printf(%d,%d,%d,%d,%d,ten_thousand,printf(%d%d%dn,indiv,ten,hundred);thousand,hundred,ten,indiv);break;printf(n 反序数字为; );case 2: printf(%d,%d,ten,indiv);printf(n反序数字为: );printf(%d%d%d%d
15、%dn,indiv,ten,hundred,thousand,ten_thousand);printf(%d%dn,indiv,ten);break;break;else if(num9) place=2;printf(%d,%d,%d,%d,thousand,hundredcase 1: printf(%d,indiv);printf(n 反序数字为: );printf(%dn,indiv);break;5.8企业发放的奖金根据利润提成。利润 I低于或等于 10 万元时,奖金可提成 10% ; 利润高于 10 万元,低于 20 万元( 100000I 200000)时,其中10万元按10勉成
16、, 高于 10 万元的部分, 可提成 7.5% ; 2000001 400000时,其中20万元仍按上 述办法提成 (下同),高于 20 万元的部分按 5%提成;4000001 600000 时,高于 40 万 元的部分按 3%g成;600000 I 1000000 时,超过 100 万元的部分按 1% 提成。从键盘输入当月利润 I ,求应发放奖 金总数。要求: (1) 用 if 语句编程序; (2) 用 switch 语句编程序。解:计算利润时, 要特别注意不同利润的不 同提成比例。例如,利润为 15万元,其中 有 10 万元按 10%的比例提成,另外 5 万元 则按 7.5%提成。(1)
17、用 if 语句编程序。#include main() long i;floatbonus,bon1,bon2,bon4,bon6,bon10;bon1=100000*0.1; /* 利 润为 10万元时的奖金 */bon2=bon1+100000*0.075; /* 利润为 20 万元时的奖金 */bon4=bon2+200000*0.05; /* 利润为 40 万元时的奖金 */bon6=bon4+200000*0.03; /* 利润为 60 万元时的奖金 */bon10=bon6+400000*0.015; /* 利润为 100万元时的奖金 */ printf( 请输入利润 i :);sc
18、anf(%ld,&i);润在 100 万元以上时的奖金 */if(i=100000)bonus=i*0.1; /* 利润 在 10 万元以内按 0.1 提成奖金 */else if(i=200000)bonus=bon1+(i-100000)*0.075; /* 利润在 10 万至 20万元时的奖金 */else if(i=400000)bonus=bon2+(i-200000)*0.05; /* 利润在 20 万至 40万元时的奖金 */else if(i=600000)bonus=bon4+(i-400000)*0.03; /* 利润在 40 万至 60万元时的奖金 */else if(i
19、=1000000)bonus=bon6+(i-600000)*0.015; /* 利 润在 60 万至 100万元时的奖金 */elsebonus=bon10+(i-1000000)*0.01; /* 利 printf( ”奖金是 %10.2fn,bonus);此题的关键在于正确写出每一区间的奖金 计算公式。例如利润在 10万元至 20 万时, 奖金应由两部分组成:利润为 10万元时应得的奖金。即100000x 0.1 ;10万元以 上部分应得的奖金。即(num-100000) x 0.075。同理,20万40万这个区间的奖金 也应由两部分组成:利润为 20万元时应 得的奖金,即 100000
20、x 0.1 x 10 万 x 0.075 ; 20 万 元 以 上 部 分 应 得 的 奖 金 , 即 (num-200000)x 0.05。程序中先把 10 万、 20 万、40 万、60 万、100万各关键点的奖 金计算出来,即 bon1、bon2、bon4、bon6、 hon 10;然后再加上各区间附加部分的奖金。(2) 用 switch 语句编程序。输入利润 i ,确定相应的提成等级 branch根据 branch 确定奖金值0 奖金=i*0.11 奖金 =bon1+(i-105)*0.0752 奖金 =bon2+(i-2*105)*0.0534 奖金 =bon4+(i-4*105)*
21、0.0356 奖金 =bon6+(i-6*105)*0.01578910 奖 金=bon10+(i-106)*0.01输出奖金#include main() long i;float bonus, bon1, bon2, bon4, bon6,bon10;int c;bon1=100000*0.1;bon2=bon1+100000*0.075;bon4=bon2+200000*0.05;bon6=bon4+200000*0.03;bon10=bon6+400000*0.015;printf( 请输入利润 i :);scanf(%ld,&i);c=i/100000;if(c10) c=10;sw
22、itch(c) case 0: bonus=1*0.1;break;case 1bonus=bon1+(i-100000)*0.075;break;case 2 :case 3: bonus=bon2+(i-200000)*0.05;break;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=bon10+(i-1000000)*0.01;printf( 奖金是 %10.2f,bonus);5.9输入 4 个整
23、数,要求按由大到小的顺 序输出。解:此题采用依次比较的方法排出其大小顺 序。在学习了循环和数组以后, 可以有更多 的排序方法。 int t,a,b,c,d;printf( 请输入 4 个整数: ); scanf(%d,%d,%d,%d,&a,&b,&c,&d);printf(na=%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;print
24、f( 排序结果如下: n);printf(%d, %d, %d, %dn,a,b,c,d);5.10有 4个圆塔,圆心分别为 (2 ,2) 、(-2 ,今输入任一点的坐标,求该点的建筑高度( 塔外的高度为零 ) 。程序如下:#include main() int h=10;floatx1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=-2,y4=-2,x,y,d1,d2,d3,d4;printf( 请输入一个点 (x,y) :);scanf(%f,%f,&x,&y);d1=(x-x1)*(x-x1)+(y-y1)*(y-y1);/* 求该点到各中心点的距离 */d2=(x-
25、x2)*(x-x2)+(y+y2)*(y+y2);d3=(x+x3)*(x+x3)+(y-y3)*(y-y3);d4=(x+x4)*(x-x4)*(y+y4)*(y+y4);printf( 该点高度为 %dn,h);第六章 循环控制6.1输入两个正整数 m和n,求其最大公约 数和最小公倍数。main()long m,n,i=1,j,s;scanf(%ld,%ld,&m,&n);for(;i=m&i=n) j=m;else j=n;for(;!(j%m=0&j%n=0);j+);printf(s=%ld,j=%ldn,s,j);6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个
26、数int n,sum=0,i=1,s=2;#includestdio.hmain()char c;int i=0,j=0,k=0,l=0;while(c=getchar()!= n)if(c=65&c=97&c=48&c=57) j+;else if(c=32) k+;else l+;printf(i=%d,j=%d,k=%d,l=%dn,i,j,k,l);6.3求 Sn=a+aa+aaa+aaaaa(有 n 个 a) 之值, 其中 a 是一个数字。例如: 2+22+222+2222+22222( n=5), n 由键盘输 入。#includemath.hscanf(%d,&n);while(
27、i=n)sum=sum+s;s=s+2*pow(10,i);i+;printf(sum=%dn,sum);6.4求,(即求 1!+2!+3!+4!+5!+ +20!)main()int n,i=1;long sum=0,s=1;scanf(%d,&n);while(i=n) s=s*i;sum=sum+s;i+;printf(sum=%ldn,sum);6.5求main()main()i=1,j=1,k=1,s1=0,s2=0,s3=0,sum;for(;i=100;i+) s1=s1+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-1printf(%5d,x)