C++复习题答案-精品文档资料整理.doc
:第一部分一、单项选择题、在一个程序中,main函数的位置(3)。 必须在程序的开头 必须在程序的后面 可以在程序的任何地方 必须在其它函数中间、程序基本单位是(4)。 数据 字符 函数 语句、执行语句 int i=10,*p=&i;后,下面描述错误的是(1)。 p的值为10 p指向整型变量i *p是一个地址 *p表示变量i的值 p的值是变量i的地址、执行语句 int a=5,b=10,c; int *p1=&a,*p2=&b;后,下面不正确的赋值语句是(2)。 *p2=b; p1=a; p2=p1; c=*p1*(*p2);、设i=1,j=2,则表达式i+ +j的值为(3)。 1 2 3 4、设i=1,j=2,则表达式+i+j的值为(4)。 1 2 3 4、执行下列语句后,x的值是(4),y的值是(3)。int x,y; 短路现象,“与”语句,前者执行了,后者就不执行x=y=1; +x|+y; 不确定 0 1 2、已知x=5,则执行语句x+=x-=x×x; 后,x的值为(3)。 25 40 -40 20 x=(x+(x-x*x) x=(-20-20)、已知a=4,b=6,c=8,d=9,则“(a+,b>a+&&c>d)?+d:a<b”的值为(4)。 9 6 8 010、有如下程序段:int a=14,b=15,x;char c=A;x=(a&&b)&&(c<B);执行该程序段后,x的值为(4)。 ture false 0 111、下面程序的输出结果是(4)。#include <iostream>using namespace std;int main( ) int a=6,b=6; if(a>5) a-=1; b+=1; else a+=1; b-=1; cout<<”a=”<<a<<endl; cout<<”b=”<<b<<endl;return 0; 5 7 a=5 b=7 a=5 b=6 编译时出错12、下面程序的输出结果是(2)#include <iostream>using namespace std;int main( ) int a=6,b=6; if(a>5) a-=1; b+=1; else a+=1; b-=1; cout<<”a=”<<a<<endl; cout<<”b=”<<b<<endl;return 0; 5 7 a=5 b=7 a=5 b=6 a=6 b=513、下面程序的输出结果是(2)#include <iostream>using namespace std;int main( ) int x=6,y=8; if(x+<6) cout<<+y<<endl; if(x>6) cout<< -y<<endl; else cout<<y+<<endl; return 0; 8 7 9 编译时出错14、下面程序的输出结果是(1)#include <iostream>using namespace std;int main( ) int x=6,y=8; if(+x<6) cout<<+y<<endl; else cout<<y+<<endl; if(x>6) cout<< -y<<endl; return 0; 1. 8 8 9 7 7 8 编译时出错15、下面程序的输出结果是(1)#include <iostream>using namespace std;f(int a) int b=0; static int c=3; 第一次时b=1,c=4,结束后b变回0,c继续是4,因为 b+;c+; static会保留c的上一次值,而b不是静态函数成员。 return (a+b+c); int main( ) int a=2,i; for(i=0;i<3;i+)cout<<f(a)<<endl;return 0; 7 8 9 7 7 7 7 10 13 7 9 1116、下面程序的输出结果是(3)#include <iostream>using namespace std;void fun(int x,int y,int z) 主函数中的原数值不受fun的影响 z=x*x+y*y; int main( ) int z=68; fun(5,2,z); cout<<z;return 0; 0 29 68 无定值17、下面程序的输出结果是(1)#include <iostream>using namespace std;int fun(int a,int b) return (+a*b+); int main( ) int x=3,y=4,z=5,r; r=fun(fun(x,y),z); cout<<r<<x<<y<<endl; 85 3 4 60 3 4 126 4 5 85 4 518、下面的程序中,当输入4、2时,其输出结果是(3)#include <iostream>using namespace std;long fib(int n) if(n>2) return (fib(n-1)+fib(n-2); else return (n); int main( ) int i; cout<<”请输入一个整数:”; cin>>i; cout<<endl; cout<<fib(i)<<endl; return 0; 5 1 4 2 5 2 6 219、下面程序的输出结果为(1)#include <iostream>using namespace std;unsigned func(unsigned num) unsigned d=1,k;do k=num%10; 2.6除以10余2。此时num符合要求num/=10; while(num); 如果这里改成num=0,输出结果是6return (k); int main( ) unsigned n=26; cout<<func (n); return 0; 2 4 6 520、下面程序的输出结果为(3)#include <iostream>using namespace std;func (int a,int b) int c; c=a*b; return (c ); 第一个括号由左到右执行,然后第二个括号执行funcint main( )int x=6,y=7,z=8,r; r=func(x-,y,x*y),z-);cout<<r;return 0; 294 245 280 41621、下面程序的输出结果为(1)#include <iostream>using namespace std;int main( ) int a33=1,2,3,4,5; int s=0; for (int i=1;i<3;i+)for(int j=0;j<=i;j+)s+=aij;cout<<s<<endl;return 0; 12 14 15 1322、下面程序的输出结果是(1)#include <iostream>using namespace std;void fun(int *x,int *y)cout<<*x<<” “<<*y<<” “; 虽然这里是有fun函数,但是加了方向使主函数*x=3;*y=4; 它影响,第一次是x与y调转,然后它在结束int main( ) 时,重新赋值給了,x与y,第二次继续调转 int x=1,y=2; fun(&y,&x); cout<<x<<” “<<y;return 0; 2 1 4 3 1 2 1 2 2 1 1 2 1 2 3 423、下面程序的输出结果是(3)#include <iostream>using namespace std;int main( ) int a10=9,8,7,6,5,4,3,2,1,0,*p=a+5; cout<<*-p; return 0; 编译出错 a4的地址 5 324、关于类和对象不正确的说法是(3) 类是一种类型,它封装了数据和操作 对象是类的实例 一个类的对象只有一个 一个对象必属于某个类25、下列的各种函数中,(3)不是类的成员函数。 构造函数 析构函数 友元函数 拷贝初始化构造函数26、作用域运算符的功能是(4)。 标识作用域的级别的 指出作用域的范围的 给定作用域的大小的 标识某个成员是属于哪个类的27、关于成员函数特征的下述描述中,(1)是错误的。 成员函数一定是内联函数 成员函数可以重载 成员函数可以设置参数的默认值 成员函数可以是静态的28、定义重载函数的下列要求中,(4)是错误的。 要求参数的个数不同 要求参数中至少有一个类型不同 要求参数个数相同时,参数类型不同 要求函数的返回值不同29、下列对重载函数的描述中,(1)是错的。 重载函数中不允许使用缺省参数 重载函数中编译系统根据参数表进行选择 不要使用重载函数来描述毫无相干的函数 构造函数重载将给初始化带来多种方式30、已知一个类A,(3)是指向类A数据成员的指针。假设类A有3个公有成员:Void f1(int),void f2(int)和int a。 A *p; int A:*pc=&A:a; void A:*pa(); A *pp;31、已知f1(int)是类A的公有成员函数,p是指向成员函数f1()的指针,采用(2)是正确的 pf1; pA:f1; pA:f1(); pf1();32、已知:p是一个指向类A数据成员m的指针,a1是类A的一个对象。如果要给m赋值为5,(4)是正确的。 a1.p=5; a1->p=5; a1.*p=5; *a1.p=5;33、已知类A中一个成员函数说明如下:void Set(A&a)其中,A&a的含意是(3)。 指向类A的指针为a 将A的地址值赋给变量Set a是类A的对象的引用,用来作函数Set()的形参 变量A与a按位相与作为函数Set()的参数34、下面程序的输出结果是(1)#include <iostream>using namespace std;class pointpublic:void poi(int px=10,int py=10) x=px; y=py;getpx( ) return x;getpy( ) return y;private:int x,y;int main( )point p,q;p.poi();q.poi(15,15);cout<<“p点的坐标是:”<<p.getpx( )<<“,”;cout<<p.getpy( )<<endl;cout<<“q点的坐标是:”<<q.getpx( )<<“,”;cout<<q.getpy( )<<endl;return 0; p点的坐标是:10,10 p点的坐标是:0,0 q点的坐标是:15,15 q点的坐标是:15,15 p点的坐标是:0,0 p点的坐标是:10,10 q点的坐标是:0,0 q点的坐标是:10,10?35、有以下类的说明,请指出错误的地方(A B D) class CSampleprivate:int a=2.5;(A)CSample;(B)public:CSample(int val);(C)CSample;(D);36、下面程序的输出结果是(1)#include<iostream>using namespace std;int main()int i,j,m=0,n=0;for (i=0;i<2;i+)for (j=0;j<2;j+)if (j>=i) m=1;n+;cout<<m<<endl;cout<<n;return 0; 1 1 1 01 4 6 2二、判断题、任何字符常量与一个任意大小的整型数进行加减都是有意义的。(x)、在命名标识符中,大小写字母是不加区分的。(x)、引用是某个变量的别名。对引用的操作,实质上就是对被引用的变量的操作。(y)、typedef类型定义是原来定义一些中所没有的新类型。(x)、枚举变量的取值受到该枚举变量所对应的枚举表中枚举常量的局限。(y)、已知:int a(5);表达式(a=7)+a具有二义性。(y)、预处理命令是在进行编译时首先执行的,然后再进行正常编译。(y)、条件编译命令只在编译时才有用。(y)、开关语句不可以嵌套,在开关语句的语句序列中不能再有开关语句。(x)10、switch语句中必须有break语句,否则无法退出switch语句。(x)11、while循环语句的循环体最少执行一次。(x)12、只有for循环的循环体可以是空语句,其它种类循环的循环体不能用空语句。(x)13、当循环体为空语句时,说明该循环体不做任何工作,只起延时作用。(x)14、在多重循环中,内重循环的循环变量引用的次数比外重的多。( y)15、在中,说明函数时要用函数原型,即定义函数时的函数头部分。(y)16、如果一个函数没有返回值,定义时需用void说明。(y)17、使用内置函数是以增大空间开销为代价的。(y)18、返回值类型、参数个数和类型都相同的函数也可以重载。(x)19、在设置了参数默认值后,调用函数的对应实参就必须省略。(x)20、函数形参的作用域是该函数的函数体。(y)21、定义外部变量时,不用存储类说明符extern,而声明外部变量时用它。(y)22、内部静态类变量与自动类变量作用域相同,但是生存期不同。(y)23、静态类标识符在它的作用域之外是不存在的。(x)24、使用关键字class定义的类中默认的访问权限是私有的(private)。(y)25、指向对象的指针和指向类的成员的指针在表达形式上是不相同的。(y)26、一维对象指针数组的每个元素应该是某个类的对象的地址值。(y)27、一个类的构造函数中可以不包含对其子对象的初始化。(x)三、 填空题、下面程序是计算110之间偶数之和,请填空:#include <iostream>using namespace std; int main( ) int a,b,i; a=0;b=0; for(i=0; i<=10;i+) a+=i; i+ ; cout<<”偶数之和为:”<<a<<endl;return 0; 、下面程序是输出100内能被3整除且个位数是6的所有整数,请填空:#include <iostream>using namespace std;int main( ) int i,j; for(i=0; i<=9 ;i+) j=i*10+6; if( j%3!=0 )continue; else ; cout<<j<<endl; return 0; 、结构体类型与数组不同,数组中的数据的类型是单一的,结构体的成员的数据类型是可同可不同的,共用体类似于结构体,但是共用体的部分成员是不可能同时存在的,枚举类型是枚举元素的集合。、常量与变量的区别是:常量在程序运行中值不变,因此它的值在编译时便进行初始化;而变量的值是可以改变的,指针类型的变量存储的是变量的地址,不是变量的值。、函数的形参在未被调用前不分配空间,函数的形参的类型要和实参相同。若类型不同,则按一般规则转换,若单元不同,则按顺序赋值。、函数的递归分为直接递归,间接递归,递归由递归函数、调用函数两部分组成。一般说,一个问题的解决要依靠另一问题的解决,而另一个问题的解决方法与上一问题的解决方法相同,则可用递归处理。、下面程序的功能是:求a的b次方,并输出,请填空。#include <iostream>using namespace std;double fun (double a,int b) int i; double z; for(i=1,z=1;i<=b;i+) z*=a; return z; int main( ) double a; int b; cout<<”请输入a的值:”;cin>>a; cout<<endl; cout<<”请输入b的值:”; cin>>b; cout<<endl; cout<< fun(a,b); cout<<endl; return 0; 、下面函数是检验输入的字符是大写还是小写或者不是26个字母,请填空。#include <iostream>using namespace std; char ch;fun (char ch) int i; if(ch>=a)&&(ch<=z)i=1; else if( (ch>=A)&&(ch<=Z)i=2; else i=3; return i;int main( ) int i; cout<<”请输入一个字符:”; cin>>ch; i=fun(ch); if (i=1)cout<<”是小写字母:”<<ch<<endl;else if ( i=2)cout<<”是大写字母:”<<ch<<endl;else cout<<”是其它字符:”<<ch<<endl;return 0; 、下面是字符串拷贝程序,请填空。void ccopy( ) char ch1=”good morning!”,ch220; int i=0,j=0; while(chi!=0) ch2j= ch1i; i+; ch2j=0;10、下面函数是寻找二维数组中每一行的最大值,请填空。#define N 5#define M 5void max (int aNM) int i,j,p; for (i=0;i<N;i+)p=0;for (j=1;j<M;j+)if (aip<aij)p=j;cout<<i<<”:”<<p<<endl;11、下面程序是将字符逆序化,请填空。#include <iostream>using namespace std; ;int main( ) char ch=”hello,boy!”; char c; int i=0,j=strlen(ch); for(; i!=j;i+,j-) c=chi; chi=chj-1; chj-1=c;cout<<ch;return 0; 12、下面程序的功能是将矩阵转置,请填空。#include<iostream>using namespace std;#define I 3#define J 4void invert(int aIJ) int i,j;int bJI;cout<<”array a:”<<endl;for(i=0;i<I;i+) for(j=0;j<J;j+) cout<<aij<<” “; bji=aij;cout<<endl;cout<<”array b:”<<endl;for(i=0;i<J;i+) for(j=0;j<I;j+)cout<<bij<<” “;cout<<endl;int main() int aIJ=1,2,3,4,5,6,7,8,1,3,5,7; Invert(a);return 0;四、 程序分析题、下面程序的输出结果是(8,16)#include <iostream>using namespace std;int func(int a,int b) static int m=0;int i=2; i+=m+1; m=i+a+b; return (m);int main( ) int k=4,m=1,p; p=func(k,m); cout<<p; p=func(k,m); cout<<p<<endl;return 0; 、下面程序的输出结果是(6 15 15)#include <iostream>using namespace std;int d=1;fun (int p) static int d=5; d+=p; cout<<d; return (d);int main( ) int a=3; cout<<fun(a+fun(d)<<endl; return 0; 、下面程序的执行结果是(hlo)#include <iostream>using namespace std;char ch=”hello,boy!”;void fun2(int i);void fun1(int i) cout<<chi; if(i<3) i+=2; fun2(i); void fun2(int i) cout<<chi; if (i<3) i+=2; fun1(i); int main( ) int i=0; fun1(i); cout<<endl; return 0;、下面程序的执行结果是(0 1 2 2 6 14)#include <iostream>using namespace std;int main( ) int a10=0,1,2; int j; for(j=2;j<6;j+)aj+1=aj+2×aj-1×aj-2; cout<<”The array is:”<<endl;for(j=0;j<6;j+)cout<<”a“<<j<<” is”<<aj; return 0; 、当输入时,下列程序的输出结果是(1 2 3)#include <iostream>using namespace std;int main( ) int str3,i,*p=str; for(i=0;i<3;i+) cin>>*p+;cout<<*(p-1); return 0; 、下面程序的输出结果是(6)#include <iostream>using namespace std;void func (int *a,int b) b0=*a+6; int main( ) int a,b5; a=0;b0=3; func(&a,b);cout<<b0; return 0; 、下列程序的输出结果是(6)#include <iostream>using namespace std;int b=2;int func(int *a) b+=*a; return (b); int main( ) int a=2,res=2; res+=func(&a);cout<<res;return 0; 、下面程序的输出结果是(3600)#include <iostream>using namespace std;int w=3;int fun(int);int main( ) int w=10; cout<<fun(5)×w<<endl; return 0; int fun(int k) return (5*4*3*2*1*(w=3)*(w=10) if(k=0) return w; return (fun(k-1)*k); 、下面程序的输出结果是(7 8 9)#include <iostream>using namespace std;int f(int);int main( ) int a=2,j; for(j=0;j<3;j+)cout<<f(a)<<” “; cout<<endl; return 0; int f(int a) int b=0; static int c=3; b+;c+; return (a+b+c); 五、 应用题a) 从键盘上输入10个int型数,去掉重复的,将剩余的由大到小排序输出。b) 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。#include<iostream>#include<cstdio>using namespace std;int q(char*str)int i,o=0,p=0,m=0,d=0;for(i=0;stri;i+)if(stri>='a'&&stri<='z')|(stri>='A'&&stri<='Z') o+;else if(stri>='0'&&stri<='9')p+;else if(stri=' ')m+;elsed+;cout<<"这里有"<<o<<"个字母."<<endl;cout<<"这里有"<<p<<"个数字."<<endl;cout<<"这里有"<<m<<"个空格."<<endl;cout<<"这里有"<<d<<"个其他字符."<<endl;return 0;int main()char text100;cout<<"输入一行字符串:"<<endl;gets(text);q(text);return 0;c) 有n个人围成一圈,顺序排号。从第1个人开始报数,凡报到3(13报数)的人退出圈子,问最后留下的人原来排在第几号。d) 将一个数组中的值按逆序重新存放。#include<iostream>using namespace std;int main()int a10,b10;for(int i=0;i<10;i+)ai=i;b10-i-1=ai;for(int j=0;j<10;j+)cout<<"a"<<j<<"="<<aj<<" "cout<<"b"<<j<<"="<<bj<<endl;return 0;e) 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天将剩下的桃子吃掉一半,且又多吃了一个。以后每天都吃了前一天剩下的一半另加一个。到第10天想再吃时,就只剩一个桃子了。求第一天共摘了多少桃子。#include<iostream>using namespace std;int main()int i=0,j;for(j=1;j<=10;j+)i=i*2+1;cout<<i<<endl;return 0;f) 输入圆柱体的底圆半径和圆柱体的高,求出底面面积、表面积及其体积。要求用虚函数实现。g) 编写程序,将键盘上输入的任意正整数逆转,如输入1234,输出4321。#include<iostream>using namespace std;int main()int n,j,t=0;cout<<"输入一行正整数:"cin>>n;cout<<"这行正整数的逆转为:"doj=n%10;cout<<j;n/=10;while(n!=0);cout<<endl;return 0;h) 编写程序,找出100200间的全部素数。(要求加注释)提示:判别m是否为素数的算法是:让m被2m(根号m)除,如果不能被其中的任何一个整数整除,就可以确定m是素数。#include<iostream.h>#include<math.h>#include<iomanip.h>void main()int m,k,i,n=0;bool prime; for(m=101;m<=200;m+)k=int(sqrt(m);for(i=2;i<=k;i+)if(m%i=0) prime=false;break;else prime=true;if(prime=true) cout<<setw(5)<<m; n=n+1;if(n%10=0) cout<<endl; cout<<endl;C+:第二部分一、选择题1、下列对派生类的描述中,(4)是错误的。 一个派生类可以作为另一个派生类的基类 派生类至少有一个基类 派生类的成员除了它自已的成员外,还包含了它的基类的成员 派生类中继承的基类成员的访问权限在派生类中保持不变2、对基类和派生类的描述中,(2)是错的。 派生类是基类的具体化 派生类是基类的子集 派生类是基类定义的延续 派生类是基类的组合3、派生类的构造函数的成员初始化列表中,不能包含(3)。 基类的构造函数 派生类中子对象的初始化 基类的子对象初始化 派生类中一般数据成员的初始化4、设置虚基类的目的是( )。 简化程序 消除二义性 提高运行效率 减少目标代码5、关于子类型的描述中,( )是错的。 子类型就是指派生类是基类的子类型 一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型 在公有继承下,派生类是基类的子类型 子类型关系是不可逆的6、已知一个类A,( )是指向类A成员函数的指针。假设类A有3个公有成员:Void f1(int),void f2(int)和int a。 A *p; int A:*pc=&A:a; void A:*pa(); A *pp;7、已知f1(int)是类A的公有成员函数,p是指向成员函数f1()的指针,采用( )是正确的 pf1; pA:f1;