C++课后习题答案.doc_第1页
C++课后习题答案.doc_第2页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

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

文档简介

/*编写程序,根据输入的x的值,按下列公式计算并输出y的值当-5=x=5且x!=0时y=x-1当x=0时y=x+1当5x=100时y=x+5当x为其他值时y=100*/#includeusing namespace std;int main(void)int x,y;coutx;if(-5=x & x=5 & x!=0) couty=x-1即y等于:x-1;else if(x=0) couty=x+1即y等于:x+1;else if(5x & x=10) couty=x+5即y等于:x+5;else couty=100;coutendl;return 0;/*输入5个百分制成绩,求出总成绩及平均成绩*/#includeusing namespace std;int main(void)float a,b,c,d,e,sum,ave;coutabcde; sum=a+b+c+d+e; ave=sum/5.0f;cout总成绩为:sumendl;cout平均成绩为:aveendl;return 0;/*编写程序,输入一个三位正整数,输出各位数字组成的最大值。例如:输入“123”,输出“321”。*/#includeusing namespace std;int main(void)int a,b,c,max,mid,min,x;coutx;a=int(x/100);b=int(x-a*100)/10);c=int(x-a*100-b*10);/分别得出该三位数的每一位上的值,并分别赋给a,b,cmax=a;if(ba) max=b;if(maxc) max=c;/求出三个数的最大值mid=b;if(ab & ca) mid=a;if(ac & cb) min=b;if(cmin) min=c;/求出三个数的最小值coutx转换后的形式为:maxmidminendl;return 0;/*输入若干个百分制成绩,求出总成绩及平均成绩。提示:由于成绩值不可能小于0,因此可将负值作为输入结束的标志*/#includeusing namespace std;int main(void)float sum=0,ave,g;int n;cout请输入n个百分制成绩并以一个负数结束输入g;if(g0) break; /break语句结束循环sum+=g;ave=sum/n;cout总成绩为:sumendl平均成绩为aveendl;return 0;/*输入若干个百分制成绩,求出总成绩及平均成绩。提示:由于成绩值不可能小于0,因此可将负值作为输入结束的标志*/#includeusing namespace std;int main(void)float sum=0,ave,a,n=1;cout输入n个百分制成绩,并以一个负数结束输入a; if(a0) sum=a+sum; ave=sum/n/1.0; n=n+; goto loop; /goto和if组成循环 cout总成绩为:sumendl平均成绩为:aveendl;return 0;/*输入若干个百分制成绩,输出对应的五分制成绩,输入结束后再分别输出这五个分段的人数。五分制成绩用字母a、b、c、d和e分别表示百分制成绩的10090、8980、7970、6960、590*/#includeusing namespace std;int main(void)float x;int a=0,b=0,c=0,d=0,e=0;cout请输入n个百分制成绩:x; if(x0) break; if(90=x & x=100) coutx分对应的等级是:aendl;a+=1; if(80=x & x90) coutx分对应的等级是:bendl;b+=1; if(70=x & x80) coutx分对应的等级是:cendl;c+=1; if(60=x & x70) coutx分对应的等级是:dendl;d+=1; if(0=x & x60) coutx分对应的等级是:eendl;e+=1; cout等级为a的人数为:aendl 等级为b的人数为:bendl 等级为c的人数为:cendl 等级为d的人数为:dendl 等级为e的人数为:eendl; return 0;/*设计一个程序,输出所有的水仙花数。所谓水仙花数是一个三位数其各位数字的立方和等于该数本身。例如:153=13+53+33 */#include#includeusing namespace std;int main(void)int a,b,c,d;for(a=100;a=999;a+) b=int(a/100); c=int(a-b*100)/10);d=int(a-b*100-c*10);/分别得出三位数三个位上的数if(a=pow(b,3)+pow(c,3)+pow(d,3)couta为水仙花数endl;return 0;/*编写程序,计算100到200之内所有素数的和*/#include#includeusing namespace std;int main(void) int x,i,sum=0; for(x=100;x=200;x+)for(i=2;isqrt(x) sum+=x;cout100到200以内的素数之和为:sumendl;return 0;/*编写程序,求出100到200之间的素数,并按每行5个输出。*/#include#include#includeusing namespace std;int main(void)int x,i;for(x=100;x=200;x+)for(i=2;isqrt(x) coutsetw(16)leftx;cout=2) */#includeusing namespace std;int main(void)int n=1,a,b;cout0endl1endl;a=0,b=1;while(n=9) /因为一次性输出“coutaendlbendl”有两项,所以只要执行9次循环。a=a+b;b=a+b;n+=1;coutaendlbendl;return 0;/*输入一个整数,输出该整数的所有素数因子。例如:输入“12”,输出为“2,2,3”*/#includeusing namespace std;int main(void)int n,c=2;coutn;coutc)if(n%c=0)coutc,;n=n/c; elsec+;coutn;coutendl;return 0;/*自守数是平方后尾数等于该数自身的自然数。例如:25*25=625 76*76=5776任意输入一个自然数(设不超过3位),判断其是否为自守数并输出,如:25 yes 25*25=62511 no 11*11=121 */#includeusing namespace std;int main(void)int x,a,b,c;coutx;if(x4)if(x*x=x) coutx yes x*x=x*x;else coutx no x*x=x*x;else if(4=x & x10)a=x*x;if(a-a/10*10)=x) coutx yes x*x=a;else coutx no x*x=a;else if(10=x & x32)a=x*x;b=a-a/100*100;if(b=x) coutx yes x*x=a;else coutx no x*x=a;else if(32=x & x99)a=x*x;b=(a-a/1000*1000);c=b-b/100*100;if(c=x) coutx yes x*x=a;else coutx no x*x=a;cout=30 */#includeusing namespace std;int main(void) long double s=1;long int n=2;while(s30)s=s+(1.0/n);n+;coutsendl;cout最小的n值为:nendls的值为:sendl;return 0;/*试编写一个加密程序,加密方法是将明文的字母变成其后的第4个字母,字母表首尾相连。例如,输入明文“china”,输出密文“glmre”。非字母符不加密,当输入字符“#”时,程序运行结束。 */ #includeusing namespace std;int main(void)char c;cout请输入需要加密的文字:;for(cin.get(c);c!=#;cin.get(c) if(65=c & c87)coutchar(int (c+4);if(87=c & c=90)coutchar(int (c+4-90+64);if(97=c & c119)coutchar(int (c+4);if(119=c & c=122)coutchar(int (c+4-122+96); if(c122)coutc;coutendl;return 0;/*用一下公式求e的近似值(n取10)。e=1+1/1!+1/2!+1/3!+1/n! */#includeusing namespace std;int main(void)double e=1,s=1;int n=1;dos*=n;e+=1/s;n+=1;couteendl;while(n11);coute的近似值为:eendl;return 0;/*用一下公式求e的近似值(直到最后一项的绝对值小于10-8为止)。e=1+1/1!+1/2!+1/3!+1/n! */#include#include#includeusing namespace std;int main(void)double e=1,s=1;int n=1;dos*=n;e+=1/s;n+=1;coutsetprecision(8)e1e-8);coute的近似值为:setprecision(8)eendl;return 0;/*输入一个实数x,用下式求ex的近似值,知道最后一项的绝对值小于1e-8为止*/#include#includeusing namespace std;int main(void)double e=1,s=1,x,n=1;coutx;dos*=n;e+=(pow(x,n)/s;n+=1;coute1e-8);coutex的近似值为:eendl;return 0;/*求出1599中能被3整出,且至少有一位数字为5的所有整数。例如15、51、513均是满足条件的整数 */#includeusing namespace std;int main(void)int b,s,g,n; /b表示百位,s表示十位,g表示个位for(n=1;n600;n+)if(10=n&n=99)for(n=10;n100;n+)s=n/10;g=n-s*10;if(n%3=0&(s=5|g=5)coutnendl;if(100=n&n=599)for(n=100;n600;n+)b=n/100;s=n-n/100*100;g=n-b*100-s*10;if(n%3=0&(b=5|s=5|g=5)coutnendl;return 0;/*由于32+42=52,所以称3,4,5为勾股数。试编程求出100以内的所有勾股数。*/#include#includeusing namespace std;int main(void)int a,b,c;for(a=1;a=100;a+)for(b=1;b=100;b+)for(c=1;c=100;c+)if(c*c=a*a+b*b)couta,b,c 为勾股数!endl;return 0;/*求满足以下条件的三位数n:它除以11(整数相除)所得的商等于n的各位数字的平方和,且其中至少有两位数字相同。例如:131除以11的商为11,各位数字的平方和为11,所以它是满足条件的三位数。 */#includeusing namespace std;int main(void)int n,b,s,g,a;for(n=100;n1000;n+)b=n/100;s=(n-b*100)/10;g=n-b*100-s*10;a=n/11;if(b=s|b=g|s=g)if(s*s+b*b+g*g=a)coutn满足条件endl;return 0;/*用牛顿迭代法求一元方程2x3-4x2+3x-6=0在x=1.5附近的根,要求精度为1e-8。*/#include#includeusing namespace std;int main(void)float x,y;for(x=1.5;)y=x;x=x-(2*pow(x,3)-4*pow(x,2)+3*x-6)/(6*x*x-8*x+3);if(fabs(y-x)1e-8) break;coutxendl;cout2x3-4x2+3x-6=0在x=1.5附近的根为:xendl;return 0;/*在1000以内验证哥德巴赫猜想*/#include#include#includeusing namespace std;int prime(int i)for(int j=2;jsqrt(i) return i;int main(void)int n,k,h;coutn;for(k=2;k=1000;k+)for(h=2;h=1000;h+)if(prime(k)+prime(h)=n)coutn=k+n-kendl;return 0;/*用二分法求方程x3-6x-1=0在x=2附近的一个实根,要求迭代精度为1e-8 */#include#includeusing namespace std;int main(void)long double y1,y2,x0,x1=1,x2=3;while(fabs(y1)=1e-8 | fabs(y2)=1e-8)y1=pow(x1,3)-6*x1-1; y2=pow(x2,3)-6*x2-1;x0=(x1+x2)/2;if(y1*y2=0)x1=x1*2-x2; x2=x0;couty1=y1 y2=y2endl; /直观显示出y1和y2的变化cout方程x3-6x-1=0在x=2附近的一个实根:x0endl;return 0;/*计算体重指数并得出相应的评语*/#include #include using namespace std;int main (void)float s,t,x;coutts;if(s5|t0.5 )cout输入的数据无效!n; return 1;x=t/(pow(s,2);if(x18.5) cout不好意思,您有点营养不良!endl;else if(18.5=x&x=23) coutperfect!完美身材endl;else cout唉!您超重了!endl;return 0;/*编写一个程序,从标准输入读入某职员的工作时间(以小时计)和每小时的工资数,计算并输出他的:工资。若职员月工作时间超过40小时,则超过部分按原工资的15倍来计算。*/#includeusing namespace std;int main(void)int hour;float reward,pay;couthour;coutreward;if(hour40) pay=40*reward+(hour-40)*1.5*reward;coutpayendl;return 0;/*编写一个程序,输出n阶杨辉三角形,其中n由用户输入,该值不能大于13。*/#includeusing namespace std;int c(int n,int m)int i,j,k=1,l=1;for(i=1;i(n-m);j-)l*=j;return l/k;int main(void)int m,n,i,j;coutn;for(i=0;i=n;i+)coutendl;for(m=0;m=35-(i+1);m+=1)cout ;for(j=0;j=i;j+)coutc(i,j) ;coutendl;return 0;/*编写程序f(),计算1+1/2!+1/3!+1/n!。f()函数的原型为:double f(int n)*/#includeusing namespace std;int main(void)double f(int n); /函数原型声明int n;coutn;coutf(n)endl;return 0;double f(int n)float s,e=1;int i;for(i=1,s=0;i=n;)e*=i;s+=1.0/e;i+=1;return s;/*编写程序:通过函数调用,求正整数m和n的最大公约数和最小公倍数*/#includeusing namespace std;int y(int m,int n)int t;if(m=0 | n=0)return 0;else if(mn)t=m;m=n;n=t;while(m%n!=0)t=m%n;m=n;n=t;return n;int main(void)int m,n;coutmn;cout最大公约数为:y(m,n)endl;cout最大公倍数为:m*n/y(m,n)endl;return 0;/*编写程序,通过函数调用,求满足以下条件的最大n:12+22+32+n21000 */#include#includeusing namespace std;int p(int n)return pow(n,2);int main(void)int n=1,s=0;for(;s1000;n+)s+=p(n);cout最大的n为:nendl;return 0;/*编写程序,通过调用函数,对输入的整数k输出它的全部素数因子。例如:当k=126时,素数因子为2、3、3、7.要求按如下格式输出:126=2*3*3*7. */#includeusing namespace std;void f(int n)int c=2;coutnc)if(n%c=0)coutc*;n=n/c; elsec+;coutn;coutendl;int main(void)int x;coutx;f(x);return 0;/*编写程序,通过函数调用,求出3个实数中的最大值并输出。程序中必须用函数求出两个数中的大数。*/#includeusing namespace std;float f(float a,float b,float c);int main(void)float a,b,c;coutabc;cout最大数是:f(a,b,c)b?a:b;s=ct?c:t;return s;/*编写程序,通过函数调用,实现十进制向十六进制的转换*/#includeusing namespace std;void f(int n);int main(void)int n;coutn;cout该数的十六进制值为:;f(n);coutendl;return 0;void f(int n)couthexn;return;/*编写程序,通过函数调用,判断任一整数是否为回文数。回文数即左读和右读都相同的数,如121、12321.*/#includeusing namespace std;int f(int x)int y,s=0;y=x;while(y0)s=s*10+y%10; /x的最低位变成s的最高位 y=y/10; /去掉个位if(s=x)return 1;elsereturn 0;int main(void)int x;coutx;if(f(x)coutx是回文数endl;elsecoutx不是回文数endl;return 0;/*编写程序,重载求两个数中大数的函数max(),分别实现求两个实数和两个整数的大数。*/#includeusing namespace std;int max(int a,int b)return ab?a:b;float max(float a,float b)return ab?a:b;void main()int a,b;float c,d;coutab;coutcd;cout大数分别是:max(a,b)tmax(c,d)endl;/*重载函数求三个整数和三个实数的最大值max()*/#includeusing namespace std;int max(int a,int b)return ab?a:b;float max(float a,float b)return ab?a:b;void main()int a,b,c;float x,y,z;coutabc;coutxyz;cout大数分别是:c?max(a,b):c)tz?max(x,y):z)endl;/*用内联函数求两个整数中的最大值*/#includeusing namespace std;inline int max(int a,int b) /定义内联函数return ab?a:b;void main()int a,b;coutab;cout大数是:max(a,b)endl;/*内联函数求3个整数的最大值*/#includeusing namespace std;inline int max(int a,int b) /定义内联函数return ab?a:b;void main()int a,b,c;coutabc;cout大数是:c?max(a,b):c)endl;/*编程找出1100之间的所有孪生素数。所谓孪生素数就是差为2的素数。*/#include#includeusing namespace std;int prime(int x)int i,t;t=sqrt(x);for(i=2;it) return x;elsereturn 0;int main(void)int n;cout1100之间的所有孪生素数如下endl;for(n=2;n=100;n+)if(prime(n)+prime(n+2)=2*n+2)coutntn+2endl;return 0;/*任意输入一个四位自然数,调用一个自定义函数,输出该自然数的各位数字组成的最大数。*/#includeusing namespace std;void f(int x)int a,b,c,d,max,mid,min;a=x/1000;b=(x-a*1000)/100;c=(x-a*1000-b*100)/10;d=x-a*1000-b*100-c*10;max=a;if(ba) max=b;if(maxc) max=c;/求出三个数的最大值mid=b;if(ab & ca) mid=a;if(ac & cb) min=b;if(c=max)coutdmaxmidmin;if(maxd & d=mid)coutmaxdmidmin;if(midd & d=min)coutmaxmiddd)coutmaxmidmind;void main()int x;coutx;cout重组后的最大数是:;f(x);coutendl;/*编写程序,通过root()函数求解一元二次方程ax2+bx+c=0 (a!=0)的实根。root()函数的原型:int root(float a,float b,float c,float*px1,float*px2)int root(float a,float b,float c,float&rx1,float&rx2)其中,a,b,c为方程的系数;px1,px2分别指向存放方程两个根的变量,rx1,rx2分别是存放两个根的变量的别名;返回值为0的时候表示无实根,为1时表示有2个相等的实根,为2时表示有2个不相等的实根。在main函数中调用root()函数分别求方程x2+3x+2=0和4.5x2+5.7x+2=0的实根。 */#include#includeusing namespace std;int root(float a,float b,float c,float*px1,float*px2)float d,x1,x2;int t;d=b*b-4*a*c;if(d0)d=sqrt(d);x1=(-b+d)/a/2;x2=(-b-d)/a/2;*px1=x1;*px2=x2;t=2;return t;int root(float a,float b,float c,float&rx1,float&rx2)float d,x1,x2;int t; d=b*b-4*a*c;if(d0)d=sqrt(d);x1=(-b+d)/a/2;x2=(-b-d)/a/2;rx1=x1;rx2=x2;t=2;return t;void main()float a=1,b=3,c=2,x1,x2;if(root(a,b,c,&x1,&x2)=0)cout方程x2+3x+2=0没有实根endl;if(root(a,b,c,&x1,&x2)=1)cout方程x2+3x+2=0有两个相等的实根x1=x2=x1endl;if(root(a,b,c,&x1,&x2)=2)cout方程x2+3x+2=0有两个不相等的实根x1=x1tx2=x2endl;float e=4.5,f=5.7,g=2,r1,r2;if(root(e,f,g,r1,r2)=0)cout方程4.5x2+5.7x+2=0没有实根endl;if(root(e,f,g,r1,r2)=1)cout方程4.5x2+5.7x+2=0有两个相等的实根x1=x2=r1endl;if(root(e,f,g,r1,r2)=2)cout方程4.5x2+5.7x+2=0有两个不相等的实根x1=r1tr2=x2endl;/*使用公式(n=0)(+)(xn)/n!,编写程序计算ex()的函数myexp()。编程要求(1)myexp()函数能做变精度计算。(2)myexp()函数应为精度参数设置默认值,以便调用。myexp()原型为double myexp(double x,double precision=1e-4)(3)在main()函数中调用myexp()函数计算e0.5(精度为10-4) */#include#includeusing namespace std;int fact(int n) /计算阶乘if(n=1)return 1;elsereturn n*fact(n-1);double myexp(double x,double precision=1e-4)int n;double s;for(n=1,s=1;(pow(x,n)/(fact(n)=(1e-16);n+) /1e-16保证精度足够s+=pow(x,n)/(fact(n);return s;void main()coute0.5=myexp(0.5,1e-4)2 */#includeusing namespace std;long int f(int n)if(n=1 | n=2)return 1;elsereturn f(n-2)+f(n-1);void main()int n;coutn;coutf(n)endl;/*编写一个递归函数,实现将任意的正整数按反序输出。例如:输入12345,输出54321

温馨提示

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

评论

0/150

提交评论