C程序设计谭浩强完整课后习题答案

  • 格式:docx
  • 大小:55.04 KB
  • 文档页数:135

C程序设计(第四版)(谭浩强)第一章课后习题答案P006 向屏幕输出文字.#include<>代码均调试成功,若有失误大多不是代码问题.自已找找. int main(){printf("Welcome to \n");return 0; }P008 求两个数的和.#include<>int main(){int a,b,sum;a=5;b=4;sum=a+b;printf("The sum is %d .\n",sum);return 0;}P008 调用函数比较两个数的大小.#include<>int main(){int max(int x,int y); int a,b,c;scanf("%d,%d",&a,&b); c=max(a,b); printf("The max is %d .\n",c);return 0;}int max(int x,int y) {int z; if (x>y)z=x;elsez=y;return(z); }P015 三个数的大小.(数字0表示课后练习题)#include<>int main(){int a,b,c,d; int max(int x , int y , int z);printf("Please input 3 numbers :\n");scanf("%d %d %d",&a,&b,&c);d=max(a,b,c); printf("The max is :%d .\n",d); }int max(int x , int y , int z){int m;if (x>y && x>z) m=x;if (y>x && y>z)m=y;if (z>y && z>x)m=z;return (m); }C程序设计(第四版)(谭浩强)第2章课后习题答案算法——程序的灵魂P017 计算机1-5相乘的积.#include<>int main(){int i,s=1; for(i=1;i<6;i++) {s=s*i; n",s);return 0;}#include<> int main(){int i,s=1; for(i=1;i<12;i++) 可以是i=i+2{if(i%2!=0) s=s*i;elsecontinue; }printf("The sum is %d .\n",s);return 0;}P019 按要求输出80分以上的学生信息.暂时没法做.P019 判断2000-2500年中的闰年,并输出.年的概念是地球围绕太阳一周的时间(所谓公转周期)称为一年,这个周期是相当稳定的,很长时间也不会变动1秒,但是真正的一年是天(目前)。

所以,如果每年定义为365天的话,1年就会多出天,4年就会多出天,非常接近1天,这样闰年就出现了,也就是每4年要有1年设置为366天,来抵消这多出的1天。

规则为:·1)如果年份能被4整除,则该年计为闰年;可是,假如不做调整的话,当400年的时候,累计才多出天,接近于多出97天,闰年的设置却多出来100天,所以要在400年内,再撤销3个闰年。

怎么撤销呢就有了下面这个规则:·2)如果年份能被100整除,则不计为闰年;问题又来了,400年里有4个100年吧,去掉后四个100年后,又少了一个,所以再加一个规则就是:·3)如果年份能被400整除,则计为闰年。

简单说来每400年里设置了97个闰年,也就是400里的前3个100年不设置闰年,误差被调整到400年仅有天。

#include<>int main()int i;for(i=2000;i<=2200;i++){if((i%4==0 && i%100!=0)||i%400==0) printf("%d is a leap year !\n",i);elseprintf("%d is not a leap year !\n",i);}}P020 求(1)-(1/2)+(1/3)……+(1/99)-(1/100)的值.#include<>int main(){float sign=1 , sum=0 , deno , term ; for(deno=1;deno<=100;deno++){term=sign*(1/deno); sum=sum+term;sign=(-1)*sign; }printf("The sum of deno(指定值) is %f .\n",sum);return 0; #include<>int main()int i , num ,n ; printf("Please input a number :\n");{if(num%i==0) {n=1;break; }n=0; }if(n==0) {printf("It is do a prime number !"); } else{printf("It is not a prime number !");}return 0;}要求用流程图表示上列算法.要求用N-S图表示上列算法.…………还要伪代码P036 调换二个参数的值.#include<>int main(){char a='a',b='b',c;c=a;a=b;b=c;printf("a now is %c , b now is %c !\n",a,b);return 0;}P036 输入10个数,并输出最大的那一个数.#include<>int main(){int i,a[10],s=0 ;printf("Please input 10 numbers :\n");for(i=0;i<=9;i++){scanf("%d",&a[i]);}for(i=0;i<=9;i++){if (s<a[i]) s=a[i];}printf("%d is the biggest number !\n",s);return 0;}P036 按大小顺序输出一些数.#include<>int main(){int i , j , a[4] , s=0 ;printf("Please input 5 numbers :\n"); for (i=0 ; i<=4 ; i++){scanf("%d",&a[i]); }for (i=0 ; i<=3 ; i++) {for (j=i+1 ; j<=4 ; j++) {if (a[i]>a[j]) {s=a[i];a[i]=a[j];a[j]=s;}}}for (i=0 ; i<=4 ; i++) printf("%d-",a[i]);return 0;P036 求1至100的总合.#include<>int main(){int i , sum=0 ; for (i=0 ; i<101 ; i++)sum=sum+i;printf("The sum of one to one hundred is %d !\n",sum);return 0;}P036 判断一个数能否同时被3和5整除.#include<>int main(){int n ;printf("Please input a number :\n");scanf("%d",&n);if(n%3==0&&n%5==0) printf ("Can be devide by 3 and 5 !\n");elseprintf ("Can not be devide by 3 and 5 !\n");return 0;P036 输出100-200间的素数.#include<> #include<>qrt是求根,属数学函数.int main() {int i;for (i=100; i<=200; i++) if(prime_number(i) == 1) printf("%d ",i);return 0;}int prime_number(double m) {int j,k;k=(int)sqrt(m); for(j=2;j<=k;j++){if(m%j==0)return 0; }return 1;}#include<>#include<>int main(){int i;for(i=100;i<=200;i++) {if(prime(i)==1) printf ("%d is the prime number !\n",i);}return 0;}int prime(int j) {int m, n;m=(int)sqrt(j);for (n=2;n<=m;n++){if(j%n==0)return 0; }return 1;}请仿照来写.P036 最大公约数和最小公倍数.#include<> main (){int m, n, c, d;int gcd(); int lcm(); printf("Please input two number :\n");scanf("%d %d",&m,&n);c=gcd(m,n); y=x%y; x=temp; }return y; }int lcm(int x, int y) 于号降序,大于号升序.{ temp=x;x=y;y=temp;}for(i=1; i<=y; i++) {if(!((x*i)%y)) { return x*i;}}}最简单的C程序设计——顺序程序设计P037 把华氏温度转化为摄氏表示法.#include<>float F_to_C(float input_fah) {float output_cen; output_cen=9)*(input_fah-32);return output_cen; }float C_to_F(float input_cen){float output_fah;output_fah=5)*input_cen+32; return output_fah; }int main(){int choice;float input_fah,input_cen,output_fah,output_cen;printf("F_to_C press <1> and C_to_F press <2> !\n");scanf("%d",&choice);if(choice==1){printf("Please input fahrenheit :");scanf("%f",&input_fah);output_cen=F_to_C(input_fah);printf("The 华氏 is %d , 摄氏is %d .",(int)input_fah,(int)output_cen);}if(choice==2){printf("Please input centigrade :");scanf("%f",&input_cen);output_fah=C_to_F(input_cen);printf("The Centigrade is %d , and the Fahrenheit is %d .",(int)input_cen,(int)output_fah);}return 0;}P038 计算存款利息(关于精度问题).#include<>int main(){float p0=1000,r1=,r2=,r3=,p1,p2,p3;p1=p0*(1+r1);p2=p0*(1+r2);p3=p0*(1+r3/2)*(1+r3/2);printf("p1=%f\np2=%f\np3=%f\n",p1,p2,p3);return 0;}P055 大写转换成小写#include<>int main() 6个字母.{char c1, c2;c1='A';c2=c1+32;printf("%c %d",c2,c2);return 0;}P059 给出三角形边长,算出面积.#include<>#include<>int main(){double a=, b=, c=, s, area;s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("area is %f\n",area); return 0; }P065 求一无二次等式的根,默认两个不同根. #include<>#include<>int main(){double a,b,c,disc,x1,x2,p,q;scanf("%lf %lf %lf",&a,&b,&c);disc=b*b-4*a*c;p=-b/*a);q=sqrt(disc)/*a);x1=p+q;x2=p-q;printf("x1=%\nx2=%",x1,x2);return 0;}P071 用%f输出实数,只能得到六位小数.#include<>#include<>int main(){double a=; 以是float.printf("%.9f\n",a/3);return 0;}P072 float型数据的有效位数.#include<>#include<>int main(){float a; 33252,float精度6位,所以第七位后不可信.a=10000/;printf("%f\n",a);return 0;}P078 使用putchar函数输出. #include<>#include<>int main(){char a='B',b='O',c='Y';putchar(a);putchar(b);putchar(c);putchar('\n');putchar(101); p utchar(66);return 0;}P079 使用getchar得到字符. #include<>#include<>int main(){char a,b,c;a=getchar();b=getchar();c=getchar();putchar(a);putchar(b);putchar(c); putchar('\n');return 0;}P081 getchar得到大写,putchar输出小写. #include<>#include<>int main(){char a,b;a=getchar();b=a+32;putchar(b);putchar('\n');return 0;}P082 国民生产总值10年后的增长倍数.#include<>#include<>int main(){double p,r=,n=10;p=pow((1+r),n); printf("P is %lf when 10 yearslater .\n",p);return 0; }P082 求各种存款的利息数.#include<>#include<>int main(){double p,r,n; p=1000*(1+5*;printf("5 years is %lf !\n",p); f输出的是double型.p=(1000*(1+2*);p=(p*(1+3*);printf("5 years is %lf !\n",p); p=(1000*(1+3*);p=(p*(1+2*);printf("5 years is %lf !\n",p); 明,是一样的.p=1000*pow((1+,5);printf("5 years is %lf !\n",p); p=1000*pow((1+4),4*5);printf("5 years is %lf !\n",p); #include<>#include<>int main(){double m,r=,d=300000,p=6000;m=(log10(p/(p-d*r)))/(log10(1+r));printf("%.1lf",m); lf.return 0;}P084 字母密码转换,调用函数及临界处理.#include<>char printcode(char f){if(((int)f>86&&(int)f<91)||((int)f>118&&(int)f<123)) {return(f-26+4); }else{return(f+4);}}int main(){char a,b,c,d,e;printf("Please input :\n");a=getchar();b=getchar();c=getchar();d=getchar();e=getchar();printf("%c%c%c%c%c",printcode(a),printcode(b),printcode(c),p rintcode(d),printcode(e));putchar(putcharcode(a));putchar(putcharcode(b));putchar(putcharcode(c));putchar(putcharcode(d));putchar(putcharcode(e));return 0; lf 来实现,因为没有要求实部,所以格式中m不写.以转换,但要在某此条件下,例如输出和读入时,%c是字母,而%d 是数值,看着办.}选择结构程序设计P086 一无二次方程求根的二分支.#include<>#include<>int main(){double a,b,c,disc,x1,x2,p,q;scanf("%lf %lf %lf",&a,&b,&c);disc=b*b-4*a*c;if(disc<0) printf("This equation hasn't real roots\n");else{p=-b/*a);q=sqrt(disc)/*a);x1=p+q;x2=p-q;printf("x1=%\nx2=%",x1,x2);}return 0;}P087 二个数按大小输出.#include<>int main() {float a,b,t;scanf("%f %f",&a,&b); 如有个逗号.if(a>b){t=a;a=b;b=t;}printf("%,%\n",a,b);return 0;}P088 三个数按大小输出.#include<>int main() {float a,b,c,t;scanf("%f %f %f",&a,&b,&c);if(a>b) {t=a;a=b;b=t;}if(a>c) {t=a;a=c;c=t;}if(b>c) {t=b;b=c;c=t;}printf("%,%%\n",a,b,c);return 0;}P099 判断输入字符,并最终按小写输出.#include<>int main(){char ch;scanf("%c",&ch);ch=(ch>='A'&&ch<='Z')(ch+32):ch; printf("%c\n",ch);return 0;}P100 按要求输出相应的Y值.#include<>{int x,y;scanf("%d",&x);if(x>=0){if(x>0) {y=1;}else{y=0;}}else{y=-1;}printf("x=%d,y=%d",x,y);return 0;}P102 switch的简单应用. #include<>{char grade;scanf("%c",&grade);printf("Your score:");switch(grade){case'a':printf("85-100\n");break;case'b':printf("70-84\n");break;case'c':printf("60-69\n");break;case'd':printf("<60\n");break;default:printf("Enter data error!\n");}return 0;}P104 按输入执行操作,并且不分大小写. #include<>void action1(int x,int y){printf("x+y=%d\n",x+y);}void action2(int x,int y){printf("x*y=%d\n",x*y);}int main(){char ch;int a=15,b=23;ch=getchar();switch(ch){case'a':case'A':action1(a,b);break; case'b': case'B':action2(a,b);break;default:putchar('\a'); }return 0;}P106 用if的分支来做闰年问题#include<>int main(){int year,leap;printf("Please input the year:\n");scanf("%d",&year);if(year%4==0) {if(year%100==0) {if(year%400==0) {leap=1;}else{leap=0;}}else}}else{leap=0;}if(leap){printf("%d is ",year);}else{printf("%d is not ",year);}printf("a leap year !"); return 0;}P108 一元二次等式的全计算过程.#include<>#include<>int main(){double a,b,c,disc,x1,x2,realpart,imagpart;scanf("%lf %lf %lf",&a,&b,&c);printf("The equation ");if(fabs(a)<=1e-6) {printf("is not a quadratic !\n");printf("x1=x2=%lf",-c/b);}else{disc=b*b-4*a*c;if(fabs(disc)<=1e-6) {printf("has two equal roots : %lf\n",-b/(2*a));}else{if(disc>1e-6){x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf("has distinct real roots : %lf and %lf \n",x1,x2);}else{realpart=-b/(2*a);imagpart=sqrt(-disc)/(2*a);printf("has complex roots: \n");printf("%lf + %lfi\n",realpart,imagpart);printf("%lf + %lfi\n",realpart,imagpart);}}}return 0;}P109 关于多个区间的计算,运费问题为例.#include<>int main(){double p,w,s,d,f;printf("p,w,s\n");scanf("%lf %lf %lf",&p,&w,&s);if(s<250){d=;f=p*w*s*(1-d);printf("%lf",f);}else if(s<500){d=;f=p*w*s*(1-d);printf("%lf",f);}else if(s<1000){d=;f=p*w*s*(1-d);printf("%lf",f);}else if(s<2000){d=;f=p*w*s*(1-d);printf("%lf",f);}else if(s<3000){d=;f=p*w*s*(1-d);printf("%lf",f);}else{d=;f=p*w*s*(1-d);printf("%lf",f);}return 0;}P0112 键盘输入三个数,输出最大者. #include<>int mina,mida,maxa;int max(int a,int b,int c){int m;if(a>b) {m=a;a=b;b=m;}if(a>c){m=a;a=c;c=m;}if(b>c){m=a;a=c;c=m;return (c); 以c是返回中最大的.}int main(){int a,b,c;printf("Please input 3 numbers :");scanf("%d %d %d",&a,&b,&c);printf("The max is %d !\n",max(a,b,c));return 0;}P0112 一个小于1000的数,有判定条件. #include<>#include<>int main(){double a,b;printf("Please input a number :");scanf("%lf",&a);if(a<1000){b=sqrt(a);else{printf("\a"); lf",b); return 0;}P0112 一个不多于5位的数,按条件输出.#include<>#include<>int main(){int i,a,b[4],count=0;printf("Please input a number (five-digit number) :");scanf("%d",&a);for(i=0;i<=4;i++){b[i]=a%10; a=a/10; if(b[i]!=0){count=count+1;}}printf("%d位数.\n",count);printf("分别输出每一位数字,如下:");for(i=4;i>=0;i--){printf("%d ",b[i]);}printf("\n");printf("倒序输出这一个数字,如下:");for(i=0;i<=4;i++){printf("%d",b[i]);}printf("\n");return 0;}P0112 按要求提成奖金(if写法).#include<>int main(){double a,b;printf("Please input profit amount :");scanf("%lf",&a);if(a<=10) {b=a*;}else if(a<=20) {b=1++(a-20)*;}else if(a<=60){b=1+++(a-40)*;}else if(a<=100){b=1++++(a-60)*;}else{b=1++++(a-100)*;}printf("The reward is %lf !\n",b);return 0;}P0112 按要求提成奖金(switch写法). #include<>double GetProfit(double c){printf("Please input profit amount :");scanf("%lf",&c);return (c); }int main(){double a;char c;printf("Your choice :\nA : 0-10 ;\nB : 10-20 ;\nC : 20-40 ;\nD :40-60 ;\nE : 60-100 ;\nF : 100-1000 ;\n");scanf("%c",&c); switch(c) { case'A':{ printf("The reward is %lf !\n",GetProfit(c)*;};break;}return 0;}P0112 键盘输入数值,然后排序输出.#include<>int main(){int a[10],i,j,m,n; printf("请输入数值的个数: (十个以内)");scanf("%d",&m); printf("请分别输入相对应个数的数值:");for(i=0;i<m;i++){scanf("%d",&a[i]);}for(i=0;i<m;i++){for(j=i+1;j<m;j++){if(a[i]>a[j]) 序.{n=a[i]; a[i]=a[j];a[j]=n;}}}for(i=0;i<m;i++){printf("%d",a[i]);}return 0;}C程序设计(第四版)(谭浩强)第五章课后习题答案循环结构程序设计P115 用while计算1至100的合.#include<>int main(){int i=1,sum=0;while(i<=100) {sum=sum+i;i++;}printf("The sum is %d .\n",sum);return 0;}P117 用do-while来做1至100的合. #include<>int main(){int i=1,sum=0;do{ sum=sum+i;i++;}while(i<=100);printf("The sum is %d .\n",sum);return 0;}P118 比较do-while与while的差别.#include<>int main(){int i,sum=0;printf("Please input a number :");scanf("%d",&i); while(i<=10){sum=sum+i;i++;}printf("The sum of 1-10 is %d .\n",sum);return 0;}#include<>int main(){int i,sum=0;printf("Please input a number :");scanf("%d",&i); 入11的话,先做操作,所以sum=11.do{sum=sum+i;i++;}while(i<=10); printf("The sum of 1-10 is %d .\n",sum);return 0;}P126 break的例子.#include<>int main(){int i,b=0,a,c;for(i=0;i<=1000;i++){printf("Please input amount :"); scanf("%d",&a);b=b+a;if(b>=100){break; }}c=b/i;printf("conut is %d , aver is %d ",i+1,c); return 0;}P127 continue的例子.#include<>int main(){int i;for(i=1;i<20;i++){if(i%3!=0){continue; }printf("%d ",i);}printf("\n");return 0;}P128 形成一个4*5的矩阵.#include<>int main(){int i,j,a=0; for(i=1;i<=4;i++) {for(j=1;j<=5;j++,a++) {if(a%5==0){printf("\n");}printf("%d\t",i*j);}}printf("\n");return 0;}P131 用一个交错的式子求哌的近似值.#include<>#include<>int main() {float s=1,n=1,m,sum=0,t;for(m=1;;m=m+2) { t=(s)*(n/m); { break;}sum=sum+t; s=s*(-1); }printf("四分之一哌的值是%f.\n",sum);printf("一个完整哌的值是%f.\n",sum*4);return 0;}掉注释,可运行.且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=.\n%f\n%f\n%f\n",m,a,b,c); 然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.为int float就不同种类,一个是整数,一个是小数,float double同样是有小数点的!!!!么写<=38,要么写<39,边界问题一定要注意,不可以太随意!!!!{f3=f1+f2;printf("%12d\n",f3);f1=f2; f2=f3; 以不用到f3.}return 0;}P135 还是求素数,方法不一样.#include<>#include<>int main(){double num;int i;printf("Please input a number :");scanf("%lf",&num); for(i=2;i<=sqrt(num);i++) { if((int)num%i==0) {break; }} {printf("Yes %d",(int)num);}return 0;}P137 求100至200间的素数.#include<>.#include<>int main(){double j;int i,k=0;for(j=100;j<=200;j++){for(i=2;i<=sqrt(j);i++){if((int)j%i==0){break;}}k=k+1; 习一下,有助逻辑.if(i<=sqrt(j)){printf("Not %d ",(int)j);if(k%5==0) {printf("\n");}}else{printf("Yes %d ",(int)j);if(k%5==0){printf("\n");}}}return 0;P139 密码转换.#include<>int main(){char c;c=getchar();while(c!='\n') {if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){if((c>='w'&&c<='z')||(c>='W'&&c<='Z')){c=c-22;}else{c=c+4;}printf("%c",c);c=getchar(); }}printf("\n"); r eturn 0;P140 最大公约数和最小公倍数.#include<> main (){int m, n, c, d;int gcd(); int lcm(); printf("Please input two number :\n");scanf("%d %d",&m,&n);c=gcd(m,n); y=x%y; x=temp; }return y; }int lcm(int x, int y) 小于号降序.{ temp=x;x=y;y=temp;}for(i=1; i<=y; i++) {if(!((x*i)%y)) { return x*i;}}}P140 判断一串输入的字符.#include<>int main(){char ch;int a=0,b=0,c=0,d=0,e=0;printf("Please input the string\n");while((ch=getchar())!='\n') { if(ch<='z'&&ch>='a'){a++;}else if(ch==' '){c++;}else if(ch<58&&ch>47){d++;}else if(ch<='Z'&&ch>='A'){b++;}。