1、国家二级( C+)笔试模拟试卷 240及答案与解析 1 在结构化程序设计中,模块划分的原则是 A) 各模块应包括尽量多的功能 B) 各模块的规模应尽量大 C) 各模块之间的联系应尽量紧密 D) 模块内具有高内聚度,模块间具有低耦合度 2 下列说法正确的是 ( A)一个关系可以有多个候选键 (码 ) ( B)一个关系只有一个候选键 (码 ) ( C)一个关系所有属性是候选键 (码 ) ( D)一个关系所有属性都不是候选键 (码 ) 3 下列叙述中正确的是 ( A)所有形态的二叉树都只能采用链式存储结构 ( B)循 环队列是队列的一种存储方式 ( C)栈只能采用顺序存储结构 ( D)循环队列与循环
2、链表都属于链式存储结构 4 常成员函数不能修改任何的数据成员 ( A) 3 ( B) 4 ( C) 5 ( D) 6 5 若采用孩子兄弟链表作为树的存储结构,则树的后序遍历应采用二叉树的 ( )。 ( A)前序遍历算法 ( B)层次遍历算法 ( C)后序遍历算法 ( D)中序遍历算法 6 C+源晚间中包含的输入 /输出头文件为 ( )。 ( A) stdio.h ( B) stdafx.h ( C) iostream.h ( D) stream.h 7 在软件测试设计中,软件测试的主要目的是 ( A)实验性运行软件 ( B)证明软件正确 ( C)找出软件中全部错误 ( D)发现软件错误而执行程
3、序 8 程序流程图中的箭头代表的是 ( )。 ( A)数据流 ( B)控制流 ( C)调用关系 ( D)组成关系 9 下列叙述中错误的是 ( A)二又树不是线性结构 ( B)线性表是非线性结构 ( C)线性链表是线性结构 ( D)栈与队列是线性结构 10 如果只想得到 1024个元素组成的序列中第 5个最小元素之前的部分 排序的序列,用 ( )方法最快。 ( A)冒泡排序 ( B)快速排序 ( C)简单选择排序 ( D)堆排序 11 执行语句: cout setfill(*) setw(10) setfill(#) left 123“OK“ endl;后将输出 ( A) 123*OK ( B)
4、 123#OK ( C) 123*OK* ( D) 123#OK# 12 下列程序的输出结果是 ( )。 #include iostream using namespace std; int main() char a=“Hello,Test“; char *p=a; while(*p) if(*p =a else cout *p; p+; return 0; ( A) hello,test ( B) Hello,Test ( C) HELLO,TEST ( D) hELLO,tEST 13 有如下程序: #include iostream using namespace std; class
5、 TestClass private; char c; public; TestClass (char n):c(n) TestClass () cout c; ; class TestClass1:public TestClass Private: char c; public: TestClass1(char n):TestClass (n+1),c(n) TestClass1() cout c; ; int main() TestClass1 obj(x); return 0; 执行上面的程序输出 ( )。 ( A) xy ( B) yx ( C) x ( D) y 14 一个类的友元函
6、数能够访问该类的 ( A)私有成员 ( B)保护成员 ( C)公用成员 ( D)所有成员 15 考虑函数原型 void test(int a, int b=7, char z=*),下面的函数调用中,属于不合法调用的是 ( )。 ( A) test(5); ( B) test(5, 8); ( C) test(6, #); ( D) test(0, 0, x); 16 有如下程序: #include iostream using namespace std; class MyClass public: MyClass()+count; MyClass()-count; static int g
7、etCount()return count; private: static int count; ; int MyClass:count=0; int main() MyCl ( A) 121 ( B) 232 ( C) 221 ( D) 122 17 能正确表示逻辑关系 :“a10或 a0”的 C语 言表达式是 ( A) a 10 or a 0 ( B) a 0 | a 10 ( C) a 10 while(+x) ( A) 9 ( B) 10 ( C) 11 ( D)无限 25 有如下语 句序列: int k=0; dOk+=5; cout $;) while(k 19); while(
8、k- 0)cout *;执行上面的语句序列输出字符 $和 *的个数分别是 ( )。 ( A) 4和 20 ( B) 5和 20 ( C) 4和 21 ( D) 5和 21 26 若有以下定义: char a: int b; float c; double d; 则表达式 a*b+d c的值的类型为 _。 ( A) float ( B) int ( C) char ( D) double 27 下列关于 C+函数的叙述中,正确的是 _ 。 ( A)每个函数至少要具有一个参数 ( B)每个函数都必须返回一个值 ( C)函数在被调用之前必须先声明 ( D)函数不能自己调用自己 28 以下关于 C+语
9、言类的说法中正确的是 ( )。 ( A) C+语言的默认访问权限是 private ( B) C+语言中的类定义,用户一定要自己定义一个构造函数用于实例化类 ( C) C+语言中的成员函数的实现部分一定要写在类定义外 ( D) C+语言中的类不能够嵌套定义 29 在派生类中重新定义虚函数时,除了 ( )方面,其他方面都必须与基类中相应的虚函数保持一致。 ( A)参数个数 ( B)参数类型 ( C)函数名称 ( D)函数体 30 在 int a=10, *p= sample add(sample s1,sample s2) this- n=s1.n+s2.n; return (*this); v
10、oid disp() cout “n=“ n end1; int main() sample s1(10),s2(5),s3; s3.add(s1,s2); s3.disp(); return 0; 程序运行后,输出的结果是 ( A) n=10 ( B) n=5 ( C) n=20 ( D) n=15 34 有如下程序: #include iostream using namespace std; int main() cout.fill(*); cout.width(5); cout scientific 315926535end1; return 0; 程序运行后,输出的结果是 ( A)
11、3.14E+02 ( B) 3.14E+02 ( C) *3.14e+002 ( D) 314.16 35 若 a, b, c1, c2, x, y均是整型变量,正确的 switch语句是 ( )。 ( A) switch(a+b) ( B) switch(a*a+b*b) case: y=a+b; break; case 3: case: y=a-b; break; case 1: y=a+b; break; case 3: y=b-a;break; ( C) switcha ( D) switch(a-b) casec1: y=a-b; break; default: y=a*b; bre
12、ak; casec2: x=a*b; break; case 3: case4: x=a+b; break; default:x=a+b; case 10: case 11: y=a-b; break; 36 数据库管理系统常见的数据模型有层次模型、网状模型和 _3种。 37 38 数据结构分为线性结构与非线性结构,带链的栈属于 _。 39 问题处理方案的正确而完整的描述称为【 】。 40 _是一种特殊的成员函数,它主要用来为对象分配内存空间,对类的数据成员进行初始化并执行对象的其他内部管理操作。 41 C+语言的基本控制结构为顺序结构、选择结构和 _。 42 C中封装性、继承性和 _是面向对
13、象思想的主要特征。 43 以下程序的输出结果是 _。 #include iostream.h unsigned fun(unsigned num) unsigned k 1; dok * num%10;num/ 10;while(num) ; return k; void main( ) unsigned n 26; cout fun(n) endl; 44 请将下列程序的横线处补充完整,使得输出结果为 bbaa #include iostream using namespace std; class A public: _cout “aa“; ; class B:public A publi
14、c: B()cout “bb“; ; int main() B*p=new 45 C+中通常和一个运算符连用,构成一个运算符函数名的 C+关键字为_。 46 当派生类中有和基类相同名字的成员时,派生类的同名成员会【 】基类的成员。 47 写出执行完下列代码段之后指定变量的值: boo1 x=true,y=false,z=false; x=x y=xy z=!(x!=y)(y=z), 则 x=false, y=false, z=【 】。 48 在执行完下面的程序后,变量 k的值为【 】。 int i, j, k; for(i=0, j=10; i :j; i+,j-) k=i+j; 49 假定
15、A为一个类,则语句 A(A int fun2(int int main() int x=1, y=2; y=fun 1(fun2(x); cout X , y; return 0: 程序的输出结果是 _。 国家二级( C+)笔试模拟试卷 240答案与解析 1 【正确答案】 D 【试题解析】 本题考查软件工程中软件设计的概念和原理。人们在开发计算机软件的长期实践中积累了丰富的经验,总结这些经验得到如下的启发式规则: 改进软件结构,提高模块独立性。通过模块的分解或合并,力求降低耦合、提高内聚。低耦合是指降低不同模块间相互依赖的紧密程度,高内聚是指提高一个模块内各元素彼此结合 的紧密程度。 模块的规
16、模应适中。一个模块的规模不应过大,过大的模块往往是由于分解不够充分;过小的模块开销大于有益操作,而且模块过多将使系统接口复杂,因此过小的模块有时不值得单独存在。 模块的功能应该可以预测,但也要防止模块功能过分局限。如果模块包含的功能太多,则不能体现模块化设计的特点;如果模块的功能过分局限,使用范围就过分狭窄。本题的正确答案是选项 D。 2 【正确答案】 A 【试题解析】 一个关系可以有多个候选键 (码 ),但不能所有属性都是或都不是候选键 (码 )。 3 【正确答案】 B 【试题解析】 一般来说,二叉树采用链式存储结构,但由于完全二叉树的特点,采用顺序存储也能方便地访问其中的每一个元素。因此,
17、选项 A中的说法是不对的。所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进行人队运算时,只要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。因此,循环队列是队列的一种顺序存储方式,选项 B 中的说法是正确的。栈是特殊的线性表,它既能采用顺序存储 结构,又能采用链式存储结构。因此,选项 C中的说法也是不对的。前面说过,循环队列是队列的一种顺序存储方式,不属于链式存储结构。因此,选项 D中的说法也是不对的。 4 【正确答案】 A 【试题解析】 在 C
18、+中,形参列表是由逗号分开的。分别说明函数的各个参数。在 fun()函数中它包括三个形参: x+y, 3和 min(n-1,y);当调用一个函数时,实参与形参一对一匹配,所以突参个数也是 3个。 5 【正确答案】 D 【试题解析】 在存储结点信息的同时,附加两个分别指向该结点最左孩子和右邻兄弟的指 针域,即可得树的孩子兄弟链表表示。这种存储结构的最大优点是:它和二叉树的二叉链表表示完全一样。可利用二叉树的算法来实现对树的操作。其后序遍历对应二叉树的中序遍历;中序遍历对应二叉树的后序遍历;前遍历对应二叉树的前序遍历。 6 【正确答案】 C 7 【正确答案】 D 【试题解析】 使用人工或自动手段来
19、运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。软件测试是为了发现错误而执行程序的过程。测试要以查找错误为中心,而不是为了演示软件的正确功能。 8 【正确答案】 B 【试题解析】 程序流程图的基本图符有箭头、矩形和菱形,其中箭头表示控制流,矩形表示加工步骤,菱形表示逻辑条件。 9 【正确答案】 B 【试题解析】 线性表肯定是线性结构二叉树是非线性结构;线性链表是线性结构,栈与队列是特殊的线性表,也是线性结构;线性表是线性结构。 10 【正确答案】 D 【试题解析】 从平均时间性能而言,快速排序最佳,其所需时间最少,但快速排序在最坏情况下的时间性
20、能不如堆排序和归并排序。当序列中的记录基本有序或元素个数较少时,冒泡排序和简单 选择排序为最佳排序方法,故本题答案应该为选项 D。 11 【正确答案】 B 【试题解析】 本题考核格式控制数据的输入输出。函数 setfill(char c)用于设置填充字符,在输出数据时,如果数据宽度小于设置的宽度,则空闲位置要用填充字符填满,设置的填充符一直有效,直到再次设置填充字符为止,如题中调用函数setfill(*)将填充字符设置为 *,后又调用函数 setfill(#)将填充字符设置为 #。函数 setw(int n)用于设置输入输出宽度,宽度设置的效果只对一次输入或输出有效,在 完成一次数据的输出或输
21、入后,宽度设置自动恢复为 0,如题中语句以宽度 10输出数据 “123”后,字符串 “OK”的输出宽度就自动恢复为 0了。而且题中输出的对齐方式为在输出宽度内左对齐。所以最终的输出为 123#OK。 12 【正确答案】 C 【试题解析】 用一个指针变量 p指向字符数组 a,在 while循环中,当不指向数组尾时,将小写字母转换为大写字母,然后将其输出。 13 【正确答案】 A 【试题解析】 题目中程序 TestClass 为基类, TestClass1为派生类。在主函数中定义 TestClass1对象 obj(x), “TestClass1(char n):TestClass (n+1),c(
22、n)”,所以先输出 x,然后调用基类构造函数, x+1=y,所以输出 y,即答案为 xy。 14 【正确答案】 D 【试题解析】 在一个类的内部声明,并用 friend 修饰的函数称为该类的友员函数,友员函数可以像成员函数一样,访问类的所有级别的成员。友员机制主要用于提高访问效率,但是破坏了类的封装性原则。在程序中适当使用友员函数,并寻求封装和效率之间的一个平衡点,是使用友员技术的 一个主要内容。 15 【正确答案】 C 【试题解析】 题中函数声明带有默认参数,那么在 C选项的调用中,将会把字符型实参 #赋值给整型形参 b,这不符合参数传递规则。 16 【正确答案】 A 【试题解析】 本题考查
23、的知识点是静态成员。类中的静态成员是解决同 :个类的不同对象之间的数据和函数共享问题的。静态成员被所有属于这个类的对象共享。这种共享与全局变量或全局函数相比,既没有破坏数据隐藏的厚则,又保证了安全性。题目中,首先定义了一个 obj对象,其构造函数使 MyClass的静态数据成员 count增 1,所以第一条输出语句输出的结果是 1。然后通过指针动态创建了一个 MyClass类的对象,构造函数再次被调用, count变为 2,所以第 2次输出结果是 2。接下来是用 dilete删除了刚才动态创建的 MyClass对象。析 17 【正确答案】 D 【试题解析】 逻辑运算符 “ | | ”表示或的意
24、思。 18 【正确答案】 D 【试题解析】 this 指针不能在程序中修改,不能被幅值;静态成员没有 this指针,因为类中只有一个静态成员函数实例,使用 this 指针无意义。 19 【正确答案】 B 【试题解析】 在每一个 C+程序中必须有且只有一个主函数,每个程序的执行都是从主函数的开始。 20 【正确答案】 C 【试题解析】 在 C+语言中,实数有两种形式表示,即十进制数形式和指数形式,在指数形式中, e3,2.1e3.5,.e3,e等都是不合法的指数形式。再如 123e3或123E3都代表 123乘以 10的 3次方。注意,字母 e的前面必须有数字,且 e的后面必须是整数。 21 【
25、正确答案】 C 【试题解析】 模板函数是函数模板的实例化。 22 【正确答案】 D 23 【 正确答案】 D 24 【正确答案】 A 25 【正确答案】 A 26 【正确答案】 D 27 【正确答案】 C 【试题解析】 函数可以自己调用自己,而且可以没返回值,可以具有多个参数。 28 【正确答案】 A 29 【正确答案】 D 30 【正确答案】 C 31 【正确答案】 B 【试题解析】 do-while语句的一般格式为 do循环体语句 while(表达式 );先执行循环体语句一次,再判断表达式的值,若为真则继续执行循环,否则终止循环。本题中,先执行 x=x-2,即 为 1。判断表达式的值, !
26、(-x)为真, x=0,继续循环。再次执行循环体语句后, x=-2,此时表达式的值为 0,结束循环。 32 【正确答案】 B 【试题解析】 右移运算符 “ ”是双目运算符。其功能是把 “ ”左边的运算数的各二进位全部右移若干位, “ ”右边的数指定移动的位数。例如:设 a=15, a 2表示把 000001111右移为 00000011 (十进制 3)。 33 【正确答案】 D 【试题解析】 本题考核 this 指针的使用。类成员函数 add 中通过 this 指针实现私有数据成员 n的赋 值。 34 【正确答案】 A 【试题解析】 本题考核格式控制数据的输入输出。函数 setfill(cha
27、r C) 用于设置填充字符,在输出数据时,如果数据宽度小于设置的宽度,则空闲位置要用填充字符填满,设置的填充符一直有效,直到再次设置填充字符为止,如题中调用函数 setfill(*)将填充字符设置为,引,后又调用函数 setfill(#)将填充字符设置为#。函数 setw(int n)用于设置输入输出宽度,当实际数据的宽度大于设置的宽度时,仍按实际的宽度输出,如题中数据 314.15926535的宽度大于 5,所以将会按实际输出。关键字 scientific将浮点数按指数格式 (科学表示法 )输出。 35 【正确答案】 D 【试题解析】 本题考查 switch 语句的语法规则。使用 switc
28、h 语句应该注意的问题: 整型表达式包括字符型或枚举型表达式。 在同一 switch 语句中,各个常量表达式的值不能相同。 每个 case分支可以有多条语句,但不必用 。 每个 case语句只是一个入口标号,并不能确定执行的终点,因此每个 case分支的最后应该加 break语句,用来结束 这个 switch 结构,否则会从入口点开始一直执行到 switch 结构的结束点。 当若干个分支需要执行相同操作时,可以使多个 case分支共用一组语句。 如果在 switch 语句中使用字符常数,则它们自动被转换成整型值。 根据以上注意点以及 switch 的语法规则,可知:对于选项 A, case后面
29、少了整型常量表达式,故不正确。对于选项 B,出现两个 case后面的整型常量表达式的值相等,故也不正确。对于选项 C, switch 后面的整型表达式应该用括号括起来,故也不正确 36 【正确答案 】 关系模型 【试题解析】 数据库系统模型有 3种,分别为:层次模型、网状模型和关系模型。其中,层次模型用树型结构表示,网状结构用无向图表示,关系模型用二维表表示。 37 【正确答案】 tb 【试题解析】 此题考查的是对象的定义。对象的定义格式如下:类名对象名 (参数表 );所以题目中的 tb 是对象名标识符,而 ta 被定义成类 MA 的指针,故空格处应填 tb。 38 【正确答案】 线性结构 3
30、9 【正确答案】 算法 【试题解析】 所谓算法是指解题方案的准确而完整的描述,是一组严谨地定义运算顺 序的规则,并且每一个规则都是有效的、明确的,此顺序将在有限的次数下终止。 40 【正确答案】 构造函数 41 【正确答案】 循环结构 42 【正确答案】 多态性 【试题解析】 面向对象系统包含了 3个特征 封装性、继承性和多态性,这 3个特征可以很好地实现数据抽象,进行行为共享,完成进化求解和描述一个系统的确定行为。 43 【正确答案】 12 【试题解析】 函数有一个形参 num,循环前变量 k置 1,循环中,表达式num%10 是取 num的个位,将 Hum的个位值累乘于 k中,然后 num
31、除 以 10。循环直至 num为 0结束,这是逐一求出 num十进制表示的各位数字,并累乘于变量k 的循环。函数最后返回 k。函数 fun 的功能是求整数的各位十进制数的积。 44 【正确答案】 A() 【试题解析】 此题考查的是类的构造与析构。本题要求输出的结果中包含 aa,所以基类 A中横线处的函数一定要被执行。横线处应是定义基类的构造或者析构函数,如果定义的是构造,那么 aa肯定在 new 操作时就输出,而下面的 bb 是在析构函数中,会在 delete时被输出。故可以肯定应填入基类 A的析构函数定义: A()。 45 【正确答案】 0perator 【试题解析】 C+中运算符重载一般是
32、和。 operator结合使用的。 46 【正确答案】 覆盖 【试题解析】 当派生类中有和基类相同名字的成员时,派生类的同名成员会覆盖基类的成员,如果派生类对象想访问基类的同名成员,需使用 “类名 :”加以区分。 47 【正确答案】 真 48 【正确答案】 10 49 【正确答案】 拷贝构造 【试题解析】 本题考查的是拷贝构造函数的定义,它是一种特殊的成员函数,作用是使用一个已知的对象来初始化一个被创建的同类 的对象,定义格式是类名 :拷贝构造函数名 (类名 函数中参数为传值,所以对于函数的操作不会改变实参的值,而函数 int fun2(int 中的参数为引用,对于形参的操作会改变实参的值。在主函数中调用 fun2(x)后,变量 x的值修改为 2,所以在调用 fun1函数时其形参值为 2,即运算后 y的值被赋值为 3,所以输出为 2,3。