谭浩强--C语言程序设计(第二版)习题答案_第1页
谭浩强--C语言程序设计(第二版)习题答案_第2页
谭浩强--C语言程序设计(第二版)习题答案_第3页
谭浩强--C语言程序设计(第二版)习题答案_第4页
谭浩强--C语言程序设计(第二版)习题答案_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C 语言程序设计(第语言程序设计(第 2 版)课后习题答案版)课后习题答案 第一章第一章 1.请参照本章例题,编写一个 C 程序,输出以下信息: * Very good! * 解: #include void main() printf(*); printf(n); printf(Verygood!n); printf(n); printf(*); 2.编写一个 C 程序,输入 a、b、c 三个值,输出其中最大值。 解: #include void main() int a,b,c,max; printf(请输入三个数 a,b,c:n); scanf(%d,%d,%d, max=a; if(m

2、axb)max=b; if(maxc printf(请输入 3 个整数:); scanf(%d,%d,%d, temp=(ab)?a:b; max=(tempc)?temp:c; printf(3 个整数的最大数是%dn,max); 6. 给一个百分制成绩,要求输出等级A、B、 C、D、 E。90 分以上为A,8090 分为B,7079 分为C,60 分以下为D。 解: #include void main() float score; char grade; printf(请输入学生成绩:); scanf(%f, while(score100|score9999)place=5; elsei

3、f(num999)place=4; elseif(num99)place=3; elseif(num9)place=2; elseplace=1; printf(place =%dn, place); ten_thousand=num/10000; thousand=num/1000%10; hundred=num/100%10; ten=num%100/10; indiv=num%10; switch(place) case 5: printf(%d,%d,%d,%d,%d,ten_thousand,thousand,hundred,ten,indiv); printf(n 反序数字为: )

4、; printf(%d%d%d%d%dn,indiv,ten,hundred,thousand,ten_thousand); break; case 4: printf(%d,%d,%d,%d,thousand,hundred,ten,indiv); printf(n 反序数字为: ); printf(%d%d%d%dn,indiv,ten,hundred,thousand); break; case 3: printf(%d,%d,%d,hundred,ten,indiv); printf(n 反序数字为: ); printf(%d%d%dn,indiv,ten,hundred); brea

5、k; case 2: printf(%d,%d,ten,indiv); printf(n 反序数字为: ); printf(%d%dn,indiv,ten); break; case 1: printf(%d,indiv); printf(n 反序数字为: ); printf(%dn,indiv); break; 8. 企业发放的奖金根据企业的当年利润决定。 当利润 I 低于或等于 100000 元时, 奖金可提成 10%;利润大于 100000 元,小于 200000 元(100000I200000)时, 低于 100000 元的部分按 10%提成,高于 100000 元的部分,可提成 7.

6、5%;利润 大于 200000 元,小于 400000 元(200000I400000)时,低于 200000 元的部 分仍按上述办法提成 (下同) , 高于 200000 元的部分按 5%提成。 利润大于 400000 元,小于 600000 元(400000I600000)时,高于 400000 元的部分按 3%提成。 利润大于 600000 元,小于 1000000 元(6000001000000)时,超过 1000000 元的 部分按 1%提成。从键盘输入当年利润 I,求应发放奖金总数。要求: (1)用 if 语句编程序;(2)用 switch 语句编程序。 解: (1) 用 if 语

7、句编程序。 #include void main() long i; float bonus,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: ); scanf(%ld

8、, if(i=100000)bonus=i*0.1;/*利润在 10 万元以内按 0.1 提成奖金*/ elseif(i=200000) bonus=bon1+(i-100000)*0.075;/*利润在 10 万至 20 万元时的奖金*/ elseif(i=400000) bonus=bon2+(i-200000)*0.05;/*利润在 20 万至 40 万元时的奖金*/ elseif(i=600000) bonus=bon4+(i-400000)*0.03;/*利润在 40 万至 60 万元时的奖金*/ elseif(i10)c=10; switch(c) case 0: bonus=1*

9、0.1;break; case 1: bonus=bon1+(i-100000)*0.075;break; case 2 : case 3: bonus=bon2+(i-200000)*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=bon10+(i-1000000)*0.01; printf(奖金是%10.2f,bonus); 9. 输入 4 个整数,要

10、求按由小到大的顺序输出。 解: #include void main() int t,a,b,c,d; printf(请输入 4 个整数: ); scanf(%d,%d,%d,%d, printf(n 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(排序结果如下: n); printf(%d, %d, %d, %dn,

11、a,b,c,d); 10. 有 4 个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为 1。 这 4 个塔的高度分别为 10m。塔以外无建筑物。今输入任一点的坐标,求该点的 建筑高度(塔外的高度为零)。 解: #include void main() int h=10; float x1=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, d1=(x-x1)*(x-x1)+(y-y1)*(y-y1);/*求该点到各中心点的距离

12、*/ d2=(x-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); if(d11/*判断该点是否在塔外*/ printf(该点高度为%dn,h); 11. 求 方程的解。 根据代数知识,应该有以下几种可能: (1)a=0, 不是二次方程,而是一次方程。 (2) ,有两个相等的实根。 (3) ,有两个不等的实根。 (4) ,有两个共轭复根。 编写程序,运行时,分别给出不同的 a, b, c 值,相应于上面 4 种情况,分析输出 结果。 解: #include #inc

13、lude #include void main() float a,b,c,disc,x1,x2,realpart,imagpart; scanf(%f,%f,%f, printf(The equation); if(fabs(a)=1e-6) printf(is not a quadraticn); else disc=b*b-4*a*c; if(fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(has distinct real roots:%8.4f and %8.4fn,x1,x2); el

14、se realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf(has complex roots:n); printf(%8.4f+%8.4fin,realpart,imagpart); printf(%8.4f-%8.4fin,realpart,imagpart); 第五章第五章 1. 求 100200 间的全部素数。 解: #include #include void main() int m,i,n=0; double k; for(m=101;m=A else if(c= ) k+; else l+; printf(i=%d,j=%d

15、,k=%d,l=%dn,i,j,k,l); 3. 输出所有水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等 于该本身。例如:153 是一个水仙花数,因为 153=13+53+33。 解: #include #include void main() int i,j,k,n; printf(水仙花数是:); for(n=100;n0) x1=(x2+1)*2; x2=x1; day-; printf(total=%dn,x1); 5. 一球从 100 米高度自由下落,每次落地后返回原高度的一半,再落下。求它 在第 10 次落地时,共经过了多少米?第 10 次反弹多高? 解: #includ

16、e void main() int i,n;double h=100,s=100; scanf(%d, for(i=1;i=n;i+) h*=0.5; if(i=1)continue; s=2*h+s; printf(h=%f,s=%fn,h,s); 6. 打印以下图案 * * * * * * * 解: #include #include void main() int i,j,k; for(i=0;i=3;i+) for(j=0;j=2-i;j+) printf( ); for(k=0;k=2*i;k+) printf(*); printf(n); for(i=0;i=2;i+) for(j

17、=0;j=i;j+) printf( ); for(k=0;k=4-2*i;k+) printf(*); printf(n); 7. 两个乒乓球队进行比赛,各出 3 人。甲队为 A、B、C 3 人,乙队为 X、Y、Z 3 人。已抽签决定比赛名单。有人向队员打听比赛的名单,A 说他不和 X 比,C 说 他不和 X、Y 比,请编程序找出 3 三队选手的对阵名单。 解: #include void main() char i,j,k;/*i 是 A 的对手,j 是 B 的对手,k 是 C 的对手*/ for(i=X;i=Z;i+) for(j=X;j=Z;j+) if(i!=j) for(k=X;k

18、=Z;k+) if(i!=k 第六章第六章 1. 已知一个班 10 个学生的成绩,要求输入这 10 个学生的成绩,然后求出它们 的平均成绩。 解: #include main() float a10,sum,avg; int i; sum=0.0; printf(Please input the students score:); for(i=0;i10;i+) scanf(%f, sum=sum+ai; avg=sum/10; printf(The average is:%fn,avg); 2. 已知一个班 10 个学生的成绩,存放在一个一维数组中,要求找出其中成绩最 高的学生的成绩和该生的

19、序号。 解: #include void main() int ch10; int i,max=0,xh; printf(请输入 10 个学生的成绩:n); for(i=0;imax) max=chi; xh=i; printf(成绩最高为:%dn,max); printf(该生的序号为:%dn,xh); 3. 有 3 个学生,上 4 门课,要求输入全部学生的各门课成绩,并分别求出每门 课的平均成绩。 解: #include #include #define RENSHU 3 #define KECHENG 4 void main() float chengji44; int i,j; pri

20、ntf(n 请按人输入(一次输入一个人所有课程的成绩)成绩(%d 人,%d 门 课程) :,RENSHU,KECHENG); for(i=0;iRENSHU;i+) printf(n 第%d 人:,i+1); for(j=0;jKECHENG;j+) scanf(%f, for(j=0;jKECHENG;j+) chengjiRENSHUj=0; for(i=0;iRENSHU;i+) chengjiRENSHUj+=chengjiij; chengjiRENSHUj=chengjiRENSHUj/RENSHU; for(i=0;i=RENSHU;i+) for(j=0;jKECHENG;j+

21、) printf(%8.2f,chengjiij); printf(n); printf(n); 4. 已知 5 个学生的 4 门课的成绩,要求求出每个学生的平均成绩,然后对平均 成绩从高到低将各学生的成绩记录排序。 解: #include void main () int i,j,k; float a55=78,79,90,67,60,76,89,63, 86,75,96,56,54,63,86,96, 63,96,98,97; float sum,t; for(i=0;i5;i+) for(j=0;j5;j+) printf(%12f,aij); printf(n); for(i=0;i5

22、;i+) sum=0; for(j=0;j4;j+) sum=sum+aij; ai4=sum/4; for(k=0;k4;k+) for(i=0;i4-k;i+) if(ai4ai+14) for(j=0;j5;j+) t=aij;aij=ai+1j;ai+1j=t; for(i=0;i5;i+) for(j=0;j5;j+) printf(%12f,aij); printf(n); 5. 将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求 改为:1,4,5,6,8。 解: #include void main() int i,a 10,temp; for(i=0;i1

23、0;i+) scanf(%d, for(i=0;i10;i+) printf(%4d,ai); for(i=0;i5;i+) temp=ai; ai=a9-i; a9-i=temp; for(i=0;ia0|keyend) printf(无此数n); 7. 输出以下图案: 解: #include void main() int i,j,k;char a55; for(i=0;i5;i+) for(j=0;j5;j+) aij=*; printf(%c,aij); printf(n); for(k=1;k=i+1;k+) printf(); printf(n); 8. 有一篇文章,共有 3 行文

24、字,每行有个 80 字符。要求分别统计出其中英文大 写字母、小写字母、空格以及其它字符的个数。 解: #include void main() int i,j,upp,low,dig,spa,oth; char text380; upp=low=dig=spa=oth=0; for(i=0;iz B-Yb-y C-Xc-x 即第 1 个字母变成第 26 个字母,第 i 个字母变成第(26-i+1)个字母。非字母字 符不变。假如已知道密码是 Umtorhs,要求编程序将密码译回原文,并输出密码 和原文。 解: #include void main() int i;char str1100,str

25、2100; gets(str1); for(i=0;str1i!=0;i+) if(str1i=65 elsestr2i=str1i; printf(%sn%sn,str1,str2); 10. 编一程序,将两个字符串连接起来,(1)用 strcat 函数;(2)不用 strcat 函数。 解: (1) #include void main() int i,j;char str1100,str2100,str3201; gets(str1); gets(str2); str3=strcat(str1,str2); printf(%sn%sn%sn,str1,str2,str3); (2) #i

26、nclude void main() int i,j;char str1100,str2100,str3201; gets(str1); gets(str2); for(i=0;str1i!=0;i+) str3i=str1i; for(j=0;str2j!=0;j+) str3j+i=str2j; printf(%sn%sn%sn,str1,str2,str3); 第七章第七章 1. 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这 两个函数,并输出结果两个整数由键盘输入。 解: #include int maxyueshu(int m,int n) int i=1,t;

27、for(;i=m else j=n; for(;!(j%m=0j+) ; return j; void main() int a,b,max,min; printf(enter two number is: ); scanf(%d,%d, max=maxyueshu(a,b); min=minbeishu(a,b); printf(max=%d,min=%dn,max,min); 2. 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。 解: #include int psushu(int m) int i,t=1; for(i=2;im/2i+) if(m%i=0) t=0;

28、 return t; void main() int a,s; printf(enter sushu is n); scanf(%d, s=psushu(a); if(s=1) printf(a is sushun); else printf(s is not sushun); 3. 写一个函数,使给定的一个二维数组()转置,即行列互换。 解: #include int zhuangzhi(int b33) int i,j,t; for(i=0;i=ij+) t=bij;bij=bji;bji=t; void main() int a33;int i,j; for(i=0;i3;i+) for

29、(j=0;j3;j+) scanf(%d, for(i=0;i3;i+) for(j=0;j3;j+) printf( %d,aij); printf(n); zhuangzhi(a); for(i=0;i3;i+) for(j=0;j-1;i+,j-) str1i=str2j; 5. 写一函数,将两个字符串连接。 解: #include lianjie(char a100,b100) strcat(a,b); void main() char str1100,str2100; gets(str1);gets(str2); lianjie(str1,str2); puts(str1); 6.

30、写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出。 解: #include fuzhi(char a100,b100) int i,j=0; for(i=0;ai!=0;i+) if(ai=97|ai=101|ai=105|ai=111|ai=117|ai=65|ai=69|ai= =73|ai=85) bj=ai; j+; void main() char str1100,str2100; gets(str1); fuzhi(str1,str2); puts(str2); 7. 写一函数,输入一个四位数字,要求输出这四个数字字符,但每个数字间空 一个空格。如输入 2008,应输

31、出2_0_0_8。 解: #include void insert(char str) int i; for(i=strlen(str);i0;i-) str2*i=stri; str2*i-1= ; printf(noutput:n%s,str); void main() char str80; printf(ninput four digits:); scanf(%s,str); insert(str); 8. 编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和 其它字符的个数,在主函数中输入字符串以及输出上述结果。 解: #include char tongji(char

32、 str0100,int b4) int i; for(i=0;str0i!=0;i+) if(str0i=65 else if(str0i=32) b2+; else b3+; void main() char str1100;static int i,a4; gets(str1); tongji(str1,a); printf(zimu Shuzi Kongge Qitan); for(i=0;i=97 void main() char str0100,longword15; gets(str0); cechang(str0,longword); puts(longword); 10. 写

33、一函数用起泡法对输入的 10 个字符按由小到大的顺序排列。 解: #include int paixu(int x) int i,j,t; for(j=1;j10;j+) for(i=0;ixi+1) t=xi+1;xi+1=xi;xi=t; void main() int y10;int i; for(i=0;i10;i+) scanf(%d, paixu(y); for(i=0;i10;i+) printf(%5d,yi); printf(n); 11. 输入 10 个学生 5 门课的成绩,分别用函数实现下列功能: 计算每个学生平均分; 计算每门课的平均分; 找出所有 50 个分数中最高的

34、分数所对应的学生和课程; 解: #include float x110,x25; float pp(),cc(),find(); void main() char name1020,class520; float score105,max5;int a5,i,j; for(i=0;i10;i+) gets(namei); for(j=0;j5;j+) gets(classj); for(i=0;i10;i+) for(j=0;j5;j+) scanf(%f, pp(score); cc(score); find(score,max,a); for(i=0;i10;i+) puts(namei)

35、; printf(%.3fn,x1i); for(j=0;j5;j+) puts(classj); printf(%.3fn,x2j); for(j=0;j5;j+) printf(%.3f n,maxj); puts(nameaj); puts(classj); float pp(float f105) float sum=0;int i,j; for(i=0,sum=0;i10;i+) for(j=0;j5;j+) sum=sum+fij; x1i=sum/5; float cc(float y105) float sum=0;int i,j; for(j=0;j5;j+) for(i=0

36、;i10;i+) sum=sum+yij; x2j=sum/10; float find(float z105,s5;int t5) int i,j; for(j=0,sj=z0j;j5;j+) for(i=0;i10;i+) if(sjzij) sj=zij;tj=i; 12. 写几个函数: 输入 10 个职工的姓名和职工号; 按职工号由小到大顺序排序,姓名顺序也随之调整; 要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职 工号,输出该职工姓名。 解: #include #define N 10 find(int a,b) int i,j,s,t,cN2; for(i=0

37、;iN;i+) ci1=ai;ci1=i; for(i=0;iN;i+) for(j=0;jci+10) t=ci0;ci0=ci+10;ci+10=t; s=ci1;ci1=ci+11;ci+11=s; for(i=0;iN;i+) bi=ci1; return; lookfor(int h,k ) int i,j; for(i=0;iN;i+) if(hi-k=0) j=i; return j; void main() int numberN,xN,i,j,u,p;char nameN20; for(i=0;iN;i+) gets(namei); scanf(%d, scanf(%d, f

38、ind(number,x); u=lookfor(number,p); for(i=0;ib) return a; else return b; 14. 用递归法将一个整数 n 转换成字符串。例如,输入整数 2008,应输出字符串 2008。n 的位数不确定,可以是任意位数的整数。 解: #include #include int x10; pf(unsigned long m,int n) int y; if(n=0) y=(int)(m%10);x0=y; else y=(unsigned long)(m-pf(m,n-1)/pow(10,n)%10;xn=y; return(y); vo

39、id main() unsigned long a,b;int i,j,k;char c11; scanf(%ld, for(j=0,b=a;b0.1;j+,b/=10) ; pf(a,j-1); for(i=0,k=j-1;ij;i+,k-) ci=xk+48;c10=0; puts(c); 15. 给出年、月、日,计算该日是该年的第几天。 解: #include int find(int x,int y,int z) int i,t,s,days=0; if(x%4=0) t=1; else t=0; for(i=1;i*p2)t=p1;p1=p2;p2=t; if(*p1*p3)t=p1;p1=p3;p3=t; if(*p2*p3)t=p2;p2=p3;p3=t; printf(%d,%d,%dn,*p1,*p2,*p3); 2. 输入三个字符串,按由小到大的顺序输出。 解: #define N 3 #define M 20 #include void main() char str0NM,str1M,*p,*q; int i,l,m,n; q=str0; for(;p0)strcpy(str1,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论