1、国家二级( C+)机试模拟试卷 9及答案与解析 一、选择题 1 在结构化方法中,用数据流程图 (DFD)作为描述工具的软件开发阶段是 ( )。 ( A)逻辑设计 ( B)需求分析 ( C)详细设计 ( D)物理设计 2 对序线性表 (23, 29, 34, 55, 60, 70, 78)用二分法查找值为 60的元素时,需要比较次数为 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 3 下列描述中,正确的是 ( )。 ( A)线性链表是线性表的链式存储结构 ( B)栈与队列是非线性结构 ( C)双向链表是非线性结构 ( D)只有根结点的二叉树是线性结构 4 开发大型软件时,产生
2、困难的根本原因是 ( )。 ( A)大型系统的复杂性 ( B)人员知识不足 ( C)客观世界千变万化 ( D)时间紧、任务重 5 两个或两个以上的模块之间关联的紧密程度称为 ( )。 ( A)耦合度 ( B)内聚度 ( C)复杂度 ( D)连接度 6 下列关于线性表的叙述中,不正确的是 ( )。 ( A)线性表可以是空表 ( B)线性表是一种线性结构 ( C)线性表的所有结点有且仅有一个前件和后件 ( D)线性表是由 n个元素组成的一个有限序列 7 设有如下关系表: 则下列操作正确的是 ( )。 ( A) T=R S ( B) T=RS ( C) T=RS ( D) T=R S 8 以下描述中
3、,不是线性表顺序存储结构特征的是 ( )。 ( A)可随机访问 ( B)需要连续的存储空间 ( C)不便于插入和删除 ( D)逻辑相邻的数据物理位置上不相邻 9 在三级模式之间引入两层映像,其主要功能之一是 ( )。 ( A)使数据与程序具有较高的独立性 ( B)使系统具有较高的通道能力 ( C)保 持数据与程序的一致性 ( D)提高存储空间的利用率 10 下列方法中,属于白盒法设计测试用例的方法的是 ( )。 ( A)错误推测 ( B)因果图 ( C)基本路径测试 ( D)边界值分析 11 关于虚函数,以下说法正确的是 ( )。 ( A)若在重定义虚函数时使用了 virtual,则该重定义函
4、数还是虚函数 ( B)虚函数不能声明为友元 ( C)子类必须重定义父类的虚函数 ( D)虚函数不能是 static的 12 下列关于纯虚函数与抽象类的描述中,错误的是 ( )。 ( A)纯虚函数 是一种特殊的虚函数,它没有具体的实现 ( B)抽象类是指具有纯虚函数的类 ( C)一个基类中说明具有纯虚函数,该基类的派生类一定不再是抽象类 ( D)抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出 13 将 x+y*z中的 “+”用成员函数重载, “*”用友元函数重载应写为 ( )。 ( A) operator+(operator*(y, z) ( B) x operator+(operato
5、r*(y, z) ( C) x operator+(x*(y, z) ( D) x+(operator*(y, z) 14 以下程序的执行结果是 ( )。 #include #include void fun(intn) if(n!=0) fun(n1); for(int i=1; i using namespace std; class TestC: lass public: TestClass(int n)number=n; ) 拷贝构造函数 -TestClass 0) private: int number; ); TestClass fun(TestClass P) TestClass
6、 temp(p); return temp; int main() TestClass obj10(10), obj2(0); TestClass obj3(objil); obj2=fun(obj3); return 0; ( A) TestClass(TestClass&other)number=other number; ) ( B) TestClass(TestClass other)number=other number; ) ( C) TestClass(TestClass&other)number; ) ( D) TestClass(&other)number=other num
7、ber; 16 执行完下列代码段之后: boot x=true, V=false, Z=false; x=x&yttz; y=xI Iy&z; z=!(x!=y)II(y=z); 则 x=false, y=false, z=( )。 ( A)真 ( B)假 ( C)不确定 ( D)异常 17 如果表达式一 x y中的 “一 ”和 “ ”是作为友元函数重载的运算符,采用运算符函数调用格式,该表达式还可表示为 ( )。 ( A) operator (x operato一 0, y); ( B) operator (operator一 (x), y); ( C) x operator一 () ope
8、rator (y); ( D) y operator (operator一 (x); 18 将以下程序写成三目运算表达式是 ( )。 if(xy)?x: y ( B) min=(x和作用域运算符 ( D)静态数据成员不是所有对象所共用的 25 以下程序的执行结果是 ( )。 #include int a8=1, 2, 3, 4, 5, 6, 7): void thn(int*pa, int n); void main() intm=8: fun(a, m); coutak)_: return(k); ( A) k=i ( B) k=j ( C) i=q ( D) i=n 27 纯 C+程序中,
9、如果要求通过函数来实现一种简单的功能,并且要求尽可能加快程序执行速度,则应该选用 ( )。 ( A)内联函数 ( B)重载函数 ( C)递归调用 ( D)嵌套调用 28 有如下类声明: class MyBASE int k: public: void set(int 11)k=n; int getOconstreturn k: ; class MyDERlVED: protected MyBASE protected: intj: public: void set(int m, int n)MyBASE: set(m); j=nI int getoconstreturn MyBASE: get
10、()+j; : 则类 MyDERIVED中保护的数据成员和成员函数的个数是 ( ) ( A) 4 ( B) 3 ( C) 2 ( D) 1 29 下列 关于继承的描述中,错误的是 ( )。 ( A)析构函数不能被继承 ( B)派牛类是基类的组台 ( C)派牛类的成员除了它自己的成员外,还包含了它的基类的成员 ( D)派牛类中继承的基类成员的访问权限到派牛类保持不变 30 类的析构函数的作用是 ( )。 ( A)一般成员函数 ( B)类的初始化 ( C)对象的初始化 ( D)释放由对象所占用的资源 31 如果表达式 y*z+中。 “*”是作为成员函数重载的运算符, “+”是作为友元函数重载的运算
11、符,采用运算符函数调用格式,该表达式还可表示为 ( )。 ( A) x operator+(0) operator*(y) ( B) operator*(x operator+(0), y) ( C) y 0perator*(operator+(x, 0) ( D) 0perator*(opera*(or+(x, 0), y) 32 有如下程序: #include using namespace std; class XX protected: int k: public: xx(int n=5): k(n): XX() Cout T cast(U u)return u; 功能是将 U类型数
12、据转换为 T类型数据。已知 i为 int型变量,下列对模板函数cast的调用中正确的是 ( )。 ( A) cast(i); ( B) castx; if(x+5) coutSetVariable(5)与语句 my SetVariable(5)等价 38 下列关于虚函数的描述中,正确的是 ( )。 ( A)虚函数是一个 static类型的成员函数 ( B)虚函数是一个非成员函数 ( C)基类中采用 virtual说明一个虚函数后,派生类中定义相同原型的函数时可不必加 virtual说明 ( D)派生类中的虚函数与基类中相同 原型的虚函数具有不同的参数个数或类型 39 有如下程序: #inclu
13、de void fun(int&X, int y)int t=x; x=y; y=t; ) int main() int a2=23, 42); fun(a1, a0); std: cout using namespace std; class A public: static int a; void initOa=1; ) A(int a-2)init0; a+; ) ; int A: a=0; A obj; int main() cout *error* template void fun(T t) std: cout void fun(bool t) std: cout class Te
14、stClassO *1* ; *2* class TestClass 1: public: void print() cout;其中:关键词 enum表示定义的是枚举类型,枚举类型名由标识符组成,而枚举元素表由枚举元素或枚举常量组成。其中 enumMonday, Tuesday, Wednesday,Tlarusday,Friday=2的值由0开始,即 0, 1, 2, 3。 D中的本题中的枚举类型中的数据值 Wednesday为 2,而 Friday的值赋值为 2,所以判断 Wednesday等于 Friday的表达式值为真,即true。即选择 A)。 20 【正确答案】 D 【试题解析】
15、如果函数实参是数组名,形参也应为数组名,函数 swap中形参进行了交换,实际上也是实参进行了交换。而且数组名代表数组首元素的地址,并不代表数组的全部元素。所以, swap(b, 2)是数组 b第一个元素与第二个元素进行交换,即 b0与 b1,根据题干,知道答案为 2, 1。 21 【正确答案】 D 【试题解析】 循环条件 i=4;是个赋值语句,使得 i, j的值非 0,所以是死循环。 22 【正确答案】 A 【试题解析】 在 switch语句中 default的位置不是固定在最后的位置,同时default也是可以省略。 23 【正确答案】 C 【试题解析】 可见性是函数内部,存在整个程序中,第
16、二次调用值不变。 24 【正确答案】 D 【试题解析】 静态数据成员是在类装载的时候就分配了内存空间,而类的成员变量是在生成对象时分配内存空间。所以只要类装载了, 就可以用类名访问静态数据成员。事实上,该类的所有对象都只保存类静态数据成员的引用,它们都指向同一块内存区域。 25 【正确答案】 D 【试题解析】 void fun(int*pa,int n)函数定义的功能就是把数组的每个元素的值加到元素 pa7中,也就是数组的元素之和放在 a7中存储,所以结果 28。 26 【正确答案】 A 【试题解析】 函数 fun中首先定义整型变量 k用来存放返回最大值的下标,并将其首先指向第一个元素,即 k
17、=j。然后在 for循环中依次将当前元素 ai与标识为最 大值的元素进行比较,如果当前元素大于这个标识元素,那么将最大值标识为当前元素,即 k=i。 27 【正确答案】 A 【试题解析】 此题考查的是内联函数的相关知识点。 C+引入内联函数是用它来代替 C语言中的预处理宏函数,内联函数在调用时,是将表达式用内联函数体来替换,这样会加快程序的执行速度。 28 【正确答案】 B 【试题解析】 因为在保护继承的情况下,基类中的公有成员 void set(int n)和 inI get()const在派生类中是保护成员,再加上派生类自身的保护成员 j,一共是 三个保护成员。 29 【正确答案】 D 【
18、试题解析】 派生类中继承的基类成员的访问权限到派生类会发生变化,例如:私有继承时,派生类不能访问基类的成员,所以选项 D)错误,其他选项均正确。 30 【正确答案】 D 【试题解析】 类的在撤销对象时,系统会自动调用类的析构函数,析构函数用来释放由对象所占用的资源。 31 【正确答案】 C 【试题解析】 运算符函数有两种调用形式,第一种是像一般函数那样用函数名调用,即 y operator*(z)或者 operator*(y, z);另一 种是通过运算符构成表达式,即 y*z。因为 “+”运算符既可以作为前缀运算符,又可以作为后缀运算符,所以重载这个运算符时,重载后缀 “+”时必须多一个虚拟参
19、数: int。 32 【正确答案】 A 【试题解析】 类 YY公有派生于类 XX,派生类对象可以替代基类对象向基类对象的引用进行赋值初始化, XX&p=*newYY语句定义了 XX对象 p引用,并用YY对象初始化, p并不是 YY对象的别名,是 XX基类对象的别名,故先调用基类 XX的构造函数将 k初始化为 5, p f()首先输出 k一 3即 2,然后调用 XX:f()输出 k+3即 8, delete&p删除 p,调用 XX的析构函数输出 “XX”。 33 【正确答案】 D 【试题解析】 选项 D)是将 double类型的数据转化成 int类型的数据,正确。 34 【正确答案】 D 【试题
20、解析】 此题首先读入数值 4赋给变量 x,因为 x+5不成立,因为 “+”后缀,之后 x的值变为 5,执行语句 cout5成立,所以执行语句 cout成员函数 (形参表 )或者对象名,成语函数名 (形参表 ),故选项 C)错误,选项 D)正确。 38 【正确答案】 C 【试题解析】 此题考查虚函数的概念。在成员函数声明的前面加上 virtual修饰,即把该函数声明为虚函数。虚函数只能是类中的一个成员函数,但不能是静态成员函数,所以选项 A)和 B)错误:在派生类中重新定义虚函数时必须有相同的函数类型,包括函数的返回类型、函数名、参数个数、参数类型的顺序必须相同。故选项 D)错误。 39 【正确
21、答案】 B 【试题解析】 此题考查的是函数的调用以及参数值的传递。函数 fun中的第一个参数是引用传值方式,是双向的;第二个参数是按值传递,是单向的。 40 【正确答案 】 B 【试题解析】 此题实际考查的是变量作用域的屏蔽效应。在 C+中,当标识符的作用域发生重叠时,在一个函数中声明的标识符可以屏蔽函数外声明的标识符或全局标识符。声明类 A的全局对象时,构造函数首先调用 int函数,但由于静态成员变量 a被构造函数内部的形参 a所屏蔽所以 a+改变的是形参 a的值,对静态成员变量 a没有影响。 二、基本操作题 41 【正确答案】 (1)template (2)删除 “template” (3
22、)bool flag=true; 【试题解析】 程序要求输出字符串 Hello test。从已定源程序的 main主函数开始入手,调用函数 fun实现字符的输出。 解题思路 (1)C+中的模板类格式为 template,所以将题目中程序中的第 1个标识下语句 “template”修改为 “template”。 (2)在第 2个标识下的 “void fun(bool t)”函数中,其中 t变量为布尔型变量,是 C+中的基础变量,并不是模板变量,并没有使用到模板类,所以删除第 2个标识下的模板类型定义语句。 (3)第 3个标识下的 “bool flag=TRUE; ”是声明布尔型变量 flag,并
23、将其值赋为逻辑真。而 TRUE并不是合法值, C+中区分大小写,所以逻辑真值应为 true,即“bool flag=true; ”。 三、简单应用题 42 【正确答案】 ifflen0)最小值位置 b0=0; 赋值第一个元素 if(1en1) bfl=1; 赋值第二个元素 f0r(int i=2; ilen; i+) bi=bi 1十 bi-2;将两个元素之和赋予当前 元素 【试题解析】 根据题干中给出的要求,从已给部分源程序的 main主函数开始入手,补全函数 void fun(double ble, int len)。 解题思路 (1)判断数组长度,如果存在第一个元素,那么将第一个元素赋值
24、为 0,即b0=0:。 (2)然后再判断数组长度,如果存在第二个元素,那么将第二个元素赋值为 1,即b1=1。 (3)最后从第 i个元素到数组最后一个元素,赋值 bi=bi一 1+bi-2;。 四、综合应用题 43 【正确答案】 (1)添加语句: virtual void print()=0; (2)将 “class TestClassl: ”补充完整为: class TestClassl: virtual private TestClass0 (3)将 “class TestClass2: ”补充完整为: class TestClass2: public TestClass0 (4)将 “c
25、lass TestCkss3: ”补充完整为: class TestClass: public TestClass2,public FestCiassl 【试题解析】 在 VC环境 下打开程序,根据题干给出的几条功能要求,对程序中给出注释下的内容逐个补全或修改。本题从题干要求入手,依次处理各个类,完成各个类的定义。 解题思路 (1)题目 1要求 “请定义一个纯虚函数 print”。在 C+中,虚函数在基类中用 virtual声明成员函数为虚函数。纯虚函数是在声明虚函数时被 “初始化 ”为 0的函数,即“virtual void print()=0; ”。 (2)题目 2要求 “类 TestCl
26、assl私有虚继承类 TestClss0”。在 C+中声明一个派生类时将基类的继承方式指定为 private的,称为 私有继承。同 (1),声明 TestClassl虚继承类 “: virtual TestClass0”,题目要求为私有,即 “class TestClassl: virtual private TestClass0”。 (3)题目 3要求 “类 TestClass2公有继承类 TestClass0。 ”同 (2),公有继承是在定义一个派生类时将基类的继承方式指定为 public的,称为公用继承。所以这里补全“class TestClass2: public TestClass0”。 (4)题目 4要求 “类 TestClass3公有继 承类 TestClass2与 TestClassl。 ” 同 (3),所以这里补全 “class TestClass3: public TestClass2,public TestClass1”。