c程序设计第四版课后习题答案(习题破解).doc_第1页
c程序设计第四版课后习题答案(习题破解).doc_第2页
c程序设计第四版课后习题答案(习题破解).doc_第3页
c程序设计第四版课后习题答案(习题破解).doc_第4页
c程序设计第四版课后习题答案(习题破解).doc_第5页
已阅读5页,还剩82页未读 继续免费阅读

c程序设计第四版课后习题答案(习题破解).doc.doc 免费下载

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

文档简介

c程序设计(第四版)-习题答案参考希望这些代码,可以帮到可以帮助到的同学。在这里,我要说:大家不要去copy ,而是要弄清每行代码的意思,否则我们的辛苦是白费了. 感谢,和我一起写代码的几位同学:潘敬、 张巍、 贺鹏程、 刘恒松、李云宽. 虽然,这些代码,我们都调试过,辛苦了半个月.但是,也避免不了会有些错误,请同学们见谅. -雷玄2012年3月第三章 顺序程序设计李云宽do第三四章 整理时间2012/3/15 qq:110 111 11 110 111 1 11 0 1000第1题:假如国民生产年增长率为百分之9%, 计算10年后我过国民生产总值与现在相比增长多少百分比#include int main(void)float a,b,sum;b = 0.09;sum = (1+b)*(1+b)*(1+b)*(1+b)*(1+b)*(1+b)*(1+b)*(1+b)*(1+b)*(1+b);printf(%fn, sum);/.乘以10次.或者用循环return 0;/或者用pow函数 ,例:把2的3次方赋给c; c = pow(2,3);第二题:#include / 存款利息的计算.有1000元,想存5年,可按以下的5钟方法存:/ (1)一次存5年/ (2)先存2年, 在将本息存3年/ (3)先存3.在2/ (4)先存1年.到期后将本息在存1年.连续5次/ (5)存活期存款.活期利息再存1年期,连续存5次/1年定期利息4.14%, 2 年 4.68%; 3 年 5.4; 5年 5.85%;/活期一季度结算一次0.72%;int main(void)/(1)double p , i;p = 1000 * (1 + 5 * 0.0585);/printf( 一次存5年 = %lfn, p);/(2)p = (1000 * (1 + 2 * 0.0468) ;i = p * (1 + 3 * 0.054);printf(先存2年在存3年 = %lf n, i);/(3)p = (1000 * (1 + 3 * 0.054) ;i = p * (1 + 2 * 0.0468);printf(先存3年在存2年 = %lf n, i);/(4)p = 1000 * (1 + 0.0414);/1i = p * (1 + 0.0414);/2p = i * (1 + 0.0414);/3i = p * (1 + 0.0414);/4p = i * (1 + 0.0414);/5printf(本息在存1年.连续5次 = %lf n, p);/(5)p = 1000 * (1 + 0.0072/4);printf(一个季度 = %lfn, p);for (i=0 ; i20; i+)p = p * (1+0.0072/4);printf(5年活期.季度 = %lfn, p);return 0;第三题:#include /购房从银行贷款.300000准备每个月还款.利率int main(void)double i, j , f, k;j = 1 + 0.01;/利率k = 300000;/贷款printf(测试.%lfn, j);f = 6000;/每月还款for (i=0;k 0 ; i+)k = k * j;printf(%lf %lf %lf %lfn, k, j, f, i); k = k - f; printf(%lf %lf nn, k, i); printf(%lf月还清n, i);return 0;第四题:/*4用scanf下面的函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=a,c2=a,问在键盘上如何输入? */#includeint main(void) int a, b;float x, y;char c1, c2; scanf(a=%d_b=%dn, &a, &b); scanf(_x=%f_y=%fn, &x, &y); scanf(_c1=%c_c2=%cn, &c1, &c2); return 0; /*a=3_b=7 _x=8.5_y=71.82 _c1=a_c2=a */第五题:/*6要将china译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母例如,字母a后面第4个字母是ee代替a。因此,china应译为glmre。请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,c、h、i、n、a,经过运算,使c1、c2、c3、c4、c5分别变为g、l、m、r、e,并输出。 */#include /方法1:/*int main(void) /可以直接用循环 char c1=c,c2=h,c3=i,c4=n,c5=a; c1=c1+4; c2=c2+4; c3=c3+4; c4=c4+4; c5=c5+4; printf(密码是 = %c%c%c%c%cnn, c1, c2, c3, c4, c5); return 0;/*!还有这题没有考虑字符是wxyz的情况呢?也就是说还有一种方法,后面有介绍*/ */方法2:int main()/用循环加密char ch=china;/首先定义数组,每一个字符对应一个数组,例如:ch1=cfor(int i=0;i5;i+)/因为有5个字符,循环5次chi=chi+4;/每次加上4printf(%c,chi);/循环的时候输出putchar(10);/换行return 0;/返回为0,程序正常 /*运行结果: * 密码是glmre */第七题:/* 7 .设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。 用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 */#includevoid main(void) float r,h,c1,sa,sb,va,vb; scanf(%f,%f,&r,&h); 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); 第八题:(这题要思考,如果有不懂,可不必花时间在此处纠结,通过学习后面的知识,就好理解了)#include /* 10编程序,用getchar函数读入两个字符给c1、c2, 然后分别用函数和函数输出这两个字符。并思考以下问题:()变量c1、c2应定义为字符型或整形?抑二者皆可?()要求输出c1和c2值的ascii码,应如何处理?用putchar函数还是printf函数?()整形变量与字符变量是否在任何情况下都可以互相代替?如:*/ void main(void)int c1;char c2;printf(输入第两字符:);c1=getchar();c2=getchar();putchar(c1);putchar(c2);printf(n %c n%c, c1, c2);/* 两者皆可.输出的是字符就行了*1/*/void main(void)int c1;char c2;printf(输入第两字符:);c1=getchar();c2=getchar();putchar(c1);putchar(c2);printf(n %c n%c n, c1, c2);/* (1)两者皆可.输出的是字符就行了%c* (2)putchar函数是用来输出单个字符的无法输出ascii码 所以想输出ascii还是用printf + %d 吧 *#includestdio.h void main(void) char c1,c2; c1=getchar();c2=getchar(); printf(c1=%d c2=%dn, c1, c2); printf(c1=%c c2=%cn, c1, c2); *2/(3)int和char不是在任何情况下都可以互相代替,因为int在32位系统下一般分配有4个字节的空间,而char只有一个字节。当存储的数据大于一个字节时,从int转到char型时会损失数据。第四章 选择结构程序设计第一题:(呵呵,内事不懂问百度,外事不知问谷歌)/* 什么是算术运算?什么是关系运算?什么是逻辑运算? 百度的.书上有的.1. 算术运算:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(+)、自减(-)共七种。2. 关系运算:用于比较运算。包括大于()、小于(=)、小于等于(=)和不等于(!=)六种。3. 逻辑运算:用于逻辑运算。包括与(&)、或(|)、非(!)三种。4. 位操作运算:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非()、位异或()、左移()六种。5. 赋值运算:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,=,=,=)三类共十一种。6. 条件运算:这是一个三目运算符,用于条件求值(?:)。7. 逗号运算:用于把若干表达式组合成一个表达式(,)。8. 指针运算:用于取内容(*)和取地址(&)二种运算。9. 求字节数运算:用于计算数据类型所占的字节数(sizeof)。10. 特殊运算:有括号(),下标,成员(,.)等几种 +、-、*、/等数学运算是算术运算 =、!=、=运算是关系运算 |、&、!是逻辑运算*/第二题:/* c语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”? * 0 就是假 非0就是真 *解 设有一个逻辑表达式,若其结果为“真”,则以1表示;若其结果为“假”,则以0表示。 但是判断一个逻辑量的值时,以0代表“真”,以非0代表“假”。 例如3&5的值为“真”,系统给出3&5的值为1。 第三题:/*4.3 写出下面各逻辑表达式的值。设a=3,b=4,c=5。 (1) a+bc&b=c a+b= 7c =1 b=c 0 (1) 0 & 0 = 0 (2) a|b+c&b-c b+c=9 b-c= -1 -1 不算 0 9 & -1=1 (2) a | 1 = 1(3) !(ab)&!c|1 34 = 0 !(0)=1 !c=0 1&0= 0 (3) 0 | 1 = 1(4) !(x=a)&(y=b)&0 !(x=a)= 0 (y=b) = 1 0 & 1 = 0 (4) 0 | 0 = 0 (5) !(a+b)+c-1&b+c/2 a+b=7 !(7)=0 c/2=2 0+5-1= 4 b+2=6 (5) 4 & 6 = 1 ! 算术运算符 关系运算符 & | 赋值运算符*/第四题:#include /* 4.4 有3个整数a、b、c,由键盘输入,输出其中最大的数。 */ /*void main (void)/方法1: int a, b, c, d; a=b=c=0; printf(input:); scanf(%d %d %d, &a, &b, &c); if(ab)/建议写if语句的时候都用以便区分 if(bc) printf( max=%d n,c); else printf( max=%d n,b); else if(ay)/如果x大于ymax=x;/赋给maxelse/否则max=y;/y赋给maxreturn max;/将比较的值返回,返回值为maxint main()int a,b,c;/定义输入的三个值scanf(%d%d%d,&a,&b,&c);/输入,以空格隔开printf(max:%dn,max(a,max(b,c);/调用自定义的函数进行比较大小,直接比较后输出return 0;第五题:#include #include /调用math.h这个头文件,因为下面要用到sqrt(求平方根)这个函数,void main(void) int data,c;lab:/标签,goto 的 位置printf(nplease input data:);scanf(%d,&data);if(data=1000|data=0)goto lab;/goto 语句else if(data1000)/如果输入的值0、不大于1000则求出平方根c = sqrt(data);printf(sqrt(%d)=%dn,data,c);/这里要加花括号,不然只执行 c = sqrt(data);这一条语句(if 默认执行一条语句)第六题:#include void main()int x, y;printf(nplease input data:);scanf(%d,&x);if(x1)printf(y = %dn,y=x);else if(1x=10)printf(y = %dn,y=3*x-11);第七题:/画流程图 (这个可以没有)第八题:/*8 给一个百分制成绩,要求输出等级a、b、c、d、e。90分以上为a,8090分为b,7079分为c,60分以下为d。 */ #include void main(void) float score; char grade; printf(请输入学生成绩:); scanf(%f,&score); if(score100|score0) printf(n请重新输入:); switch(int)score/10) case 10: case 9: grade=a;break; case 8: grade=b;break; case 7: grade=c;break; case 6: grade=d;break; case 5: case 4: case 3: case 2: case 1: case 0: grade=e;break; printf(成绩是%5.1f,相应的等级是%c。n,score,grade); 第九题:#include void main()int data,x;int gw,sw,bw,qw,ww;/个位,十位,百位,千位,万位printf(nn输入一个数:);scanf(%5d,&data);/%5d 只截取5个数字 存在data变量里,可以不这样写.if(data99999)/进行判断 不是五位数则 结束程序。printf(输入有误,结束n);return 0;/下面是判断几位数。if(data/10000=1)printf(n这是一个5位数n);else if(data/1000=1)printf(n这是一个4位数n);else if(data/100=1)printf(n这是一个3位数n);else if(data/10=1)printf(n这是一个2位数n);else printf(n这是一个1位数n);/下面是分别输出各位数ww = data/10000;qw = (data-ww*10000)/1000;bw = (data-ww*10000-qw*1000)/100;sw = (data-ww*10000-qw*1000-bw*100)/10;gw = (data-ww*10000-qw*1000-bw*100-sw*10)/1;printf(n%d,%d,%d,%d,%dn,ww,qw,bw,sw,gw);/下面是逆序输出printf(逆序输出:n);while(data)printf(%d,data%10);data/=10;printf(n);getchar();/暂停 第十题:#include void main(void) 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,&i); 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=1000000) bonus=bon6+(i-600000)*0.015; /*利润在60万至100万元时的奖金*/ else bonus=bon10+(i-1000000)*0.01; /*利润在100万元以上时的奖金*/ printf(奖金是%10.2fn,bonus); 2)*/#include /标准输入输出文件头 int main() /主函数入口 long i; float bonus, bon1, bon2, bon4, bon6, bon10; /定义实型的变量,可以拥有小数 int c; /整型变量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; /判断 switch(c) /分支语句 case 0: bonus=1*0.1;break; /对应的值,执行相应的动作case 1: bonus=bon1+(i-100000)*0.075;break; case 3: bonus=bon2+(i-200000)*0.05; break; case 5: bonus=bon4+(i-400000)*0.03;break; case 9: bonus=bon6+(i-600000)*0.015;break; case 10: bonus=bon10+(i-1000000)*0.01; printf(奖金是%10.2f,bonus); /输出 第十一题:/* 输入4个整数,要求按由大到小的顺序输出。 */ #include void main(void) int t, a, b, c, d; printf(请输入4个整数:); scanf(%d,%d,%d,%d,&a,&b,&c,&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,a,b,c,d); 第十二题:#include void main(void) 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,&x,&y); d1=(x-x1)*(x-x1)+(y-y1)*(y-y1); /*求该点到各中心点的距离*/ 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&d21&d31&d41) h=0; /*判断该点是否在塔外*/ printf(该点高度为%dn,h); 第五章 循环结构程序设计刘恒松do第五章 整理时间2012/3/17 qq:10, 111, 110, 0, 10, 0 ,101 ,100 ,1第1、2题 略.第3题#includevoid main() int n,m,nm,r,t; printf(enter m,n:); scanf(%d%d,&m,&n); nm=n*m;/最小公倍数= 两个数的积/最大公约数 if(mn) t=m; m=n; n=t; /确定最大的数,是第一个数 while (r=m%n )/()里的是逻辑值 0和1 m=n; n=r; printf(最大公约数=%dn,n); printf(最小公倍数=%dn, nm/n);第4题#include int main()char c;int letters=0,space=0,digit=0,others=0; /letters(字母) space(空格) digit(数字) others(其他) printf(请输入字符n);while(c=getchar()!=n) /当输入的字符不等于n时,可以继续输入if(c=a&c=a&c=0&c=9) /如果输入数字一次,digit+ 一次digit+;else others+; /如果输入其他的字符一次,others+ 一次printf(这些字符:字母有%d个 空格有%d个 数字有=%d个 其他%d个n,letters,space,digit,others); system(pause);return 0;第5题#includeint main()int a,n,c;long int sn=0,tn=0;scanf(%d %d,&a,&n);printf(a=%d,n=%dn,a,n);for(c=1;c=n;c+)tn=tn+a;sn=sn+tn;a=a*10;printf(%ld,sn);system(pause);return 0;第6题#includeint main()float s=0,t=1;int n;for(n=1;n=20;n+) t=t*n; /把1到20的的阶乘存在t里面(t每一次都在改变,由1到20的阶乘顺序改变)s=s+t; /把存于t中的阶乘加起来printf(%e,s);system(pause);return 0;第7题#includeint main()float i=0,i2=0,i3=0,k;for(k=1;k=100;k+) /求1到100的和i=i+k;for(k=1;k=50;k+) /求1的平方到50的平方的和i2=k*k+i2;for(k=1;k=10;k+) /求1/1到1/10的和i3=1/k+i3;printf(%.5f,i+i2+i3);system(pause);return 0;第8题#includeint main()int shu,ge,shi,bai;for(shu=100;shu1000;shu+) /控制循环(检测从100到1000的所有符合的数)bai=shu/100; /分解出百位shi=(shu-bai*100)/10; /分解出十位ge=shu-bai*100-shi*10; /分解出个位if(shu=bai*bai*bai+shi*shi*shi+ge*ge*ge) /如果,各位数字的立方和等于这个数。就输出这个数printf(%5d,shu);system(pause);return 0;第9题第10题#includeint main()int n,t;float a=2,b=1,s=0; /a表示分子,b表示分母for(n=1;n=20;n+) s=s+a/b; /(a/b)第一个分数先存在s里面,便于后面的数与其相加t=a; /把分子存于一变量中,便于后面的使用a=a+b; /a分子就是 上一项分子与分母的和b=t; /b分母就是 上一项分子printf(sum is %.6fn,s);system(pause);return 0;第11题#includeint main()float h=100.0,s=h/2; /h表示经过的“路程”。 s 表示每一次反弹的高度int n;for(n=2;n=10;n+)h=h+2*s; /这里s乘以2,是因为要算上“总路程”不仅要算反弹的“路程”,而且要算上掉在地上的“路程”s=s/2; printf(经过%f米n,h);printf(第十次反弹%f米n,s);system(pause);return 0;第12题#includeint main()int day,tao,y; /day(天) tao(桃子的个数) y(剩下的1个桃)y=1; for(day=9;day0;day-) /因为知道第十天的桃子的个数,所以就只用往前推九天tao=(y+1)*2; /反推,计算出前一天的桃子的个数y=tao; /把每天的桃子的个数存于y这个变量中,便于使用printf(%dn,tao);system(pause);return 0;第13题#include #include int main()float a,x0,x1;printf(intput a:);scanf(%f,&a);x0 = a/2;x1 = (x0+a/x0)/2;dox0 = x1;x1 = (x0+a/x0)/2;while(fabs(x0-x1)=1e-5);printf(%5.2f is %8.5fn,a,x1);getchar();return 0;第14题#include #include int main()float x,x0,f,f1;x = 1.5;dox0 =x;f = (2*x0-4)+3)*x0-6;f1 = (6*x0-8)*x0+3;x = x0-f/f1;while(fabs(x-x0)=1e-5);printf(%5.2fn,x);getchar();return 0;第15题#include int main()float x0,x1,x2,fx0,fx1,fx2;doprintf(input x 1 ,x2:);scanf(%f,%f,&x1,&x2);fx1 = x1*(2*x1-4)*x1+3)-6;fx2 = x2*(2*x2-4)*x2+3)-6;while(fx1*fx20);dox0 = (x1+x2)/2;fx0 = x0*(2*x0-4)*x0+3)-6;if(fx0*fx1)=1e-5);printf(x=%6.2fn,x0);getchar();return 0;第16题#includeint main()int i,j,k;for(i=0;i4;i+) /控制前四行for(j=0;j3-i;j+) /(j3-i)一个变量控制循环,使循环的次数改变(后面一样的)printf( );for(k=0;k=2*i;k+) printf(*);printf(n);for(i=0;i3;i+) /控制后三行for(j=0;j=i;j+)printf( );for(k=0;k=4-2*i;k+)printf(*);printf(n);system(pause);return 0;第17题#includeint main()char a,b,c;for(a=x;a=z;a+) /这里可以把从x到z当作 1到3,这样就好理解了 for(b=x;b=z;b+) /if(a!=b) /(a!=b)表示a,b不与同一个人比赛for(c=x;c=z;c+) if(a!=c&b!=c) /(a!=c)表示a,c不与同一个人比赛 (b!=c)表示b,c不与同一个人比赛 (其实是表示a,b,c三个人不能相互比赛)if(a!=x&c!=x&c!=z) /(a!=x)表示a不跟x比赛 (c!=x)表示c不和x比赛 (c!=z)表示c不和z比赛printf(a vs %cnb vs %cnc vs %cn,a,b,c);system(pause);return 0;第六章:利用数组批量处理数据雷玄do第六章 整理时间2012/3/22 qq:1000, 1001, 101, 1000, 1001, 110 ,111 ,11 ,110第一题:#in

温馨提示

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

最新文档

评论

0/150

提交评论