C++课后习题答案 完整.docx
C+课后习题答案 完整第一章 一、 C A 二、 选择题 B C A A C B 填充题 1 main 2 数字0-9、下划线 3字符串 4#include #define 5hex 6.h 7语法错误和逻辑错误 8Insert/Remove Breakpoint 9.cpp 10Fileview 三、 简答题 1 C+是C语言的超集。C+中的类和对象部分,C语言没有,C+是面向对象的程序设计。见教材P3。 2 C/C+程序是由一个或多个函数组成,其中必须要有一个main函数。在一个函数内,语句的执行是从上到下的。 3 a? , 3a, a-b, f(x), A D, a.txt, D $, , double 4 C/C+程序书写形式自由。一行可以写多条语句,一条语句也可以分别写在不同行上。区别大小写字母。 5 用尖括号时,预处理程序在系统指定的文件夹中寻找文件;用双引号时,预处理程序首先在当前文件所在的文件目录中寻找文件,若找不到再到系统指定的文件夹中查找。 6 最好的调试手段是设置断点,并让程序运行到该断点,然后在Debug窗口观察各变量的值,从中发现错误。 第二章 一、 选择题 B C D C D C C C B B 二、 1(x+y)!=(a+b) 2pow(log(10)+x*y),3) 3sin(w*u)/(cos(45*180/3.14)+3*pow(x,y) 4exp(3)+sqrt(2*x+3*y) 5fabs(x-y)+(x+y)/(3*x) 61/(1/r1+1/r2+1/r3) 三、 1a>d|b>d 2z=x>y?x : y 3x<0&&y<0 4x+y>z|y+z>z|x+z>y 5(int)(x*100+0.5)/100. 6d>0&&d<=100&&d%2=0 7x%5=0|y%5=0 8n%k=0?n/k : n/k+1 四、 1 #include "iostream.h" void main float r,h,v; cin>>r>>h; v=3.1416*r*r*h; cout<<v; 2. #include "iostream.h" void main float a,b,c,ave,min; cin>>a>>b>>c; ave=(a+b+c)/3; min=(a<b)?a:b; min=(c<min)?c:min; cout<<"ave="<<ave<<" min="<<min<<endl; 3. #include "iostream.h" void main char c1='1',c2='2' int x; x=10*(c1-'0')+c2-'0' cout<<x<<endl; 4. #include "iostream.h" void main int x; int c1,c2,c3; cin>>x; c1=x/100; c2=x/10%10; c3=x%10; x=100*c3+10*c2+c1; cout<<x<<endl; 5. 解1: #include "iostream.h" void main int year,x; cin>>year; x=year%400=0|year%4=0&&year%100!=0; x!=0?cout<<year<<"is a leap year!": cout<<year<<"is not a leap year!" 解2: #include "iostream.h" void main int year; char x; cin>>year; x=(year%400=0|year%4=0&&year%100!=0)?'y': 'n' cout<<x<<endl; 6. #include "iostream.h" #include "math.h" void main double x,y; cin>>x; y=log(x*x+3)/log(10)+3.14/2*cos(40*3.14/180); cout<<y; 第三章 一、 1.C 2.D 3.D(该答案后还应附“其他值”) 5.B 6.C 7.A 8.C 9.B 二、 (1)输入两个正整数给m和n。 (2)20 4.C (3)s=288 (4)AB20ega5 (5) * * * * * * 三、 (1)c=')' count=0 count>0 count (2)cin>>m>>n m=m-n n=n-m (3)n=m n=n/5 m=m+5 四、 1. #include "iostream.h" #include "math.h" void main float x,y; cout<<"input x:"<<endl; cin>>x; if(x<5) y=fabs(x); else if(x<20) y=3*x*x-2*x+1; else y=x/5; cout<<"x="<<x<<",y="<<y<<endl; 2. #include "iostream.h" void main float s,p,t,w; cout<<"input s:"<<endl; cin>>s; switch(int(s)/1000) case 0:p=0;break; case 1:p=0.05;break; case 2:p=0.08;break; case 3: case 4:p=0.1;break; default:p=0.15;break; t=s*p; w=s-t; cout<<"纳税款="<<t<<",实得工资="<<w<<endl; 3. #include "iostream.h" void main int m,count=0; for(m=100;m<1000;m+) if(m%10+m/10%10+m/100=5) count+; cout<<"count="<<count<<endl; 4. #include "iostream.h" void main int m,n; for(m=0;m<=30;m+) for(n=0;n<=30;n+) if(m*2+n*4=90&&m+n=30) cout<<"鸡:"<<m<<"兔:"<<n<<endl; 5. #include "iostream.h" void main float e=1,t=1; int n; for(n=1;1/t>1e-6;n+) t=t*n; e=e+1/t; cout<<"e="<<e<<endl; 6. #include "iostream.h" void main int x,y; for(x=1;x<=100;x+) for(y=1;y<=100;y+) if(x*x+2*x=y*y*y) cout<<"x="<<x<<",y="<<y<<endl; 7. #include "iostream.h" #include "stdio.h" void main char ch; while(ch=getchar)!='.') if(ch=' ') cout<<endl; else cout<<ch; 8. #include "iostream.h" #include "math.h" void main int m,k1,k2; for(m=0;m<=1000;m+) k1=sqrt(m+100); k2=sqrt(m+100+168); if(k1*k1=m+100&&k2*k2=m+100+168) cout<<m<<"是满足条件的数"<<endl; 9. 二分法的步骤为等分区间x1,x2成x1,x和x,x2,其中,若f(x)与f(x1)同号,则取x,x2作为新的区间,否则取x1,x作为新的区间, 依次类推,当新区间的长度或f(x)的绝对值小于eps时,x 就作为所求的实根。 #include "iostream.h" #include "math.h" void main float x1=0,x2=10,x,y1,y2,y,eps=1e-6; dox=(x1+x2)/2; y1=pow(x1,9)-4*pow(x1,5)-5*pow(x1,3)-270000; y=pow(x,9)-4*pow(x,5)-5*pow(x,3)-270000; if(y1*y>0) x1=x; else x2=x; while(fabs(x2-x1)>eps); cout<<x; 第四章 一、 1.C 2.A 3.C 4.D 5.C 6.B 7.A 8.B 二、 1. 678904321 2. 4 3. 14 三、 1. (1)0,1 (3)xi=xi-1+xi-2 (4)setw(5)<<xi 2. (1)rand%101 (2)j<ai/2 (3)"A("<<i<<")=" 3. (1)bm=0 (2)n<m+4 (3)bm=bm/4 4. (1)gets(s1) (2)gets(s2) (3)*s1=*s2 (4) r=0 5. (1)j=k=l=0 (2)j<M&&k<N (3)cl=aj (4)cl+=bk+ 四、 1.(1) #include "stdlib.h" #include "iostream.h" void main int a44,b44,c44,i,j; for(i=0;i<4;i+) for(j=0;j<4;j+) aij=rand%41+30; for(i=0;i<4;i+) for(j=0;j<4;j+) bij=rand%35+101; cout<<"矩阵A的内容如下:n" for(i=0;i<4;i+) for(j=0;j<4;j+) (5)k<N (6)j<M cout<<aij<<' ' cout<<endl; cout<<"矩阵B的内容如下:n" for(i=0;i<4;i+) for(j=0;j<4;j+) cout<<bij<<' ' cout<<endl; for(i=0;i<4;i+) for(j=0;j<4;j+) cij=aij+bij; cout<<"矩阵C的内容如下:n" for(i=0;i<4;i+) for(j=0;j<4;j+) cout<<cij<<' ' cout<<endl; (2) #include "stdlib.h" #include "iostream.h" void main int a44,b44,c44,i,j,max,imax,jmax; for(i=0;i<4;i+) for(j=0;j<4;j+) aij=rand%41+30; for(i=0;i<4;i+) for(j=0;j<4;j+) bij=rand%35+101; cout<<"矩阵A的内容如下:n" for(i=0;i<4;i+) for(j=0;j<4;j+) cout<<aij<<' ' cout<<endl; cout<<"矩阵B的内容如下:n" for(i=0;i<4;i+) for(j=0;j<4;j+) cout<<bij<<' ' cout<<endl; for(i=0;i<4;i+) for(j=0;j<4;j+) cij=aij+bij; cout<<"矩阵C的内容如下:n" for(i=0;i<4;i+) for(j=0;j<4;j+) cout<<cij<<' ' cout<<endl; max=c00; for(i=0;i<4;i+) for(j=0;j<4;j+) if(cij>max) max=cij; imax=i; jmax=j; cout<<"max=c"<<imax<<""<<jmax<<"="<<max<<endl; (3) #include "stdlib.h" #include "iostream.h" void main int a44,b44,i,j; for(i=0;i<4;i+) for(j=0;j<4;j+) aij=rand%41+30; for(i=0;i<4;i+) for(j=0;j<4;j+) bij=rand%35+101; cout<<"矩阵A的主对角线以下元素内容如下:n" for(i=0;i<4;i+) for(j=0;j<=i;j+) cout<<aij<<' ' cout<<endl; cout<<"矩阵B的主对角线以上元素内容如下:n" for(i=0;i<4;i+) for(j=i;j<4;j+) cout<<bij<<' ' cout<<endl; (4) #include "stdlib.h" #include "iostream.h" void main int a44,i,j; for(i=0;i<4;i+) for(j=0;j<4;j+) aij=rand%41+30; cout<<"矩阵A的内容如下:n" for(i=0;i<4;i+) for(j=0;j<4;j+) cout<<aij<<' ' cout<<endl; for(j=0;j<4;j+) int t=a0j; a0j=a2j; a2j=t; cout<<"改变后矩阵A的内容如下:n" for(i=0;i<4;i+) for(j=0;j<4;j+) cout<<aij<<' ' cout<<endl; (5) #include "stdlib.h" #include "iostream.h" void main int a44,i,j,s=0; for(i=0;i<4;i+) for(j=0;j<4;j+) aij=rand%41+30; cout<<"矩阵A的内容如下:n" for(i=0;i<4;i+) for(j=0;j<4;j+) cout<<aij<<' ' cout<<endl; for(j=0;j<4;j+) if(i=j|i+j=3) s=s+aij; for(i=0;i<4;i+) cout<<"对角线元素之和为:"<<s<<endl; 2. 用字符数组实现 #include "stdio.h" void main int i;char s150,s220; gets(s1); for(i=0;s1i!='0'i+) s2i=s1i; s2i='0' puts(s2); 用字符指针实现 #include "stdio.h" void main int i;char s150,*p1=s1,*p2; p2=new char20; gets(p2); while(*p2!='0') *p1+=*p2+; *p1='0' puts(s1); 3. #include "stdio.h" void main char s80,ch; int i,len=0; gets(s); while(slen!='0')len+; for(i=0;i<len/2;i+) 4. ch=si; si=slen-i-1; slen-i-1=ch; puts(s); #include "stdio.h" #include "iostream.h" void main char s80,ch; int i,j; gets(s); cin>>ch; for(i=j=0;si!='0'i+) if(si!=ch) sj=si;j+; sj='0' puts(s); 习 题 一、选择题 1. 下列叙述错误的是_A_。 A. 主函数中定义的变量在整个程序中都是有效的 B. 复合语句中定义的变量只在该复合语句中有效 C. 其它函数中定义的变量在主函数中不能使用 D. 形式参数是局部变量 2. 若函数的形参为一维数组,则下列说法中错误的是_B、才_。 A. 形参数组可以不指定大小 B. 函数调用时对应的实参只能是数组名 C. 函数调用时,系统会为形参数组分配存储单元 D. 函数中对形参的修改将会影响对应的实参值 3. 若函数的类型和return语句中的表达式的类型不一致,则_D_。 A. 编译时出错 B. 运行时出现不确定结果 C. 不会出错,且返回值的类型以return语句中表达式的类型为准 D. 不会出错,且返回值的类型以函数类型为准 4. 下面的函数定义正确的是_D_。 A. float f(float x;float y) B. float f(float x,y) return x*y; return x*y; C. float f(x,y) D. float f( int x, int y) int x,y ; return x*y; return x*y; 5. 下面函数头的定义格式正确的是_C_。 A. void sort(int an,int n) B. void sort(int a ,int n) C. void sort(int a ,int n) D. void sort(int a ,n) 6. 下面4个程序中输出结果是125的有_C_。 (1). #include "iostream.h" void cube(int x) x=x*x*x; void main int x=5;cube(x); cout<<x; (3). #include "iostream.h" int cube(int x) x=x*x*x; return(x); void main int x=cube(5); cout<<x; A. 1 B. 2 C. 3 D. 4 7. 设函数m的说明形式为void m(int,int *); 利用函数m对数5和整数j作函数m定义的计算,正确的调用形式为_C_。 A. m(&5,&j) B. m(5,j) C. m(5,&j) D. m(&5,j) 8. 设函数的说明为: void fun(int a,int m); ,若有定义:int a10,n,x; 则下面调用该函数正确的是_A_。 A. fun( a, n); B. x=fun( a, n); C. fun( a10, 10); D. x=fun( a, n); 9. 下面函数说明正确的是_C_。 A. void f1(int a=3, int b, int c); B. void f2 int a, int b=3, int c); C. void f3(int a, int b, int c=3); D. void f4(int a, int b, int 3); 10. 有两个函数分别为: int f(int);和int f(int,int =100);,则下面说法正确的是_B_。 A. 不能在同一个程序中定义 B. 可以在同一个程序中定义,但不可以重载 C. 可以在同一个程序中定义并可重载 D. 以上说法均错误 11. 以下几种函数模板的定义正确的是_A_。 A. template <class T> T fun1(T a,int b) C. template <class T> void fun1(int a,int b) T i; 12. 下面程序的输出结果是_B_。 #include "iostream.h" int m=10; void f(int m,int &n) m=m+2; n=n+2; void main int n=5; f(m,n); cout<<"m="<<m<<" n="<<n<<endl; 二、阅读程序,写出运行结果 1. yes 3 not 4 2. 4 3. 12 25 16 9 2 1 4. 21234 5. m=5n=3 6. 911 三、程序填空 1. 该程序功能:对x=1,2,.,10,求f(x)=x*x-5*x+sin(x)的最大值。 #include "iostream.h" #include "math.h" float f(int x) float y; y=x*x-5*x+sin(x); _return y _; void main int x; float max; _max=f(1)_; for(x=2;x<=10;x+) _if(f(x)>max)max=f(x)_ ; cout<<max<<endl; 2. 函数backmove是把字符指针x所指的字符串平移m个字符,即将最后m个字符移到串首。如“abcdefghij”, 平移3个字符,成“hijabcdefg”。 #include "stdio.h" #include "string.h" void backmove(char *x,int m) int i,j,n;char w; A. m=10 n=5 B. m=10 n=7 C. m=12 n=7 D. m=12 n=5 n=strlen(x); for(j=0;j<m;j+) w=_*(x+n-1)_; for(i=0;i<n-1;i+) *(x+n-1-i)=_ *(x+n-2-i)_; _*x_=w; void main char s20; gets(s); _backmove(s,3)_; /假设平移3个字符 puts(s); 3. 函数index为查找字符串sub是否是字符串st的子串。若是,返回sub在st中首次出现的下标,否则返回-1。字符串sub和st非空。如sub: " cd ",st: "abcdefcd ",返回2。 #include "iostream.h" #include "stdio.h" void main char s180,s280; _ int index(char ,char );_; gets(s1);gets(s2); if(_index(s1,s2)_) cout<<"子串在字符串中首次出现的下标:"<<index(s1,s2); else cout<<"找不到" int index(char st,char sub) int i,j,k; for(i=0;sti!='0'i+) for(j=i,k=0;subk!= '0'&&stj=subk ;_ k+,j+_); if(subk= '0')_ return(i)_; return 0; 4. 函数root为用二分法求方程f(x)=0在x1,x2的实根,精度为eps。二分法求根的基本思想为 f(x)在区间a,b上连续,f(a) 与 f(b)异号,区间中点 c=(a+b)/2 的 f(c) 符号和 f(a) 符号确定 c 代替 a 或 b,使根所在区间每次减半,直到|a- b|<eps或|f(c)|<eps,c 即为所求的根,其中eps为精度。下面程序为求方程x3-5x2+16x-80=0在1,7区间的实根,精度取10-6。 #include "math.h" #include "iostream.h" double root(double x1, double x2, double eps=1e-6) _double f(double x);_ ; double x,y,y1; y1=f(x1); do x=0.5*(x1+x2); y=f(x); if(y1*y>0.0)_ x1=x_; else if (y1*y<0.0) _x2=x_; while(fabs(y)>=eps_&&_fabs(x2-x1)>=eps); return(x); double f(double x) return x*x*x-5*x*x+16*x-80; void main cout<<_root(1,7)_<<endl; 5随机生成10个1100之间的数放在一维数组中,求其平均值及最大的元素值。 #include "iostream.h" #include "stdlib.h" const int N=10; void fun(float *p,float *p1,float *p2) float sum,max1; _max1=*p_; for(int i=1;i<N;i+) if (max1<*p) max1=*p; sum=sum+*p; p+; _*p1=max1_; _*p2=sum/N_; void main float a10,aver,max,x; for(int i=0;i<10;i+) x=rand % 100+1; ai=x; for(i = 0;i<10;i+) cout<<ai<<" " cout<<endl; _fun(a,max,aver)_; cout<<"平均值:"<<aver<<" 最大值:"<<max<<endl; 6. 函数convert的功能是将一个十进制整数转换为二到十六进制的字符串。 #include "iostream.h" void convert(int m,int h,char ch) char b17="0123456789ABCDEF" int c10,i=0,k=0; do c _i+_ =m%h; while(_(m=m/h)!=0_); for(-i;i>=0;-i) chk+=b _ci_ ; _chk='0'_; void main char ch10;int m,h; cin>>m>>h; convert(m,h,ch); cout<<ch<<endl; 四、编写程序 1. 编写函数,功能为将字符串s中的字符c1用字符c2替换,并加以调用。函数形式为: void match(char s, char c1,char c2); #include <iostream.h> void replace(char s,char c1,char c2) char *p=s; while(*p!='0') if(*p=c1) void main char s80,c1,c2; cin>>s; cin>>c1>>c2; replace(s,c1,c2); cout<<s<<endl; 2. 编写函数,功能为求圆的周长和面积。函数分别定义为如下形式: double area(double r, double * girth ,double pi=3.14159); *p=c2; p+; void fun(double r, double &girth ,double &area,double pi=3.14159); 分别编二个程序实现,半径从键盘输入。 方法一、 #include <iostream.h> double area(double r,double *girth,double pi=3.14159) *girth=2*pi*r; return(pi*r*r); void main double r,len,s; cin>>r; s=area(r,&len); cout<<"len="<<len<<",s="<<s<<endl; 方法二 #include <iostream.h> void fun(double r,double &girth,double &area,double pi=3.14159) girth=2*pi*r; area=pi*r*r; void main double r,len,s; cin>>r; fun(r,len,s); cout<<"len="<<len<<",s="<<s<<endl; 3. 编写函数,功能是求二维数组中最大元素所在的行号和列号,再编写主函数调用之。 #define SIZE1 3 #define SIZE2 4 #include "iostream.h" #include "stdlib.h" float max_value(float x4,int &ii,int &jj) float max=x00; for(int i=0;i<SIZE1;i+) for(int j=0;j<SIZE2;j+) if(xij>max) max=xij; ii=i; jj=j; return(max); void main int i,j,t1,t2;float aSIZE1SIZE2; cout<<"enter the array:n" for(i=0;i<SIZE1;i+) for(j=0;j<SIZE2;j+) aij=rand%101; cout<<aij<<" " cout<<endl; cout<<"max value is" << max_value(a,t1,t2); cout<<" line="<<t1<<" row="<<t2<<endl; 4. 编写函数,将两个字符串s和t的前n个字符拼接成新的字符串,结果存放在s中。如果s或t中字符串的长度不足n,按实际长度处理。例如,如果有"ABCDEFGH"和"abcdefghijk",n为3,则新的字符串为”ABCabc”,并加以调用。函数形式为: void mystrcat(char s,char t,int n); #include <iostream.h> #include <string.h> void mystrcat(char s,char t,int n)