C++ Primer 4th 第五章答案

合集下载

C++Primer(第4版)习题解答(非扫描版有目录)

C++Primer(第4版)习题解答(非扫描版有目录)

习题 2.19............................................11 习题 2.20............................................11 习题 2.21............................................11 习题 2.22............................................11 习题 2.23........................................... 12 习题 2.24........................................... 12 习题 2.25........................................... 12 习题 2.26........................................... 12 习题 2.27........................................... 12 习题 2.28........................................... 12 习题 2.29........................................... 13 习题 2.30........................................... 13 习题 2.31........................................... 13 习题 2.32........................................... 14 习题 2.33........................................... 14 习题 3.1 ............................................. 14 习题 3.2 ............................................. 14 习题 3.3 ............................................. 14 习题 3.4 ............................................. 15 习题 3.5 ............................................. 15 习题 3.6 ............................................. 15 习题 3.7 ............................................. 15 习题 3.8 ............................................. 16 习题 3.9 ............................................. 17 习题 3.10........................................... 17 习题 3.11........................................... 17 习题 3.12........................................... 17 习题 3.13........................................... 18 习题 3.14........................................... 19 习题 3.15........................................... 19 习题 3.16........................................... 19 习题 3.17........................................... 20 习题 3.18........................................... 21 习题 3.19........................................... 22 习题 3.20........................................... 22 习题 3.21........................................... 22 习题 3.23........................................... 22 习题 3.24........................................... 22 习题 4.1 ............................................. 23 习题 4.3 ............................................. 23 习题 4.4 ............................................. 23 习题 4.5 ............................................. 24 习题 4.6 ............................................. 24 习题 4.7 ............................................. 24

计算机vc第五章课后习题答案(第四版)

计算机vc第五章课后习题答案(第四版)

第五章课后习题答案5.3#include <stdio.h>void main(){int a,b,num1,num2,temp;printf("please input two positive integers:\n");scanf("%d,%d",&num1,&num2);if(num1<num2){temp=num1;num1=num2;num2=temp;}a=num1,b=num2;while(b!=0){temp=a%b;a=b;b=temp;}printf("The greatest common divisor:%d\n",a);printf("The lease common multiple:%d\n",num1*num2/a);}5.4#include <stdio.h>void main(){char c;int letters=0,space=0,digit=0,other=0;printf("please input a group of characters:\n");while((c=getchar())!='\n'){if(c>='a'&&c<='z'||c>'A'&&c<='Z')letters++;else if(c==' ')space++;else if(c>='0'&&c<='9')digit++;elseother++;}printf("letters=%d\nspace=%d\ndigit=%d\nother=%d\n",letters,space,digit,other); }5.5#include <stdio.h>void main(){int i=1;long int a,n,sum=0,t=0;printf("please input the a,n:\n");scanf("%ld,%ld",&a,&n);printf("a=%ld,n=%ld\n",a,n);while(i<=n){t=t+a;sum=sum+t;a=a*10;i++;}printf("a+aa+aaa+...=%ld\n",sum); }5.6#include <stdio.h>void main(){float s=0,t=1;int i;for(i=1;i<=20;i++){t=t*i;s=s+t;}printf("1!+2!+...+20!=%e\n",s);}5.7#include <stdio.h>void main(){int N1=100,N2=50,N3=10;float k;float s1=0,s2=0,s3=0;for(k=1;k<=N1;k++)s1=s1+k;}for(k=1;k<=N2;k++){s2=s2+k*k;}for(k=1;k<=N3;k++){s3=s3+1/k;}printf("Total=%8.2f\n",s1+s2+s3); }5.8#include <stdio.h>void main(){int i,j,k,n;printf("The narcissus numbers are:"); for(n=100;n<1000;n++){i=n/100;j=n/10-i*10;k=n%10;if(n==i*i*i+j*j*j+k*k*k)printf("%d ",n);}printf("\n");5.9#include <stdio.h>void main(){int m,s,i;for(m=2;m<=1000;m++){s=0;for(i=1;i<m;i++)if(m%i==0)s=s+i;if(s==m){printf("%d its factors are ",m); for(i=1;i<m;i++)if(m%i==0)printf("%d ",i);printf("\n");}}}5.10#include <stdio.h>void main(){int i,t,n=20;float a=2,b=1,s=0;for(i=1;i<=n;i++){s=s+a/b;a=a+b;b=t;}printf("sum=%9.6f\n",s);}5.11#include <stdio.h>void main(){float sn=100,hn=sn/2;int n;for(n=2;n<=10;n++){sn=sn+2*hn;hn=hn/2;}printf("The total distance is %fm\n",sn);printf("The 10th rebound distance is %fm\n",hn); }5.12#include <stdio.h>void main(){int day,x1,x2;day=9;x2=1;while(day>0){x1=(x2+1)*2;x2=x1;day--;}printf("Total=%d\n",x1);}5.13#include <stdio.h>#include <math.h>void main(){float a,x0,x1;printf("enter a positive number :");scanf("%f",&a);x0=a/2;x1=(x0+a/x0)/2;do{x0=x1;x1=(x0+a/x0)/2;}while(fabs(x1-x0)>=1e-5);printf("the square root of %f is %f\n",a,x1); }5.14#include <stdio.h>#include <math.h>void main(){float x1,x0,f,f1;x1=1.5;do{x0=x1;f=((2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x1=x0-f/f1;}while(fabs(x1-x0)>=1e-5);printf("The root of equation is %5.2f\n",x1); }5.15#include <stdio.h>#include <math.h>void main(){float x0,x1,x2,fx0,fx1,fx2;do{printf("enter x1 & x2:");scanf("%f,%f",&x1,&x2);fx1=x1*((2*x1-4)*x1+3)-6;fx2=x2*((2*x2-4)*x2+3)-6;}while(fx1*fx2>0);do{x0=(x1+x2)/2;fx0=x0*((2*x0-4)*x0+3)-6;if(fx0*fx1<0){x2=x0;fx2=fx0;}else{x1=x0;fx1=fx0;}}while(fabs(fx0)>=1e-5); printf("x=%6.2f\n",x0);}5.16#include <stdio.h>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=0;j<=i;j++)printf(" ");for(k=0;k<=4-2*i;k++) printf("*");printf("\n");}}。

C 程序设计与应用基础第五章 多态性习题答案

C  程序设计与应用基础第五章 多态性习题答案
Base's des.
根据结果将程序补充完整。
#incude <iostream.h>
class Base
{
public:
Base(){cout<<"Base's cons."<<endl;}
___varitual ~Base()___{cout<<"Base's des."<endl;}
};
class Derived:public Base
第五章多态性
1、填空题
1)在一个成员函数内调用一个虚函数时,对该虚函数的调用进行___动态______联编。
2)动态联编是在__虚函数___的支持下实现的,它通过___指针和引用__来调用该函数操作。
3)下列程序的运行结果如下:
Base's cons.
Derived's cons.
Derived's des.
salesman s1;
employee *emp[4]={&m1,&t1,&sm1,&s1};
int i;
for(i=0;i<4;i++)
{
emp[i]->promote();
emp[i]->pay();
emp[i]->display();
}
}
2)编写一个程序,建立两种类型的表:队列与堆钱,使它们可以共用一个接口访问。
答案:
#include <iostream.h>
#include <string.h>
class employee

C程序设计第五章课后习题答案

C程序设计第五章课后习题答案

循环结构程序设计P115 5.1 用while计算1至100的合.#include<stdio.h>int main(){int i=1,sum=0;while(i<=100) //对于需要运算的值,要么在运算前可以赋值,要么一开始要指定.{sum=sum+i;i++;}printf("The sum is %d .\n",sum);return 0;}P117 5.2 用do-while来做1至100的合.#include<stdio.h>int main(){int i=1,sum=0;do// do-while可以做的事,用while都可以做到.{ //do-while先做一次执行,再判断条件,而while却是先做一个条件,再执行.sum=sum+i;i++;}while(i<=100);printf("The sum is %d .\n",sum);return 0;}P118 5.3 比较do-while与while的差别.#include<stdio.h>{int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,正常,11的话,则sum仍然是0.while(i<=10){sum=sum+i;i++;}printf("The sum of 1-10 is %d .\n",sum);return 0;}#include<stdio.h>int main(){int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,结果一样.输入11的话,先做操作,所以sum=11.do{sum=sum+i;i++;}while(i<=10); //此重点在于理解二者的差别.printf("The sum of 1-10 is %d .\n",sum);return 0;}P126 5.4 break的例子.#include<stdio.h>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; //break是用于跳出循环,对if无效,对while for switch 这一类.}}c=b/i;printf("conut is %d , aver is %d ",i+1,c); //注意%号后的形式,否则可能输出错误.return 0;}P127 5.5 continue的例子.#include<stdio.h>int main(){int i;for(i=1;i<20;i++){if(i%3!=0){continue; //跳过本次I,执行下一个i.}printf("%d ",i);}printf("\n");return 0;}P128 5.6 形成一个4*5的矩阵.#include<stdio.h>int main(){int i,j,a=0; //没有给初值,会出现警告: 使用了未初始化的局部变量“a”.for(i=1;i<=4;i++){for(j=1;j<=5;j++,a++) // a用来控制换行.{if(a%5==0){printf("\n");}printf("%d\t",i*j);}}printf("\n");return 0;}P131 5.7 用一个交错的式子求哌的近似值.#include<stdio.h>#include<math.h>int main() //四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11).{float s=1,n=1,m,sum=0,t;for(m=1;;m=m+2) //不确定哪项才会小于等于十的负六次方,所以不指定,无限下去.{ //不指定第二项,执行语句中应该有控制跳出的句子,否则死循环.t=(s)*(n/m); //这是第一项,s是符号,if(fabs(t)<=1e-6) //应该写在这里,题目要求这一项不累加进去.{break;}sum=sum+t; //因为累加项在这里,所以,一旦跳出就不会累加进来了.s=s*(-1); //变号一次.}printf("四分之一哌的值是%f.\n",sum);printf("一个完整哌的值是%f.\n",sum*4);return 0;}//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题.//#include <stdio.h> //这是关于int float double三者关复杂关系的,乱啊,如果看不懂,可以通过实验自己明白来.////int main() //在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1 warning C4305: “=”: 从“double”到“float”截断.//{// float m,a,b,c; //一旦定义了是这种类型的话,输出或是赋值的时候只能扩展不能截断,意思就是能变成double型,不能变成int型啦.而且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=1.0.// int d,e,f;// m=1;// a=1.0/3;// b=1/3;// c=m/3;// d=1.0;// e=1/4;// f=1.0/4;// printf("%lf(float用double的%lf来输出是可以的.)\n%f\n%f\n%f\n",m,a,b,c); //不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.// printf("%d\n%d\n%d\n",d,e,f); //但是,不相应的int型不可以用%f来输出的.因为int float就不同种类,一个是整数,一个是小数,float double同样是有小数点的!!!!// return 0;//}#include<stdio.h>int main() //这个就是著名的Fibonacci(费波那契数列问题){int f1=1,f2=1,f3,i;printf("%12d\n%12d\n",f1,f2);for(i=1;i<=38;i++) //注意,这是个基础问题,(i=1;i<=5;i++)这里其实进行了次运算,因为有f1,f2,要求有个,所以要有个.要么写<=38,要么写<39,边界问题一定要注意,不可以太随意!!!!{f3=f1+f2;printf("%12d\n",f3); //这个问题同样适用于"一对兔子一个月生一对"的问题.,f1=f2; //f1=f1+f2;此时它们各是,所以,现在的f1是.f2=f3; //f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3.}return 0;}#include<stdio.h>#include<math.h>int main(){double num;int i;printf("Please input a number :");scanf("%lf",&num); //因为sqrt要求是浮点型,那就给它浮点型,需要时再强制转换.for(i=2;i<=sqrt(num);i++) //这边是<=号没错.{if((int)num%i==0) //如果在这期间有任何一个可以为零的话,则不是素数.{break; //当然跳出.}} //执行到这里的时候,i=5,已经变成了!!if(i<=sqrt(num)){printf("Not %d",(int)num);}else//如上所述,i=5,超出了求根的值,所以是素数.{printf("Yes %d",(int)num);}return 0;}P137 5.10 求100至200间的素数.#include<stdio.h>//不解释,HOHO>>>>...#include<math.h>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) //5个换一次行.{printf("\n");}}else{printf("Yes %d ",(int)j);if(k%5==0){printf("\n");}}}return 0;}P139 5.11 密码转换.#include<stdio.h>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(); //套在循环里,依次得到字母,而while中判断回车为结束.}}printf("\n"); //这是布局问题.return 0;}P140 0.3 最大公约数和最小公倍数.#include<stdio.h>//最大公约数用累除法,除到无余数时的被除数是最大公约数.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 Divisor{int 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 Multiple{int i, temp;if(x<y) //此段代码结果是保证二者大的数在X上,小的数在Y上.即小于号降序.{ //以下为经典三行码,实现两个数的互换.temp=x;x=y;y=temp;}for(i=1; i<=y; i++) //设定一个区间,从1至大的数之间的循环.{if(!((x*i)%y)) //此式子如有余数,加上"!"号,会是假,则不返回,进行下一轮.{ //如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数.return x*i;}}}P140 0.4 判断一串输入的字符.#include<stdio.h>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++;}else{e++;}}printf("大写%d 小写%d 空格%d 数字%d 其它%d\n",a,b,c,d,e);}#include<stdio.h>//不理解时可以百度或是谷歌更多的信息.int main() //想办法既快速做完,又要消化理解!!!{int temp,i,a,n,sum=0; //主逻辑,友好性暂时放松.scanf("%d %d",&a,&n); //a是数字,n是要乘的个数.temp=a; //先把第一阶的值存起来.for(i=0;i<n;i++){sum=sum+a;printf("%d + ",a); //事关布局.a=a*10+temp; //重点是每次乘,然后加上上一个数.}printf("= %d .",sum);return 0;}P140 0.6 1!+2!+3!+4!.....的值. #include<stdio.h>int main() //1!+2!+3!+4!.....{int i,j,k,sum=0,m=1;scanf("%d",&k); //比如设定为,值为.for(i=1;i<=k;i++) //第一层循环,指定到.{for(j=1;j<=i;j++) //第二层循环,指定至当前数.{m=m*j;} //到此是阶乘的结构.sum=sum+m;m=1;}printf("%d",sum); //完全不理解时,搜索并参考.return 0; //尝试自己做,第一次做出来就是自己的东西了. }#include<stdio.h>int main(){int a,b;double c,asum=0,bsum=0,csum=0;for(a=1;a<=100;a++) //三个块分别注释验证结果.{asum=asum+a;}for(b=1;b<=50;b++) //在VS运行中,注意*.cpp为C++语言.{bsum=bsum+b*b; //为了避免语言差别,请注意文件名为*.c.}for(c=1;c<=10;c++) //c作浮点运算,所以定义在double类型中.{csum=csum+1/c;}printf("%lf",asum+bsum+csum);return 0;}PP#include<stdio.h>#include<math.h>int main(){int j,k,s[6],x=100,y,sum=0;for(j=153;j<=154;j++){for(k=2;k>=0;k--){s[k]=j%(int)pow(10,k+1)/(int)pow(10,k);y=pow(s[k],3);sum+=y;printf("%d-%d--%d\t",k,s[k],j);}printf("%d\n",sum);}return 0;}P140 0.8 水仙花数.//#include <stdio.h> //一步步的发现问题.////int main() //在%和/号之间,以前pow.以后再做.//{// int i,j,k,a,b,c,sum=0; //这里逻辑对,算出来却错了.// for(i=2;i<=4;i++) //计算机在想什么,看来它的大脑难以模拟.// {// for(j=pow(10,i);j<=pow(10,i+1)-1;j++) //我不完全明白它遵守的逻辑. // {// for(k=0;k<=i;k++)// {// sum+=pow((j%pow(10,i+1)/pow(10,i)),3);// }// if(sum==j)// {// printf("%d 是水仙花数!\n",j);// }// sum=0;// }// }// return 0;//} //为什么还是无法实现?!#include<stdio.h>#include<math.h>int main(){int a,b,c,i,sum=0; //这里只计算三位数的.for(i=100;i<1000;i++){a=i/100;b=i%100/10;c=i%10;sum+=a*a*a+b*b*b+c*c*c;if(sum==i){printf("%d 是水仙花数.\n",i);}sum=0;}return 0;}P141 0.9 完数.#include<stdio.h>int main(){int i,j,r;for(i=1;i<=1000;i++) //零是个临界值,不能包括它.{r=0; //每次清零重来.类似水仙中的sum.for(j=1;j<i;j++){if(i%j==0) //除得尽即是因子.{r=r+j; //然后累加进去.}}if(r==i) //若相等.{printf("%d 是完数.\n",i);}}return 0;}P141 0.10 2/1+3/2+5/3+8/5+13/8…#include<stdio.h>int main() //10.007051{double i,a=2,b=1,c,s=0; //a是分子,b是分母.for(i=0;i<6;i++) //二十可以用户指定.{s+=a/b; //中间储值变量.c=a+b;b=a;a=c;}printf("%lf\n",s);return 0;}#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{double sum=100,high=100,up,donw,i;for(i=1;i<10;i++) //不管指定到哪个数,都不会超过三百.{up=high/2;donw=up;high=donw; //自咬尾巴问题.sum+=donw*2;}printf("%lf %lf\n",donw,sum);return 0;}P141 0.12 猴子吃桃子.#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{int i,sum=1;for(i=1;i<=10;i++) //临界要清楚,结果要与手算的前几个实例相匹配.{printf("倒数第%d天还剩有%d个桃子.\n",i,sum);sum=(sum+1)*2;}//printf("%d\n",sum);return 0;}#include<stdio.h>#include<conio.h>main() //只关注左半部分.右半部分无视空格.{int i,j,k,m=6; //m可指定,指定中心点位置.可任意奇偶.for(i=1;i<=m;i++) //上半部分.其实也是正三角.{for(j=1;j<=m-i;j++) //一到中心点前i个位置填充空格.printf(" ");for(k=1;k<2*i;k++) //空格后向前填充星号的个数.是奇数.一,三,五... printf("*");printf("\n");}for(i=m-1;i>0;i--) //下半部分.其实也是倒三角.{ //减一是因为行数问题.这是中心行以下的.for(j=m-1;j>=i;j--)printf(" ");for(k=1;k<2*i;k++)printf("*");printf("\n");}getch(); //用户反应后结束.但,没必要.}。

C++Primer课后习题解答(第1~18章完整答案)完整版

C++Primer课后习题解答(第1~18章完整答案)完整版

目录第一章快速入门 (2)第二章变量和基本类型 (7)第三章标准库类型 (13)第四章数组和指针 (21)第五章表达式 (31)第六章语句 (37)第七章函数 (37)第八章标准IO库 (37)第九章顺序容器 (43)第十章关联容器 (60)第十一章泛型算法 (75)第十二章类和数据抽象 (86)第十三章复制控制 (94)第十四章重载操作符与转换 (102)第十五章面向对象编程 (116)第十六章部分选做习题 (133)第十七章用于大型程序的工具 (138)第十八章特殊工具与技术 (138)第一章快速入门习题 1.1查看所用的编译器文档,了解它所用的文件命名规范。

编译并运行本节的main程序。

【解答】一般而言,C++编译器要求待编译的程序保存在文件中。

C++程序中一般涉及两类文件:头文件和源文件。

大多数系统中,文件的名字由文件名和文件后缀(又称扩展名)组成。

文件后缀通常表明文件的类型,如头文件的后缀可以是.h 或.hpp 等;源文件的后缀可以是.cc 或.cpp 等,具体的后缀与使用的编译器有关。

通常可以通过编译器所提供的联机帮助文档了解其文件命名规范。

习题1.2修改程序使其返回-1。

返回值-1 通常作为程序运行失败的指示器。

然而,系统不同,如何(甚至是否)报告main 函数运行失败也不同。

重新编译并再次运行程序,看看你的系统如何处理main 函数的运行失败指示器。

【解答】笔者所使用的Windows 操作系统并不报告main 函数的运行失败,因此,程序返回-1 或返回0 在运行效果上没有什么区别。

但是,如果在DOS 命令提示符方式下运行程序,然后再键入echo %ERRORLEVEL%命令,则系统会显示返回值-1。

习题1.3编一个程序,在标准输出上打印“Hello, World”。

【解答】#include<iostream>int main(){std::cout << "Hello, World" << std::endl;return 0;}习题1.4我们的程序利用内置的加法操作符“+”来产生两个数的和。

C PRIMER PLUS 第五章正确答案

C PRIMER PLUS 第五章正确答案

C PRIMER PLUS 第五章正确答案.txtPE 5-1/* Programming Exercise 5-1 */#include <stdio.h>int main(void){const int minperhour = 60;int minutes, hours, mins;printf("Enter the number of minutes to convert: ");scanf("%d", &minutes);while (minutes > 0 ){hours = minutes / minperhour;mins = minutes % minperhour;printf("%d minutes = %d hours, %d minutes\n", minutes, hours, mins);printf("Enter next minutes value (0 to quit): ");scanf("%d", &minutes);}printf("Bye\n");return 0;}PE 5-3/* Programming Exercise 5-3 */#include <stdio.h>int main(void){const int daysperweek = 7;int days, weeks, day_rem;printf("Enter the number of days: ");scanf("%d", &days);weeks = days / daysperweek;day_rem = days % daysperweek;printf("%d days are %d weeks and %d days.\n", days, weeks, day_rem);return 0;}PE 5-5/* Programming Exercise 5-5 */#include <stdio.h>int main(void) /* finds sum of first n integers */ {int count, sum;int n;printf("Enter the upper limit: ");scanf("%d", &n);count = 0;sum = 0;while (count++ < n)sum = sum + count;printf("sum = %d\n", sum);return 0;}PE 5-7/* Programming Exercise 5-7 */#include <stdio.h>void showCube(double x);int main(void) /* finds cube of entered number */{double val;printf("Enter a floating-point value: ");scanf("%lf", &val);showCube(val);return 0;}void showCube(double x){printf("The cube of %e is %e.\n", x, x*x*x );}#include <stdio.h>void Temperatures(double f);int main (void) {double a;printf("input a float Fahrenheit ,and this program will output centigrade and kelvin\n");printf("enter q or other character to quit\n");while(scanf("%lf",&a) == 1) {Temperatures((double)a);}printf("done!\n");return 0;}void Temperatures(double f) {double c,k;c = 1.8 * f + 32.0;k = c + 273.16;printf("%.2f f = %.2f c = %.2f k\n",f,c,k);}。

C语言第五章习题及答案

C语言第五章习题及答案

第五章习题答案一、选择题1) 有以下程序#include <stdio.h>main(){ int n=2,k=0;while(k++&&n++>2);printf("%d %d\n",k,n);}程序运行后的输出结果是A)0 2 B)1 3 C)5 7 D)1 22)有以下程序:main(){ int k=5;while(--k) printf("%d",k-=3);printf("\n");}执行后的输出结果是()。

A)1 B)2 C)4 D)死循环3)有以下程序#include<stdio.h>main(){int y=10;while(y--);printf(”y=%d\n”,y);}程序执行后的输出结果是A)y=0 B)y= -1 C)y=1 D)while构成无限循环4) 若变量已正确定义,有以下程序段i=0;do printf("%d,",i);while(i++);printf("%d\n",i)其输出结果是A)0,0 B)0,1 C)1,1 D)程序进入无限循环5)有以下程序:main(){ int i;for(i=1;i<=40;i++){ if(i++%5==0)if(++i%8==0) printf("%d",i); }printf("\n");}执行后的输出结果是()。

A)5 B)24 C)32 D)406) 有以下程序#includes <stdio.h>main(){ int a=1,b=2;for(;a<8;a++) {b+=a; a+=2;}printf ("%d,%d\n",a,b);}程序运行后的输出结果是(A)9,18 (B)8,11 (C)7,11 (D)10,147) 有以下程序#include<stdio.h>main(){int y=9;for( ; y>0;y--)if(y%3= =0) printf("%d",--y);}程序的运行结果是A)741 B)963 C)852 D)8) 一下程序段中的变量已正确定义for(i=0;i<4;i++,j++)for(k=1;k<3;k++); printf("*");程序段的输出结果是A)******** B)**** C)** D)*9) 有以下程序#iinclude <stdio.h>main(){ int i,j;for(i=3; i>=1; i--){ for (j=1;j<=2;j++) printf(“%d”,i+j);printf(“\n”);}}程序的运行结果是()A) 2 3 4 B) 4 3 2 C) 2 3 D) 4 53 4 5 5 4 3 3 4 3 44 5 2 3 答案:D10)有以下程序main(){int i,j;for(i=1;i<4;i++){for(j=i;j<4;j++) printf(“%d*%d=%d “,i,j,i*j);printf(“\n”);}}程序运行后的输出结果是A) 1*1=1 1*2=2 1*3=3 B) 1*1=1 1*2=2 1*3=32*1=2 2*2=4 2*2=4 2*3=63*1=3 3*3=9C) 1*1=1 D) 1*1=11*2=2 2*2=4 2*1=2 2*2=41*3=3 2*3=6 3*3=9 3*1=3 3*2=6 3*3=9 11) 有以下程序#include<stdio.h>main(){int i,j,m=55;for(i=1;i<=3;i++)for(j=3;j<=i;j++) m=m%j;printf("%d\n",m);}程序的运行结果是A)0 B)1 C)2 D)312) 有以下程序#include <stdio.h>main(){ int i=5;do{ if (i%3= =1)if (i%5= =2){printf(“*%d”,i); break; }i++;}while(i!=0);printf(“\n”);}程序的运行结果是A)*7 B)*3*5 C) *5 D)*2*6答案:A13) 有以下程序#include <stdio.h>main(){ int c=0,k;for(k=1;k<3;k++)switch(k){ default:c+=k;case 2:c++;break;case 4:c+=2;break;}printf("%d\n",c);}程序运行后的输出结果是A)3 B)5 C)7 D)914) 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是A)n=0;while((ch=getchar())!='\n')n++;B)n=0;while(getchar()!='\n')n++;C)for(n=0;getchar()!='\n';n++);D)n=0;for(ch=getchar();ch!='\n';n++);15)有以下程序#includemain(){int a=1,b=2;while(a<6){b+=a;a+=2;b%二10;}printf(”%d,%d\n”,a,b);}程序运行后的输出结果是A)5,11 B)7,1 C)7,11 D)6,116) 要求通过while循环不断读入字符,当读入字母N时结束循环。

C语言第五章课后答案

C语言第五章课后答案
return 0;
}
xt5-5
#include <stdio.h>
int main()
{
int a,n,i=1,sn=0,tn=0;
printf("a,n=:");
scanf("%d,%d",&a,&n);
while (i<=n)
{
tn=tn+a; /*赋值后的tn为i个a组成数的值*/
sn=sn+tn; /*赋值后的sn为多项式前i项之和*/
if (n>8) printf(",%d",k9);
if (n>9) printf(",%d",k10);
printf("\n");
}
}
return 0;
}
xt5-9-2
#include <stdio.h>
int main()
{int m,s,i;
for (m=2;m<1000;m++)
{s=0;
for (i=1;i<m;i++)
count++; // count累加1
}
pi=pi*4; //多项式的和pi乘以4,才是π的近似值
printf("pi=%10.8f\n",pi); //输出π的近似值
printf("count=%d\n",count); //输出循环次数
return 0;
}
xt5-3
#include <stdio.h>
{x0=x1;
x1=(x0+a/x0)/2;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编写while 循环条件从标准输入设备读入整型(int)数据,当读入值为42 时循 环结束。 【解答】 int val; cin >> val; while (val != 42) 或者,while 循环条件也可以写成 while (cin >> ival && ival != 42) 习题5.8 编写表达式判断4 个值a、b、c 和d 是否满足a 大于b、b 大于c 而且c 大于d 的条件。 【解答】 表达式如下: a > b && b > c && c > d 习题5.9 假设有下面两个定义: unsigned long ul1 =3, ul2 = 7; 下列表达式的结果是什么? (a) ul1 & ul2 (b) ul1 && ul2 (c) ul1 | ul2 (d) ul1 || ul2 【解答】 各表达式的结果分别为3、true、7、true。 习题 5.10 重写bitset 表达式:使用下标操作符对测验结果进行置位(置1)和复位(置 0)。 【解答】 bitset<30> bitset_quiz1; bitset_quiz1[27] = 1; bitset_quiz1[27] = 0; 习题5.11 请问每次赋值操作完成后,i 和d 的值分别是多少? int i; double d; d = i = 3.5; i = d = 3.5; 【解答】 赋值语句d=i=3.5;完成后,i 和d 的值均为3。因为赋值操作具有右结合性,所以首先将3.5 赋给 i(此时发生隐式类型转换,将double 型字面值3.5 转换为int 型值3,赋给i),然后将表达式 i=3.5 的值(即赋值后i 所具有的值3)赋给d。赋值语句 i=d=3.5;完成后,d 的值为3.5,i 的 值为3。因为先将字面值3.5 赋给d,然后将表达式d=3.5 的值(即赋值后d 所具有的值3.5)赋给 i(这时也同样发生隐式类型转换)。 习题 5.12 解释每个if 条件判断产生什么结果? if ( 42 = i ) // ... if ( i = 42 ) // ... 【解答】 前者发生语法错误, 因为其条件表达式42=i 是一个赋值表达式, 赋值操作符的左操作数必须为一 个左值,而字面值42 不能作为左值使用。 后者代码合法,但其条件表达式i=42 是一个永真式(即其逻辑值在任何情况下都为true),因为
习题5.18 编写程序定义一个vector 对象,其每个元素都是指向string 类型的指针,读 取该vector 对象,输出每个string 的内容及其相应的长度。 【解答】 //定义一个vector 对象,其每个元素都是指向string 类型的指针, //读取该vector 对象,输出每个string 的内容及其相应的长度 #include <iostream> #include <string> #include <vector> using namespace std; int main() { vector<string*> spvec; //读取vector 对象 string str; cout << "Enter some strings(Ctrl+Z to end)" << endl; while (cin >> str) { string *pstr = new string; //指向string 对象的指针 *pstr = str; spvec.push_back(pstr); } //输出每个string 的内容及其相应的长度 vector<string*>::iterator iter = spvec.begin(); while (iter != spvec.end()) { cout << **iter << (**iter).size() << endl; iter++; } //释放各个动态分配的string 对象 iter = spvec.begin(); while (iter != spvec.end()) { delete *iter; iter++; } return 0; } 习题5.19 假设iter 为vector<string>::iterator 类型的变量,指出下面哪些表达式是 合法的,并解释这些合法表达式的行为。 (a) *iter++; (b) (*iter)++; (c) *iter.empty(); (d) iter->empty(); (e) ++*iter; (f) iter++->empty(); 【解答】 (a)、(d)、(f)合法。 这些表达式的执行结果如下: (a)返回iter 所指向的string 对象,并使iter 加1。 (d)调用iter 所指向的string 对象的成员函数empty。 (f)调用iter 所指向的string 对象的成员函数empty,并使iter 加1。 习题5.20
编写程序提示用户输入两个数,然后报告哪个数比较小。 【解答】 可编写程序如下: //提示用户输入两个数,然后报告哪个数比较小 #include <iostream> using namespace std; int main() { int val1, val2; //提示用户输入两个数并接受输入 cout << "Enter two integers:" << endl; cin >> val1 >> val2; //报告哪个数比较小 cout << "The smaller one is" << (val1 < val2 ? val1 : val2) << endl; return 0; } 习题5.21 编写程序处理vector<int>对象的元素:将每个奇数值元素用该值的两倍替换。 【解答】 //处理vector<int>对象的元素: //将每个奇数值元素用该值的两倍替换 #include <iostream> #include <vector> using namespace std; int main() { vector<int> ivec(20,1);//ivec 包含20 个值为1 的元素 //将每个奇数值元素用该值的两倍替换 for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) *iter = (*iter % 2 == 0 ? *iter : *iter * 2); return 0; } 习题5.22 编写程序输出每种内置类型的长度。 【解答】 //输出每种内置类型的长度 #include <iostream> using namespace std; int main() { cout << "type\t\t\t" << "size" << endl << "bool\t\t\t" << sizeof(bool) << endl << "char\t\t\t" << sizeof(char) << endl << "signed char\t\t" << sizeof(signed char) << endl << "unsigned char\t\t" << sizeof(unsigned char) << endl << "wchar_t\t\t\t" << sizeof(wchar_t) << endl
该赋值表达式的值为赋值操作完成后的i 值(42),而42 为非零值,解释为逻辑值true。 习题 5.13 下列赋值操作是不合法的,为什么?怎样改正? double dval; int ival; int *pi; dval = ival = pi = 0; 【解答】 该赋值语句不合法,因为该语句首先将0 值赋给pi,然后将pi 的值赋给ival,再将ival 的值赋 给dval。pi、ival 和dval 的类型各不相同,因此要完成赋值必须进行隐式类型转换,但系统无 法将int 型指针pi 的值隐式转换为ival 所需的int 型值。 可改正如下: double dval; int ival; int *pi; dval = ival = 0; pi = 0; 习题5.14 虽然下列表达式都是合法的,但并不是程序员期望的操作,为什么?怎样修改这些表达式以使其 能反映程序员的意图? (a) if ( ptr = retrieve_pointer() != 0 ) (b) if ( ival = 1024 ) (c) ival += ival + 1; 【解答】 对于表达式(a), 程序员的意图应该是将retrieve_pointer()的值赋给ptr, 然后判断ptr的值是否 为0 ,但因为操作符“= ” 的优先级比 “!= ” 低, 所以该表达式实际上是将retrieve_pointer()是否 为0 的判断结果true 或false 赋给ptr,因此不是程序员期望的操作。 对于表达式(b),程序员的意图应该是判断ival 的值是否与1024 相等,但误用了赋值操作符。 对于表达式(c),程序员的意图应该是使ival 的值增加1,但误用了操作符“+=”。 各表达式可修改如下: (a) if ( (ptr = retrieve_pointer()) != 0 ) (b) if ( ival == 1024 ) (c) ival += 1; 或 ival++; 或 ++ival; 习题5.15 解释前自增操作和后自增操作的差别。 【解答】 前自增操作和后自增操作都使其操作数加1, 二者的差别在于: 前自增操作将修改后操作数的值作 为表达式的结果值;而后自增操作将操作数原来的、未修改的值作为表达式的结果值。 习题 5.16 你认为为什么C++不叫作++C? 【解答】 C++ 之名是Rick Mascitti 在1983 年夏天定名的( 参见The C++ Programming Language(Special Edition) 1.4 节),C 说明它本质上是从C 语言演化而来的,“++”是C 语言 的自增操作符。C++语言是C 语言的超集,是在C 语言基础上进行的扩展(引入了new、delete 等 C 语言中没有的操作符,增加了对面向对象程序设计的直接支持,等等),是先有C 语言,再进 行++。根据自增操作符前、后置形式的差别(参见习题5.15 的解答),C++表示对C 语言进行扩 展之后,还可以使用C 语言的内容;而写成++C 则表示无法再使用C的原始值了,也就是说C++不 能向下兼容C 了,这与实际情况不符。 习题 5.17 果输出 vector 内容的 while 循环使用前自增操作符,那会怎么样? 【解答】 将导致错误的结果:ivec 的第一个元素没有输出,并企图对一个多余的元素进行解引用。
相关文档
最新文档