1、国家二级( C+)机试模拟试卷 7及答案与解析 一、选择题 1 线性表常采用的两种存储结构是 ( )。 ( A)散列方法和索引方式 ( B)链表存储结构和数组 ( C)顺序存储结构和链式存储结构 ( D)线性存储结构和非线性存储结构 2 软件需求分析阶段的工作,可以分为四个方面:需求获取、编写需求规格说明书、需求评审和 ( )。 ( A)阶段性报告 ( B)需求分析 ( C)需求总结 ( D)都不正确 3 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段是 ( )。 ( A)需求分析 ( B)详细设计 ( C)软件设计 ( D)概要设计 4 对建立良好的程序设计风格,下
2、面描述正确的是 ( )。 ( A)程序应简单、清晰、可读性好 ( B)符号名的命名只要符合语法 ( C)充分考虑程序的执行效率 ( D)程序的注释可有可无 5 下列工具中,不属于结构化分析的常用工具的是 ( )。 ( A)数据流图 ( B)数据字典 ( C)判定树 ( D) N S图 6 在软件生产过程中,需求信息的来源是 ( )。 ( A)程序员 ( B)项目经理 ( C) 设计人员 ( D)软件用户 7 对关系 S和 R进行集合运算,结果中既包含 S中的所有元组也包含 R中的所有元组,这样的集合运算称为 ( )。 ( A)并运算 ( B)交运算 ( C)差运算 ( D)积运算 8 设有关键
3、码序列 (Q, G, M, Z, A, N, B, P, X, H, Y, S, T, L, K, E),采用堆排序法进行排序,经过初始建堆后关键码值 B在序列中的序号是 ( )。 ( A) 1 ( B) 3 ( C) 7 ( D) 9 9 数据库的故障恢复一般是由 ( )来执行恢复。 ( A)电脑用户 ( B)数据 库恢复机制 ( C)数据库管理员 ( D)系统普通用户 10 下列选项中,不属于数据模型所描述的内容的是 ( )。 ( A)数据类型 ( B)数据操作 ( C)数据结构 ( D)数据约束 11 下面关于面向对象的程序设计方法中,正确的是 ( )。 ( A) “多态性 ”是指对象的
4、状态根据运行的要求进行变化 ( B) “封装性 ”是指将不同类型的数据结合在一起作为一个整体来处理 ( C)在面向对象的程序设计中,结构化程序设计方法仍有着重要作用 ( D)基类的私有成员在派生类的对象中不可访问,也不占内存 空间 12 下列关于函数模板的定义中,合法的是 ( )。 ( A) template classT abs(T z)return zT abs(T z)return zabs(T z)return z using namespace std; int m=5: int main() int m=3: m+: : m+: cout void main() int x=3。
5、Y=3: switch(x 2) case 1: switch(Y) case 0: cout using namespace std; class Base public: virtual void func 1 0coutfimcl(); P一 func20; return 0: 运行此程序,屏幕上将显示输出 ( A) Derived 1 Base 2 ( B) Base 1 Base 2 ( C) Derived 1 Derived 2 ( D) Base 1 Derived 2 29 下面关于友元的说法中错误的是 ( )。 ( A)若类 A是类 B的友元,那么类 B也是类 A的友元 (
6、 B)友元关系不能被继承 ( C)若函数 fun被说明为类 A的友元,那么在 fun中可以访问类 A的私有成员 ( D)若类 A是类 B的友元,那么类 A的所有成员函 数都是类 B的友元 30 运行以下的程序代码,结果是 ( )。 #include using namespace std; int main() intx=5; int*q=&x; int&y=x; y+; cout using namespace std; class TestClass public: TestClass(int n)number=n; 拷贝构造函数 TestClass(TestClass other)num
7、ber=other number; ) TestClass() private: int number; ; TestClass fun(TestClass p) TestClass temp(p); return temp; int main() TestClass obj 1(10), obj2(0); TestClass obj3(obj 1); obj2=fun(obj3); return 0: 程序执行时, TestClass类的构造函数被调用的次数是 ( )。 ( A) 2 ( B) 3 ( C) 4 ( D) 5 33 语句 ofstream outf(“TEST DAT”,io
8、s base: app);的功能是建立流对象 outf,并试图打开文件 TEST DAT与 outf关联,而且 ( )。 ( A)如果文件存在,打开失败;如果文件不存在,建立一个新文件 ( B)如果文件存在,将文件指针定位于文件首;如果文件不存在,打开失败 ( C)如果文件存在,将文件指针定位于文件尾; 如果文件不存在,建立一个新文件 ( D)如果文件存在,将其置为空文件;如果文件不存在,打开失败 34 下面的类定义中,如果要为其添加一个析构函数,对于析构函数定义正确的是( )。 class TestClass private: int a; public: TestClass(int giv
9、a a=0)a=give_a; ) ( A) -void TestClass() ( B) TestClass void() ( C) void TestClass() ( D) TestClass() 35 下面关于虚函数的表述中正确的是 ( )。 ( A)虚函数不能声明为另一个类的友元函数 ( B)派生类必须重新定义基类的虚函数 ( C)如果在重定义虚函数时使用了保留字 virtual,那么该重定义函数仍是虚函数 ( D)虚函数不能够声明为静态函数 36 将下面类 TestClass中的函数 fun()的对象成员 n值修改为 100的语句应该是( )。 class TestClass pu
10、blic: TestClass(int x)n=x; ) void SetNum(int n1)n=n1; private: int n: int fun() TestClass*ptr=new TestClass(45); ( A) TestClass(100) ( B) ptr-SqtNum(100) ( C) SetNum(100) ( D) ptr=100 37 运算符重载是对已有的运算符赋予多重的含义,所以 ( )。 ( A)能够对基本类型 数据 (如 double),重新定义 ”+”运算符的含义 ( B)只能重载 C+中己经有的运算符,不能重新定义新运算符 ( C)能够改变一个已有
11、运算符的优先级和操作数个数 ( D) C+中现有的所有运算符都可以重载 38 TestClass类定义如下: class TestClass private: int id; char gender; char木phone; public: TestClass(): id(0), gender(#),phone(NULL) TestClass(int no,char ge=#, char*ph=NULL) id=no; gender=ge; phone=ph; ) ; 下面类对象定义语句中错误的是 ( ) ( A) TestClass myObj(1); ( B) TestClass myOb
12、j(2,“11101111155”); ( C) TestClass myObj(1, m); ( D) TestClass myObj; 39 使用输入输出操作符 setw,能够控制 ( )。 ( A)填充字符 ( B)输出宽度 ( C)对齐方式 ( D)输出精度 40 有如下类定义: class Fun public: Fun(int v): value(v) Fun() private: Fun int value=0; ; 其中存在语法错误的行是 ( )。 ( A) ( B) ( C) ( D) 二、基本操作题 41 使用 VC6打开考生文件夹下的源程序文件 modil cpp,请修改
13、程序中的错误,使程序能得出正确的结果: num: 0 num: 1 tlum:10 注意:不要改动 main函数,不能增行或删行,也不能更改程序的结构,错误的语句在 *eroor* #include int i=10; class TeslClass public: TestClass(int i) cout 必须使用递归 int funl(int n) ; 不能使用递归 int fun2(int n) void main() int i; couti; cout class TestClassA public: void fun() cout其中 是由一个或多个 组成 (如果是多个需要用逗号
14、隔开 )。其中, 可以换成 class,函数的声明部分和一般函数的声明部分类似,只有某些类型修饰符被虚拟类型参数替代。 13 【正确答案】 D 【试题解析】 ifstream是文件输入流类,只能用于输入,它没有提供任何用于输出的操作。 ofstream是文件输出流类,只能用于输出,它没有提供任何用于输入的操作。从文件中输入字符要用文件输入流类引 用 outf,并调用其输入字符的成员函数 get(1。根据题目中的要求,可以看出当输入文件中读到换行符时,程序将在输出文件中两次输出换行符,即双倍行距。 outc put(c)为输出一个字符,因为“if(c= n)coutc put(c); ”此句,当
15、 c为间格字符 (行距字符 )时,再多输出一次outc put(c)。 14 【正确答案】 C 【试题解析】 运算符函数的返回类型可以声明为基本数据类型,故选项 A)错误。 “、 *、 -*:、 ?”这五个运算符不可以重载,故选项 B)错误。在重载类型转换符时,由于 运算符本身已经表示出返回值类型,因此不需要返回值类型的声明。运算符重载是针对 C+中已有的运算符进行的,不可能通过重载创造出新的运算符,故选项 D)错误。 15 【正确答案】 B 【试题解析】 引用实际上就是别名,它与被引用变量拥有同一个地址空间。选项A)中 &m表示 m的地址,而 x是一个整型变量,在 C+中不能从地址值隐式转换
16、为整型值,故选项 A)是错的。选项 B)中其操作实际上就是为 m赋于一个别名 x,因此选项 B)是对的。选项 C)中引用必须要用被引用的对象,即引用必须要初始化;选项 D)中 x是一个整型引用 ,而其被引用的对象却是 m的地址,存在着与选项 A)类似的错误,因此选项 D)也是错的。 16 【正确答案】 A 【试题解析】 C+标识符是一个以字母或下划线开头的,由字母、数字、下划线组成的字符串。标识符不能与任何一个关键字同名,因此 case不能作为标识符。 17 【正确答案】 B 【试题解析】 C+中变量有全局变量和局部变量。当在一个函数中声明的局部变量与全局变量同名时,局部变量会将全局变量屏蔽掉
17、。要引用全局变量可以在变量名前面加 “: ”符号。 18 【正确答案】 A 【试题解析】 构造函数是一种特殊的成员函数,它必须与类名相同,不能指定返回值类型,可以有一个或者多个参数,可以重载。 19 【正确答案】 C 【试题解析】 定义对象 x时执行一次构造函数 (调用 Test(int a,int b=0),定义对象数组 y时,构造函数 (注意,该构造函数必须是没有任何参数的 )的执行次数与数组中对象的个数相等,即需要执行 3次,最后定义一个指向 Test对象的指针数组,它并不会创建对象,从而也就不会去执行构造函数,故构造函数一共执行了 4次。 20 【正确答案】 A 【 试题解析】 派生类
18、可以访问基类中的保护成员和公有成员。当基类有默认构造函数时,派生类可以不向基类传递参数,直接调用派生类的默认构造函数,而纯虚函数要在非抽象的子类中实现,虚基类不能被实例化。 21 【正确答案】 A 【试题解析】 “ ”、 “+”不能作为变量名, double是系统关键字。 22 【正确答案】 D 【试题解析】 此数组是 43二维数组, b22是第 3行第 3列。 23 【正确答案】 B 【试题解析】 “+(单目 )”是第 2优先级, “+”是第 4优先级, “funcl();后,执行派生类 Derived的函数 void funcl();调用 p-func2();后,执行基类的函数 void
19、func2(),因为虚拟函数是根据对象的实际类型调用,非虚拟函数是根据指针类型调用。故通过指针 p调用 func2时将直接调用基类中的 voidfunc2()。 29 【正确答案】 A 【试题解析】 C+中有些对象或函数需要访问其他对象的内部成员,这样可以用friend关键字将对应的类指定友元函数或友元类,但是这种关系不是相互的。如 果声明一个类 A为类 B的友元类,则类 A中的所有成元函数都可以访问类 B中的私有成员。另外,友元关系不会被继承。 30 【正确答案】 B 【试题解析】 C+中引用是个别名,建立时须用另一个数据对象的名字进行初始化,这样确定该引用所代表的数据对象。此后对该引用的任
20、何操作实际上就是对所代表的数据对象的操作。 31 【正确答案】 C 【试题解析】 C抖中类模板的声明格式为 template,并且类模板的成员函数都是模板函数。 32 【正确答案】 C 【试题解 析】 objl(10)执行一次构造函数, 0bj2(O)也执行一次构造函数;obi3(0bjl)以 obil作为参数执行一次构造函数; fun(obj3)中的 temp(p)将执行一次构造函数,而 fun本身是以按值传递参数,形参在 fun函数内也要分配独立的空间,所以也要执行一次构造函数,其返回结果也是 TestClass类型的,同样需要执行一次构造函数,所以一共要执行 4次。 33 【正确答案】
21、C 【试题解析】 ofstream outf(“TEST DAT”, ios base: app);是以 ios base: app方式打开文件,若文件存在,将文件指针定位于文件尾。若文件不存在,建立一个新文件。 34 【正确答案】 D 【试题解析】 C+中的析构函数是类中的一种特殊的成员函数,它用来完成对象删除前的一些清理工作。析构函数不指定返回值类型。析构函数没有参数,同时不能重载。 35 【正确答案】 D 【试题解析】 在 C+中的成员函数前加上 virtual修饰,就把该函数声明为虚函数。虚函数可以是另一个类的友元函数,但不得是静态成员函数。 36 【正确答案】 B 【试题解析 】 对
22、象指针存放的是对象的地址,要访问对象指针所指向对象的成员。可以通过两种方式。 (*指针 )成员,或者是指针 -成员。 37 【正确答案】 B 【试题解析】 C+在重载运算符时,必须符合以下的条件: 不可以重载内置的C+数据类型 (如 int, double等类型 )运算符的含义; 不可以定义 C+中没有的运算符; 不可以改变重载运算符的优先级与操作数的个数; 有些运算符不能被重载,例如域运算符 (: ),条件运算符 (?: )等,具体哪些运算符不能被重载与编译器有关。 38 【正确答案】 B 【试题解析】 B)中由于有两个参数,所以其调用了第二个构造函数,第二个构造函数的两个缺省参数,在调用时
23、,实参会按从左到右的顺序传给形参,所以第二个参数 “11101111155”会传递给形参 ge,而原型中的 ge为字符型,实参为指向字符的指针,所以在编译时会出现错误。 A)与 C)都能够正确的实现参数的传递。对于 D),由于在创建 TestClass的实例 myObi时,没有参数,所以其调用了第一个构造函数。 39 【正确答案】 B 【试题解析】 本题考查的是输入输出操作符。使用输入输出操作符 setw,可 以控制输入输出宽度。 40 【正确答案】 D 【试题解析】 C+中,不允许声明类成员变量的时候进行初始化,而在新的ANSI C+标准中,可以对常整型数值在定义时进行初始化,所以语句 4是
24、错的。 二、基本操作题 41 【正确答案】 (1)this i=i+1;或 TestClass: i=i+1;或 (*this) i=i+1; (2)TestClass print(0); (3)couti=i+1; ”或 “TestClass: i=i+l; ”或 “(*this) i=i+1; ”。 (3)主函数中通过 “tout1 n=1 计算公式: n!=1 公式分为参数 n是 1和大于 1的两种情况,例如: 1的阶乘 1!=1; 5的阶乘 5 1=54321。 解题思路 (1)进入 funl函数,根据前面的定义,它对阶乘算法的实现可以分为 三种情况,一是当 n小于或等于 0时,返回
25、0即可;二是当 n大于 1时应该用什么程序来实现阶乘的计算;三是当 n=1时,函数直接返回 1即可。 (2)计算 n!的值,先定义一个放阶乘值的变量 res,初值为 1,通过循环的方法,用累乘器 “res*=i; ”实现 n!。 四、综合应用题 43 【正确答案】 (1)将 “class TestClassB: ”补充完整为: class TestClassB: virxual public TestClassA (2)将 “class TestClassC: ”补充完整为: class TestClassC: virtual public TestClassA (3)将 “class Tes
26、tClassD: ”补充完整为: class TestClassD: public TestClassB,public TestClassC (4)添加语句: TestClassA: fun(); TestClassB: fun(); TestClassC: fun(); 【试题解析】 在 VC环境下打开程序,根据题干给出的几条功能要求,对程序中给出注释下的内容逐个补全或修改。从已定源程序的 main主函数开始 入手,可以看出程序通过调用类和函数 fun实现各种输出操作。 解题思路 (1)题目 1要求 “完成类 B虚继承于 A”。在 C+中,声明虚基类的一般形式为:class派生类名: vir
27、tual继承方式基类名,由题目知道 TestClassA为基类,TestClassB为派生类,所以第 1个标识下修改为 “class TestClassB: virtual public TestClassA”。 (2)同 (1),题目 2和题目 3中要求的标识 2和 3下的语句修改为 “class TestClassC: viitual public TestClassA”和 “classTestClassD: public TestClassB,public TestClassC”。 (3)题目 4要求 “函数 fun通过调用基类的 fun,完成所输出的内容 ”。在 C+中调用基类的成员函数,要使用作用域限定符 “: ”,类名 A:函数 fun,就是调用类A的函数: fun,根据题目中的要求补全对类 TestClassA、 TestClassB以及TestClassC中的 fun函数,即 “TestClassA: fun(); TestClassB: fun();TestClassC: fun(); ”。