1、国家二级( C+)机试模拟试卷 14及答案与解析 一、选择题 1 下列叙述中正确的是 ( )。 ( A)对长度为 n的有序链表进行查找,最坏情况下需要的比较次数为 n ( B)对长度为 n的有序链表进行对分查找,最坏情况下需要的比较次数为 (n 2) ( C)对长度为 n的有序链表进行对分查找,最坏情况下需要的比较次数为 (log2n) ( D)对长度为 n的有序链表进行对分查找,最坏情况下需要的比较次数为 (nlog2n) 2 算法的时间复杂度是指 ( )。 ( A)算法的执行时间 ( B)算法所处理的数 据量 ( C)算法程序中的语句或指令条数 ( D)算法在执行过程中所需要的基本运算次数
2、 3 软件按功能可以分为应用软件、系统软件和支撑软件 (或工具软件 ),下面属于系统软件的是 ( )。 ( A)编辑软件 ( B)操作系统 ( C)教务管理系统 ( D)浏览器 4 软件 (程序 )调试的任务是 ( )。 ( A)诊断和改正程序中的错误 ( B)尽可能多地发现程序中的错误 ( C)发现并改正程序中的所有错误 ( D)确定程序中错误的性质 5 数据流程图 (DFD)是 ( )。 ( A)软件概要 设计的工具 ( B)软件详细设计的工具 ( C)结构化方法的需求分析工具 ( D)面向对象方法的需求分析工具 6 软件生命周期可分为定义阶段、开发阶段和维护阶段。详细设计属于 ( )。
3、( A)定义阶段 ( B)开发阶段 ( C)维护阶段 ( D)上述 3个阶段 7 数据库管理系统中负责数据模式定义的语言是 ( )。 ( A)数据定义语言 ( B)数据管理语言 ( C)数据操纵语言 ( D)数据控制语言 8 在学生管理的关系数据库中,存取一个学生信息的数据单位是 ( )。 ( A)文件 ( B)数据库 ( C)字段 ( D)记录 9 数据库设计中,用 E-R图来描述信息结构但不涉及信息在计算机中的表示,它属于数据库设计的 ( )。 ( A)需求分析阶段 ( B)逻辑设计阶段 ( C)概念设计阶段 ( D)物理设计阶段 10 有两个关系 R和 T如下所示: 则由关系 R得到关系
4、 T的操作是 ( )。 ( A)选择 ( B)投影 ( C)交 ( D)并 11 下列特征中不是面向对象方法的主要特征的是 ( )。 ( A)多态性 ( B)继承 ( C)封装性 ( D)模块化 12 下列 选项中不符合良好程序设计风格的是 ( )。 ( A)源程序要文档化 ( B)数据说明的次序要规范化 ( C)避免滥用 goto爵句 ( D)模块设计要保证高耦合、高内聚 13 设计数据库的存储结构属于 ( )。 ( A)需求分析 ( B)概念设计 ( C)逻辑设计 ( D)物理设计 14 相对于数据库系统,文件系统的主要缺陷有数据关联差、数据不一致性和( )。 ( A)可重用性差 ( B)
5、安全性差 ( C)非持久性 ( D)冗余性 15 设关系 R和关系 S的元数分别是 3和 4,元组数分别 为 5和 6,则 R与 S自然连接所得到的关系,其元数和元组数分别为 ( )。 ( A) 7和 11 ( B) 12和 30 ( C) 7和 30 ( D) =7和 =30 16 下列关于函数的描述中,错误的是 ( )。 ( A)函数可以没有返回值 ( B)函数可以没有参数 ( C)函数可以是一个类的成员 ( D)函数不能被定义为模板 17 若 MyClass是一个类名,其有如下语句序列: MyClass c1, *c2; MyClass*c3=new MyClass; MyClass&c
6、4=c1: 上面的语句序列所定义的类对象的个数是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 18 下列关于继承方式的描述中,错误的是 ( )。 ( A)如果不显式地指定继承方式,默认的继承方式是私有 (private) ( B)采用公有继承方式时,基类中的公有成员在派生类中仍然是公有成员 ( C)采用保护继承方式时,基类中的保护成员在派生类中仍然是保护成员 ( D)采用私有继承方式时,基类中的私有成员在派生类中仍然是私有成员 19 将前缀运算符 “-”重载为非成员函数, 下列原型中,能正确用于类中说明的是( )。 ( A) Decr&operator-int); ( B
7、) Decr operator-(Decr&, int); ( C) friend Decr&cperator-(Decr&); ( D) friend Decr operacor-(Decr&, int); 20 若 MyTemp是一个具有虚拟类型参数的类模板,且有如下语句序列: MyTempp2; MyTemp long p32; 编译系统在处理上面的语句 序列时,所生成的模板 MyTemp的实例的个数是( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 21 在 C+中, cin是一个 ( )。 ( A)类 ( B)对象 ( C)模板 ( D)函数 22 在下列字符中,不允
8、许作为 C+标识符的是 ( )。 ( A) b ( B) B ( C) _ ( D) 2 23 下列叙述中,错误的是 ( )。 ( A) false是一个逻辑型常量 ( B) “b”是一个字符型常量 ( C) 365是一个 int常量 ( D) 3 1415926是一个 double常量 24 若 x和 y是程序中的两个整型变量,则下列 if语句中正确的是 ( )。 ( A) if(x=0)y=1; else y=2; ( B) if(x=0)then y=1 else y=2 ( C) if(x=0)y=1 else y=2; ( D) if x=0 y=1 else y=2; 25 要定义
9、整型数组 x,使之包括初值为 0的 3个元素,下列语句中错误的是 ( )。 ( A) int x3=0, 0, 0; ( B) int x=0; ( C) static int x3: 0; ( D) int x=0, 0, 0; 26 关于函数中的 ,下列表述中错误的是 ( )。 ( A) 中有可能包含关键字 int ( B) 中有可能包含自定义标识符 ( C) 中有可能包含字符 * ( D) 中可能包含 27 要定义一个引用变量 p,使之引用类 MyClass的一个对象,正确的定义语句是( )。 ( A) MyClass p=MyClass; ( B) MyClass p=new MyCl
10、ass; ( C) MyClass&p=new MyClass ( D) MyClass a, &p=a; 28 有如下两个类定义: class XX private: double x1; protected: double x2; public: double x3; ; clase YY: protected XX private: double y1; protected: double y2; public: double y3; ; 在类 YY中保护成员变量的个数是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 29 下列关于运算符重载的描述中,错误的是 ( )
11、。 ( A)可以通过运算符重载在 C+中创建新的运算符 ( B)赋值运算符只能重载为成员函数 ( C)运算符函数重载为类的成员函数时,第一操作参数就是该类对象 ( D)重载类型转换运算符时不需要声明返回类型 30 下列关于类模板的描述中,错误的是 ( )。 ( A)类模板的成员函数都是模板函数 ( B)可以为类模板参数设置默认值 ( C)类模板描述了一组 类 ( D)类模板中只允许有一个类型参数 31 下列控制格式输入输出的操作符中,能够设置浮点数精度的是 ( )。 ( A) setprecision ( B) setw ( C) setfill ( D) showpoint 32 下列程序段
12、中包含 4个函数,其中具有隐含 this指针的是 ( )。 int funl(); class Test public: int fun2(); friend int fun3(); static int fun4(); ; ( A) funl ( B) fun2 ( C) fun3 ( D) fun4 33 有如下程序: #include using namespace std; class Test public: Test() Test(const Test& t)cout using namespace std; class A public: A(int i=0): r1(i) vo
13、id print()cout Using namespace std; class Base public: Base(int x=0): valB(x)cout using namespace std; class B public: B(int xx): x(xx)+count; x+=10; virtual void show()const cout void main() int d1: int d2; int d3: coutd1d2; * * * * * * * * error* * * * * * * * d3=(d1(d2)?d1: d2; tout #define N 10
14、void sort(int AN, int n) int main() int AN=-72, 54, -6, 7, 18, 102, 0, 4, -11, 1; sort(A, 10); for(int i=0; i(sizeof(A) sizeof(int); i+) cout class BA int a; public: * * * * * * * * 1 * * * * * * * * int beta()return a; ; class PA1: public BA int b; public: * * * * * * * * 2 * * * * * * * * int getb
15、()return b; ) ; class PA2: public PA1 int C; public: * * * * * * * * 3 * * * * * * * * void show() * * * * * * * * 4 * * * * * * * * ; void main() PA2 a(7, 5, 10); cout(模板函数形参表 )函数定义体 , ”其中 是由一个或多个 组成,每个 可以有这几种形式: typename, class, ;前两种是等价的 typename和 class可以互换,它们的参数为虚拟类型参数;最后一种的参数是常规参数。 17 【正确答案】 B 【
16、试题解析】 首先定义对象的格式: (存储类型 )(, , );第一句定义了对象 c1和指针对象 c2,而 MyClass*c3=new MyClass是 Java里的定义方式, MyClass&c4=c1这种定义方式也是不对的。 18 【正确答案】 D 【试题解析】 采用私有继承方式时,基类中私有成员在派生类中是不可访问的成员。 19 【正确答案】 C 【试题解析】 把 “-”运算符重载为非成员 (友元 )函数格式: “friendoperator-()”是前缀 的格式; friendoperator-(int)是后缀的格式。当然也可以有参数如题中 C选项所示。 20 【正确答案】 B 【试题
17、解析】 类模板是一系列相关类的模板或样板,成员函数的源代码形式相同,不同的是所针对的类型不一样,如题中的一个 double类型,一个 long类型;类模板中数据类型本身是它的参数,它是类的生成器。 21 【正确答案】 B 【试题解析】 C+提供了一套输入输出流类的对象,它们是 cin、 tout和cerr,对应 C语言中的 3个文件指针 stdin、 stdout、 stderr,分别指向终端输入、终端输出和标准出错输出 (也从终端输出 )。 cin与 一起完成输入操作, cout、cerr与 )else”注意语句结束要以分号结尾,对照题中选项可知 A正确。 25 【正确答案】 D 【试题解析
18、】 选项 D中整型数组 x的第一个元素是 NULL不是 0,故选 D。 26 【正确答案】 B 【试题解析】 又称函数类型,表示一个函数所计算 (或运行 )的结果值类型,这里的类型可以是预定义类型 (如 int)、复合类型 (如 double*)、用户定义类型 (如枚举类 ),若返回值只做更新 (或设置 )等操作,则该函数返回类型为 void类型,函数类型和内置数组不能作为返回类型,但类类型和容器类型可以被直接返回。 27 【正确答案】 D 【试题解析】 选项 A错误不存在这样的定义方式;选项 B定义了一个 MyClass类的对象 p;选项 C是 Java里的定义方式。 28 【正确答案】 C
19、 【试题解析】 派生类从基类保护继承 class YY: protected XX时,基类的公有成员在派生类中变为保护成员,基类的保护成员在派生类中仍然是保护成员;本题中 YY本身有一个保护成员 y2,再加上基类 XX的 x2和 x3,故选 C。 29 【正确答案】 A 【试题解析】 运算符的重载是针对 C+中原有运算符进行 的,不能通过重载创造新的运算符。 30 【正确答案】 D 【试题解析】 类模板是一系列相关类的模板,类成员组成相同,成员函数的源代码形式相同,所不同的是所针对的类型。类模板的成员函数都是模板函数,在用类模板定义对象时,由于没有像函数实参表这样的额外信息渠道,因此无法按函数
20、模板的方式省略模板实参。但可以为类模板的参数设置默认值。由此可知应选D。 31 【正确答案】 A 【试题解析】 setprecision(int)是设置浮点数的精度, setw(int n)是设置输入输出宽度, setfill(char c)设置填充字符, showpoint即使小数部分为 0,也输出以及其后的无效数据 0。 32 【正确答案】 B 【试题解析】 this指针是成员函数所属对象的指针,是指向类对象的地址,是一个隐含的指针,隐含于每个类的非静态成员函数中。 fun1是外部函数, fun3是友元函数, fun4是静态成员函数,故选 B。 33 【正确答案】 C 【试题解析】 本题调
21、用了 fun函数。 34 【正确答案】 D 35 【正确答案】 B 【试题解析】 类 Undergraduate从类 Stadent私有继承,继承方式默认是private。 36 【正确答案】 A 【试题解析】 本题使用析构函数。 37 【正确答案】 B 【试题解析】 抽象类是类中至少有一个纯虚函数,抽象类是用来被继承的,即是用来生成派生类,它本身不能生成实例。 38 【正确答案】 C 【试题解析】 非成员函数一般都是友元函数,相比成员函数第一个操作数是对象本身以 this指针的形式隐含在参数列表中,非成员函数调用必须显式的列出参数;选项 C中没有 MyClock类型,故选 C。 39 【正确
22、答案】 D 【试题解析】 ios_base: binary是作为二进制文件打开, ios_base: out是为输出而打开,故选 D。 40 【正确答案】 B 【试题解析】 本题考查了类的继承。继承有 3种方式, public公有、 private私有和 protected保护,本题都涉及了。本题中类 D公有继承类 B。在类 B中又定义了虚函数,并且有保护类静态类型 count及私有变量 x。主函数中调用类 D,类 D又继承了类 B,经过系统及调用,本题最终结果为 2120。 二、基本操作题 41 【正确答案】 (1)“d3=(d1d2)?d1: d2; ”应改为 “d3=(d1)d2)?d1
23、: d2; ”。 (2)“d3=(d2)?d1 d2: -1; ”应改为 “d3=(d2)?d1 d2: -1; ”。 (3)“d3=(-d1)+(d2+); ”应改为 “d3=(d1+)+(d2-);或 d3=(+d1)+(-d2); ”。 【试题解析】 本题考查了考生对条件表达式和自增自减运算符了解的情况。 d3应为 d1和 d2中较大者的值,所以 “(d1(d2)”应改为 “(d1)d2)”。若 d2不为 0,应返回 d1 d2的值,而不是 d1 d2。第 3处应该输 d1+1d2-1,所以两者的 +、一一应反过来。又因为 d3应该是两者原值之和,所以 +、一一应同时为后缀式或前缀形式。
24、 三、简单应用题 42 【正确答案】 int i, j; for(i=0; i(n-1; i+) for(j=0; j(n-1-i; j+) if(Aj)Aj+1) 如果前面的数比后面的大则进行交换 int t=Aj; 进行交换 Aj=Aj+1; Aj+1=t; 【试题解析】 数组 AN中有 n个数,进行 n-1趟比较,在每一趟比较中两两比较的次数逐渐减少,比如若有 6个数 9, 8, 5, 4, 2, 0。第一次将 8和 9对调,第二次将第 2个数 9和第 3个数 5对调,如此共进行 5次,得到 8-5-4-2-0-9的顺序,可以看到:最大的数 9已 “沉底 ”,成为最下面一个数,而小的数
25、“上升 ”。最小的数 0已向上 “浮起 ”一个位置。经第一趟 (共 5次 )后,已得到最大的数,然后进行第二趟比较,对余下的前面 5个数按上面的方法进行比较,经过 4次比较,得到次大的数 8。如此 进行下去。 可以推知, 6个数要比较 5趟。在第一趟中要进行两两比较 5次,在第二趟中比较 4次, 第 5趟比较 1次。因此设置两层循环,外层循环变量 i从 0变化大到n-1,内层循环变量 j从 0到 n-j,在内层循环体内,比较相邻两数,如果前面比后面的大则交换。在内层循环体内,如果前面的元素比后面的元素大,则用一个临时变量记录前面的第 j个元素,然后将第 j+1个元素赋值给第 j个元素,临时变量
26、值赋给第 j+1个元素,如此完成两个元素的交换。 四、综合应用题 43 【正确答案】 (1)应添加 “BA(int m)a=m; ”。 (2)应添加 “PA1(int m, int n): BA(n)b=m; ”。 (3)应添加 “PA2(int m, int n, int k): PA1(n, k)c=m; ”。 (4)应添加 “coutgeta()“getb()“cend1; ”。 【试题解析】 根据第 1处要求,构造函数的函数名和类名一致,显然 BA构造函数的名称为 BA,在 BA()中通过参数 m完成对成员变量 a的赋值,因此构造函数的名称为 BA(int m),在函数内部对成员 a赋
27、值,故第 1处的语句应添加 “BA(int m)a=m; ”。 根据第 2处的要求,构造函数的形式为 “PA1(int m, int n)”, m赋值给 PA1类成员 b,将 n作为基类 BA构造函数的参数值传入,故第 2处应添加 “PA1(int m,int n): BA(n)b=m; )”。 根据第 3处的要求,函数形式为 PA2(int m, int n, intk),在构造函数中将 m赋值给数据成员 c,将 n和 k分别赋值给基类 PA1构造函数的参数 m和 n,因此第 3处应添加 “PA2(int m, int n, int k): PA1(n, k)c=m; )”。 根据第 4处的要求, PA2类公有派生于 PA1,而 PA1公有派生于 BA,因此在PA2类中可以调用基类的 geta()和 getb()来获得基类私有成员 a和 b,再输出 PA2的私有成员 c即满足要求,因此第 4处应添加“coutgeta()“getb()“cend1; ”。