




已阅读5页,还剩79页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档C程序设计(第四版)(谭浩强)第一章课后习题答案P006 1.1 向屏幕输出文字.#include /预编译. 代码均调试成功,若有失误大多不是代码问题.自已找找. int main()printf(Welcome to n); return 0; /与int main对应,为了程序可移植性,建议全用int main + return 0;.P008 1.2 求两个数的和.#include int main()int a,b,sum;a=5;b=4;sum=a+b;printf(The sum is %d .n,sum);return 0;P008 1.3 调用函数比较两个数的大小.#include int main()int max(int x,int y); /被调用函数在主函数后面,用前先声明.int a,b,c;scanf(%d,%d,&a,&b); /输入时要按格式来,此处的逗号,用空格会发生错误.c=max(a,b); /a,b作为实参传入被调用函数中.printf(The max is %d .n,c);return 0;int max(int x,int y) /定义了两个形参. int z; /z属于局部变量,可与主函数中相同名字.if (xy)z=x;elsez=y;return(z); /z作为整个程序的出口值,赋给主函数中的c.P015 0.6 三个数的大小.(数字0表示课后练习题)#include int main()int a,b,c,d; /d是用于存储最大值的.int max(int x , int y , int z); /测试可知,在VS2008中,可以不预先声明.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); / d可以换成max(a,b,c).int max(int x , int y , int z)int m;if (xy & xz) /求三者之大的一种方法.m=x;if (yx & yz)m=y;if (zy & zx)m=z;return (m); /返回值m给主函数中的d.C程序设计(第四版)(谭浩强)第2章课后习题答案算法程序的灵魂P017 2.1 计算机1-5相乘的积.#include int main()int i,s=1; /在执行数值操作前一定要先有个初值.for(i=1;i6;i+) /这里是到6.s=s*i; /相乘printf(The sum is %d .n,s);return 0;#include /作出要求:换成1到11间奇数相乘.int main()int i,s=1; /在执行数值操作前一定要先有个初值.for(i=1;i12;i+) /这里是到,但题目要求的是取单数.也可以是i=i+2if(i%2!=0) /i对取模,值为非为奇数;为则为偶数.s=s*i;elsecontinue; /跳过这个for循环的这一次,执行下一次.printf(The sum is %d .n,s);return 0;P019 2.2 按要求输出80分以上的学生信息.暂时没法做.P019 2.3 判断2000-2500年中的闰年,并输出.年的概念是地球围绕太阳一周的时间(所谓公转周期)称为一年,这个周期是相当稳定的,很长时间也不会变动1秒,但是真正的一年是365.2423天(目前)。所以,如果每年定义为365天的话,1年就会多出0.2423天,4年就会多出0.9692天,非常接近1天,这样闰年就出现了,也就是每4年要有1年设置为366天,来抵消这多出的1天。规则为:1)如果年份能被4整除,则该年计为闰年;可是,假如不做调整的话,当400年的时候,累计才多出96.92天,接近于多出97天,闰年的设置却多出来100天,所以要在400年内,再撤销3个闰年。怎么撤销呢?就有了下面这个规则:2)如果年份能被100整除,则不计为闰年;问题又来了,400年里有4个100年吧,去掉后四个100年后,又少了一个,所以再加一个规则就是:3)如果年份能被400整除,则计为闰年。简单说来每400年里设置了97个闰年,也就是400里的前3个100年不设置闰年,误差被调整到400年仅有0.08天。#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 2.4 求(1)-(1/2)+(1/3)+(1/99)-(1/100)的值.#include int main()float sign=1 , sum=0 , deno , term ; /关于有小数的计算应该用float.for (deno=1;deno=100;deno+)term=sign*(1/deno); /term临时值,sing符号,deno为分母.sum=sum+term; /第一次总全存储.sign=(-1)*sign; /换号.printf(The sum of deno(指定值) is %f .n,sum); return 0; /若是到100的话,结果为0.68172P021 2.5 得到一个大于3的数,并判断是否为素数.#include int main() int i , num ,n ; /像13,37,这样只能让和它本身除以外,没有其它除数的叫素数.printf(Please input a number :n); /获取一个数值scanf(%d,&num);for(i=2;inum;i+) /在到此数值间进行循环除,如果除得尽,就不满足素数要求.if(num%i=0) /除得尽,则不是.n=1;break; /设置跳出,才不会执行多次.n=0; /按程序走的话,这里会执行多次,不能用printf语句,会输出多次.if(n=0) /单出口问题,虽然n=0执行多次,但仍然是n=0,这样才会只输出一次.printf(It is do a prime number !); /如果是100-200可以加个”%d”,nmu进去.elseprintf(It is not a prime number !);return 0;2.6-2.10要求用流程图表示上列算法.2.11-2.16要求用N-S图表示上列算法. 还要伪代码P036 0.1 调换二个参数的值.#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 0.2 输入10个数,并输出最大的那一个数.#include int main() int i,a10,s=0 ;printf(Please input 10 numbers :n);for(i=0;i=9;i+)scanf(%d,&ai);for(i=0;i=9;i+)if (sai) s=ai;printf(%d is the biggest number !n,s);return 0;P036 0.3 按大小顺序输出一些数.#include int main() int i , j , a4 , s=0 ;printf(Please input 5 numbers :n); /此处要回车.for (i=0 ; i=4 ; i+)scanf(%d,&ai); /这是取多个数的代码,可以用while控制取到n符为止.for (i=0 ; i=3 ; i+) /双重循环,先一个外循,再轮所有小循,轮完后再下一个大循.for (j=i+1 ; jaj) /如果成立,则对换,小于号表示降序排列,大于号表示升序排列.s=ai;ai=aj;aj=s;for (i=0 ; i=4 ; i+) /重新定义循环输出数组中新排列的数.printf(%d-,ai);return 0;P036 0.4 求1至100的总合.#include int main()int i , sum=0 ; /这是一个简单的程序.for (i=0 ; i101 ; i+)sum=sum+i;printf(The sum of one to one hundred is %d !n,sum);return 0;P036 0.5 判断一个数能否同时被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 0.6 输出100-200间的素数./*第一种方法.#include /网络版本,采用调用函数和求根取素.#include /下面用到sqrt,所以需要包含数据函数.sqrt是求根,属数学函数.int main() /学会一个程序采用”主函数+被调用函数”的方式,会比较规范.int i;for (i=100; i=200; i+) /为了书写规范,最好加上,以示清范围.if(prime_number(i) = 1) /i是实参.printf(%d ,i);return 0;int prime_number(double m) /m是形参.int j,k;k=(int)sqrt(m); /求根,(int)是强制转换,求根里要是浮点型.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) /这里i为实参,传入形参j中进行运算,然后再由形参j带出返回.printf (%d is the prime number !n,i);return 0;int prime(int j) /j是形参,用于接收实参i给的值.int m, n;m=(int)sqrt(j);for (n=2;n=m;n+)if(j%n=0)return 0; /返回值,0为不是素数,1是素数.return 1;/*第二种方法.请仿照2.5来写.P036 0.7 最大公约数和最小公倍数.#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); /c获取最大公约数d=lcm(m,n); /d获取最小公倍数printf(The GCD of %d and %d is : %d !n, m, n, c);printf(The LCM of %d and %d is : %d !n, m, n, d); return 0;int gcd(int x, int y) /最大公约数Greatest Common Divisorint temp;while(x%y!=0) temp=y; /y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去.y=x%y; /x,y的余数作为下一轮中的Y,由x%y来取得.x=temp; /刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用.return y; /这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理.int lcm(int x, int y) /最小公倍数Lowest Common Multipleint i, temp;if(xy) /保证二者大的数在X上,小的数在Y上.小于号降序,大于号升序. /以下为经典三行码,实现两个数的互换.temp=x;x=y;y=temp;for(i=1; i=y; i+) /设定一个区间,从1至小的数之间的循环.if(!(x*i)%y) /除得尽为零,非零为真,则成立并返回. /如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数. return x*i;最简单的C程序设计顺序程序设计P037 3.1 把华氏温度转化为摄氏表示法.#include float F_to_C(float input_fah) /代表华转摄,input_fah是局部变量.float output_cen;/这里也是局部变量.output_cen=(5.0/9)*(input_fah-32); /函数的功能体.return output_cen; /返回值,注意,返回值的数据类型应该和函数一致.float C_to_F(float input_cen)float output_fah;output_fah=(9.0/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 and C_to_F press !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 3.2 计算存款利息(关于精度问题).#include int main()float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3;p1=p0*(1+r1);p2=p0*(1+r2);p3=p0*(1+r3/2)*(1+r3/2);printf(p1=%fnp2=%fnp3=%fn,p1,p2,p3); return 0;P055 3.3 大写转换成小写#include int main() /小写范围是97-122,大写范围是65-90,大写加上即得小写.26个字母.char c1, c2;c1=A;c2=c1+32;printf(%c %d,c2,c2);return 0;P059 3.4 给出三角形边长,算出面积.#include #include int main() double a=3.67, b=5.43, c=6.21, s, area;s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c);printf(area is %fn,area); /默认可以组成三角形.return 0;P065 3.5 求一无二次等式的根,默认两个不同根.#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/(2.0*a);q=sqrt(disc)/(2.0*a);x1=p+q;x2=p-q;printf(x1=%7.2fnx2=%7.2f,x1,x2);return 0;P071 3.6 用%f输出实数,只能得到六位小数.#include #include int main() double a=1.0; /1是整型,1.0是浮点型,默认是double.可以是float.printf(%.9fn,a/3); return 0;P072 3.7 float型数据的有效位数.#include #include int main()float a; /输出的结果是.333252,float精度6位,所以第七位后不可信.a=10000/3.0;printf(%fn,a);return 0;P078 3.8 使用putchar函数输出.#include #include int main()char a=B,b=O,c=Y;putchar(a);putchar(b);putchar(c);putchar(n);putchar(101); /101是A的ASCII代码的缩写,因为此函数只能输出字符.putchar(66);return 0;P079 3.9 使用getchar得到字符.#include #include int main()char a,b,c;a=getchar();b=getchar();c=getchar();putchar(a);putchar(b);putchar(c); /这也是基本回显的C程序代码.putchar(n);return 0;P081 3.10 getchar得到大写,putchar输出小写.#include #include int main()char a,b;a=getchar();b=a+32;putchar(b); putchar(n);return 0;P082 0.1 国民生产总值10年后的增长倍数.#include #include int main()double p,r=0.09,n=10;p=pow(1+r),n); /这是数学函数, pow(x,y)计算x的y次方.printf(P is %lf when 10 years later .n,p);return 0; /结果是0.36倍.P082 0.2 求各种存款的利息数.#include #include int main()double p,r,n; /年份和当年利率均有给出.p=1000*(1+5*0.0585);printf(5 years is %lf !n,p); /1292.5,这是全五年期.lf输出的是double型.p=(1000*(1+2*0.0468);p=(p*(1+3*0.0540);printf(5 years is %lf !n,p); /1270.76,这是先二年,再三年的.p=(1000*(1+3*0.0540);p=(p*(1+2*0.0468);printf(5 years is %lf !n,p); /1270.76,这是先三年,再二年的.证明,是一样的.p=1000*pow(1+0.0414),5);printf(5 years is %lf !n,p); /1224.86,这难道说是,相对的存死期越久越值钱.p=1000*pow(1+0.072/4),4*5);printf(5 years is %lf !n,p); /1428.74.return 0; P083 0.3 求几个月要以还贷.#include #include int main()double m,r=0.01,d=300000,p=6000; m=(log10(p/(p-d*r)/(log10(1+r);printf(%.1lf,m); /按要求只留一个小数,所以要写%.1lf.return 0;P084 0.6 字母密码转换,调用函数及临界处理.#include char printcode(char f)if(int)f86&(int)f118&(int)f123)return(f-26+4); /因为putchar会自动返回,所以改成return,因为这是在函数中,调用需要返回值.elsereturn(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),printcode(d),printcode(e); putchar(putcharcode(a);putchar(putcharcode(b);putchar(putcharcode(c);putchar(putcharcode(d);putchar(putcharcode(e);return 0; /注意理解自定义函数的定义,使用,及形参实参的流向./p84的是计算问题,自己看着办,最后要求小数点后两位,用的是%.2lf 来实现,因为没有要求实部,所以m.n格式中m不写./p84的是定义问题,第一问,两者都行,但是定义字母时,scanf要写%c来获取,而定义数值时则要用%d来获取./ 第二问,putchar貌似只能输出字符,所以用printf.putchar本身就是字符输出函数啦,字符,有木有!字符啊!尽管它的参数可以是putchar(101),效果是输出字符A啊./ 第三问,出现任何及无条件,那么答案明显是否.可以转换,但要在某此条件下,例如输出和读入时,%c是字母,而%d是数值,看着办.选择结构程序设计P086 4.1 一无二次方程求根的二分支.#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(disc0) /这是选择结构和其判断条件的示例.printf(This equation hasnt real rootsn);elsep=-b/(2.0*a);q=sqrt(disc)/(2.0*a);x1=p+q;x2=p-q;printf(x1=%7.2fnx2=%7.2f,x1,x2);return 0;P087 4.2 二个数按大小输出.#include int main() /此程序代表按大小顺序输出.float a,b,t;scanf(%f %f,&a,&b); /出错时,注意检查这里是否按格式输入了.比如有个逗号.if(ab)t=a;a=b;b=t;printf(%5.2f,%5.2fn,a,b);return 0;P088 4.3 三个数按大小输出.#include int main() /此程序代表按大小顺序输出.float a,b,c,t;scanf(%f %f %f,&a,&b,&c); if(ab) /此处执行后,a为小者.t=a;a=b;b=t;if(ac) /此处执行后,a为小者.t=a;a=c;c=t;if(bc) /上面已经搞定a是最小者,现在对比得出次小者,并且已经归到变量中.t=b;b=c;c=t;printf(%5.2f,%5.2f%5.2fn,a,b,c);return 0;P099 4.4 判断输入字符,并最终按小写输出.#include int main()char ch;scanf(%c,&ch);ch=(ch=A&ch=Z)?(ch+32):ch; /条件运算符,真取前,假取后.printf(%cn,ch); return 0;P100 4.5 按要求输出相应的Y值.#include int main()int x,y;scanf(%d,&x);if(x=0) if(x0) /这个范围要基于x=0来判断.y=1;elsey=0;else /这个是x0的范围.y=-1;printf(x=%d,y=%d,x,y);return 0;P102 4.6 switch的简单应用.#include int main()char grade;scanf(%c,&grade);printf(Your score:);switch(grade)casea:printf(85-100n);break; /当多分支结构过于多时,可以用switch来解决.caseb:printf(70-84n);break;casec:printf(60-69n);break;cased:printf(60n);break;default:printf(Enter data error!n);return 0;P104 4.7 按输入执行操作,并且不分大小写.#include void action1(int x,int y)printf(x+y=%dn,x+y);void action2(int x,int y)printf(x*y=%dn,x*y);int main()char ch;int a=15,b=23;ch=getchar();switch(ch)casea:caseA:action1(a,b);break; /a,A共用一个执行语句.caseb:caseB:action2(a,b);break;default:putchar(a); /a可以控制电脑发出蜂鸣声.return 0;P106 4.8 用if的分支来做闰年问题#include int main()int year,leap; printf(Please input the year:n);scanf(%d,&year);if(year%4=0) /400年里,在100个可除尽4的年里计算,以下是在全范围内计算. if(year%100=0) /既是100个内的,又是可以除尽100的,算是且.if(year%400=0) /相当于且了两次,只余下唯一一个.leap=1;else /400年里只有1个除得尽,其它都不是.leap=0;else /这里的范围是(year%4=0)&(year%100!=0)leap=1; /在合法的100内,又不是2100,2200一类的,当然属闰年.elseleap=0;if(leap)printf(%d is ,year);elseprintf(%d is not ,year);printf(a leap year !); /不管上面如何判断,最后还是会输出这一句.return 0;P108 4.9 一元二次等式的全计算过程.#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) /fabs是绝对值, le-6,即是的负六次方,接近或是等于零.printf(is not a quadratic !n); printf(x1=x2=%lf,-c/b);elsedisc=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 : %lf and %lf n,x1,x2);elserealpart=-b/(2*a);imagpart=sqrt(-disc)/(2*a);printf(has complex roots: n);printf(%lf + %lfin,realpart,imagpart);printf(%lf + %lfin,realpart,imagpart);return 0;P109 4.10 关于多个区间的计算,运费问题为例.#include int main()double p,w,s,d,f;printf(p,w,sn);scanf(%lf %lf %lf,&p,&w,&s);if(s250)d=0.0;f=p*w*s*(1-d);printf(%lf,f);else if(s500)d=0.02;f=p*w*s*(1-d);printf(%lf,f);else if(s1000)d=0.05;f=p*w*s*(1-d);printf(%lf,f);else if(s2000)d=0.08;f=p*w*s*(1-d);printf(%lf,f);else if(s3000)d=0.1;f=p*w*s*(1-d);printf(%lf,f);elsed=0.15;f=p*w*s*(1-d);printf(%lf,f);return 0;P0112 0.4 键盘输入三个数,输出最大者.#include int mina,mida,maxa;int max(int a,int b,int c)int m;if(ab) /凡是比较中,大于号代表升序排列.m=a;a=b;b=m;if(ac)m=a;a=c;c=m;if(bc)m=a;a=c;c=m;return (c); /此排序后,a,b,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 0.5 一个小于1000的数,有判定条件.#include #include int main()double a,b;printf(Please input a number :);scanf(%lf,&a);if(a1000)b=sqrt(a);elseprintf(a); /控制蜂鸣声printf(Please input a number again :);scanf(%lf,&a);11b=sqrt(a);printf(%.0lf,b); /按要求,只取整数.return 0;P0112 0.9 一个不多于5位的数,按条件输出.#include #include int main()int i,a,b4,count=0;printf(Please input a number (five-digit number) :); /意思是五位数以内. scanf(%d,&a);for(i=0;i=0;i-)printf(%d ,bi);printf(n);printf(倒序输出这一个数字,如下:);for(i=0;i=4;i+)printf(%d,bi)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深入了解专利代理人考试试题及答案
- 育婴师情感沟通与亲子联系试题及答案
- 系统规划与管理师考试重点评估试题及答案
- 自我防护措施在临床中的必要性试题及答案
- 网络规划设计师复习规划设计试题及答案
- 编程语言构造与使用方法试题及答案
- 激光设备应用案例试题及答案
- 2025年河南省安全员A证考试题库附答案
- 卫生管理相关证书考试试题及答案解析
- 育婴师心理支持技巧试题及答案
- 2024安徽省徽商集团有限公司招聘若干人笔试参考题库附带答案详解
- 2025年郑州铁路职业技术学院单招职业倾向性测试题库必考题
- 2024-2025学年人教版七年级生物下册知识点总结
- 声屏障行业跨境出海战略研究报告
- 2025年安阳职业技术学院高职单招语文2019-2024历年真题考点试卷含答案解析
- 《4•15 第十个全民国家安全教育日》知识宣讲
- 事业单位人力资源管理绩效考核难题与对策分析
- 院内VTE防控课件
- 汽车智能系统知识
- 2025年中铁特货物流股份有限公司招聘(75人)笔试参考题库附带答案详解
- 第8课 数据需要保护(教案)2023-2024学年四年级下册信息技术浙教版
评论
0/150
提交评论