第2章 基本数据类型、运算符与表达式
【习题】 一、
选择题
1. 下列数据类型不是C++语言基本数据类型的是( )。
(a)字符型 (b)整型 (c)浮点型 (d)数组
一、 下列字符列中,可作为C++语言程序自定义标识符是( )。选择题
2.
(a)x (b)-var (c)new (d)3i 3. 下列数中哪一个是8进制数( )。
(a)0x1g (b)010 (c)080 (d)01b 4. 已知a=1,b=2,c=3,则表达是++a||-b&&++c的值为( )。
(a)0 (b)1 (c)2 (d)3 5. 下列表达式选项中,( )是正确的。
(a)++(a++) (b)a++b (c)a+++b (d)a++++b 6. 已知枚举类型定义语句为:( )。
enum color{RED,BLUE,PINK=6,YELLOW,GREEN,PURPLE=15}; 则下列叙述中错误的是( )。
(a)枚举常量RED的值为1 (b)枚举常量BLUE的值为1 (c)枚举常量YELLOW的值为7 (d)枚举常量PURPLE的值为15
二、
填空题
1. c++语言标示符是以字母或____下划线______开头的,由字母、数字、下划线组成。 2. 在C++语言中,char型数据在内存中的存储形式是____ ASCII______。
3. 在内存中,存储字符‘x’占用1个字节,存储字符串“x”要占用____2____个字
节。
4. 符号常量可以用宏定义define和_____ const_____表示。 5. 转义字符序列中的首字符是__\\_______。 6. 空字符串的长度是____0______。
7. 表达式cout<<’\\n’;还可以表示为cout< 三、 编程题 1. 编写一个程序,输入一个三位数,分别输出该数的百位、十位和个位。 【参考答案】 一、 选择题 1. d 2. a 3. b 4. b 5. c 6. a 7. c 二、 填空题 1. 下划线 2. ASCII 3. 2 4. const 5. \\ 6. 0 7. cout< 8. a+b a-b a-b 9. iomanip.h iostream.h 三、 编程题 1. #include int num,var1,var2,var3; cout<<\请输入一个三位数:\ cin>>num; if(num>999||num<100) //用于检查输入数据的合法性 else { var1=num/100; var2=(num-var1*100)/10; var3=num; cout<<\百位数为:\ <<\十位数为:\<<\个位数为:\cout<<\您的输入有误!\ } } 第3章 C++程序的流程控制 【习题】 一、 选择题 1. 在循环语句中使用break语句的作用是( )。 (a)结束本次循环 (b)结束该层循环 (c)结束所有循环 (d)结束程序执行 2. 对if后的括号中的表达式,要求i不为0的时候表达式为真,该表达式表示正确的为 ( )。 (a)i (b)!i (c)i<>0 (d)i=0 3. 下列循环语句的执行次数是( )。 while(!1) cout<<”ok!”; (a)0次 (b)1次 (c)2次 (d) 无数次 4. 运行下列程序结果为( )。 #include int i; for (i=0;i<=10;i++){ if (i%2) cout< (a)246810 (b)12345 (c)678910 (d)13579 二、 填空题 1. 结构化程序设计的三种基本结构是顺序结构、选择结构(分支结构)、循环结构。 2. continue语句实现的作用是____跳出本次循环。__________________________。 3.若输入”china 2008!”,运行下列程序的输出结果为___________________________。 #include char c; int letters=0,digits=0,others=0; cout<<\ while ((c=getchar( ))!='\\n') { if (c>='a' && c<='z' || c>='A' && c<='Z' ) letters++; else if (c>='0' && c<='9') digits++; else others++; } cout<<\ <<\ <<\ } please input a line charaters letters:5 digits:4 others:2 4.本程序完成1!+2!+??+18!的计算,请将程序补充完整。 #include double sum=0,fac=1; for(int i=1;i<=18;i++) { ___________ fac*=i ____________ ____________ sum+=fac ___________ } cout<<\??+18!=\ < 三、 编程题 1. 输入某学生成绩,若成绩在90-100输出"优秀",若成绩在80-89输出"良好",若 成绩在70-79输出"中",若成绩在60-69输出”及格”,若成绩在0-59输出”不及格”。 2. 输入三人数,按从小到大的大顺序输出。 3. 在100~200中找出同时满足用3除余2,用5除余3和用7除余2的所有整数。 【参考答案】 一、选择题 1. b 2. a 3. a 4. d 二、填空题 1.顺序结构、选择结构(分支结构)、循环结构 2.跳出本次循环。 3. please input a line charaters letters:5 digits:4 others:2 4.①fac*=i; ②sum+=fac; 三、编程题 1. #include double grade; char* degree; cout<<\请输入学生成绩:\ cin>>grade; if(grade>100||grade<0) { cout<<\您的输入有误!\ return; } else if(grade>=70) if(grade<80) degree=\中\ else if(grade<90) degree=\良好\ else degree=\优秀\ else if(grade>=60) degree=\及格\ else degree=\不及格\ cout<<\分数:\ < #include int num1,num2,num3,num; cout<<\请输入三个整数:\ cin>>num1>>num2>>num3; if(num1>num2) { num=num1; num1=num2; num2=num; } if(num1>num3) { num=num1; num1=num3; num3=num; } if(num2>num3) { num=num2; num2=num3; num3=num; } cout<<\三个数按从小到大输出为:\ < #include cout<<\在100~200中同时满足用3除余2,用5除余3和用7除余2的整数为:\ for(int i=100;i<=200;i++) { if(i%3==2&&i%5==3&&i%7==2) cout< } 第4章 数组 【习题】 一、选择题 1.在C++中对数组下标说法正确的是( )。 (a)初始化数组的值的个数可以多于定义的数组元素的个数,多出部分将被忽略。 (b)初始化数组的值的个数可以少于定义的数组元素的个数。 (c)初始化数组的值的个数必须等于定义的数组元素的个数。 (d)初始化数组的值可以通过跳过逗号的方式来省略。如int a[3]={1,,2}; 2.数组定义为:int a[2][2]={1,2,3,4};则a[1][0]%3为( )。 (a)0 (b)1 (c)2 (d)4 4.运行下列程序结果为( )。 #include int a[4]={1,2,3,4}; for(int i=3;i>=0;i--) } (a)1234 (b)1324 (c)4231 (d)4321 5.运行下列程序结果为( )。 #include int i,j,t,a[2][2]={8,7,6,5}; for(i=0;i<1;i++) for(j=i+1;j<2;j++) { t=a[i][j]; cout< } } a[i][j]=a[j][i]; a[j][i]=t; for(i=0;i<2;i++) { } for(j=0;j<2;j++) cout< cout< (a)87 (b)78 (c)86 (d)68 65 65 75 57 二、填空题 1. m?n数组包含____M______行、___N______列和______M*N____个元素。 2. 定义数组int a[10];,若要给该数组的第三个元素赋值100,其语句为___ a[2]=100_______。 3. 已知数组a中的元素个数为4,下列语句的作用是将下标为i的元素移动到下标为i-1 的单元,其中1≤i<4。a中原有数据为1,2,3,4,移动后a中元素结果为2,3,4,4。请将下列程序补充完整。 #include int a[4]={1,2,3,4}; for(int i=0;______①i<3______;i++) } 4. 程序填空 运行下列程序后当str是对称的时,输出“是回文”,否则输出“不是回文”,请将程序补充完整。 #include char str[20]; cin.get(str,20);//输入字符串 a[i]=______②__ a[i+1]____; int i=0, j=0; while (str[j])_______①___ j++________; for(j--; i cout<<\不是回文\} 5. 运行下列程序的结果为___________________。 #include int array1[3][3]={1,2,3,4,5,6,7,8,9},array2[3][3],i,j; for(i=0;i<3;i++) for(j=0;j<3;j++) array2[j][i]=array1[i][j]; for(i=0;i<3;i++) { } } 1 4 7 2 5 8 3 6 9 6. 运行下列程序的结果为____________________。 #include for(j=0;j<3;j++) cout< cout< int num[6],i,j; cout<<\请输入1到50的六个正整数:\for(i=0;i<6;i++) cin>>num[i]; for(i=0;i<6;i++) { } } 输入为:2 4 1 6 3 1 ** **** * ****** *** * 三、编程题 1设学生人数N=8,提示用户输入N个人的考试成绩,然后计算出平均成绩,显示出来。 2. 将一个二维数组行和列互换,然后存放到另一个二维数组中; 【参考答案】 一、 选择题 1.b 2.a for(j=1;j<=num[i];j++) cout<<\ cout< 4.d 5.c 6. 二、填空题 1.m n m×n 2.a[2]=100; 3.①i<3 ②a[i+1] 4.①j++ ②i==j 5. 1 4 7 2 5 8 3 6 9 6. ** **** * ****** *** * 三、编程题 解: 源程序: #include float grades[N]; //存放成绩的数组 void main() { int i; float total,average; //提示输入成绩 for(i = 0; i < N; i++ ) { cout << \cin >> grades[i]; } total = 0; for (i = 0; i < N; i++) total += grades[i]; average = total / N; cout << \} #include int a[m][n],b[n][m],i,j; cout<<\请输入一个两行三列的数\ for (i=0;i for (j=0;j cin>>a[i][j]; b[j][i]=a[i][j]; } } cout<<\转换为三行两列值为\ for (i=0;i for(j=0;j cout< system(\ return 0; } 第4章 C++函数与程序结构 【内容提要】 【习题】 一、选择题 1.下列函数定义语句正确的是((a) void fun(int var1) { int var1=0; cout< } (b) void fun(int var1,var2) { cout< 。 )int fun(int var1) { if(var1) return 1; else return 0; } (d) int fun(int var1) { } 2.下列叙述中正确的是( ) (a)C++语言程序中,main()函数必须在其它函数之前,函数内可以嵌套定义函数。 (b)C++语言程序中,main()函数的位置没有限制,函数内不可以嵌套定义函数。 (c)C++语言程序中,main()函数必须在其它函数之前,函数内不可以嵌套定义函数。 (d)C++语言程序中,main()函数必须在其它函数之后,函数内可以嵌套调用函数。 3.下列对return语句叙述错误的是( )。 (a)在函数定义中可能有return语句,也可能没有return语句。 (b)在函数定义中可以有多条return语句。 (c)在函数定义中每条return语句可能返回多个值。 (d)如果函数类型不是void型,则函数定义中必须有return语句。 4.C++语言中函数返回值的类型是由( )决定的。 (a)return语句中的表达式类型 (b)调用该函数的主调函数类型 (c)定义函数时所指定的函数类型 (d)以上说法都不正确 5.C++中,关于参数默认值的描述正确的是( )。 (a)只能在函数定义时设置参数默认值 if(var1) return 1; else cout<<0< (b)设置参数默认值时,应当从右向左设置 (c)设置参数默认值时,应当全部设置 (d)设置参数默认值后,调用函数不能再对参数赋值 6.使用重载函数编程序的目的是( )。 (a)使用相同的函数名调用功能相似但参数不同的函数 (b)共享程序代码 (c)提高程序的运行速度 (d)节省存储空间 7.系统在调用重载函数时,下列不能作为确定调用哪个重载函数的依据的选项是((a)函数名 (b)参数个数 (c)函数类型 (d)参数类型 9.数组作为函数的形参,把数组名作为函数的实参时,传递给函数的是( )。 (a)数组中各元素的值 (b)数组中元素的个数 (c)数组中第0个元素的值 (d)该数组的首地址 10.运行下列程序结果为( )。 #include int a[][3]={0,1,2,3,4,5,6,7,8}; cout< int f(int a[][3],int row,int col) { int i,j,t=1; for(i=0;i {a[i][j]++; //每个值加1 if(i==j) t*=a[i][j]; 。 ) } return t; } (a)0 (b)48 (c)105 (d)45 相当于 下面矩阵的对角线相乘 1 2 3 4 5 6 7 8 9 11.运行下列程序的输出结果为( )。 #include int var=2; ::var=0; //访问全局变量 if(var>1) { int var=5; cout< } } (a)20 (b)000 (c)520 (d)500 二、填空题 1.一个C++语言程序总是从_____ main函数_____开始执行。 3.在函数原型说明中必须包含的要素有函数类型(如果省略则默认为int型)、___函数名______、______参数表_____。 4.____ const ______限定符声明只读变量。 5.若某个函数没有返回值,则该函数的类型应定义为_____ void _____类型。 6.一个函数直接或间接地调用自身,这种现象称为函数的____递归调用______。 cout< 7.在一个函数的定义或声明前加上关键字___ inline _______则就把该函数定义为内联函数,它主要是解决____程序的运行效率______问题。 8.函数的参数传递的方式分为两类,分别是_____值传递_____方式和_____引用传递_____方式。 9.在c++中,可以有多个同名而处理不同参数类型或个数的函数,称为函数____重载______。 12.运行下列程序的结果为____ ______。 #include int a=66,b=4; cout<<\“ < cout<<\“ < void swap(int &x,int &y) { int t=x; x=y; y=t; } a=66,b=4 a=4,b=66 13.运行下列程序的结果为__________。 #include void fun(int array[ ],int n); void main( ) { } void fun(int array[ ],int n) { } ? 1 1 2 3 5 8 13 21 34 55 14.运行下列程序,若输入1 2 3 4 5则输出结果为_______________________。 #include void main() { rev(5); int x; cin>>x; if(n==1) cout< for(i=2;i array[i]=array[i-1]+array[i-2]; int a[10]={1,1}; int i; fun(a,10); for(i=0;i<10;i++) cout< cout< else { } rev(n-1); cout< } 用递归调用:54321 15. 运行下列程序结果为________________。 #include void fun(char PrChar='$',int num=10); main() { char ch; int num; ch='#'; num=20; fun(ch,num); fun(); fun('&'); return 0; } void fun(char ch,int num) { for(int i=0;i cout< #################### $$$$$$$$$$ &&&&&&&&&& cout<<\ 16.运行下列程序结果为____________________________。 #include void fun( ) { } 答案:01234 三、编程题 1. 编写函数将华氏温度转换为摄氏温度,公式为c?(F?32)?5?9;并在主函数中调用。 2. 编写函数利用全局变量统计数组中奇数和偶数的个数。 【参考答案】 一、选择题 1. c 2. b 3. c 4. c 5. b 6. a 7. c 8. b 9. d 10. d 11. c static int m=0; M的值保持不变 cout< for(i=0;i<5;i++) fun(); 二、填空题 1. main函数 2. 函数原型 3. 函数名、参数表 4. const 5. void 6. 递归调用 7. inline、程序的运行效率 8. 值传递、引用传递(或地址传递) 9. 重载 10. 函数范围、文件范围、块范围、函数原型范围 11. static 12. a=66,b=4 a=4,b=66 13. 1 1 2 3 5 8 13 21 34 55 14. 54321 15. #################### $$$$$$$$$$ &&&&&&&&&& 16.01234 三、编程题 1. #include double ftoc(double f) { double c; c=(f-32)*5/9; return c; cout<<\华氏温度\度为摄氏\度!\ } 2. #include int array[N]={0,2,3,4,5,6,7,8,10,12}; sta(array,N); cout<<\奇数有\个,\ <<\偶数有\个\ } void sta(int a[],int n) { for(int i=0;i else numo++; } 第6章 指针、引用和动态空间管理 【习题】 一、选择题 1. 要使变量i成为int型变量x的别名,正确的定义语句是( )。 (a) int &i=x; (b) int i=&x; (c) int &i=&x; (d) int i=x; 2. 在下列指针表达式中,与下标访问a[i][j]不等效的是( )。 (a) *(a+i+j) (b) (*(a+i))[j] (c) *(*(a+i)+j) (d) *(a[i]+j) 3. 已定义字符串char str[5],则下列表达式中不能表示str[1]的地址的是((a) str+1 (b) str++ (c) &str[0]+1 (d)&str[1] 4. 已知:int a[]={1,2,3,4,5,6},*p=a,x;下面语句中x的值为5的是( )。。 ) (a) p+=3;x=*(p++); (b) p+=5;x=*p++ ; (c) p+=4;x=*++p; (d) p+=4; x=*p++ 5. 若有说明:int i,j=6,*p;p=&i;则与i=j等价的语句是( )。 (a) i=*p; (b) *p=*&j; (c) i=&j; (d)i=**p; 6. 设p1和p2是指向同一个int型一维数组的指针变量,k为int型变量,则不能正确执行 的语句是( )。 (a) k=*p1+*p2; (b) p2=k; (c) p1=p2; (d) k=*p1*(*p2); 7. 下面函数的功能是( )。 int fun(char *x) { char *y=x; while(*y++){}; //执行到结尾,即指针指到字符串的尾部 return y-x-1; } (a) 求字符串的长度 (b) 求字符串存放位置 (c) 比较两个字符串的大小 (d) 将字符串x连接到字符串y后面 8. 执行以下程序段后,m的值为( )。 int a[2][3]={{1,2,3},{4,5,6}}; int m,*p=&a[0][0]; m=(*p)*(*(p+2))*(*(p+4)); //第1,3,5个元素的乘积 (a) 15 (b) 14 (c) 13 (d) 12 9. 设有如下定义,下面关于ptr正确叙述是( )。 int (*ptr)(); (a) ptr是指向一维数组的指针变量。 (b) ptr是指向int 型数据的指针变量。 (c) ptr是指向函数的指针,该函数返回一个int型数据。 (d) ptr是一个函数名,该函数的返回值是指向int型数据的指针。 10. 若有如下语句: int **pp,*p,a=10,b=20; pp=&p; p=&a; p=&b; cout<<*p<<”,”<<**pp< 二、填空题 (b) 10,10 (c) 20,10 (d) 20,20 1. 运行下列程序结果为_____10_____。 #include { int a[3]={10,15,20}; int *p1=a,*p2=&a[1]; //*P2=15 *p1=*(p2-1)+5; //*P1=15 *(p1+1)=*p1-5; // A[1]=10 cout< 2. 运行下列程序结果为max=15,min-=-5,请将程序补充完整。 #include void max_min(int arr[],int *pt1,int *pt2,int n) { } void main() { } 三、编程题 【参考答案】 void max_min(int arr[],int *pt1,int *pt2,int n); int array[N]={1,8,10,2,-5,0,7,15,4,-5}; int *pt1,*pt2,a,b; pt1=&a; pt2=&b; max_min(_________③___ array,pt1,pt2,N_________); cout<<\int i; *pt1=*pt2=arr[0]; for(i=1;i if(arr[i]>*pt1) ________①___*pt1=arr[i];_______ if(arr[i]<*pt2) ________②____*pt2=arr[i]______ 一、选择题 1. a 2. a 3. b 4. d 5. b 6. b 7. a 8. a 9. c 10. d 二、填空题 1. 10 2. ①*pt1=arr[i];②*pt2=arr[i];③array,pt1,pt2,N 3. MONTH NO3 MARCH 4. 123 321 321 第8章 类和对象的创建 【习题】 一、选择题 1.下列各项中不能用于声明类的成员访问控制权限的关键字是((a)private (b)protected (c)public (d)static 2.下列关于构造函数的说法错误的是( )。 。 ) (a)构造函数的名字必须与类的名字相同。 (b)构造函数可以定义为void类型。 (c)构造函数可以重载、可以带有默认参数。 (d)构造函数可以由用户自定义也可以由系统自动生成。 3.有如下类声明: class student { int age; char *name; }; 则student类的成员age是( )。 (a)公有数据成员 (b)私有数据成员 (c)保护数据成员4.有如下类定义 #include point():x(0),y(0){} point(int x1,int y1=0):x(x1),y(y1){} }; 若执行语句 point a(2),b[3],*c; 则point类的构造函数被调用的次数是( )。 (a)2次 (b)3次 (c)4次 (d)5次 5.在下列哪种情况下不会调用拷贝构造函数( )。 (a)用一个对象去初始化本类的另一个对象时。 (b)函数的形参是类的对象,在进行形参和实参的结合时。 (c)函数的返回值是类的对象,函数执行完返回时。 (d)将类的一个对象赋值给另一个本类的对象时。 6.下列关于友元的描述错误的是( )。 (a) 友元关系是单向的且不可传递 (b) 在友元函数中可以通过this指针直接引用对象的私有成员。 (c) 友元可以是一个普通函数也可以是一个类。 (d) 通过友元可以实现在类的外部对类的私有成员的访问。 7.有如下程序 (d)私有成员函数 #include public: AA(int k):n(k){ } int get( ){ return n;} int get( )const{ return n+1;} }; int main( ) { AA a(5); const AA b(6); cout< 运行该程序结果为( )。 (a)56 (b)57 (c)67 8.有如下程序: #include static int getNum( ) { return n; } private: static int n; }; int Test::n = 1; int main( ) { Test* p = new Test; delete p; cout << \return 0; } 执行后的输出结果是( )。 (a) n=0 (b)n=1 (c)n=2 (d)66 (d)n=3 9.下列程序的运行结果为( )。 #include int A::num=0; void g(A& a) { } void main() { } (a)0 (b)1 (c)2 (d)3 10.运行下列程序结果为____________________。 #include MyClass p1,*p2; p2=new MyClass('X'); delete p2; return 0; MyClass(){cout<<'A';} MyClass(char c){cout< cout< num++; return *this; } 执行这个程序幕上将显示输出______。 (a)ABX (b)ABXB (c)AXB (d)AXBB 二、填空题 1.类的成员包括___数据_____成员和成员___函数_____。 2.释放对象所占的内存空间并完成善后处理工作的是____析构_______函数。 3.拷贝构造函数以_____本类对象的引用_________作为参数。 4.用指向对象的指针引用对象成员使用操作符___->_______。 5.当一个对象生成以后,系统就为这个对象定义了一个_____ this指针_____,它指向这个对象的地址。 6.在类中声明静态成员的关键字是___ static ________。 7.非成员函数应声明为类的____友元________函数才能访问这个类的private成员。 8.C++建立和初始化对象的过程由_____类的构造函数__________完成。 9.对于常量数据成员和引用数据成员的初始化只能通过______成员初始化列表__________来完成。 10.在类中说明的具有类类型的成员称为_____对象成员____________。 11.下列为类的定义语句,是否有错,若有错请改正。 class circle --------------------------------------------① { double r=3;---------------------------------------② public:----------- ---------------------------------------③ circle(double i) ----------------------------------④ { } double area();//面积-----------------------------⑥ r=i; ------------------------------------------⑤ double prm();//周长-----------------------------⑦ void printarea(double); -------------------------⑧ void printprm(double); ------------------------- }--------------------------------------------------------⑩ //成员函数的实现 12.下列程序输出结果为0,1.请将程序补充完整。 #include class A{ int num; A():num(0){} void set(int num) { ________①___ A::num=num ________}//给A的数据成员num赋值 int get() {_________②___ return num;________}//获得数据成员num的值 }; int main() { } 13.下列程序输出:2,33.4,tom。请将程序补充完整。 #include int i; float j; char c[20]; public: A(int x, float y, char ch[]):i(x),j(y) { }; void main() { A a(2,33.4,\ } void printA() { } ________②____ cout< cout< cout< } a.printA(); 14.下列程序的输出结果为 Object id=0 Object id=1 请将程序补充完整。 #include _____ int Point::countP=0;_____________//静态数据成员的初始化 int main( ) { } 15. 插入排序算法的主要思想是:每次从未排序序列中取出一个数据,插入到已排序序列中的正确位置,InsertSort类的成员函数sort()实现了插入排序算法,请将画线处缺失的部分补充完整。 #include InsertSort(int*a0,int n0):a(a0),n(n0){}//a是数组首地址,n是数组元素个数 void sort() {//此函数假设已排序序列初始化状态只包含a[0],未排序序列初始为a[1]?a[n-1] for (int i=1;i Point(int xx=0, int yy=0) {X=xx; Y=yy; countP++; } Point( ) { countP--; } int GetX( ) {return X;} int GetY( ) {return Y;} static void GetC( ) {cout<<\ int X,Y; static int countP; private: }; } { } int j,t; for(_______________;j>0;--j) { } a[j]=t; if(t>a[j-1])break; a[j]=a[j-1]; protected: int*a,n;//指针a用于存放数组首地址,n用于存放数组元素个数 三、编程题 1. 自定义一个正方体类,它具有私有成员x,表示正方体的每个面的正方形的边长。提供构造函数以及计算正方体的体积和表面积的公有成员函数,并编制主函数,对正方体类进行使用:说明正方体类对象,输入棱长,计算其体积和表面积并显示结果。 2. 设计一个时间类Time,包括3个数据成员,时(hour)、分(minute)、秒(second),以及成员函数用于设置和读取时、分、秒,并按上午、下午各12小时或按24小时输出时间。 【参考答案】 一、选择题 1.d 2.b 3.b 4.c 5.d 6.b 7.b 8.a 9.b 10.d 二、填空题 1.数据、函数 2.析构 3.本类对象的引用 4.-> 5.this指针 6.static 7.友元 8.类的构造函数 9.成员初始化列表 10.对象成员 11.②⑩ 改正如下: ②double r; ⑩末尾加分号。 12.①A::num=num; ②return num; 13. ①strcpy(c,ch); ②cout< 三、编程题 1.参考程序如下: #include double cube::volume() double x; cube(double xx) { } double volume(); double sarea(); x=xx; public: { } double cube::sarea() { } void main() { } 2.参考程序如下: #include int Time::sethour(int h) { if(h>=24||h<0) else return 0; int hour; int minute; int second; int sethour(int); int setminute(int); int setsecond(int); int gethour(); int getminute(); int getsecond(); void show12(); void show24(); double a; cout<<\请输入棱长:\cin>>a; cube c(a); cout<<\该正方体的体积为:\ <<\该正方体的表面积为:\return pow(x,2)*6; return pow(x,3); public: } { } hour=h; return 1; int Time::setminute(int m) { } int Time::setsecond(int s) { } int Time::gethour(){return hour;} int Time::getminute(){return minute;} int Time::getsecond(){return second;} void Time::show12() { } void Time::show24() if(hour==12) else cout< second=s; return 1; return 0; if(m>=60||m<0) else { } minute=m; return 1; return 0; { } void main() { } 【习题】 一、选择题 1.在私有继承的情况下,允许派生类直接访问的基类成员包括( )。 (a)公有成员和私有成员 (b)公有成员和保护成员 (c)保护成员和私有成员 (d)公有成员、私有成员和保护成员 2.有如下类定义: class base{ public:int x; protected: int y; private: int z; }; 派生类采用什么方式继承可以使x成为自己的公有成员( )。 (a)公有继承 (b)保护继承 (c)私有继承 (d)以上三个都对 3.派生类的对象对其基类成员中( )是可以访问的。 (a)公有继承中的公有成员 (b)公有继承中的保护成员 (c)私有继承中的公有成员 (d)以上三者都对 int h,m,s; cin>>h>>m>>s; Time t; if(t.sethour(h)==0||t.setminute(m)==0||t.setsecond(s)==0) { } t.show12(); t.show24(); cout<<\输入时间错误!\return; cout< 4.下列虚基类的声明正确的是( )。 (a)class derived:virtual public base (b)virtual class derived:public base (c)class virtual derived:base (d)class derived: base1 virtual 5.有如下类声明: class base{ }; class derived: protected base{ protected: }; 则类derived中保护的数据成员和成员函数的个数是( )。 (a)1 (b)2 (c)3 (d)4 二、填空题 1. 1.在继承中,缺省的继承方式是____私有继承_______。 2. 2.派生类中的成员函数不能直接访问基类中的____私有________成员。 3. 3.保护派生时,基类中的所有非私有成员在派生类中是__保护________成员。 4.当创建一个派生类对象时,先调用_____基类_____的构造函数,然后调用_对象成员所在类______的构造函数,最后调用______派生类______的构造函数。 4. 5.对于基类数据成员的初始化必须在派生类构造函数中的_____成员初始化列表______处执行。 5. 6.为了解决在多重继承中因公共基类带来的__二义性___________问题,C++语言提供了虚基类机制。 7.将下列的类定义补充完整。 class base int j; void set(int m, int n){ base::set(m); j=n;} int get( )const{ return base::get( )+j; } public: int i; void set(int n){ i=n;} int get( )const{ return i; } public: { public: }; class derived:public base { }; void derived::g() { f(); //被调用的函数是derived:: f() //调用基类的成员函数f int f(); int g(); int f(); __________________ } 8.有如下程序: #include class derived: public base{ public: }; int main() { } derived x; return 1; base(){cout<<\~base(){ cout<<\ derived(){cout<<\~derived(){ cout<<\ 运行结果为___________________________。 constructing base! constructing derived! destructing derived! destructing base! 9.有如下程序: #include { x=x1;cout<<\}; class base1:virtual public base { int y; public: base1(int x1,int y1):base(x1) { y=y1;cout<<\}; class base2:virtual public base { int z; public: base2(int x1,int z1):base(x1) { z=z1;cout<<\}; class derived:public base1,public base2 { int xyz; public: ________________________________________ { xyz=xyz1;cout<<\}; void main() {derived obj(1,2,3,4);} 输出结果为: x=1 y=2 z=3 xyz=4 请将程序补充完整。 10.运行下列程序的结果为_______________________。 # include class car:public vehicle { }; class truck:public vehicle { }; void main() { } 三、编程题 1.编写一个输出学生和教师数据的程序,学生数据有编号、姓名、年龄、班号和成绩;教师数据有编号、姓名、年龄、职称和部门。要求声明一个person类,并作为学生数据操作 vehicle obj,*ptr; car obj1; truck obj2; ptr=&obj; ptr->message(); ptr=&obj1; ptr->message(); ptr=&obj2; ptr->message(); int goods; void message(){ cout<<\public: int passengers; void message(){ cout<<\public: int wheels; float weight; void message() {cout<<\ public: 类student和教师数据操作类teacher的基类。 【参考答案】 一、选择题 1. b 2. a 3. a 4. a 5. c 6. b 7. a 8. c 二、填空题 1. 私有继承 2. 私有 3. 保护 4. 基类、对象成员所在类、派生类 5. 成员初始化列表 6. 二义性 7. base::f() 8. constructing base! constructing derived! destructing derived! destructing base! 9. derived(int x1,int y1,int z1,int xyz1):base(x1),base1(x1,y1),base2(x1,z1) 其中参数名可以为任意合法变量名。 10. vehicle message vehicle message vehicle message 三、编程题 1. 参考程序如下: #include }; char name[10]; int age; person(char n[],int a) { } void disp() { } cout<<\ 姓 名:\cout<<\ 年 龄:\strcpy(name,n); age=a; public: class teacher : public person { }; class student : public person { char sid[12]; char cnum[12]; char tid[10]; char dept[20]; char post[10]; teacher(char *s1,char *s2,int i,char *s3,char *s4):person(s2,i) { } void disptech() { } cout<<\ 编 号:\person::disp(); cout<<\ 工作部门:\cout<<\ 职 称:\strcpy(tid,s1); strcpy(dept,s3); strcpy(post,s4); public: }; double score; student(char *s1,char *s2,int a, char *s3,double i):person(s2,a) { } void dispstu() { cout<<\ 学 号:\person::disp(); cout<<\ 班 级:\cout<<\ 成 绩:\strcpy(sid,s1); strcpy(cnum,s3); score=i; public: int main() { } teacher t1(\张伟\信息学院\教授\student s1(\李涛\t1.disptech(); s1.dispstu(); return 0;