1、国家二级( C+)机试模拟试卷 152及答案与解析 一、选择题 1 下列数据结构中,能用二分法进行查找的是 ( )。 ( A)无序线性表 ( B)线性链表 ( C)二叉链表 ( D)顺序存储的有序表 2 下列叙述中,不属于设计准则的是 ( )。 ( A)提高模块独立性 ( B)使模块的作用域在该模块的控制域中 ( C)设计成多入口、多出口模块 ( D)设计功能可预测的模块 3 下列队列的描述中,正确的是 ( )。 ( A)队列属于非线性表 ( B)队列在队尾删除数据 ( C)队列按 “先进后出 ”进行数据操作 ( D)队列按 “先进先出 ”进行数据操作 4 对下列二叉树进行前序遍历的结果为 (
2、 )。 ( A) ABCDEFGH ( B) ABDGEHCF ( C) GDBEHACF ( D) GDHEBFCA 5 对于长度为 n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是 ( )。 ( A)冒泡排序为 n(n1)/2 ( B)简单插入排序为 n ( C)希尔排序为 n ( D)快速排序为 n/2 6 为了使模块尽可能独立,要求 ( )。 ( A)内聚程度要尽量高,耦合程度要 尽量强 ( B)内聚程度要尽量高,耦合程度要尽量弱 ( C)内聚程度要尽量低,耦合程度要尽量弱 ( D)内聚程度要尽量低,耦合程度要尽量强 7 下列选项中不属于软件生命周期开发阶段任务的是 (
3、 )。 ( A)软件测试 ( B)概要设计 ( C)软件维护 ( D)详细设计 8 数据独立性是数据库技术的重要特点之一。所谓数据独立性是指 ( )。 ( A)数据与程序独立存放 ( B)不同的数据被存放在不同的文件中 ( C)不同的数据只能被对应的应用程序所使用 ( D)以上三种说法都不对 9 在 学校中, “班级 ”与 “学生 ”两个实体集之间的联系属于 ( )关系。 ( A) 对一 ( B)一对多 ( C)多对一 ( D)多对多 10 软件调试的目的是 ( )。 ( A)发现错误 ( B)改善软件的性能 ( C)改正错误 ( D)验证软件的正确性 11 在公有派生时,派生类中定义的成员函
4、数只能访问原基类的 ( )。 ( A)私有成员、保护成员和公有成员 ( B)保护成员和私有成员 ( C)公有成员和保护成员 ( D)公有成员和私有成员 12 有如下定义: int b10= 1,2,3,4,5,6,7,8,9,10,*q=b; 则数值为 8的表达式是 ( )。 ( A) *q+8 ( B) *(q+7) ( C) *q+=8 ( D) q+7 13 下面的符号中可以用作 C+标识符的是 ( )。 ( A) 3test ( B) fcc other ( C) else ( D) radius 14 下列程序 int x=5, y=0; while(+x) y+; cout y e
5、nd1; 执行后,输出的结果是 ( ), ( A) 1 ( B) 2 ( C) 4 ( D) 5 15 有如下类声明: c1ass TestClass int n; public: TestClass(int i=0):n(i) void setValue( int n0); ; 下面关于 setValue成员函数的实现中,正确的是 ( )。 ( A) TestClass:setValue(intn0)n=n0; ( B) void TestClass:setValue (int n0)n=n0; ( C) void setValue(int n0)n=n0; ( D) setValue(in
6、t n0)n=n0; 16 下面关于常成员函数的说法中正确的是 ( )。 ( A)常成员函数不能修改任何的数据成员 ( B)常成员函数只能修改一般的数据成员 ( C)常成员函数只能修改常数据成员 ( D)常成员函数只能通过常对象来调用 17 下面的函数调用为: fun(x+y,3, min(n1, y) 则 fun的实参个数是 ( )。 ( A) 3 ( B) 4 ( C) 5 ( D) 6 18 下面关于虚函数的描述中,正确的是 ( )。 ( A)基类中利用 virtual关键字说明一个虚函数后,其派生类中定义相同的原型函数时可不必加 virtual来说明 ( B)虚函数是非成员函数 ( C
7、)虚函数是 static类型的成员函数 ( D)派生类中的虚函数与基类中类型相同的虚函数具有不同的参数个数或类型 19 有如下程序: #inc1ude iostream using namespace std; c1ass Base protected: Base()cout Base; Base(char c)cout c; ; c1ass Derived:public Base public: Derived(char c)cout c; ; int main0 Derived d(Derived); retum0; 执行这个程序屏幕上将显示输出 ( )。 ( A) Derived ( B
8、) DerivedBase ( C) BaseDerived ( D) DerivedDerived 20 有如下程序: #inc1ude iostream using namespace std; int main() cout fill(*); cout width(6); cout fill(#); cout 888 end1; retum0; 的执行结果是 ( )。 ( A) #888 ( B) 888# ( C) *888 ( D) 888* 21 假定一个类的构造函数为 A(int aa, int bb)a=aa; b=a*bb; ,则执行Ax(4, 5);语句后, x a和 x
9、b的值分别为 ( )。 ( A) 3和 15 ( B) 5和 4 ( C) 4和 20 ( D) 20和 5 22 在类中说明的成员可以使用关键字的是 ( )。 ( A) public ( B) extern ( C) cpu ( D) register 23 下列不能作为类的成员的是 ( )。 ( A)自身类对象的指针 ( B)自身类对象 ( C)自身类对象的引用 ( D)另一个类的对象 24 使用地址作为实参传给形参,下列说法正确的是 ( )。 ( A)实参是形参的备份 ( B)实参与形参无联系 ( C)形参是实参的备份 ( D)参与形参是同一对象 25 下列程序的输出结果是 ( )。 #
10、inc1ude iostream h void main0 int n3=10,20,30,40,50,60;int(*p)3; p=n; cout p00 “,“ *(p0+1) “,“ (*p)2 end1; ( A) 10, 30, 50 ( B) 10, 20, 30 ( C) 20, 40, 60 ( D) 10, 30, 60 26 设程序如下: #inc1ude iostream using namespace std; int main() int *p, *q r=1 0: q= rctum0; 以上程序的输出结果是 ( )。 ( A) p的地址 ( B) r的地址 ( C)
11、 11 ( D)运行错误 27 下面关于函数模板的表述中不正确的是 ( )。 ( A)类模板的成员函数都是模板函数 ( B)类模板本身在编译过程中不会产生任何代码 ( C)类模板只能有虚拟类型的参数 ( D)用类模板定义一个对象时,实参不能省略 28 下面类的声明中的几个语句,正确的是 (设定语句是主函数中的语句 )( )。 c1ass Te8tClass private: int data; public: TestClass (intg_data) data=g data; void show0 cout data end1; ( A) TestClass*p; ( B) TestClas
12、s m; ( C) TestClass data=8; ( D) TestClass show0; 29 类中的一个字符指针成员指向具有 m个字节的存储空间时,它所能存储的字符串的最大长度为 ( )。 ( A) m2 ( B) m1 ( C) m ( D) m+1 30 有如下程序: #inc1ude iostream using namespace std; c1ass TestClass static inti; public: TestClass ()i+; TestClass ()i; static int getVal0 return i; ) ); int TestClass:i=
13、0; void f0 TestClass obj2;cout obj2 getVal(); int main() TestClass obj 1; f(); TestClass*obj3=new TestClass;cout obj3 getVal(); delete obj3;cout TestClass:getVal(); return 0: 程序的输出结果是 ( )。 ( A) 232 ( B) 221 ( C) 222 ( D) 231 31 下面关于派生类的描述中错误的是 ( )。 ( A)派生类中至少有一个基类 ( B)一个派生类可以作为另一个派生类的基类 ( C)派生类只继承了基
14、类中的公有成员和保护成员 ( D)派生类的缺省继承方式是私有 32 有如下程序: #inc1ude iostrcam using namespace std; c1ass TestClass int n; public: TestClass (int k):n(k) int get()return n; ) int get()const retum n+l;) ); int main() TestClass p(5); const TestClass q(6); cout p get(F q get(); return 0; 执行后的输出结果是 ( )。 ( A) 55 ( B) 57 ( C
15、) 75 ( D) 77 33 下列关于抽象类的表述中正确的是 ( )。 ( A)派生类必须要实现作为基类的抽象类中的纯虚函数 ( B)抽象类的成员函数至少有一个没实现 ( C)抽象类不可能用来定义对象 ( D)派生类不能成为抽象类 34 执行下列语句: #inc1ude iostream using namespace std; int main() int x=3; if(x=5) cout x+ end1; else cout x end1; retum 0; 程序的输出是 ( )。 ( A) 3 ( B) 4 ( C) 5 ( D) 6 35 假定 TestClass为一个类,则该类的
16、拷贝构造函数的声明语句为 ( )。 ( A) TestClass (TestClass x) ( B) TestClass void swap(int x, int y) int temp=x; x=y; y temp; cout “x=“ x “,y=“ y end1; int main() int x=3,y=2; swap(x,y); C0ut “x=“ x “,y=“ y end1; return 0; ( A) x=3,y=2 x=3,y=2 ( B) x=2,y=3 x=3,y=2 ( C) x=2,y=3 x=2,y=3 ( D) x=3,y=2 x=2,y=3 39 在每个 C
17、+程序中必须有且仅有一个 ( )。 ( A)函数 ( B)主函数 ( C)预处理指令 ( D)语句 40 有如下程序: #inc1ude iostream using namespace std; c1assA public: A()cout “A“; ; c1ass Bpublic:BO cout “B“; c1ass C:public A B b; public: C()cout nC; ; int main()C obj; return 0; 执行后的输出结果是 ( )。 ( A) ABC ( B) BAC ( C) ACB ( D) CBA 二、基本操作题 41 使用 VC6打开考生文
18、件夹下的源程序文件 modil cpp,该程序运行时有错误,请改正程序中的错误,使得程序输出: 10 TestClass1 注意:不要改动 main函数,不能增行或删行,也不能更改程序的结构,错误的语句在 *error*的下面。 #inc1ude iostream c1ass TestClass1 public: TestClass10 ; *error* private: virtual TestClass1() using namespace std; cout “TestClass1“ end1; ; ; c1ass TestClass2: public TestClass1 publi
19、c: *error* exp1icit TestClass2(int i) m_i=i; ; TestClass2 private: int m_i, ; void fun(TestClass2 C1) C1 print(), int main() fun(10), return0; 三、简单应用题 42 使用 VC6打开考生文件夹下的源程序文件 modi2 cpp。请完成函数fun(char*s),该函数完成以下功能: (1)把 s中的大写字母转换成小 写字母,把其中的小写字母转换成大写字母。并且在函数中调用写函数 WriteFile()将结果输出到 modi2 txt文件中。 例如: s=
20、“heIIoTEST“,则结果为: s=“HELLOtest“ (2)完成函数 WriteFile(char*s),把字符串输入文件中。 提示:打开文件使用的第二参数为 ios base:binarylios_base:app。 注意:不要改动 main()函数,不得增行或删行,也不得更改程序的结构。 #inc1ude iostream #inc1ude fstream #inc1ude cmath using namespace std; void WriteFile(char*s) void fun(char*s) void ClearFile() ofstream outl; outl
21、open(“modi2 txt“); outl c1ose(), int main() ClearFile(); char s1024; cout “p1case input a string:“ end1; cin getline(s,1024); fun(s), return 0; 四、综合应用题 43 用 VC6打开考生文件夹下的源程序文件 modi3 cpp,其中定义了多个类,但类不能达到输出要求,按照定义的输出修改函数,使得输出如下: TestClass3 TestClass2 TestClass1 其中定义的类并不完整,按照要求完成下列操作,将类的定义补充完整。 (1)类 Test
22、Class2公共继承于 TestClass1,请在注释 /*1*后添加适当的语句。 (2)print函数为虚函数,请在注释 /*2*后添加适当的语句。 (3)修改函数,使得 p指定对象 obj3,请在注释 /*3*后添加适当的语句。 (4)修改语句,利用 p调用 pnnt()函数,完成输出信息,注释 *4*后添加适当的语句。 注意:仅在函数指定位置添加语句,请勿改动主函数 main与其他函数中的任何内容。 #inc1ude iostream using namespace std; c1ass TestClass1 public: void print() cout “TestClass1“
23、end1; ; *1* c1ass TestClass2 public: *2* void print() cout “TestClass2“ end1; ; c1ass TestClass3:public TestClass2 public: void print() cout “TestClass3“ end1; ; int main() TestClass2 0bj2; TestClass3 0bj3; TestClass1*p; obj2 print(); obj3 print(); *3* p=obj3; *4* p print(); return 0; 国家二级( C+)机试模拟试
24、卷 152答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 二分法查找只适用于顺序存储的有序表,表中的元素按值从小到大排列。 2 【正确答案】 C 【试题解析】 大量软件设计表明,以下的设计准则是可以借鉴为设计的指导和对软件结构图进行优化,这些准则是:提高模块独立性;模块规模适中;深度、宽度、扇出和扇入适当;使模块的作用域在该模块的控制域中;应减少模块的接口和界面的复杂性:设计成单入口、单出口的模块;设计功能可预测的模块。 3 【正确答案】 D 【试题 解析】 队列是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做队头,允许插入的一端叫做队尾。队列的操作数是依据先进先出的原
25、则进行的。因此队列亦称作先进先出的线性表,或后进后出的线性表。 4 【正确答案】 B 【试题解析】 遍历就是不重复地访问二叉树的所有结点。二叉树遍历的方法有 3种:前序遍历、中序遍历和后序遍历。记住 3种遍历的顺序: 前序,访问根一按前序遍历左子树一按前序遍历右子树。 中序,按中序遍历左子树 访问根 按中序遍历右子树。 后序,按后序遍历左子树 按后序遍历右子树 访问根。所 以对该二叉树的中序遍历结果为 ABDGEHCF。 5 【正确答案】 A 【试题解析】 在最坏情况下,冒泡排序所需要的比较次数为 n(n1)/2:简单插入排序所需要的比较次数为 n(n1)/2;希尔排序所需要的比较次数为 O(
26、n1 5):堆排序所需要的比较次数为 O(nlog2n)。 6 【正确答案】 B 【试题解析】 模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。耦合性与内聚性是模块独立性的两个定性标准,耦合与内聚是相互关联的。在程序结构中,各模块的内聚性 越强,则耦合性越弱。一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。 7 【正确答案】 C 【试题解析】 软件生命周期分为软件定义、软件开发及软件运行维护三个阶段,其中开发阶段包括概要设计、详细设计、实现和测试。 8 【正确答案】 D 【试题解析】 数
27、据独立性是数据与程序间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序。所以选项 A),选项 B)和选项 C)都不正确。 9 【正确答案】 B 【试题解析】 一个班可以有多名学生,而一名学生只能属于一个班级,所以 “班级 ”与 “学生 ”两个实体集之间的联系属于一对多关系。 10 【正确答案】 C 【试题解析】 在对程序进行了成功的测试之后将进入程序调试,程序调试的任务是诊断和改正程序中的错误。 11 【正确答案】 C 【试题解析】 派生类中的成员,一部分是从基类继承来的,另一部分是自己定义的新成员,所有的这些成员也分为公有、私有和保护三种访问权限。其中,从基类继承下来的全部成员构
28、成派生类的基类,这部分的私有成员是派生类不能直接访问的,而公有成员和 保护成员则是派生类可以直接访问的,但它们在派生类中的访问属性随着派生类对基类的继承方式而改变。 12 【正确答案】 B 【试题解析】 数组的下标是从 0到数组的长度减 1。 *(p+i)是取数组的第 i+1个元素,即下标为 i的元素。因此 *(p+7)取数组的第八个元素,即元素 8。 13 【正确答案】 D 【试题解析】 C+标识符是以字母、下划线开头的,由字母、数字及下划线组成的,不与关键字相同的字符串。选项 C)中 else为关键字。 14 【正确答案】 C 【试题解析】 循环条件是 +x,在 c+中,对于非 0值全都为
29、真, 0代表假。 x的初始值为 5,所以循环能进行 4次。 15 【正确答案】 B 【试题解析】 C+中类成员函数的实现形式为:返回类型类名:成员函数名(参数列表 )(代码块 16 【正确答案】 A 【试题解析】 C+中使用 const关键字来说明函数称为常成员函数,常成员函数不能更新对象中的数据成员。 17 【正确答案】 A 【试题解析】 在 C+中,形参列表是由逗号分开的,分别说明函数的各个参数。在 fun0函数中它包括兰个形参: x+y, 3和 min(n1, y);当调用一个函数时,实参与形参一对一匹配,所以实参个数也是 3个。 18 【正确答案】 A 【试题解析】 虚函数是非 sta
30、tic类型的成员函数,基类中可以利用 virtual关键字来声明虚函数,派生类中定义相同原型函数时可不必加 virtual说明,直接重写基类中的函数。在派生类中的虚函数必须与基类中的虚函数具有相同的参数个数与类型。 19 【正确答案】 C 【试题解析】 派生类 Derived由基类 Base公有派生,在派生类构造函数声明时系统会自动调用基类的缺省构造函数。调用 Derived d(Derived);后,执行类Derived构造函数的 Derived(char c),系统自动调用基类的缺省构造函数 Base(),输出字母 Base;再执行派生类的构造函数 Derived(charc),输出字母
31、Derived。 20 【正确答案】 A 【试题解析】 C+在流操作中,利用 cout对象的 width属性设:置输出字符的宽度,用 fill函数来设置需要填充的字符。题目程序中,首先设置填充字符为 *,输出宽度为 6,但在输出前又设置了填充字符为 #,所以在输出时,其填充字符为 #,由于 888不足 6个字符,所以在前面以三个 “#”来填充。 21 【正确答案】 C 【试题解析】 因为 aa后减,所以 a=4;b的值与 a、 bb相关 ,b=4*5=20,与 aa没有任何关系。 22 【正确答案】 A 【试题解析】 extern用于声明外部变量的, register声明寄存器类型变量,无cp
32、u类型。它们都不能声明类成员。 public声明为公有访问权限。 23 【正确答案】 B 【试题解析】 类的定义,如果有自身类对象,会使其循环定义,选项 B)错误。在类中具有自身类的指针,可 以实现链表的操作,当然也可以使用对象的引用,类中可以有另一个类的对象即成员对象。 24 【正确答案】 D 【试题解析】 地址作为实参,表示实参与形参代表同一个对象。如果实参是数值,形参也是普通变量,此时形参是实参的备份。 25 【正确答案】 B 【试题解析】 如果数组元素都是相同类型的指针,则称这个数组为指针数组。指针数组一般用于处理二维数组。 声明的格式为:数据类型 (*变量名 )元素个数 。 p表示指
33、向数组 n的行指针,初始化 “(*p)3=n; ”,地址的等价形式: p+i、 pi、*(p+i)都表示数组第 i+1行的第 1个元素的首地址。 *(p+i)+j、 pi+j、 【试题解析】 程序要求输出值为 10, TestClass1。从已给定源程序的 main主函数开始入手, main主函数首先调用 fun函数, fun调用 TestClass2中的 print()函数,其中 TestClass2继承了 TestClass1。 (1)第 1个标识下的 ”virtualTestClass1()”语句是 TestClass1()析构函数,不是私有函数,所以删除 “private:”。 (2)
34、“exp1icit TestClass2(int i)”构造函数语句中的 “exp1icit”是禁止隐式转换。程序中无法实现对类 TestClass2的直接使用,所以这里应该将其删除。即“TestClass2(int i)。 (3)第 3个标识下实现, fun函数中 m i的标准输出,即在屏幕上输出 10。在程序中用到 C+标准库时,要使用 std标准命名空间进行限定。 cout为标准库函数,所以要声明 cout是在命名空间 std中定义的流对象,即 “std:cout mjstd:end1;”或者添加 “using namespace std;”。 三、简单应用题 42 【正确答案】 (1)
35、void WriteFile(char*s)中的命令语句: ofstream outl: outl open(“modi2 txt“, ios_base: binarylios_base:app);/ /打开文件 modi2 outl s; /写入字符串 s outl close(); (2) void fun(char*s)中的命令语句: for(int i=0;si=0;i+) /循环孰断每一个字符 if(si =A 【试题解析】 本题要求实现两个函数的功能,其中 WriteFile(char*s)实现把字符串输入到 文件中; fun(char*s)函数实现大写字母转换成小写字母,把其中的
36、小写字母转换成大写字母。其中大小写字母之间的 ASCII码差为 32。 从已给部分源程序的 main主函数开始入手,首先实现 WriteFile函数,然后再实现 fun函数,并在其中调用 WriteFile函数。 (1)在 WriteFile(char*s)函数中,利用标准流 ofstream实现字符串写入文件modi2 txt。 (2)在 fun函数中,利用 for循环逐个判断字符是大写还是小写。 (3)如果是大写,那么加上 32实现大写转换为小写。否则, 就减去 32,实现小写到大写的转换。最后调用前面实现的 WriteFile函数,将字符串写入文件。 四、综合应用题 43 【正确答案】
37、(1)将 “class TestClass2”补充完整为: class TestClass2: public TestClass1 (2)将 “void print()”补充完整为: virtual void print() (3)将 “p=obj3;”修改为: p= (4)将 “p print(),”修改为: p print(); 【试题解析】 本题的功能是通过 print虚函数将字符串输出。在 VC环境下打开程序,根据题干给出的几条功能要求,对程序中给出注释下的内容逐个补全或修改。从已定源程序的 mam主函数开始入手,可以看出程序通过调用类和成员函数实现各种输出操作。 (1)题目 1要求
38、“类 TestClass2公共继承于 TestClass1”。从已有的类产生一个新的子类,成为类的派生。声明派生类的一般形式为: class派生类名: 继承方式 基类名。根据题目中的要求以及派生类的一般形式,第 1个标识下添加语句 “class TestClass2: publicTestClass1”。 (2)题目 2要求 “print函数为虚函数 ”。在 C+中,用 virtual声明的函数为虚函数,因此第 2个标识下的语句修改为 “vulual void print()”。 (3)题目 3要求 “使得 p指定对象 obj3”。 p为指针变量, obj3为类的对象,将一个指针变量指向另一个变量,只要把被指向的变量的地址赋给指针变量即可。取对象 obj3地址的语句为 ”。 (4)题目 4要求 “利用 p调用 print()函数 ”。 C+中用 ” ”运算符实现成员访问,因此调用 print()函 数,应将第 4个标识下修改为 “p print(),”。