1、国家二级( C+)笔试模拟试卷 135及答案与解析 1 下面叙述正确的是 ( A)算法的执行效率与数据的存储结构无关 ( B)算法的空间复杂度是指算法程序中指令 (或语句 )的条数 ( C)算法的有穷性是指算法必须能在执行有限个步骤之后终止 ( D)以上三种描述都不对 2 以下数据结构中不属于线性数据结构的是 ( A)队列 ( B)线性表 ( C)二叉树 ( D)栈 3 下列关于栈的描述正确的是 ( A)在栈中只能插入元素而不能删除元素 ( B)在栈中只能删除元素而不能插入元素 ( C)栈是特殊的 线性表,只能在一端插入或删除元素 ( D)栈是特殊的线性表,只能在一端插入元素,而在另一端删除元
2、素 4 下列叙述中正确的是 ( A)在模块化程序设计中,一个模块应尽量多的包括与其他模块联系的信息 ( B)在自顶向下、逐步细化的设计过程中,首先应设计解决问题的每一个细节 ( C)在模块化程序设计中,一个模块内部的控制结构也要符合结构化原则 ( D)在程序设计过程中,不能同时采用结构化程序设计方法与模块化程序设计方法 5 下列描述中正确的是 ( A)软件工程只是解决软件项目的管理问题 ( B)软件工程主 要解决软件产品的生产率问题 ( C)软件工程的主要思想是强调在软件开发过程中需要应用工程化原则 ( D)软件工程只是解决软件开发中的技术问题 6 在软件设计中,不属于过程设计工具的是 ( A
3、) PDL(过程设计语言 ) ( B) PAD图 ( C) N-S图 ( D) DFD图 7 在软件开发中,下面任务不属于设计阶段的是 ( A)数据结构设计 ( B)给出系统模块结构 ( C)定义模块算法 ( D)定义需求并建立系统模型 8 下列描述中正确的是 ( A)程序就是软件 ( B)软件开发不受计算机系统的限制 ( C)软件既是逻辑实体,又是物理实体 ( D)软件是程序、数据与相关文档的集合 9 用树形结构来表示实体之间联系的模型称为 ( A)关系模型 ( B)层次模型 ( C)网状模型 ( D)数据模型 10 下列关于 E-R图的描述中正确的是 ( A) E-R图只能表示实体之间的联
4、系 ( B) E-R图只能表示实体和实体之间的联系 ( C) E-R图只能表示实体和属性 ( D) E-R图能表示实体、属性和实体之间的联系 11 下列关于 C+函数的叙述中,正确的是 ( A)每个函数至少要具有一个参数 ( B) 每个函数都必须返回一个值 ( C)函数在被调用之前必须先声明 ( D)函数不能自己调用自己 12 以下非法的赋值表达式是 ( A) n (i 2, +i); ( B) j+; ( C) +(i+1); ( D) x j 0; 13 下列关于虚函数的描述中,正确的是 ( A)虚函数是一个 static类型的成员函数 ( B)虚函数是一个非成员函数 ( C)基类中采用
5、virtual说明一个虚函数后,派生类中定义相同原型的函数时可不必加 virtual说明 ( D)派生类中的虚函数与基类中相同原型的虚函数具有不同 的参数个数或类型 14 下面有关重载函数的描述中正确的是 ( A)重载函数必须具有不同的返回值类型 ( B)重载函数形参个数必须不同 ( C)重载函数必须具有不同的形参列表 ( D)重载函数名可以不同 15 下列对模板的声明中正确的是 ( A) template T ( B) template class T1, T2 ( C) template class T1,class T2 ( D) template class T1; class T2
6、16 对于语句 cin x;中的各个组成部分,下列叙 述中错误的是 ( A) “cin”是一个输出流对象 ( B) “; ”的作用是表示语句结束 ( C) “x”是一个变量 ( D) “ ”称作提取运算符 17 下列字符串中,正确的 C+标识符是 ( A) foo-1 ( B) 2b ( C) new ( D) _256 18 已知程序中已经定义了函数 test,其原型是 int test(int, int, int);,则下列重载形式中正确的是 ( A) char test(int,int,int); ( B) double test(int,int,double); ( C) int te
7、st(int,int,int=0); ( D) float test(int,int,float=3.5F); 19 执行语句序列 int i=0; while(i 25)i+ 3; cout i; 输出结果是 ( A) 24 ( B) 25 ( C) 27 ( D) 28 20 已知函数 f的原型是: void f(int*a,long ; class Derived:public Base public: void fun() _/显式调用基类的 fun函数 cout “Derived:fun“ end1; ; 42 有如下程序 : #include iostream using name
8、space std; class Con char ID; public: Con():ID(A) cout 1; Con(char ID) :ID(ID) cout 2; Con(Con char get1D()constreturn ID; ; void show(Con c) cout c.getID(); int main() Con c1; show(c1); Con c2(B); show(c2); return 0; 执行上面程序的输出是 _。 43 将 x+y*z中的 “+”用成员函数重载, “*”用友元函数重载应写为 _。 44 执行下列程序后,输出 “*”号的个数是 _。
9、#include iostream.h main() int i,j; for(i=1;i 5;i+) for(j=2;j i;j+) cout *; 45 指针变量所保存的不是一般的数据值,而是程序中另一个对象的 _。 46 阅读下面程序: #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 main() char a,b; a=x;b=y; fun1(a,b);cout a b; a=x;b=y; fun2(a,b);cout a b; 则该程序
10、的输出为 _。 47 己知下列程序的输出结果是 42,请将横线处缺失的部分补充完整。 #include iostream using namespace std; class TestClass int value; public: TestClass():value(0); void setValue(int value) _=value;/给 TestClass的数据成员 value赋值 void print()cout value; ; int main() TestClass f; f.setValue(42); f.print(); return 0; 48 若下列程序运行时输 出结
11、果为 1,A,10.1 2,B,3.5 请将程序补充完整。 #include iostream using namespace std; int main() void test(int,char,double_); test(1,A,10.1); test(2,B); return 0; void test(int a,char b,double c) cout a , b , c end1; 49 非成员函数应声明为类的 _函数才能访问这个类的 private成员。 50 下列类定义中包含了构造函数和拷贝构造函数的原型声明,请在横线处填写正确的内容,使拷贝构造函数的声明完整。 class
12、myClass private: int data; public: myClass(int value);/构造函数 myClass(const_another Object);/拷贝构造函数 国家二级( C+)笔试模拟试卷 135答案与解析 1 【正确答案】 C 【试题解析】 A选项错误,因为算法的执行效率与算法执行过程中所需基本运算的执行次数有关; B 选项错误,原因是算法的空间复杂度是指执行这个算法所需要的内存空间; C选项正确,故 D选项不正确。 2 【正确答案】 C 【试题解析】 所谓的线性结构是指:如果一个非空的数据结构满足下列两个条件,即 有且只有一个根结点; 每一个结点最多有
13、一个前驱,也最多有一个后继。同时满足两个 条件的有队列、线性表和栈,而二叉树的结点可能存在两个后继,所以不是线性结构。 3 【正确答案】 C 【试题解析】 栈是一种特殊的线性表,其插入与删除运算都只在线性表的一端进行。 由此可见,选项 A、选项 B和选项 D错误,正确答案是选项 C。 4 【正确答案】 C 【试题解析】 选项 A错误,在模块化设计中,要求将一个大程序按人们能理解的大小规模进行分解,使每个模块都能易于理解,各模块的功能尽量单一,各模块之间的联系尽量的少。选项 B 错误,自顶向下、逐步细化的设计过程,土要包括两个方面:将复杂问题 的解法分解和细化成由若干模块组成的层次结构:将一个模
14、块的功能逐步分解细化为一系列的处理步骤,直到某种程序设计语言的语句或某种机器指令。即在自顶向下、逐步细化的设计过程中,是按照先全局后局部、先整体后细节、先抽象后具体的方法设计程序。选项 D错误,由于在模块化程序设计中,一个模块内部的控制结构也要符合结构化原则,所以,在程序设计过程中,结构化程序设计方法与模块化程序设计方法是要同时采用的。选项 C为正确答案。 5 【正确答案】 C 【试题解析】 软件工程学是研究软件开发和维护的普遍原理与技术的一门工程学科。所谓软件工程是指,采用工程的概念、原理、技术和方法指导软件的开发与维护。软件工程学的主要研究对象包括软件开发与维护的技术、方法、工具和管理等方
15、面。由此可见,选项 A、 B和 D的说法均不正确,选项 C正确。 6 【正确答案】 D 【试题解析】 数据流图 DFD,是结构化分析方法最主要的一种图形工具,不属于过程设计工具。 7 【正确答案】 D 【试题解析】 数据结构设计、给出系统模块结构以及定义模块算法都属于设计阶段,而定义需求并建立系统模型属于分析阶段。 8 【正确答案】 D 【试题 解析】 计算机软件是计算机系统中与硬件相互依存的另一部分,包括程序、数据及相关文档的完整集合。选项 D的描述正确。 9 【正确答案】 B 【试题解析】 在数据库系统中,由于采用的数据模型不同,相应的数据库管理系统 (DBMS)也不同。目前常用的数据模型
16、有 3种:层次模型、网状模型和关系模型。在层次模型中,实体之间的联系是用树结构来表示的,其中实体集 (记录型 )是树中的结点,而树中各结点之间的连线表示它们之间的关系。所以,本题的正确答案是 B。 10 【正确答案】 D 【试题解析】 E-R图中,用 3种图框分别表示实体、属性和实体之间的联系:矩形框表示实体,框内标明实体名;椭圆状框表示实体的属性,框内标明属性名;菱形框表示实体间的联系,框内标明联系名;实体与其属性之间以无向边连接,菱形框与相关实体之间也用无向边连接,并在无向边旁标明联系的类型。综上所述,用 E-R图不仅可以简单明了地描述实体及其相互之间的联系,还可以方便地描述多个实体集之间
17、的联系和一个实体集内部实体之间的联系。选项 A、 B、 C的说法都错误,本题的正确答案是 D。 11 【正确答案】 C 【试题解析】 本题考核函数的声明和调用。定义 一个函数就是为了以后的调用,但如果函数定义在后面而调用在前,就会产生编译错误。为此,必须将函数定义在前或在调用前进行 “函数的说明 ”。函数说明消除了函数定义的位置影响。 C选项的描述是正确的。函数可以没有参数,可以没有返回值。递归函数就是自己调用自己。所以 A、 B 和 D选项的描述都是错误的。 12 【正确答案】 C 【试题解析】 对于任何一种赋值运算,其赋值号或复合赋值号左边必须是一个左值。左值是指具有对应的可由用户访问的存
18、储单元,并且能够由用户改变其值的量。而在 C选项中赋值号对应的是表达式 “i+1”,不 是一个左值,因此是非法的赋值表达式。 13 【正确答案】 C 【试题解析】 本题考核对虚函数的了解。在成员函数声明的前面加上 virtual 关键字修饰,即把该函数声明为虚函数。虚函数可以是另一个类的友元函数,但不是静态成员函数。所以 A、 B 选项的描述都是错误。在派生类中可以重新定义从基类继承下来的虚函数,在派生类中重定义虚函数时,函数名、形参表和返回值类型必须保持不变,所以 D选项是错误的。 14 【正确答案】 C 【试题解析】 所谓函数重载,是指同一个函数名可以对应多个函数的实现。进行函数重 载时,
19、要求同名函数在参数个数上不同,或者参数类型上不同。即重载函数具有不同的形参列表。 15 【正确答案】 C 【试题解析】 本题考核模板的定义。模板定义的类型参数表中包含一个或多个由逗号分隔的类型参数项,每一项由关键字 class 后跟一个用户命名的标识符,此标识符为类型参数,它不是一种数据类型,但可以同一般数据类型一样使用。在使用类模板时,必须将其实例化,即用实际的数据类型代替它。 16 【正确答案】 A 【试题解析】 本题考核 C+的输入流。 cin是一个输入流对象,所以 A选项的叙述 是错误的。 17 【正确答案】 D 【试题解析】 本题考核 C+语言词汇中的标识符的定义。标识符不是一个随意
20、的字符序列,定义标识符时一般应注意如下几点:第一个字符必须是字母或下划线,中间不能有空格;在第一个字母后,可以是任意字母、下划线和数字组成的字符序列;标识符的长度是任意的,但特定的编译系统能够识别的标识符长度是有限的。一般不要超过 31个字符;标识符中大小写字母是有区别的;用户定义标识符时,不要采用系统的保留字。 18 【正确答案】 B 【试题解析】 本题考核函数重载。所谓函数重载, 是指同一个函数名可以对应着多个函数的实现。每种实现对应着一个函数体,这些函数的名字相同,但是函数的参数的类型不同。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。不可以根据函数返回值类
21、型来重载函数。 A选项中定义只是函数的返回类型不同,不符合重载的条件, C选项也不符合。对于: D选项,形参列表中带有默认参数,如果原型的最后一个也带有默认参数,则会造成不知道该调用哪个函数的错误。 19 【正确答案】 C 【试题解析】 本题考核循环语句 while的使用。 while循环 8次后 i的 值变为24,符合循环条件进入循环体,经过自我赋值后 i的值变为 27,不符合循环条件,结束循环执行输出语句。 20 【正确答案】 C 【试题解析】 本题考核形式参数与实在参数,参数值的传递。第一个参数是地址传递,所以在调用时要传入实参的地址,第二个参数引用传递,调用时直接写上实参即可。 21
22、【正确答案】 B 【试题解析】 本题考核构造函数和析构函数。题中定义了类 MyClass的对象 a,对象数据 b,所以调用了构造函数 3次,输出 111。然后定义了对象指针 *p2,由于指针没有实例话,所以不会 调用构造函数。 22 【正确答案】 C 【试题解析】 本题考核友元函数的应用。程序中函数 square是类 sample的一个友元函数,它可以直接访问类 sample的所有成员。它的功能是返回类 sample的私有数据成员 x的平方。所以程序的执行结果是: 900。注意:友元函数不是类的成员函数,在类外定义时不要加上类名及其作用域运算符 (: )。友元函数的调用与一般函数的调用的方式和
23、原理一致,可以在程序的任何地方调用它。 23 【正确答案】 B 【试题解析】 本题考核动态存储分配。用于动态分配的内存 空间称为堆内存,它通常由操作系统进行管理且数量有限,其内存空间可以被初始化。若程序不断分配堆内存,则可能耗尽,在这种情况下,系统无法再对 new 提出的内存分配请求给予满足,此时 new 会返回空指针 NULL,表示动态存储分配操作失败,不会造成系统崩溃。在 C+程序中由 new分配的动态内存空间必须通过 delete运算符释放。 24 【正确答案】 B 【试题解析】 本题考核 C+的拷贝构造函数。调用拷贝构造函数的情况为:一个新对象被另一个已存在的同类型对象初始化;当一个对
24、象作为实参传递给函数时为初始化形 参,要调用拷贝构造函数。在函数值返回时形参的生命期结束时它的析构函数被调用;在函数返回一个对象时调用拷贝构造函数。符合以上条件的有:用对象 obj1来初始化 obj3; obj3作为实参被传入;函数 fun返回一个对象时;系统用返回值初始化一个匿名对象时调用了拷贝构造函数。总共调用 4次。 25 【正确答案】 C 【试题解析】 本题考核函数模板的使用。对于 C选项,编译系统从 3获得的信息是 “T对应于 int”,从 5.5处获得的信息是 “T对应于 double”,二者相互矛盾,在编译时会产生错误。对于 D选项中紧跟在 函数名后的 int就是模板实参表,通过
25、它通知编译系统在调用过程中, double型的参数 5 5将被自动换成 int型。 26 【正确答案】 B 【试题解析】 本题考核格式控制数据的输入输出。函数 setfill(char c)用于设置填充字符,在输出数据时,如果数据宽度小于设置的宽度,则空闲位置要用填充字符填满,设置的填充符一直有效,直到再次设置填充字符为止,如题中调用函数setfill(*)将填充字符设置为 *,后又调用函数 setfill(#)将填充字符设置为 #。函数 setw(int n)用于设置输入输出宽度,宽度设置的效果只对一次输入或输出有效,在完成一次数据的输出或输入后,宽度设置自动恢复为 0,如题中语句以宽度 1
26、0输出数据 “123”后,字符串 “OK”的输出宽度就自动恢复为 0了。而且题中输出的对齐方式为在输出宽度内左对齐。所以最终的输出为 123#OK。 27 【正确答案】 D 【试题解析】 本题考核类的构造函数。构造函数是类的一个特殊成员函数,它与类同名,并且没有返回值。所以 A、 B 选项都不符合要求, C选项中函数 AA定义为常函数,它不能更新对象的数据成员,也不符合 要求。 28 【正确答案】 A 【试题解析】 本题考核 this 指针的使用。类的每一个成员函数都有一个隐含定义的常量指针,称为 this指针。它是成员函数所属对象的指针,它指向类对象的地址。若 func()是该类的友元函数,
27、 this指针就没有指向同一个对象的地址,语句 this- ff=0;与语句 ff=0;的效果就不同了。静态成员函数没有 this指针。因为类只有一个静态成员函数实例,所以使用 this指针没有什么意义。在静态成员函数中使用 this 指针会引起编译错误。 29 【正确答案】 C 【试 题解析】 本题考核派生类的定义和访问权限。本题涉及多层次的继承关系。类 B 是类 A的派生类,类 C又是类 B的派生类。类 C中的构造函数调用了类 B的构造函数来初始化类 B 的私有数据成员,而类 B的构造函数又调用了类 A的构造函数来初始化类 A的私有数据成员。由此可知,程序最后的输出为 3,4。 30 【正
28、确答案】 C 【试题解析】 本题考核模板的定义。模板定义的类型参数表中包含一个或多个由逗号分隔的类型参数项,每一项由关键字 class 后跟一个用户命名的标识符,此标识符为类型参数,它不是一种数据类型,但可以同一般数 据类型一样使用。在使用类模板时,必须将其实例化,即用实际的数据类型代替它。 31 【正确答案】 D 【试题解析】 本题考核虚基类的声明。 C+中,虚基类说明格式如下: class类名 : virtual继承方式基类名。其中, virtual是虚基类的关键词。虚基类的说明是用在定义派生类时,写在派生类名的后面。 32 【正确答案】 A 【试题解析】 本题考核派生类的定义和应用。本程
29、序设计了一个点类 Point,包含了横、纵两个坐标数据 x和 y,由它派生出了圆类 Circle,并加入了新的 数据成员,即一个半径 r和一个求圆面积的函数成员 area。在主函数 main 中,首先定义了一个圆 Circle类的对象 c1,并通过它的构造函数初始化其数据成员。由此可知,其半径 r的值为 10,所以其面积为 PI*10*10=314,即对象 c1 的函数成员area的返回值为 314。 33 【正确答案】 A 【试题解析】 本题考核模板的概念。 C+中,模板形参具有三种形式:(1)typename参数名, (2)class参数名, (3)类型修饰符参数名,前两种形式是等价的,在
30、声明模板参数时,关键字 typename和 class 可以互换。但是在定义类的程序中,关键字 class 代表的含义是类,此时不能用 typename代替。 34 【正确答案】 C 【试题解析】 本题考核文件 I/O 操作。 C+中可以在定义文件流对象的同时打开文件,也可以在定义文件流对象以后用 open函数打开文件。可以通过构造函数或open 函数的第 2个参数,确定文件的打开模式。根据以上知识点可知关于题中语句的描述中,只有 C选项是正确的。 35 【正确答案】 C 【试题解析】 本题考核派生类的构造函数。在 C+中,构造函 数不能被继承,因此,派生类的构造函数必须通过调用基类的构造函数
31、来初始化基类子对象。所以,在定义派生类的构造函数时,除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含对子对象初始化的构造函数。 36 【正确答案】 时间 【试题解析】 算法的复杂度主要指时间复杂度和空间复杂度。所谓算法的时间复杂度,是指执行算法所需要的计算工作量;算法的空间复杂度,一般是指执行这个算法所需要的内存空间。 37 【正确答案】 空间 【试题解析 】 算法的复杂度主要包括时间复杂度和空间复杂度。所谓算法的时间复杂度,是指执行算法所需要的计算工作量。一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。 38
32、 【正确答案】 驱动模块 【试题解析】 由于模块不是一个独立的程序,不能单独运行,因此,在进行模块测试时,还应为每个被测试的模块另外设计两类模块:驱动模块和承接模块。其中驱动模块的作用是将测试数据传送给被测试的模块,并显示被测试模块所产生的结果;承接模块的作用是模拟被测试模块的下层模块。通常,承接模块有多个。 39 【正确答案】 一对多 【试题解析】 实体集 “项目主管 ”与实体集 “项目 “的联系属于一对多的联系。 40 【正确答案】 一对多 【试题解析】 实体之间的联系可以归结为一对一、一对多与多对多。如果一个学校有许多学生,而一个学生只归属于一个学校,则实体集学校与实体集学生之间的联系属
33、于一对多的联系。 41 【正确答案】 Base:fun(); 【试题解析】 此题考查的是成员函数的调用。因为横线处的作用是调用基类的fun函数,又因为派生类中也有 fun()函数,所以必须对 fun()函数加以限定,即Base:fun();。 42 【正确答案】 13A23B 【试题解析】 Con c1定义 c1 对象,调用 Con 的无参数构造函数,输出 1, ID值变为 A,执行 show(c1)时会调用拷贝构造函数,将 c1 对象的值拷贝给 show()函数的形参,此时输出 3,然后在 show()中输出 c1 的 ID值 A, Con c2(B)定义 c2 对象,调用 Con(char
34、 ID) 构造函数,输出 2, c2 的 ID值为 B, show(c2)执行时先调用拷贝构造函数输出 3,然后输出 B。因此程序输出结果为 “13A23B”。 43 【正确 答案】 x.operator+(operator*(y,z) 【试题解析】 运算符重载为成员函数的形式:函数类型 operator运算符 (形参表 )函数体; ;运算符重载为友元函数的形式: friend函数类型 operator运算符(形参表 )函数体; 。一般来讲,单目运算符最好重载为成员函数,双目运算符最好重载为友元函数。运算符函数有两种调用形式,第一种是像一般函数那样用函数名调用,即 y.operator*(z)
35、或者 operator*(y,z);另一种是通过运算符构成表达式,即 y*z。 44 【 正确答案】 6 【试题解析】 外层 for循环 “for(i=1;i 5;i+)”是由 1到 4,一共是 4次循环。内层循环 “for(j=2;j =i;j+)”是 j初始等于 2,当 j小于等于 i那么 j就加 1。所以只有当 i等于 2时才进入内层循环,当 i等于 2时,内层循环进行一次,输出一个“*”,同理 i=3时,输出两个 “*”, i=4时,输出 3个 “*”,所以一共是 6个。 45 【正确答案】 内存地址 【试题解析】 指针变量指向的不是变量保存的数据值,而是变量的地址,所以指针变量保存的
36、是对象的内存地址。 46 【正确答案】 xyyx 【试题解析】 由程序 mm主函数入手,首先调用 fun1函数,输出结果然后调用 fun2函数,输出结果。在函数 fun1声明中出现的参数为形参,调用结束后,形参单元被释放,实参单元仍维持原值。也就是 fun1函数中的 “c=a;a=b;b=c;”交换结果并不能改变主函数中 a,b 实参的值, “a=x;b=y;”输出为 xy。函数 void fun2(char第二次调用少了一个实参,却要求输出 2,B,3.5,由此分析,应将 test()函数的第三个参数声明为默认参数。且默认为 3.5,才能达到要求的输出结果。故应填入 =3.5或者 c=3.5。 49 【正确答案】 友元 【试题解析】 此题考查的是友元函数。一个类的私有成员和保护成员,只能由其本身的成员来访问,不能被其他函数访问,但是如果要让类中的数据成员被其他函数访问,可以通过友元函数声明来分享类中的数据资源。 50 【正确答案】 myClass& 【试题解析】 此题考查的是复制构造函数。复制构造函数定义的一般格式如下:类名 :类名 (const类名 &引用对象名 )复制构造函数体 )。而在类中的声明部分可省去 “类名 :”。