1、国家二级( C+)笔试模拟试卷 124及答案与解析 1 下列叙述中正确的是 ( )。 ( A)一个算法的空间复杂度大,则其时间复杂度必定大 ( B)一个算法的空间复杂度大,则其时间复杂度必定小 ( C)一个算法的时间复杂度大,则其空间复杂度必定小 ( D)上述三种说法都不对 2 下列叙述中正确的是 ( )。 ( A)一个逻辑数据结构只能有一种存储结构 ( B)逻辑结构属于线性结构,存储结构属于非线性结构 ( C)一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率 ( D)一个逻辑数 据结构可以有多种存储结构,且各种存储结构影响数据处理的效率 3 对长度为 n的线性表进行顺序
2、查找,在最坏情况下需要比较的次数为 ( )。 ( A) 125 ( B) n/2 ( C) n ( D) n+1 4 最简单的交换排序方法是 ( )。 ( A)快速排序 ( B)选择排序 ( C)堆排序 ( D)冒泡排序 5 设计程序时,应采纳的原则之一是 ( )。 ( A)程序的结构应有助于读者的理解 ( B)限制 GOTO语句的使用 ( C)减少或取消注释行 ( D)程序越短越好 6 下列关于结构化程序设计原 则和方法的描述中错误的是 ( )。 ( A)选用的结构只准许有一个入口和一个出口 ( B)复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现 ( C)不允许使用 GOTO语句 ( D
3、)语言中所没有的控制结构,应该采用前后一致的方法来模拟 7 下列特征中不是面向对象方法的主要特征的是 ( )。 ( A)多态性 ( B)继承 ( C)封装性 ( D)模块化 8 在面向对象方法中,一个对象请求另一个对象为其服务的方式是通过发送( )。 ( A)调用语句 ( B)命令 ( C)口令 ( D)消息 9 下 列描述中错误的是 ( )。 ( A)继承分为多重继承和单继承 ( B)对象间通信靠传递消息实现 ( C)在外面看不到对象的内部特征是基于对象的 “模块独立性好 ”这个特征 ( D)类是具有共同属性、共同方法的对象的集合 10 下列叙述中正确的是 ( )。 ( A)软件交付使用后还
4、需要进行维护 ( B)软件一旦交付使用就不需要再进行维护 ( C)软件交付使用后其生命周期就结束 ( D)软件维护是指修复程序中被破坏的指令 11 下列关于 C+函数的说明中,正确的是 ( )。 ( A)内联函数就是定义在另一个 函数体内部的函数 ( B)函数体的最后一条语句必须是 return语句 ( C)标准 C+要求在调用一个函数之前,必须先声明其原型 ( D)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式 12 假定 MyClass为一个类,则执行 MyClass a b(2), *p;语句时,自动调用该类构造函娄 ( )次。 ( A) 2 ( B) 3 ( C) 4 (
5、 D) 5 13 有如下程序: #include iostream using namespace std; class Test public: Test() n+=2; Test() n-=3; static int getNum()return n; private: static int n; ; int Test:n=1; int main() Test*p=new Test; delete p; cout “n=“Test:getNum() endl; return 0; 执行后的输出结果是 ( )。 ( A) n=0 ( B) n=1 ( C) n=2 ( D) n=3 14 关
6、于运算符重载,下列表述中正确的是 ( )。 ( A) C+已有的任何运算符都可以重载 ( B)运算符函数的返回类型不能声明为基本数据类型 ( C)在类型转换符函数的定义中不需要声明返回类型 ( D)可以通过运算符重载来创建 C+中原来没有的运算符 15 假定 MyClass为一个类,那么下列的函数说明中, ( )为该类的析构函数。 ( A) void MyClass(); ( B) MyClass(int n); ( C) MyClass(); ( D) MyClass(); 16 对于拷贝初始化构造函数,正确的描述是 ( )。 ( A)在 C+语言中,如果不自定义类的拷贝初始化构造函数,则每
7、个类都有默认的拷贝初始化构造函数 ( B)必须为每个类定义拷贝初始化构造函数 ( C)如果要使用拷贝初始化构造函数,则必须在类中先定义 ( D)当定义了类的构造函数时,如果要使用拷贝初始化构造函数,则必须定义拷贝初始化构造函数 17 下列对重载函数的描述中,错误的是 ( )。 ( A)重载函数中不允许使用默认参数 ( B)重 载函数中编译是根据参数表进行选择的 ( C)不要使用重载函数来描述毫不相干的函数 ( D)构造函数重载将会给初始化带来多种方式 18 有如下程序: #include iostream using namespace std; class Complex double re
8、,im; public: Complex(double r,double i):re(r),im(i) double real()constreturn re; double image()constreturn im; Complex im+=a.im; return *this; ; ostream int main() Complex x(1,2),y(2,3); tout (x+=y) endl; return 0; 执行这个程序的输出结果是( )。 ( A) (1,-2) ( B) (2,3) ( C) (3,5) ( D) (3,1) 19 下面有关重载函数的描述中,正确的是 (
9、)。 ( A)重载函数必须具有不同的返回值类型 ( B)重载函数形参个数必须不同 ( C)重载函数必须具有不同的形参列表 ( D)重载函数名可以不同 20 ( )是以一种完全通用的方法来设计函数或类而不必预 先说明将被使用的每个对象的类型。 ( A)模板 ( B)类 ( C)对象 ( D)函数 21 下列关于 getline()函数的描述中,错误的是 ( )。 ( A)该函数可以用来从键盘上读取字符串 ( B)该函数读取的字符串长度是受限制的 ( C)该函数读取字符串时,遇到终止符时便停止 ( D)该函数中所使用的终止符只能是换行符 22 下列选项中合法的用户标识符是 ( )。 ( A) 10
10、ng ( B) _2Test ( C) 3Dmax ( D) A.dat 23 程序中有如下语句 for(int i=0;i 5;i+)cout *(p+i) “,“;能够依次输出int型一维数组 a的前 5个元素。由此可知,变量 P的定义及初始化语句是 ( )。 ( A) int *p=a; ( B) int p=a; ( C) *p=a; ( D) p=a; 24 有如下语句序列: int k=0; dok+=5;cout ; while(k 19); while(k- 0)cout *; 执行上面的语句序列输出字符 “ ”和 “*”的个数分别是 ( )。 ( A) 4和 20 ( B)
11、5和 20 ( C) 4和 21 ( D) 5和 21 25 若有以下定义和语句: int s45, (*p)5; p=s; 则指针对 s数组中第三个元素的正确引用形式是 ( )。 ( A) p03 ( B) p12 ( C) p02 ( D) p13 26 下列程序的输出结果是 ( )。 #include iostream using namespace std; int main() char a=“Hello,Test“; char *p=a; while(*p) if(*p =a ( B) double f2(double x)return x-1.5; ( C) void f3(do
12、uble x)-x; ( D) double f4(double *x)-*x;return*x; 28 有如下的运算符重载函数定义: double operator+(int i,int k)return double(i+k);但定义有错误,对这个错误最准确的描述是 ( )。 ( A) #NAME? ( B)两个 int型参数的和也应该是 int型,而这里将 +的返回类型声明为 double ( C)没有将运算符重载函数声明为某个类的友元 ( D) C+已经提供了求两个 int型数据之和的运算符 +,不能再定义同样的运算符 29 下列程序的执行结果是 ( )。 #include iostr
13、eam.h #include stdlib.h Class TestClass public: int x,y; TestClass()x=y=0; TestClass(int a,int b)x=a;y=b; void disp() cout “x=“ x “,y=“ yend1; ; void main() TestClass s1(2,3); s1.disp(); ( A) x=2,y=2 ( B) x=3,y=3 ( C) x=2,y=3 ( D) x=3,y=2 30 若有以下变量定义和函数调用语句: int a=5; fun( protected: unsigned len; ch
14、ar*data; ; MyString:MyString(const char*s) len=strlen(s); data=new charlen+1); strcpy(data,s); int main() MyString a(“C+Programing“); MyString b(a); return 0; 在运行上面的程序时出错,出错的原因是 ( )。 ( A) 构造函数的实参不允许是本类的对象 ( B)没有定义实现深层复制 (深拷贝 )的复制构造函数 ( C)构造对象 a时实参与形参类型不符 ( D)系统不能生成默认的复制构造函数 33 有如下程序: #include iostre
15、am.h using namespace std; class Demo public: Demo() cout “default constructorn“; Demo(const Demo ; Demo userCode (Demo b)Demo c(b);return c; int main() Demo a,d; cout “calling userCode()n“; d=userCode(a); return 0; 执行上面程序的过程中,构造函数 Demo()和 Demo(const Demo “语句后得到的输出结果为【 】。 42 下列函数的功能是【 】。 #include ios
16、tream. h int Func(int a,int b) if (a b) return 1; else if(a=b) return 0; else return -1; 43 根据三角形的基本定理完成填空,则表达式为【 】。 #include iostream. h #include math. h void main() double a,b,c,s,area; cout “请输入三角形三边 a,b,c:“ end1; cin a b c; if(_) s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)* (s-c), cout “三角形的面积为 :“ area
17、; else cout “不能构成三角形 !“ end1; 44 下列程序的运行结果为【 】。 #include iostream, h void main( ) int i; for(i=1; i 6;i+)if(i=3) break: com “i=“ i end1; 45 下列程序编译错误,因为 add函数返回值是一个引用,故对 return后返回值的要求是【 】。 #include iostream. h int void main( ) int i=3,j=19; cout (add(i,j)+ =20) end1; 46 在下面的类定义中, this指针的用途是【 】。 #incl
18、ude iostream. h class Sample int x,y; public: Sample(int i,int j)x=i;y=j; void asstgn(Sample sa): ; void Sample: :assign(Sample p) if (this! = y=p.y; 47 参照函数模板的写法,完成非模板函数的定义,语句为【 】。 #include iostream, h #include string. h template class T T min(T a, T b) return(a b? a:b); char * min(char * a, char *
19、 b) _ void main() double a=1.23,b=3.45; char s1=“abcd“,s2=“erg“; cout min(a, b) min(s1,s2) end1: 48 下列程序中的 this指针的作用是【 】。 #include iostream. h class Sample int n; static int st; public, Sample() Sample(int m) n=m; st=m+10; void Change(int k) st=st+k; void AddValue(int m) Sample s, s. n=n+m; *this=s;
20、 void disp( ) cout “n=“ n “;st=“ st end1; ; int Sample: :st=0 void main() Sample s1(10),s2(10) s1.disp() s1.AddValue(5), s2.Change(100); s1.disp(); s2.disp() 49 下列程序的运行结果为【 】。 #include iostream. h class myclass private: int a, b, c; public: void fun() int a; a=10; this- ,a=5; b=6; this- c=7; cout “a
21、=“ a “,this- a=“ this- a endl; ; void main() myclass obj1; obj1.fun() 50 下列程序的运行结果是【 】。 #include iostream, h class Sample int a; public: Sample(int aa=0) a=aa; Sample() cout “Sample=“ a ; class Derived: public Sample int b; public: Derived(int aa=0, int bb=0): Sample(aa) b=bb; De rived() cout “Deriv
22、ed=“ b ; void main() Derived dl (9) 国家二级( C+)笔试模拟试卷 124答案与解析 1 【正确答案】 D 【试题解析】 算法 的时间复杂度和算法的空间复杂度从不同的角度来衡量算法的执行情况,它们之间没有内在联系。 2 【正确答案】 D 【试题解析】 数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式,一种数据结构可以根据需要采用不同的存储结构,常用的存储结构有顺序和链式结构。采用不同的存储结构,其处理的效率是不同的。 3 【正确答案】 C 【试题解析】 对线性表进行顺序查找时,从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到
23、两者相符,查找到所要找的元素为止。在最坏情况下,要查找的 元素是表的最后一个元素或查找失败,这两种情况都需要将这个元素与表中的所有元素进行比较,因此比较次数为 n。 4 【正确答案】 D 【试题解析】 所谓的交换类排序方法是指借助数据元素之间的互相交换进行排序的一种方法,包括冒泡排序和快速排序。冒泡排序是一种最简单的交换排序方法,它通过相邻元素的交换,逐步将线性表变成有序。 5 【正确答案】 A 【试题解析】 程序设计的风格主要强调程序的简单、清晰和可理解性,以便读者理解。程序滥用 GOTO语句将使程序流程无规律,可读性差;添加注释行有利于对程序的 理解,不应减少或取消,程序的长短要依据实际的
24、需要而定,并不是越短越好。 6 【正确答案】 C 【试题解析】 限制使用 GOTO 语句是结构化程序设计的原则和方法之一,但不是绝对不允许使用 GOTO 语句。其他 3项为结构化程序设计的原则。 7 【正确答案】 D 【试题解析】 面向对象设计方法与面向过程设计方法有本质的不同,其基本原理是,使用现实世界的概念抽象地思考问题从而自然地解决问题。其特点包括分类性、多态性、封装性、模块独立性、继承和多态性等。模块化是结构化程序设计的特点。 8 【正确答案 】 D 【试题解析】 在面向对象方法中,对象之间通过消息进行通信。消息中只包含传递者的要求,它告诉接受者需要做哪些处理,但并不指示接受者应该怎么
25、完成这些处理,接受者独立决定采用什么方式完成所需的处理。 9 【正确答案】 C 【试题解析】 对象的封装性是指从外面看只能看到对象的外部特性;而对象的内部,其处理能力的实行和内部状态对外是不可见的,是隐蔽的。 10 【正确答案】 A 【试题解析】 软件生命周期一般可以分为软件定义、软件开发及软件运行维护 3个阶段。软件交付并投入运行后,需要不 断地进行维护,并根据新提出的需求进行必要而且可能的扩展和删改。 11 【正确答案】 C 【试题解析】 选项 A)中,内联函数不是定义在另一个函数体内部的函数,而是将 incline放在函数定义中函数类型之前:函数体的最后一条语句可以是任意的语句,选项 B
26、)错误;编译器不会根据函数返回值的类型来区分重载形式,选项 D)错误。标准 C+要求在调用一个函数之前,必须先声明其原型,选项 C)正确。 12 【正确答案】 A 【试题解析】 C+在创建一个对象时,会调用类的构造函数。语句 MyClass a b(2),*p;创建了两个对象 a、 b和指针 p,在创建对象 a和 b 后会调用构造函数,而创建指针 p时,由于 p 本身不是对象,所以不调用类的构造函数。 13 【正确答案】 A 【试题解析】 语句 Test*p=new Test;会调用类的构造函数 Test() n+=2;,使 n 的值由原来的 1变为 3,然后 delete p 调用类的析构函
27、数 Test() n-=3;,因为 n是 static型变量,所以会在 3的基础上减 3,使得输出结果为 0。 14 【正确答案】 C 【试题解析】 此题考查的是运算符的有 关概念。运算符重载是针对 C+原有运算符进行的,不能通过重载创造新的运算符;除了 “.”、 “.*”、 “- *”、 “:”、 “?:”这 5个运算符外,其他运算符都可以重载;在类型转换符函数的定义中不需要声明返回类型:运算符函数的返回值类型可以声明为基本数据类型。 15 【正确答案】 D 【试题解析】 c+语言中析构函数为符号 “ ”加类名,且析构函数没有返回值和参数,故前不加 void关键字。所以正确的形式应该是 My
28、Class()。 16 【正确答案】 A 【试题解析】 拷贝构造函数是一个特殊 的构造函数,它用一个已知的对象初始化一个正在创建的同类对象,它不能指定函数返回类型;只有一个参数,是同类的某个对象名的引用。每一个类中都必须有一个拷贝构造函数,如果类中未声明,编译器会自动生成一个公有的拷贝构造函数。 17 【正确答案】 A 【试题解析】 选项 A)中,重载函数中是允许使用默认参数的;为了使重载函数有意义,不要使用重载函数来描述毫不相干的函数;重载函数中编译是根据参数表进行选择的,包括参数的个数和类型。 18 【正确答案】 C 【试题解析】 此题考查的是 “+”运算符的重载。 重载后的 “+”运算符
29、的功能是对参数的两部分分别进行加法运算,然后返回复数值。所以 x+=y使得对象 x(1,2)与y(2,3)的 re和 im分别相加,最后输出结果 (3,5)。 19 【正确答案】 C 【试题解析】 所谓函数重载是指同一函数名可以对应多个函数实现。进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。但函数的返回类型不能作为判断重载的依据。 20 【正确答案】 A 【试题解析】 本题考查的是模板的特点。模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每 个对象的类型。 21 【正确答案】 D 【试题解析】 此题考查的是无格式输入输出流对象中的 getline()函数。
30、该函数的功能是允许从输入流中读取多个字符,并且允许指定输入终止字符 (默认是换行符 ),在读取完成后,从读取的内容中删除该终止字符。 22 【正确答案】 B 【试题解析】 此题考查的是标识符。标识符是由数字、字母以及下划线构成,其第一个字符必须是字母或下划线,中间不能有空格;标识符的长度是任意的,但由于编译系统的限制一般不超过 31个字符;标识符中的大小写字母是不同的;定义标识符时 不能采用系统的保留字。符合这些要求的只有选项 B)。 23 【正确答案】 A 【试题解析】 从循环语句中可以看出,是在。到 4的循环中输出数组 a中的前 5个元素,输出的值为 *(p+i),即为指针 p向后移动指向
31、的元素。所以初始化要将指针 p 指向数组 a,即 int*p=a;。 24 【正确答案】 A 【试题解析】 此题考查的是 do.while 语句和 while语句的使用。题目中do.while语句循环了 4次, while语句循环了 20次,故最后输出字符 “ ”4个,字符 “*”20个。 25 【正 确答案】 C 【试题解析】 “p=s;”语句将指针 p指向数组 s。而数组为二维数组,下标标识由0开始,所以第二个元素是下标为 0行的 2列元素,即 p02。 26 【正确答案】 C 【试题解析】 用一个指针变量 p指向字符数组 a,在 while循环中,当不指向数组尾时,将小写字母转换为大写字
32、母,然后将其输出。 27 【正确答案】 C 【试题解析】 此题考查的是函数的调用和函数参数值的传递。选项 C)中函数 f3的调用采用按值传递的方式,函数中对形参的修改不能改变实参的值,并且 f3函数没有返 回值,所以 f3 对调用它的函数没有起到任何的作用。选项 A)采用的是引用传递方式;选项 B)中 f2有返回值;选项 D)中函数 f4是指针调用并且函数有返回值。 28 【正确答案】 D 【试题解析】 此题考查的是运算符的重载。 c+语言规定,不能作为非成员函数重载的运算符有 =、 、 ()、 -以及所有的类型转换运算符,故选项 A)错误;运算符重载对返回值类型没有限制,故选项 B)错误;
33、C+并不强制要求非成员重载的运算符一定是某个类的友元,所以选项 C)错误:题目中重载的 “+”运算符的两个参数都是 int类型,而 C+已经提供了求两个血型数据之和的运算符 +,编译器无法区分应该调用哪一个,所以应该选择选项 D)。 29 【正确答案】 C 【试题解析】 由主函数入手,定义了类 TestClass 的对象 s1(2,3),当类对象进入其作用域时调用构造函数,构造函数应该是调用具有参数的 “TestClass(int a,int b)x=a;y=b;)”。然后引用成员函数 disp(),则输出为 “cout ”x=“ x ”,y=“ y endl;”。 30 【正确答案】 D 【
34、试题解析】 fun 函数中的 x参 数为整型指针变量。调用 fun 函数, ”符合条件将调用 My String的复制构造函数,但类 My String未定义复制构造函数,所以会出错。 33 【正确答案】 C 【试题解析】 此题考查的是虚函数的应用。 C+语言中,在创建一个对象时,会自动调用类的构造函数,所以语句 “Demo a,d;”将调用函数 Demo()两次。当一个对象作为实参传递给函数时,为初始化形参,要调用复 制构造函数:在函数返回一个对象时调用复制构造函数。所以语句 “d=userCode(a);”调用复制构造函数 3次。 34 【正确答案】 A 【试题解析】 此题考查的是 thi
35、s 指针的使用。类的每一个对象成员函数都有一个隐含的常量指针,即 this 指针。本题选项 A)中,若 func()是该类的友元函数, this指针没有指向同一个对象的地址,语句 this- ff=0;与 ff=0;的效果就不同了。 35 【正确答案】 B 【试题解析】 此题考查的是派生类中的访问权限。继承方式包括公有继承、保护继承和私 有继承。私有继承时基类中的 protected 成员在派生类中变成了 private成员,所以选项 B)叙述错误。 36 【正确答案】 线性结构 【试题解析】 循环链表是线性表的一种存储结构,因此,循环链表属于线性结构。 37 【正确答案】 面向对象 【试题解
36、析】 程序设计分为面向过程程序设计和面向对象程序设计,具有继承性特点的程序设计称为面向对象程序设计。 38 【正确答案】 交 【试题解析】 为了在两个关系中提取所有相同的元组,则在交与并这两种关系运算中,应使用交运算。 39 【正确答案】 时间 【试题解析】 在算法执行过程中所需要的基本运算次数称为算法的时间复杂度。 40 【正确答案】 非格式化 【试题解析】 数据模型分为格式化模型和非格式化模型,关系模型属于非格式化模型。 41 【正确答案】 C 【试题解析】 本题考察强制类型转化, char()在这里作为一个强制类型转化函数存在,将整数转化为字符。 42 【正确答案】 比较两个整数 a和
37、b的大小,若 a b则返回 1,若 a等于 b,则返回 0,否则返回 -1。 43 【正确答案】 a 0&b 0&c 0&a+b c&b+c a&c+a b 【试题解析】 本题考察考生将实际问题转换为逻辑表达式的能力。根据三角形的基本定理 “两边和大于第三边 ”可穷举出其表达式。 44 【正确答案】 i 3 【试题解析】 本题考察考生的 for语句和 if 语句综合使用能力。本题的情况适用于希望在满足指定值时停止循环的情况。 45 【正确答案】 不能是表达式 【试题解析】 引用是变量的别名,其实质是变量的地址。 return 在返回值时,如果其后为表达式,则系统为该表达式生成一个临时变量用于存
38、放该表达式的 结果,函数执行完毕之后该变量被系统回收,因此,返回的该变量的地址对调用函数来说已经没有意义了。 46 【正确答案】 防止对类对象自己给自己赋值 【试题解析】 防止对象给自己赋值,这是一种自毁行为,这种行为如果不加以判断,可能造成无意识的破坏。 47 【正确答案】 return(strcmp(a,b) 0? a:b); 【试题解析】 由于对于两个变量的比较来说,字符间的比较不同于整型或浮点剩变量那样可以直接比较,而是要采用专用函数进行,因此不能采用同一个函数模板,所以本题采用的就是单独写成 一个非模板函数。 48 【正确答案】 修改本对象的值 【试题解析】 本题巧妙的使用 this 指针来完成类的不同实例进行的修改自身数据成员的操作。 49 【正确答案】 a=10, this- a=5 【试题解析】 本题考察在类的成员函数定义中,如果出现类的数据成员和成员函数的局部变量同名的情况下,如何正确引用合适的变量或数据成员。本题巧妙的采用了 this 指针完成这种标识。 50 【正确答案】 Derived=0 Sample=9 【试题解析】 本题考察派生类和基类的构造函数,析构函 数的执行顺序。