1、二级 C+-74 及答案解析(总分:63.50,做题时间:90 分钟)一、选择题(总题数:20,分数:33.50)1.最简单的交换排序方法是 _ 。(分数:2.00)A.快速排序B.选择排序C.堆排序D.冒泡排序2.将 E-R 图转换到关系模式时,实体与实体间的联系可以表示成 _ 。(分数:2.00)A.属性B.关系C键D域3.有如下程序: #includeiostream using namespace std; class Point int x,y; public: Point(int x1=0,int y1=0):x(x1),y(y1) int get()return x+y;) ;
2、class Circle Point cente; int radius; public: Circle(int cx,int cy,int r):center(cx,cy),radius(r) int get()return center.get()+radius; ; int main() Circle c(3,4,5); coutc.get()endl; return 0; 运行时的输出结果是_。(分数:2.00)A.5B.7C.9D.124.下列重载函数中,正确的是 _ 。(分数:2.00)A.void fun(int a,float b);void fun(int c,float d
3、)B.void fun( int a,float b);void fun(float a,int b)C.float fun(int a,float b);int fun(int b,float a)D.int fun(int a,int b);float fun(int a,int b)5.有以下程序: #includeiostream using namespace std; Class sample private: int n; public: sample() sample(int m) n=m; sample add(sample s1,samplc s2) this-n=s1.n
4、+s2.n; return(*this); void disp() cout“n”nendl; ; int main() sample s1(10),s2(5),s3; s3.add(s1,s2); s3.disp(); return 0; 程序运行后,输出的结果是 _ 。(分数:2.00)A.n10B.n5C.n20D.n=156.在深度为 5 的满二叉树中,叶子节点的个数为(分数:2.00)A.32B.31C.16D.157.若有以下程序: void g(int *q) (*q) +; (*q) +; void main() int line 5; int *p=line; for (i=
5、0; i5; i+) *p=i; g( for (i=0; i5; i+) coutlinei; coutend1; 该程序运行后的输出结果为( )。(分数:1.00)A.12345B.01234C.11111D.555558.下列关于运算符重载的描述中,错误的是 _ 。(分数:2.00)A.:运算符不能重载B.类型转换运算符只能作为成员函数重载C.将运算符作为非成员函数重载时必须定义为友元D.重载运算符应完成“下标访问”操作9.下面关于友元函数的描述正确的是 _ 。(分数:2.00)A.友元函数不能访问类的私有成员B.友元函数破坏了类的封装性和隐藏性C.友元函数是类的成员函数D.友元函数的实
6、现必须在类的内部定义10.继承具有 _ ,即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接基类的成员。(分数:1.00)A.规律性B.传递性C.重复性D.多样性11.有如下程序: #includeiost ream using namespace std; class XA int a; public: static int b; XA(int aa):a(aa)b+; XA() int get()return a; ; int XA:b=0 int main() XA d1(1),d2(3); coutd1.get+d2.get+XA:bendl; return 0; 运行时
7、的输出结果是_。(分数:1.00)A.5B.6C.7D.812.下面程序的运行结果是 #include“ iostreamh“ #define sum(a,b)a * b void main( ) int x; x=sam(1+2,3); cout x; (分数:1.00)A.0B.9C.7D.513.有如下程序: #include iostream #include iomarup using namespace std; int main() coutsetw(10)setfill(“x“)setprecision(8)left; cout12.3456793_98765; return
8、0; 若程厚的输出是 12.345679x98765xxxxx,则划线处缺失的部分是 _ 。(分数:2.00)A.setw(10)B.setfill(“x“)C.setprecision(8)D.right14.关于抽象类下面说法正确的是(分数:1.00)A.抽象类就是其中有函数定义但没有实现的类B.抽象类是可以被实例化的C.派生类不能成为抽象类D.抽象类的子类必须实现父类中的纯虚函数15.下列数据模型中,具有坚实理论基础的是(分数:1.00)A.层次模型B.网状模型C.关系模型D.以上 3 个都是16.有以下程序: #include iostream using namespace Std;
9、 int main( ) int a = 15,b = 21,m = 0; switch(a%3) case 0: m+; break; case 1: m+; switch(b%2) default: m+; case 0: m+; break; coutmend1; return 0; 程序运行后的输出结果是 _ 。(分数:1.00)A.1B.2C.3D.417.可以用 p.a 的形式访问派生类对象 p 的基类成员 a,其中 a 是 _ 。(分数:2.00)A.私有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.公有继承的公有成员18.若变量已正确定义为 inL 型,要通过语
10、句“scanf(“%d,%d“,a,b,c);”给 a 赋值 1、给 b 赋值 2、给 c 赋值 3,以下输入形式中错误的是( 代表一个空格符)_。 A 1,2,3回车 B1 2 3回车 C1, 2, (分数:2.50)A.B.C.D.19.定义派生类时,若不使用关键字显式地规定采用何种继承方式,则默认方式为 _ 。(分数:2.00)A.私有继承B.非私有继承C.保护继承D.公有继承20.若有以下定义: int a=1,2,3,4,5,6,7); char cl=“b“,c2=“2“; 则数值不为 2 的表达式是 _ 。(分数:2.00)A.a1B.“d“-c1C.a“3“-c2D.c2-0二
11、、填空题(总题数:18,分数:30.00)21.派生类构造函数的执行顺序是先执行 _ 1_ 的构造函数,然后执行成员对象的构造函数,最后执行 _ 2_ 的构造函数。 (分数:1.00)22.下面程序的功能是:将字符数组 a 中下标值为偶数的元素从小到大排列,其他元素不变。请填空。 #include iostream,h #include string.h main() char a=“clanguage“,t; /一定是偶数个数 int i,j,k; k=strlen(a); for(i=0;i=k-2;i+=2) for(j=i+2;j=k;j=j+2) if( 1) t=ai;ai=aj;
12、aj=t; coutaendl; (分数:2.00)23.静态数据成员在定义或说明时,要在前面加上关键字 1;静态成员函数的实现中,不能直接引用类中说明为非静态的成员。 (分数:2.00)24.多态性分为两类:编译时的多态性和 1。 (分数:2.00)25.下面是计算 n 的阶乘的递归函数,请将该函数的定义补充完整。 unsigned f(unsigned n) if(n=1) return 1; else return _ 1_ ; (分数:2.00)26.以下程序输出的结果是 _ 1_ 。 #includeiostream.h void main( ) int a=5,b=4,c=3,d;
13、 d=(abC) ; coutd; (分数:1.00)27.有以下程序: #include iostream using namespace std; class Base int a; public: Base(int x) a-x; void show() couta; ; class Derived : public Base int b; public: Derived(int i) :Base(i+1) void show() coutb; ; int main ( ) Base b(5) ,*pb; Derived d(1); pb= pb-show (); return 0; 运
14、行后的打印结果是 _ 1_ 。 (分数:1.00)28.下面程序的输出结果是 _ 1_ 。 #include iostream using namespace std; class base protected: int a; public: base()cout“0“: ; class basel: virtual public base public: base1() cout“1“; ; class base2 : virtual public base public: base2()cout“2“; ; class derived : public base1,public base2
15、 public: derived () cout“3“; int main () derived obj; coutend1; return 0; (分数:2.00)29.全面支持软件开发过程的软件工具集合被称为 1。 (分数:2.00)30.有如下的函数定义: int Xfun(int x) int y=x; int x=10;y+=x; return x+y; 通过表达式 Xfun(5)调用该函数,则得到的返回值为 1。 (分数:2.00)31.创建对象数组时,对数组的每一个元素都将调用一次构造函数,如果没有显式给出数组元素的初值,则调用默认构造函数,下列程序涉及对象数组的创建和单个对象的
16、创建,其输出结果是 1。 #include iostream using namespace std; class Foo public: Foo(int x)eout“A“; Foo( ) ; int main( ) Foo f3,g(3); return 0; (分数:2.00)32.数据库保护分为安全性控制 _ 1_ 、并发性控制和数据的恢复。 (分数:1.00)33.在最坏情况下,堆排序需要比较的次数为 _ 1_ 。 (分数:1.00)34.下列程序的输出结果是 1。 #includeiostream.h class base int x,y; public: base(int i,i
17、nt j)x=i;y=j; virtual int add( )return x+y; ; class three:public base int z; public: three(int i,int j,int k):base(i,j)z=k;) int add( )return(base:add( )+z); ; void main( ) three*q=new three(10,20,30); coutq-add( )endl; (分数:2.00)35.下列程序中需要清理动态分配的数组,划线处应有的语句是 1。 #includeiostream, h class person int a
18、ge, tall; public: person() age= 0; tall= 40; cout“A baby is born. “end1; person(int i) age=i, tall=40, cout“A old person. “end1; person(int i, int i) age = i; tall = j; cout “ a old person with tall. “ end1; person( ) cout“ person dead. “end 1; void show() cout“age= “age“ ,tall= “tallend1; ; void ma
19、in() person * ptr; ptr = new person3; ptr0=person ( ) ptr1=person(18); ptr2=person(20,120); for(int i=0;i3; i+) ptri. show( ); 2 (分数:2.00)36.插入排序算法的主要思想是:每次从未排序序列中取出一个数据,插入到已排序序列中的正确位置。InsertSort 类的成员函数 sort()实现了插入排序算法。请将画线处缺失的部分补充完整。 class InsertSort public: InsertSort(int* a0,int n0):a(a0),n(n0)/参
20、数 a0 是某数组首地址,n 是数组元素个数 void sort() /此函数假设已排序序列初始化状态只包含 a0,未排序序列初始为 a1.an-1 for(int i=1;in;11i) int t=ai; int j; for( _ 1_ ;j0;-j) if(t=aj-1)break; aj=aj-1; aj=t; protected: int *a,n;/指针 a 用于存放数组首地址,n 用于存放数组元素个数 ; (分数:2.00)37.以下程序的功能是输出 1 至 100 之间每位数的乘积大于每位数的和的数,例如对于数字 12,有1*21+2,故不输出该数;对于 27,有 2*72+
21、7,故输出该数。请填空。 #includeiostream.h void main() int n,k=1,s=o,m: for (n=l:n=100;n+= k=l;s=0; 1; while( 2) k*=m%10;s+=m%10; _ 3_ ; if(ks)coutn; (分数:1.00)38.以下函数模板 max 的功能是返回数组 a 中最大元素的值。请将横线处缺失部分补充完整。 template typename TT max(T a,int n) T m=a0; for(int i=1 ;in;i+) if(aim) _ 1_ return m; (分数:2.00)二级 C+-74
22、 答案解析(总分:63.50,做题时间:90 分钟)一、选择题(总题数:20,分数:33.50)1.最简单的交换排序方法是 _ 。(分数:2.00)A.快速排序B.选择排序C.堆排序D.冒泡排序 解析:解析 所谓的交换类排序方法是指借助数据元素之间的互相交换进行排序的一种方法,包括冒泡排序快速排序。冒泡排序是一种最简单的交换排序方法,它通过相邻元素的交换,逐步将线性表变成有序。2.将 E-R 图转换到关系模式时,实体与实体间的联系可以表示成 _ 。(分数:2.00)A.属性B.关系 C键D域解析:解析 将 E-R 图转换成指定 RDBMS 中的关系模式是数据库逻辑设计的主要工作。从 E-R 图
23、到关系模式的转换是比较直接的,实体和联系都可以表示成关系。3.有如下程序: #includeiostream using namespace std; class Point int x,y; public: Point(int x1=0,int y1=0):x(x1),y(y1) int get()return x+y;) ; class Circle Point cente; int radius; public: Circle(int cx,int cy,int r):center(cx,cy),radius(r) int get()return center.get()+radius;
24、 ; int main() Circle c(3,4,5); coutc.get()endl; return 0; 运行时的输出结果是_。(分数:2.00)A.5B.7C.9D.12 解析:解析 根据类 Point 和类 Circle 的定义可知,类 Circle 的实例 c(3,4,5)的成员函数 c.get()返回值为 3+4+5=12。4.下列重载函数中,正确的是 _ 。(分数:2.00)A.void fun(int a,float b);void fun(int c,float d)B.void fun( int a,float b);void fun(float a,int b) C
25、.float fun(int a,float b);int fun(int b,float a)D.int fun(int a,int b);float fun(int a,int b)解析:5.有以下程序: #includeiostream using namespace std; Class sample private: int n; public: sample() sample(int m) n=m; sample add(sample s1,samplc s2) this-n=s1.n+s2.n; return(*this); void disp() cout“n”nendl; ;
26、 int main() sample s1(10),s2(5),s3; s3.add(s1,s2); s3.disp(); return 0; 程序运行后,输出的结果是 _ 。(分数:2.00)A.n10B.n5C.n20D.n=15 解析:解析 本题考查 this 指针的使用类成员函数 add 中通过 this 指针实现私有数据成员 n 的赋值。6.在深度为 5 的满二叉树中,叶子节点的个数为(分数:2.00)A.32B.31 C.16D.15解析:解析 所谓满二叉树是指这样的一种二叉树:除最后一层外,每一层上的所有节点都有两个叶子节点。这就是说,在满二叉树中,层上的节点数都达到最大值,即在
27、满二叉树的第 k 层上有 2 k1 个节点,且深度为 m 的满二叉树有 2 m 1 个节点。7.若有以下程序: void g(int *q) (*q) +; (*q) +; void main() int line 5; int *p=line; for (i=0; i5; i+) *p=i; g( for (i=0; i5; i+) coutlinei; coutend1; 该程序运行后的输出结果为( )。(分数:1.00)A.12345 B.01234C.11111D.55555解析:解析 本题考核指针的运用。主函数的 for 循环中向函数 g()传入实参 class XA int a;
28、public: static int b; XA(int aa):a(aa)b+; XA() int get()return a; ; int XA:b=0 int main() XA d1(1),d2(3); coutd1.get+d2.get+XA:bendl; return 0; 运行时的输出结果是_。(分数:1.00)A.5B.6C.7 D.8解析:解析 每调用一次 get 函数时,对新的类 A 对象进行一次实例化,调用一次构造函数,类 A 的静态成员变量 b 便加 1。12.下面程序的运行结果是 #include“ iostreamh“ #define sum(a,b)a * b v
29、oid main( ) int x; x=sam(1+2,3); cout x; (分数:1.00)A.0B.9C.7 D.5解析:13.有如下程序: #include iostream #include iomarup using namespace std; int main() coutsetw(10)setfill(“x“)setprecision(8)left; cout12.3456793_98765; return 0; 若程厚的输出是 12.345679x98765xxxxx,则划线处缺失的部分是 _ 。(分数:2.00)A.setw(10) B.setfill(“x“)C.s
30、etprecision(8)D.right解析:14.关于抽象类下面说法正确的是(分数:1.00)A.抽象类就是其中有函数定义但没有实现的类B.抽象类是可以被实例化的C.派生类不能成为抽象类D.抽象类的子类必须实现父类中的纯虚函数 解析:解析:C+语言中的抽象类就是类中至少有一个纯虚函数的类,抽象类不能被实例化,继承抽象类的类必须实现抽象类中的纯虚函数。15.下列数据模型中,具有坚实理论基础的是(分数:1.00)A.层次模型B.网状模型C.关系模型 D.以上 3 个都是解析:解析:关系模型较之格式化模型(网状模型和层次模型)有以下方面的优点,即数据结构比较简单、具有很高的数据独立性、可以直接处
31、理多对多的联系,以及有坚实的理论基础。16.有以下程序: #include iostream using namespace Std; int main( ) int a = 15,b = 21,m = 0; switch(a%3) case 0: m+; break; case 1: m+; switch(b%2) default: m+; case 0: m+; break; coutmend1; return 0; 程序运行后的输出结果是 _ 。(分数:1.00)A.1 B.2C.3D.4解析:解析 由于 a=15,所以 a%3 的值为 0。程序进入第 1 分支,执行“m+;”,最后输出
32、 m 的值为1。17.可以用 p.a 的形式访问派生类对象 p 的基类成员 a,其中 a 是 _ 。(分数:2.00)A.私有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.公有继承的公有成员 解析:解析 只有公有继承的公有成员才能被派生类的对象直接访问,其他的情况都会因为访问权限问题产生错误。18.若变量已正确定义为 inL 型,要通过语句“scanf(“%d,%d“,a,b,c);”给 a 赋值 1、给 b 赋值 2、给 c 赋值 3,以下输入形式中错误的是( 代表一个空格符)_。 A 1,2,3回车 B1 2 3回车 C1, 2, (分数:2.50)A.B. C.D.解析:
33、解析 本题考查 scanf 函数的用法,其调用格式为: scanf(格式字符串,输入项地址表); 功能是按格式字符串中规定的格式,在键盘上输入各输入项的数据,并依次赋给各输入项。 当需要从键盘上输入数据时,直到按下回车键,scanf 函数才会接受从键盘输入的数据。选项 B 中,每一个变量输入后都有一个空格是不正确的。19.定义派生类时,若不使用关键字显式地规定采用何种继承方式,则默认方式为 _ 。(分数:2.00)A.私有继承 B.非私有继承C.保护继承D.公有继承解析:解析 此题考查的是派生类的基本知识。在声明派生类时,如果不显式地给出继承万式,缺省的类继承方式是私有继承 private。2
34、0.若有以下定义: int a=1,2,3,4,5,6,7); char cl=“b“,c2=“2“; 则数值不为 2 的表达式是 _ 。(分数:2.00)A.a1B.“d“-c1C.a“3“-c2D.c2-0 解析:二、填空题(总题数:18,分数:30.00)21.派生类构造函数的执行顺序是先执行 _ 1_ 的构造函数,然后执行成员对象的构造函数,最后执行 _ 2_ 的构造函数。 (分数:1.00)解析:基类 派生类 解析 本题主要考查的是派生类构造函数的执行顺序,在 C+语言中构造函数的执行顷序是先基类后派生类,而析构函数的执行顷序正好相反,是先调用派生类后调用基类。22.下面程序的功能是
35、:将字符数组 a 中下标值为偶数的元素从小到大排列,其他元素不变。请填空。 #include iostream,h #include string.h main() char a=“clanguage“,t; /一定是偶数个数 int i,j,k; k=strlen(a); for(i=0;i=k-2;i+=2) for(j=i+2;j=k;j=j+2) if( 1) t=ai;ai=aj;aj=t; coutaendl; (分数:2.00)解析:ajai23.静态数据成员在定义或说明时,要在前面加上关键字 1;静态成员函数的实现中,不能直接引用类中说明为非静态的成员。 (分数:2.00)解析
36、:static24.多态性分为两类:编译时的多态性和 1。 (分数:2.00)解析:运行时的多态性解析 多态性是指一个接口,多种方法。分为编译时多态性和运行时的多态性。25.下面是计算 n 的阶乘的递归函数,请将该函数的定义补充完整。 unsigned f(unsigned n) if(n=1) return 1; else return _ 1_ ; (分数:2.00)解析:n *f(n-1)解析 本题首先判断是否小于等于 1,若是返回 1,否则返回 n 乘以(n-1)!,这样递归下去,因此答案为:n*f(n-1)。26.以下程序输出的结果是 _ 1_ 。 #includeiostream.
37、h void main( ) int a=5,b=4,c=3,d; d=(abC) ; coutd; (分数:1.00)解析:0 解析 本题的关键在于对变量 c 的赋值运算: d=(abC d=(543) 先算 54,为真,得 1,即:d=(13),此时 13,为假,得 0。27.有以下程序: #include iostream using namespace std; class Base int a; public: Base(int x) a-x; void show() couta; ; class Derived : public Base int b; public: Derive
38、d(int i) :Base(i+1) void show() coutb; ; int main ( ) Base b(5) ,*pb; Derived d(1); pb= pb-show (); return 0; 运行后的打印结果是 _ 1_ 。 (分数:1.00)解析:2解析 本例程序中类 Derived 是从基类 Base 公有继承来的。主函数中定义了基类对象 b 和一个基类指针 pb,又定义了派生类 Derived 的对象 d。由于 Derived 是 Base 的子类型,因此可以将派生类Derived 的对象 d 的地址赋值给指向基类 Base 的指针 pb,但这时指针 pb 只
39、能使用从基类 Base 继承的成员。所以通过对象指针 pb 调用的 show 函数是基类的成员函数 show(),从而输出基类私有数据成员 a 的值 2。28.下面程序的输出结果是 _ 1_ 。 #include iostream using namespace std; class base protected: int a; public: base()cout“0“: ; class basel: virtual public base public: base1() cout“1“; ; class base2 : virtual public base public: base2()
40、cout“2“; ; class derived : public base1,public base2 public: derived () cout“3“; int main () derived obj; coutend1; return 0; (分数:2.00)解析:0123解析 本题考核含有虚基类的继承中构造函数的调用顺序,应该先调用基类的构造函数,接着是按照派生类继承列表的顺序依次调用虚基类的构造函数,最有调用派生类自己的构造函数题中先调用 base 的构造函数,然后调用 base1、base2 的构造函数,最后调用 derived 的构造函数。29.全面支持软件开发过程的软件工具
41、集合被称为 1。 (分数:2.00)解析:软件工程环境解析 软件开发环境或称软件工程环境,它是全面支持软件开发过程的软件工具集合。30.有如下的函数定义: int Xfun(int x) int y=x; int x=10;y+=x; return x+y; 通过表达式 Xfun(5)调用该函数,则得到的返回值为 1。 (分数:2.00)解析:20解析 通过参数传递将 5 传给 x,由语句 y=x;知 y=5,又有 x=10 将局部变量 x 重新赋值,而y+=x 使得 y=15,于是 x+y=5+15=20 返回 20。31.创建对象数组时,对数组的每一个元素都将调用一次构造函数,如果没有显式
42、给出数组元素的初值,则调用默认构造函数,下列程序涉及对象数组的创建和单个对象的创建,其输出结果是 1。 #include iostream using namespace std; class Foo public: Foo(int x)eout“A“; Foo( ) ; int main( ) Foo f3,g(3); return 0; (分数:2.00)解析:A解析 数组 f3调用的是无参构造函数,而 g(3)调用的是第一个有参构造函数,故打印 A。32.数据库保护分为安全性控制 _ 1_ 、并发性控制和数据的恢复。 (分数:1.00)解析:完整性控制33.在最坏情况下,堆排序需要比较的
43、次数为 _ 1_ 。 (分数:1.00)解析:O(nlog 2 n) 解析 在最坏情况下,冒泡排序所需要的比较次数为 n(n-1)/2;简单插入排序所需要的比较次数为 n(n -1)/2;希尔排序所需要的比较次数为 O(n l.5 );堆排序所需要的比较次数为O(nlog 2 n)。34.下列程序的输出结果是 1。 #includeiostream.h class base int x,y; public: base(int i,int j)x=i;y=j; virtual int add( )return x+y; ; class three:public base int z; publi
44、c: three(int i,int j,int k):base(i,j)z=k;) int add( )return(base:add( )+z); ; void main( ) three*q=new three(10,20,30); coutq-add( )endl; (分数:2.00)解析:60解析 本题考察继承中子类对父类的继承方式,注意子类的 add 成员函数,它直接使用了父类的成员函数进行运算。35.下列程序中需要清理动态分配的数组,划线处应有的语句是 1。 #includeiostream, h class person int age, tall; public: perso
45、n() age= 0; tall= 40; cout“A baby is born. “end1; person(int i) age=i, tall=40, cout“A old person. “end1; person(int i, int i) age = i; tall = j; cout “ a old person with tall. “ end1; person( ) cout“ person dead. “end 1; void show() cout“age= “age“ ,tall= “tallend1; ; void main() person * ptr; ptr
46、= new person3; ptr0=person ( ) ptr1=person(18); ptr2=person(20,120); for(int i=0;i3; i+) ptri. show( ); 2 (分数:2.00)解析:delete ptr解析 本题考察对象数组的销毁方法,注意删除对象数组时,内不要指定大小。36.插入排序算法的主要思想是:每次从未排序序列中取出一个数据,插入到已排序序列中的正确位置。InsertSort 类的成员函数 sort()实现了插入排序算法。请将画线处缺失的部分补充完整。 class InsertSort public: InsertSort(int* a0,int n0):a(a0),n(n0)/参数 a0 是某数组首地址,n 是数组元素个数 void sort() /此函数假设已排序序列初始化状态只包含 a0,未排序序列初始为 a1.an-1 for(int i=1;
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1