2016C++面向对象程序设计期末复习
一、单选题
1.在每个C++程序中都必须包含有这样一个函数,该函数的函数名为( A )。 A. main B. MAIN C. name D. function
2.设x和y均为bool量,则x && y为真的条件是( D )。 A. 其中一个为假 B. 其中一个为真 C. 它们均为假 D. 它们均为真
3. 逻辑表达式x>0 || y==5的相反表达式为( B )。
A. x<=0 || y!=5 B. x<=0 && y!=5 C. x>0 || y!=5 D. x>0 && y==5
4. 假定p是一个指向float型数据的指针,则p+1所指数据的地址比p所指数据的地址大( C )个字节。
A. 1 B. 2 C. 4 D. 8
5. 枚举类型中的每个枚举常量的值都是一个( A )。
A. 整数 B. 浮点数 C. 字符 D. 逻辑值
6. 循环体至少被执行一次的语句为( C )语句。
A. for循环 B. while循环 C. do循环 D. 任一种循环
7. 在下面的字符数组定义中,( D )语句有语法错误。
A. char a[20]=”abcdefg”; B. char a[]=”x+y=55.”; C. char a[15]={’1’,’2’}; D. char a[10]=’5’;
8. 若用数组名作为函数调用的实参,传递给形参的是( A )。 A. 数组的首地址 B. 数组中第一个元素的值 C. 数组全部元素的值 D. 数组元素的个数
9.假定AB为一个类,则执行“AB a(4), b[5], *p[2];”语句时,自动调用该类构造函数的次数为( A )。
A. 6 B. 7 C. 9 D. 11
10.当使用fstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为( D )。
A. ios::in B. ios::out C. ios::in | ios::out D. 没有 11. 枚举类型中的每个枚举常量的值都是一个( A )值。
A. 整数 B. 浮点数 C. 字符 D. 逻辑
12.设x和y均为bool量,则逻辑表达式x || y为假的条件是( C )。 A. 它们均为真 B. 其中一个为真
1
C. 它们均为假 D. 其中一个为假
13. 声明或定义一个内联函数时,必须在函数开始使用保留字( D )。 A. static B. const C. extern D. inline
14. 在下面的函数声明中,存在着语法错误的是( D )。 A. BC(int a, int); B. BC(int, int); C. BC(int, int=5); D. BC(int x; int y);
15. 假定a为一个整型数组名,则元素a[4]与( C )的表示等价。 A. a+4 B. *a+4 C. *(a+4) D. *(a+16)
16. 下面循环语句执行结束后输出的i值为( B )的值。
for(int i=0; i 18. 预处理命令在程序中都是以( B )字符开头的。 A. * B. # C. & D. @ 19. 假定有定义“struct BOOK{char title[40]; float price;};”,则不正确的变量定义语句为( D )。 A. BOOK x; ; B. BOOK x={\"C++ Programming\ C. BOOK *x=new BOOK; D. BOOK x=new BOOK; 20. 假定AB为一个类,px为指向该类动态对象数组的指针,该数组长度为n,则执行“delete []px;”语句时,自动调用该类析构函数的次数为( B )。 A. 1 B. n C. n-1 D. n+1 21. 由C++源程序文件编译而成的目标文件的缺省扩展名为( A )。 A. obj B. lik C. exe D. cpp 22. 程序运行中需要从键盘上输入多于一个数据时,各数据之间应使用( D )符号作为分隔符。 A. 空格或逗号 B. 逗号或回车 C. 逗号或分号 D. 空格或回车 23. 设x是一个bool型的逻辑量,y的值为10,则表达式 x && y的值为( C )。 A. 1 B. 0 C. 与x值相同 D. 与x值相反 24. for语句能够被改写为( D )语句。 A. 复合 B. if C. switch D. while 25. 在下面的do循环语句中,其循环体被执行的次数为( A )。 int i=0; do i++; while(i*i<10); A. 4 B. 3 C. 5 D. 2 2 26. 在下面的一维数组定义中,( C )语句有语法错误。 A. int a[]={1,2,3}; B. int a[10]={0}; C. int a[]; D. int a[5]; 27. 下面的( C )保留字不能作为函数的返回类型。 A. void B. int C. new D. long 28. 下面的函数声明中,( B )是“void BC(int a, int b);”的重载函数。 A. int BC(int x, int y); B. void BC(int a, char b); C. float BC(int a, int b, int c=0); D. int BC(int a, int b=0); 29. 当类中一个字符指针成员指向具有n个字节的存储空间时,它所能存储字符串的最大长度为( C )。 A. n B. n+1 C. n-1 D. n-2 30. 假定AB为一个类,则该类的拷贝构造函数的声明语句为( D )。 A. AB&(AB x); B. AB(AB x); C. AB(AB* x); D. AB(AB&); 31. C++程序的基本功能模块为( D )。 A. 表达式 B. 标识符 C. 语句 D. 函数 32. 存储以下数据,占用存储字节最多的是( A )。 A. 0 B. ’0’ C. ”0” D. ’\\n’ 33. 在下面的一维数组定义中,有语法错误的是( C )。 A. int a[]={1,2,3}; B. int a[10]={0}; C. int a[]; D. int a[5]; 34. 在下面的语句或语句组中,( B )不正确。 A. int a[5]; B. int M=10; int a[M]; C. int a[]={1,5,10,45}; D. const int N=12; int a[N]; 35.C++语言中的每条简单语句以___B_____作为结束符。 A. 逗号 B. 分号 C. 空格 D. 换行符 36. 含随机函数的表达式rand()%20的值在( C )区间内。 A. 1~19 B. 1~20 C. 0~19 D. 0~20 37. 当处理一个特定的问题时,若循环次数已知,则通常采用( A )来解决。 A. for循环 B. while循环 C. do循环 D. switch语句 38. 在下面循环语句中内层循环体S语句的执行总次数为( D )。 for(int i=0; i A. n B. (n+1)/2 C. n(n-1)/2 D. n(n+1)/2 3 39. 若函数声明为double* function(), 则该函数的返回值为( B )。 A. 实数型 B. 实数指针型 C. 函数指针型 D. 数组型 40. 假定变量m定义为“int m=7;”,则定义变量p的正确语句为( A )。 A. int p=&m; B. int *p=&m; C. int &p=*m; D. int *p=m; 二、填空题 1. 若需要定义一个标识符常量,并且使C++能够进行类型检查,则应在定义语句的开始使用保留字__ const __。 xy24b1对应的C++表达式为_(x*y*y)/(3*a)+4*b-1 _。 2. 算术表达式3a 3. 逻辑表达式x>y && x!=10的相反表达式为__ x<=y || x==10__。 4. 每个字符指针变量占用内存__4____个字节。 5. 执行“typedef int DataType;”语句后,在使用int定义整型变量的地方都可以使用标识符___ DataType _______来定义整型变量。 6. 对于在所有函数定义之外定义的变量,若没有被初始化则系统隐含对它赋予的初值为___0_____。 7.假定p所指对象的值为25,p+1所指对象的值为46,则执行“*(p++);”语句后,p所指对象的值为___46_____。 8.假定一个结构类型的定义为“struct A{int a; double* b; A* c;};”,则该类型的大小为____12___字节。 9.假定一维数组的定义为“int a[8];”,则该数组所含元素的个数为_____8___。 10. 若while循环语句的开始为”while(i++<=10)”,若i的初值为0,同时在循环体中不会修改i的值,则其循环体将被重复执行____11______次后正常结束。 11.已知'A''Z'的ASCII码为6590,当执行“char ch=14*4+12;cout< 13. 表达式x=x+1表示成增量表达式为_____++x _____。 14. 逻辑表达式a<=b || b==15的相反表达式为____a>b && b!=15____。 4 15. 假定一个二维数组的定义为“char* a[5][4];”,则该数组所含元素的个数为____20____,所占存储空间的字节数为___80_____。 16.当函数中的___局部____变量没有被赋初值时,它的值是不确定的。 17.假定一个结构类型的定义为“struct A{double a,b; A* c;};”,则该类型的大小为___20_____字节。 18. 假定要访问一个结构指针p所指对象中的数据成员data,则表示方法为_ p->data _。 19.假定用户没有给一个名为AB的类定义构造函数,则系统为其隐含定义的构造函数为 AB(){}_。 20. 当在程序中执行到 break 语句时,就立即结束本层循环类语句或switch语句的执行。 21.执行“cout< 23. 表达式float(25)/4的值为____6.25_______。 24. 关系表达式x+y>5的相反表达式为____ x+y<=5___。 25. 假定一个二维数组的定义为“int a[3][6];”,则该数组含有____18____个元素。 26. 执行“typedef int ABC[20];”语句把ABC定义为具有20个整型元素的_数组类型_。 27.假定p所指对象的值为36,p+1所指对象的值为49,则*++p的值为__49___。 28. 假定a是一个一维数组,则a[i]的指针访问方式为__*(a+i)__。 29.对一个类中的数据成员的初始化可以通过构造函数中的初始化表实现,也可以通过构造函数中的___函数体__实现。 30.当一个类对象离开它的作用域时,系统将自动调用该类的___析构函数_。 31.C++语言中每条复合语句以_ }(或右花括号)_作为结束符。 32.假定一个枚举类型的定义为“enum RA{ab,ac,ad,ae};”,则ac的值为___1____。 33.十进制数25表示成符合C++语言规则的八进制数为___031_____。 34. 表达式x=x+y表示成复合赋值表达式为__ x+=y __。 35.若x=5,y=15,则x>y的逻辑值为__假(false 或0)_。 5 36.假定一个一维数组的定义为“char* a[8];”,则该数组所占用存储空间的字节数为_32__。 37. 假定x=10,则表达式2+x++的值为__12__。 38.假定p所指对象的值为25,p+1所指对象的值为46,则*p++的值为__25______。 39. 假定要动态分配一个类型为Worker的具有n个元素的数组,并由r指向这个动态数组,则使用的语句为Worker* r=___ new Worker[n];___。 40. 设px指向一个类的动态分配的对象,则执行“delete px;”语句时,将自动调用该类的__析构函数__。 三、写出下列每个程序运行后的输出结果 1. #include int s1=0, s2=1; for(int i=1; i<=6; i++) {s1+=i; s2*=i;} cout< 2. #include int a[10]={68,79,86,65,46,94,37,78,60,53}; int c=0; for(int i=0;i<10;i++) if(a[i]>=60) c++; cout<<”c=”< 3. #include int a[3][4]={{1,2,7,8},{5,6,11,15},{9,20,3,4}}; int m=a[0][0]; for(int i=0;i<3;i++) for(int j=0;j<4;j++) if(a[i][j]>m) m=a[i][j]; cout< 输出结果:20 4. #include int a=10, b=15; cout<int b=a+20; cout<cout<输出结果:10 15 30 50 30 15 5. #include int a[8]={6,19,4,12,20,5,18,25}; int* p=a; for(p=a; pif(*p<10) cout<<*p<<’ ‘; cout< for(int i=1;i<=8;i=+2) s+=i*i; cout<<\"s=\"< 7. #include if(i%2!=0) s+=i; i++; } cout<7 } 输出结果:10,25 8. #include int a[8]={36,25,48,14,55,20,47,82}; int b1, b2; b1=b2=a[0]; for(int i=1; i<8; i++) { if(a[i] cout< 9. #include for(int i=0;i void main() { int a[5]={1,2,3,4,5}; cout< 10. #include char name[15]; //姓名 int age; //年龄 float pay; //工资 }; void main() { Worker x={\"wangfong\ Worker y, *p; y=x; p=&x; cout< cout< int SD(int a, int b, char op) { switch(op) { case '+': return a+b; case '-': return a-b; default: {cout<<\"操作符op出错,退出运行!\";exit(1);} } } void main() { int x=20, y=6; cout< 12. #include char* a[5]={\"student\ char *p1; p1=a[0]; for(int i=1;i<5;i++) { if(strcmp(a[i], p1)>0) p1=a[i]; } cout< 13. #include return x+y; } void main() { 9 cout< 14. #include int a[n]={2,4,6,8,10,12,14,16,18}; int s=0; for(int i=0; i 15. #include int* d=new int[5]; int i; for(i=0;i<5;i++) { d[i]=2*i+1; cout< case 'A': case 'a': cout<<\"well!\"<<’ ’; break; case 'B': case 'b': cout<<\"good!\"<<’ ’; break; case 'C': case 'c': cout<<\"pass!\"<<’ ’; break; default: cout<<\"bad!\";break; } } void main() { SB(’A’); SB(’c’); SB(’b’); cout< } 运行结果:well! pass! good! 17. #include int a[6]={36,25,48,14,55,40}; int b1=a[0]; for(int i=1;i<6;i++) if(a[i]>b1) b1=a[i]; cout<<”b1=”< 18. #include int a[9]={3,5,7,9,11,13,15,17,25}; int *p=a; for(int i=0;i<9;i++) if((i+1)%3==0) cout<<*(p+i)<<’ ’; cout< 19. #include int* a=new int[m]; for(int i=0;i for(int i=0;i<5;i++) cout<运行结果:1 4 7 10 13 20. #include 11 #include char name[15]; //姓名 int age; //年龄 float pay; //工资 }; void main() { Worker x; strcpy(x.name, \"WeiRong\"); x.age=45; x.pay=1235; cout< 四、写出下列每个函数的功能 1. bool WB(int a[], int n, int x) { for(int i=0;i 函数功能:从数组a中顺序查找值为x的元素,若查找成功则返回真,否则返回假。 2. int LJ(int a[], int n) { int k=0; for(int i=1;i 函数功能:求出数组a中n个元素的最大值并返回。 3. 假定结构类型Dnode中的data域为结点值域,next域为结点指针域。 DNode* QB(int n) { if(n==0) {return NULL;} DNode* f=new DNode; cin>>f->data; DNode* p=f; 12 while(--n) { p=p->next=new DNode; cin>>p->data; } p->next=NULL; return f; } 函数功能:建立一个具有n个结点的链表,每个结点的值依次由键盘输入,该函数返回其表头指针。 4. int WC(int a[], int n, int k) { int c=0; for(int i=0;i 函数功能:统计出数组a的n个元素中大于等于参数k的值的元素个数并返回。 5. bool SG(int x) { //x为大于等于2的整数 int a=int(sqrt(x)); //sqrt(x)为求x的平方根 int i=2; while(i<=a) { if(x%i==0) break; i++; } if(i>a) return true; else return false; } 函数功能:判断x是否为一个素数(或质数),若是则返回真,否则返回假。 6. 假定结构类型Worker中的name域表示姓名,age域表示年龄,pay域表示工资。 void QA(Worker a[], int n) { for(int i=0; i 函数功能: 从键盘上输入n个Worker结构类型的记录依次保存到一维数组a的对应元素中。 7. float FI(int n) { //n为大于等于1的整数 float x,y=0; do { cin>>x; y+=x*x; 13 } while(--n>0); return y; } 函数功能:求出从键盘上输入的n个整数的平方和并返回。 8. bool WE(int a[], int b[], int n) { for(int i=0;i if(i==n) return true; return false; } 函数功能:判断具有n个元素的两个数组a和b中对应元素值是否全部相等,若是则返回真,否则返回假。 9. void LK(int a[], int n, int& m) { float s=0; int i; for(i=0;i 函数功能:统计出数组a的前n个元素中大于等于其平均值的元素个数并由引用参数m带回。 10. int SC(int a, int b, int c) { if(a>b) a=b; if(a>c) a=c; return a; } 函数功能:求出a,b,c三个数中的最小值并返回。 11. double WA(int a[], int n) { double s=0; for(int i=0;i 14 12. double SF(double x, int n) { //n为大于等于0的整数 double p=1,s=1; for(int i=1;i<=n;i++) { p*=x; s+=p/(i+1); } return s; } xx2xn 函数功能:计算出表达式1...的值并返回。 23n1 五、按题目要求编写程序 1 已知6≤a≤30、15≤b≤36,求出满足不定方程2a+5b=126的全部整数组解。如(13,20)就是其中的一组解,并按此格式输出每组解。 答: #include int a,b; for(a=6;a<=30; a++) for(b=15;b<=36;b++) if(2*a+5*b==126) cout<<'('<2 假定函数声明为“void Print(int a[], int n);”,在函数体中按下标从大到小的次序输出数组a中的n个元素的值,并要求每行输出6个元素,当然最后一行可以不足6个。 答: void Print(int a[], int n) {输出结果:s=84输出结果:120
运行结果:24