1、国家二级( C+)笔试模拟试卷 186及答案与解析 1 算法的空间复杂度是指 ( ) ( A)算法程序的长度 ( B)算法程序中的指令条数 ( C)算法程序所占的存储空间 ( D)算法执行过程中所需要的存储空间 2 下列叙述中正确的是 ( )。 ( A)一个逻辑数据结构只能有一种存储结构 ( B)逻辑结构属于线性结构,存储结构属于非线性结构 ( C)一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率 ( D)一个逻辑数据结构可以有多种存储结构,且各种存储结构 影响数据处理的效率 3 下列关于类、对象、属性和方法的叙述中,错误的是 ( ) ( A)类是对一类相似对象的描述,这
2、些对象具有相同的属性和方法 ( B)属性用于描述对象的状态,方法用于表示对象的行为 ( C)基于同一个类产生的两个对象可以分别设置自己的属性值 ( D)通过执行不同对象的同名方法,其结果必然是相同的 4 在软件开发中,需求分析阶段产生的主要文档是 ( ) ( A)可行性分析报告 ( B)集成测试计划 ( C)概要设计说明书 ( D)软件需求规格说明书 5 关于 结构化程序设计原则和方法的描述错误的是 ( ) ( A)选用的结构只准许有一个入口和一个出口 ( B)复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现 ( C)不允许使用 GOTO语句 ( D)语言中所没有的控制结构,应该采用前后一致
3、的方法来模拟 6 已知一个有序线性表为 (13, 18, 24, 35, 47, 50, 62, 83, 90, 115, 134),当用二分法查找值为 90的元素时,查找成功的比较次数为 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 9 7 如果一个关系中,存在多 个属性 (或属性组 )都能用来唯一标识该关系的元组,且其任何一个子集都不具有这一特性。这些属性 (或属性组 )都被称为关系的 ( )。 ( A)连接码 ( B)主码 ( C)外码 ( D)候选码 8 设 R是一个 2元关系,有 3个元组, S是一个 3元关系,有 4个元组。如T=RS,则 T的元组为 ( )个。 (
4、 A) 6 ( B) 8 ( C) 12 ( D) 16 9 在数据库设计中,将 E-R图转换为关系模式的过程属于 ( )。 ( A)需求分析阶段 ( B)逻辑设计阶段 ( C)概念设计阶段 ( D)物 理设计阶段 10 有如下程序: #include iostream using namespace std; class A public: A()cout “A“; A()cout “ A“; ; class B:public A A*p; public: B()cout “B“;p=new A; B()cout “ B“;delete p; ; int main() B obj; retu
5、rn 0; 执行这个程序的输出结果是 ( )。 ( A) BAA A B A ( B) ABA B A A ( C) BAA B A A ( D) ABA A B A 11 若有以下程序: #include iostream using namespace std; class A public: A(int i,int j) a=i; b=j; void move(int x,int y) a+=x; b+=y; void show() cout a “,“ b endl; private: int a,b; ; class B:private A public: B(int i,int j
6、):A(i,j) void fun() move(3,5); void fl() A:show(); ; int main() B d(3,4); d.fun(); d.fl(); return 0; 程序执行后的输出结果是 ( )。 ( A) 3,4 ( B) 6,8 ( C) 6,9 ( D) 4,3 12 有如下程序: #include iostream using namespace std; class Test public: Test() n+=2; Test() n-=3; static int getNum()return n; private: static int n;
7、; 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 13 假定 MyClass为一个类,那么下列的函数说明中, ( )为该类的析构函数 ( A) void MyClass(); ( B) MyClass(int n); ( C) MyClass(); ( D) MyClass(); 14 下列情况中,不会调用拷贝构造函数的是 ( )。 ( A)用一个对象去初始化
8、同一类的另一个新对象时 ( B)将类的一个对象赋值给该类的另一个对象时 ( C)函数的形参是类的对象,调用函数进行形参和实参结合时 ( D)函数的返回值是类的对象,函数 执行返回调用时 15 下列有关拷贝构造函数的描述中错误的是 ( )。 ( A)拷贝构造函数是一种构造函数 ( B)拷贝构造函数与一般的构造函数一样,可以设置多个形参 ( C)每一个类中都必须有一个拷贝构造函数 ( D)拷贝构造函数的功能是用一个已知对象去初始化一个正在创建的对象 16 类 MyClass的定义如下,若要对 value赋值,则下面语句正确的是 ( )。 class MyClass public: MyClass(
9、) MyClass(int i)value=new int(i); int*value; ; ( A) MyClass my;my.value=10; ( B) MyClass my;*my.value=10; ( C) MyClass my;my.*value=10; ( D) MyClass my(10); 17 若有如下程序: #include iostream using namespace std; int s=0; class sample static int n; public: sample(int i) n=i; static void add() S+=n; ; int
10、sample:n=0; int main() sample a(2),b(5); sample:add(); cout s endl; return 0; 程序运行后的输出结果是 ( )。 ( A) 2 ( B) 5 ( C) 7 ( D) 3 18 下列运算符中不能在 C+中重载的是 ( ) ( A) ?: ( B) + ( C) - ( D) = 19 下列重载函数中,正确的是 ( )。 ( 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
11、 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) 20 有如下程序: #include iostream using namespace std; class sample private: int x,y; public: sample(int i,int j) x=i; y=j; void disp() cout “disp1“ endl; void disp()const cout “disp2“endl; ; int main
12、() const sample a(1,2); a.disp(); return 0; 该程序运行后的输出结果是 ( )。 ( A) disp1 ( B) disp2 ( C) disp1 disp2 ( D)程序编译时出错 21 有如下类的定义,横线处的语句是 ( )。 class TestClass _ int x,y; public: TestClass(int a=0,int b=0) X=a: y=b; static void change() y-=10; y-=10; ; ( A) public ( B) private ( C) static ( D) protected 22
13、 有如下程序: #include iost earn using namespace std; class TestClass protected: TestClass()cout x; TestClass(char C) coutc; ; class TestClass1:public TestClass public: TestClass1(char C) Cout c;) ; int main() TestClass1 d1(y); return 0; 执行这个程序,屏幕上将显示输出 ( )。 ( A) y ( B) yx ( C) xy ( D) yy 23 下面是关于派生类声明的开始
14、部分,其中正确的是 ( )。 ( A) class virtual B:public A ( B) virtual class B:public A ( C) class B:public A virtual ( D) class B:virtual public A 24 在函数中,可以用 auto、 extern、 register和 static这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是 ( )。 ( A) auto ( B) extern ( C) register ( D) static 25 若有以下程序: #include iostream
15、using namespace std; class TestClass public: void who()cout “TestClass“ endl; ; class TestClass1:public TestClass public: void who()cout “TestClass1“ endl; ; int main() TestClass *p; TestClass1 obj1; P= P- who(); return 0; 则该程序运行后的输出结果是 ( )。 ( A) TestClass1 ( B) TestClass ( C) 0 ( D)无输出 26 下列有关继承和派生
16、的叙述中,正确的是 ( )。 ( A)如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员 ( B)派生类的成员函数可以访问基类的所有成员 ( C)基类对象可以赋值给派生类对象 ( D)如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类 27 下面叙述错误的是 ( )。 ( A)派生类可以使用 private派生 ( B)对基类成员的访问必须是无二义性的 ( C)基类成员的访问能力在派生类中维持不 变 ( D)赋值兼容规则也适用于多继承的组合 28 下列程序的输出结果为 2,横线处应添加语句 ( )。 #include iostream using namespace
17、std; public: _void fun()cout 1; ; class TestClass2:public TestClass1 public:void fun()cout 2;) ; int main() TestClass1 *p=new TestClass2; p- fun(); delete p; Teturn 0; ( A) public ( B) private ( C) virtual ( D) protected 29 要使程序执行后的输出结果为 ABCD,应在横线处添加语句 ( )。 #includeiostream using namespace std; publ
18、ic:A()cout A; ; class B=_ public:B()cout B; ; class C:virtual public A public:C()coutC; ; class D:public B,public C public:D()cout D; ; void main()D obj; ( A) public A ( B) private A ( C) protected A ( D) virtual public A 30 下面的描述中,正确的是 ( )。 ( A) virtual可以用来声明虚函数 ( B)含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类 ( C)
19、即使基类的构造函数没有参数,派生类也必须建立构造函数 ( D)静态数据成员可以通过成员初始化列表来初始化 31 若要把函数 void fun()定义为 TestClass的友元函数,则应该在类 TestClass的定义中加入的语句是 ( ) ( A) void friend fun() ( B) friend fun() ( C) friend void fun() ( D) TestClass void fun() 32 已知递归函数 fun的定义如下: int fun(int n) if(n =1)return1;/递归结束情况 else return n*fun(n-2);/递归 则函数
20、调用语句 fun(5)的返回值是 ( )。 ( A) 5 ( B) 12 ( C) 15 ( D) 30 33 字面常量 42、 4.2、 42L的数据类型分别是 ( ) ( A) long,double,int ( B) long,float,int ( C) int,double,long ( D) int,float,long 34 下列有关内联函数的叙述中,正确的是 ( )。 ( A) 内联函数在调用时发生控制转移 ( B)内联函数必须通过关键字 inline来定义 ( C)内联函数是通过编译器来实现的 ( D)内联函数函数体的最后一条语句必须是 return语句 35 在算法的 4个
21、特性中,算法必须能在执行有限个步骤之后终止指的是算法的_特性。 36 栈中允许进行插入和删除的一端叫做 _。 37 在关系代数运算中, _操作会消去关系中的某些列并删去重复的元组。 38 Jackson方法是一种面向 _的结构化方法。 39 在关系模型中,二维表的行称为 _。 40 插入排序算法的主要思想是:每次从未排序序列中取出一个数据,插入已排序序列中的正确位置。 Insert类的成员函数 sort()实现了插入排序算法,请填 空。 class Insert public: Insert(int*b0,int n0):b(b0),n(n0);/参数 b0是某数组首地址, n是数组元素个数
22、void sort() /此函数假设已排序序列初始化状态只包含 b0,未排序序列初始为 b1bn -1 for(int i=1;i n;+i) int t=bi; int j; for(_;j 0;-j) if(t =bj-1) break; bj=bj-1; bj=t; ; 41 已有函数 fun(a,b),为了使函数指针变量 P指向函数 fun,则使用的赋值语句是_。 42 阅读下面程序: #include iostream.h void fun1(char a,char b) char c; c=a;a=b;b=c; void fun2(char c=a;a=b;b=c; void ma
23、in() char a,b; a=x;b=y; fun1(a,b);cout a b; a=x;b=y; fun2(a,b);cout a b; 则该程序的输出为 _。 43 已知 double var;是文件 1.CPP中的一个全局变量定义,若文件 2.CPP中的某个函数也需要访问,则在文件 2.CPP中 var应说明为 _。 44 下面是一个栈 类的模板,其中 push函数将元素 i压入栈顶, pop函数弹出栈顶元素。栈初始为空, top值为 0,栈顶元素在 stacktop-1中,在下面横线处填上适当语句,完成栈类模板的定义。 template class T class Tstack
24、enumsize=1000; T stacksize; int top; public: Tstack():top(0) void push(const T Tpop() if(top=0)exit(1);/栈空时终止运行 return_; 45 非成员函数只有在声明为类的 _时才能访问这个类的所有 private成员。 46 对基类数据成员的初始化必须派生类的构造函数中的 _处执行。 47 在下面的程序的横线处填上适当的语句,使该程序的输出为 12。 #include iostream.h using namespace std; class Base public: int a,b; Ba
25、se(int i)a=i; ; class Derived:public Base int a; public: Derived(int x):Base(x),b(x+1); void show() _;/输出基类数据成员 a的值 cout b endl; ; int main() Derived d(1); d.show(); return 0; 48 在下面函数的横线处填上适当的内容,使该函数能够利用递归方法求解字符串str的长度 (不得使用系统提供的字符串处理函数 )。 int GetLen(char*str) if(_) return 0; else return 1+GetLen(s
26、tr+1); 49 执行语句序列: int x=10, cout x . r endl; 输出结果为 _。 国家二级( C+)笔试模拟试卷 186答案与解析 1 【正确答案】 D 【试题解析】 一个算法的空间复杂度,一般是指执行这个算法所需的存储空间。一个算法所占用的存储空间包括算法程序所占用的空间、输入的初始数据所占用的存储空间及算法执行过程中所需要的额外空间。 2 【正确答案】 D 【试题解析】 数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式,一种数据结构可以根据需要采用不同的存储结构,常用的存储结构有顺序和链式结构。采用不同的存储结构,其处理的效率是不同的。 3 【正确答案
27、】 D 【试题解析】 对象根据所接受的消息而做出动作,同样的消息被不同的对象接受时可以导致完全不同的行为,该现象称为多态性,这种消息可以是同名的方法。 知识拓展 类是具有共同属性、共同方法的对象的集合。 4 【正确答案】 D 【试题解析】 软件的生命周期分为计划、开发和运行 3个时期。其中计划期包括问题定义和可行性研究。运行的任务是软件维护。开发期包括分析、设计和实施:分析即为需求分析。需求分析的最终结果是生成软件需要规格说明书,可以为用户、分析人员和设计人员之间 的交流提供方便。 5 【正确答案】 C 6 【正确答案】 B 7 【正确答案】 D 8 【正确答案】 C 【试题解析】 R为 n元
28、关系, S为 m元关系,分别有 p、 q两个元组。两个关系笛卡儿积后,新关系是一个 n+m元的关系,元组个数是 qp。 知识拓展 通俗而言,所谓 “元 ”就好像表格中有多少列, “元组 ”就好像表格中有多少行。 9 【正确答案】 B 10 【正确答案】 B 【试题解析】 此题考查的是类的构造函数和析构函数。派生类构造函数的执行顺序为:首先调用基类的构造函 数,调用顺序按它们被继承时说明的顺序;然后调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容。因此本题中,首先调用基类构造函数输出 A,然后调用子对象的构造函数输出 B, p=new A再调用类 A的构造函数输
29、出 A;析构函数的调用顺序和构造函数的调用顺序相反。 11 【正确答案】 C 12 【正确答案】 A 13 【正确答案】 D 14 【正确答案】 B 【试题解析】 拷贝构造函数是一个特殊的构造函数,它用一个已知的对象初始化一个正在创建的同类对象,它的一般格式 是:类名 :类名 (const类名 ”语句首先调用调用基类中的“TestClass()cout x;)”输出 x,然后调用 “TestClass1(char C) cout c;”输出 y,即答案为 “xy”。 23 【正确答案】 D 24 【正确答案】 A 【试题解析】 此题考查的是存储类型。 C+语言变量的存储类型分为如下几种类型:
30、auto函数内部的局部变量; static静态存储分配; extern全局变量; register变量存储在硬件寄存器中。 25 【正确答案】 B 26 【正确答案】 D 【试题解析】 如果派生类私有继承基类,不能访问基类中的私有成员,所以A)、 B)是错误的。派生类是对基类的具体化,所 以 C)错误的。如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类,即选择 D)。 27 【正确答案】 C 【试题解析】 在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公用成员直接作为派生类的公用成员。涉及如何确定基类的成员在派生类中的访问属性问题,不仅要考虑对基
31、类成员所声明的访问属性,还要考虑派生类所声明的对基类的继承方式,根据这两个因素共同决定基类成员在派生类中的访问属性。所以本题选择 C)。 28 【正确答案】 C 【试题解析】 由主函数 main入手,定义 TestClass1类的指针对象 p指向派生类Testclass2。因为基类和派生类中都有 fun函数,题目要求输出为 2,就是基类对象访问派生类中 fun函数。通过虚函数与指向基类对象的指针变量的配合使用,就能方便调用同名函数。所以这里将基类中的 fun函数声明为 virtual。并且当一个成员函数被声明为虚函数后,其派生类中的同名函数自动成为虚函数。 29 【正确答案】 D 【试题解析】
32、 由主函数 main入手,定义了类 D对象 obj。其中 D为类 B和 C的公有继承, A是 C的虚基类。题目中要求的输出 结果为 “ABCD”,依次为类 A,类 B,类 C,类 D中构造函数的输出语句。为了保证基类通过多条路径被派生类继承时,即保证 A只被继承一次,输出一个 A,所以不但需要声明 A为 C的虚基类,同样也要声明 A为 B的虚基类。 30 【正确答案】 A 【试题解析】 在基类中用 virtual声明成员函数为虚函数,所以 A是正确的。纯虚函数是在声明虚函数时被 “初始化 ”为 0的虚函数。纯虚函数是一种特殊的虚函数,它没有具体的实现。静态数据成员函数只能在类外进行初始化。 3
33、1 【正确答案】 C 32 【正确答案】 C 【试题解析】 递归函数 fun被定义为含有参数 int n,返同整型。其中 fun函数递归调用本身,当 n=1时, fun返回 1,如果大于 1那么执行 n*fun(n-2)。所以,当n等于 5时,执行 5*fun(3);当 3时继续调用 fun, 3*fun(1),即fun(5)=5*(3*fun(1),答案为 15。 33 【正确答案】 C 【试题解析】 此题考查的知识点是字面常量。对于整型字面常量,只要没有超过C+中整数所能表示的范围, C+将自动按整数来存储此数,也可以通过在整型字面常量后添加 u或 1来指定无符号 整数或长整数来存储;对于
34、实型字面常量, C+将自动按照双精度数来存储,也可以通过在实型字面常量后添加 f来指定按单精度数存储。 34 【正确答案】 C 【试题解析】 此题考查的是内联函数的概念。在调用时,内联函数会像宏函数一样的展开,将调用表达式用内联函数体来替换,所以它没有一般函数的参数压栈和退栈操作,所以选项 A) 错误;即使没有使用 inline说明,编译器也会将存类的说明部分定义的函数认定为内联函数,所以选项 B) 错误;内联函数只是比普通函数有更高的执行效率。 35 【正确答案】 有穷性 【试题解析】 算法的四个基本特性包括:可靠性、确定性、有穷性和拥有足够的情报,其中,算法的有穷性指的是算法必须在有限的时
35、间内完成,即算法必须在执行有限个步骤之后终止。 36 【正确答案】 栈顶 【试题解析】 栈是限定在表的一端进行插入和删除操作的线性表。在表中,允许插入和删除的一端叫做 “栈顶 ”,不允许插入和删除的一端叫做 “栈底 ”。 37 【正确答案】 投影 38 【正确答案】 数据结构 39 【正确答案】 关系的元组 【试题解析】 在关系型数据库中,用二维表来表示关系,二维表 的表名即关系名,二维表的行称为关系的元组,二维表的列称为关系的属性。 40 【正确答案】 j=i 【试题解析】 在函数 sort()中,外层 for循环中依次将数组 b中的值赋值给变量t,然后在内层循环中依次与已经排序的数组元素进
36、行比较,并在符合条件的位置插入该元素。 “int t=bi;”语句可知数组中有 i个元素已经排序。因此,根据内层循环中的 j 0;-j语句,知道内层循环是将当前的第 i个元素与 j个元素进行比较,前面已知数组中有 i个元素已经排序,根据题干中的要求 “插入已排序序列中 ”,即 j=i。 41 【正确答案】 p=fun 【试题解析】 函数入口地址称为函数的指针。可以使用指针变量指向 fun函数,然后通过该指针变量调用此函数。赋值语句就是将函数 fun的入口地址赋值给指针变量 P,只需将函数名赋给 P,不能写成 “p=fun(a,b)”形式。函数名就代表了函数入口地址,即 p=fun。 42 【正
37、确答案】 xyyx 【试题解析】 由程序 main主函数入手,首先调用 fun1函数,输出结果。然后调用 fun2函数,输出结果。在函数 fun1声明中出现的参数为形参,调用结束后,形参单元被释放,实参 单元仍维持原值。也就是 fun1函数中的 “c=a;a=b;b=c;”交换结果并不能改变主函数中 a,b实参的值, “a=x;b=y;”输出为 xy。函数 void fun2(char&a,char&b)声明中的为实参的地址所以在函数中调用交换语句后,实参值改变,即输出为 yx。 43 【正确答案】 外部变量 44 【正确答案】 stack-top 或 stacktop-=1 或 stackt
38、op=top-1 【试题解析】 此题考查的是堆栈数据结构。分析题目,首先利用函数 void push(const T &i)将 i压入栈,然后 Tpop()将元素弹出,但由于在压入栈的时候,top值已经增加 1;要弹出元素,须使 top先减 1,才能把栈顶元素弹出。 45 【正确答案】 友元函数 【试题解析】 此题考查的是非成员函数对类的成员的访问权限,非成员函数只有在声明为类的友元函数才能访问这个类的所有 private成员,否则是不能访问类的私有成员的。 46 【正确答案】 成员初始化列表 47 【正确答案】 cout Base:a 【试题解析】 此题考查的是基类和派生类的构造函数 。派生
39、类构造函数的执行顺序为:首先调用基类的构造函数,调用顺序按它们被继承时说明的顺序;然后调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容。此题要求结果是输出 12,分析题目,首先调用基类的构造函数,然后是调用子对象的构造函数,横线处要求输出基类成员 a的值,填入 coutBase:a即可。 48 【正确答案】 *str=NULL 或 !*str 或 *str=0 或 sir0=0 或 str0=NULL 【试题解析】 此题考查的是递归函 数的定义。分析题目可以看出 GetLen的定义中缺少递归终止的条件,显然此函数递归终止的条件是读到了字符串的终止符0,此时的返回值为 0。 49 【正确答案】 10-10