1、国家二级( C+)笔试模拟试卷 189及答案与解析 1 算法的有穷性是指 ( )。 ( A)算法程序的长度是有限的 ( B)算法程序所处理的数据量是有限的 ( C)算法程序的运行时间是有限的 ( D)算法只能被有限的用户使用 2 以下描述中,不是线性表顺序存储结构特征的是 ( ) ( A)不便于插入和删除 ( B)需要连续的存储空间 ( C)可随机访问 ( D)需另外开辟空间来保存元素之间的关系 3 按照 “先进后出 ”原则组织数据的数据结构是 ( )。 ( A)队列 ( B)栈 ( C)舣向链表 ( D)二叉树 4 在三级模式之间引入两层映像,其主要功能之一是 ( )。 ( A)使数据与程序
2、具有较高的独立性 ( B)使系统具有较高的通道能力 ( C)保持数据与程序的一致性 ( D)提高存储空间的利用率 5 自然连接 (Naturaljoin)是一种特殊的等值连接,下列哪个 (些 )是它满足下面的条件( )。 、两关系间有公共域 、通过公共域的等值进行连接 、可进行逆运算 ( A) 和 ( B) 和 ( C) 和 ( D) 、 和 6 已知一棵二叉树的先根序列为 ABCDEFK,中根序列为 DGBAFCK,则结点的后根序列为 ( ) ( A) ACFKDBG ( B) GDBFKCA ( C) KCFAGDB ( D) ABCDFKG 7 深度为 6的满二叉树中,度为 2的结点个数
3、为 ( )。 ( A) 31 ( B) 32 ( C) 63 ( D) 64 8 设有关键码序列 (Q, G, M, Z, A, N, B, P, X, H, Y, S, T, L, K, E),采用堆排序法进行排序,经过初始建堆后关键码值 A在序列中的序号是 ( )。 ( A) 1 ( B) 4 ( C) 8 ( D) 12 9 设 R是一个 2元关系, S是一个 3元关系,则下列运算中正确的是 ( )。 ( A) R-S ( B) RS ( C) RS ( D) R S 10 下列工具中为需求分析常用工具的是 ( )。 ( A) PAD ( B) PFD ( C) N-S ( D) DFD
4、 11 下列语句中,错误的是 ( )。 ( A) const int buffer=-256; ( B) const int temp; ( C) const double *point; ( D) const double *rt=new double(5.5); 12 下列变量名中,合法的 ( )。 A) B) C) D) ( A) CHINA ( B) byte.size ( C) double ( D) A+a 13 在进行任何 C+流的操作后,都可以用 C+流的有关成员函数检测流的状态:其中只能用于检测输入流状态的操作函数名称是 ( )。 ( A) fail ( B) eof ( C
5、) bad ( D) good 14 对 于浯句 cout end1 x;中的各个组成部分,下列叙述中错误的是 ( )。 ( A) “cout”是 个输出流对象 ( B) “end1”的作用是输出回车换行 ( C) “x”是 个变量 ( D) “ ”称作提取运算符 15 以下程序的输出结果是 ( )。 #include iostream.h main() int m=5; if(m+ 5) cout m; else cout m-; ( A) 7 ( B) 6 ( C) 5 ( D) 4 16 阅读下面的程序: #include iostream.h void main() int x; ci
6、n x; if(x+ 5) cout x end1; else cout x- end1; 如果两次执行上述程序,且键盘输入分别为 4和 6,则输出结果分别是 ( )。 ( A) 4, 6 ( B) 3, 6 ( C) 4, 7 ( D) 5, 7 17 关于 this指针的说法不正确的是 ( )。 ( A)不能在程序中修改 this指针 ( B) this指针可以给其他指针赋值,但不能修改 this指针 ( C)静态成员函数中没有 this指针 ( D) this指针可以被赋值 18 ( )使一个函数可以定义成对许多不同数据类型完成同一个任务。 ( A)函数模板 ( B)重载函数 ( C)递
7、归函数 ( D)模板函数 19 有如下程序: #include iostream using namespace std; int i=1; class Fun public: static int i; int value()return i-1; int value()constreturn i+1; ; int Fun:i=2; int main() int i=3; Fun fun 1; const Fun fun2; _ return 0; 若程序的输出结果是: 123 则程序中横线处的语句是 ( )。 ( A) cout fun1.value() Fun:i fun2.value(
8、); ( B) cout Fun:i fun1.value() fun2.value(); ( C) count fun.value() fun2.value() Fun:i; ( D) cout fun2.value() Fun:i fun1.value(); 20 下列对重载函数的描述中, ( )是错误的。 ( A)重载函数中不允许使用默认参数 ( B)重载函数中编译是根据参数表 进行选择 ( C)不要使用重载函数来描述毫不相干的函数 ( D)构造函数重载将会给初始化带来多种方式 21 有如下程序: #include iostream using namespace std; class
9、A public: A()cout “A“; ; class Bpublic:B()cout “B“; ; class C:public A B b; public:C()cout “C“; ; int main() C obj; return 0; 执行后的输出结果是 ( )。 ( A) CBA ( B) BAC ( C) ACB ( D) ABC 22 下面程序的输出结果是 ( )。 #include iostream.h #include“string.h“ void main() char a=“Hello Test“,b=“Test“; strcpy(a,b); cout a end
10、1; A) B) C) D) ( A) Hello ( B) Test ( C) Hello Test ( D) Hello Test HelloTest 23 如下程序: #include iostream.h void main() char str25=“1234“,“5678“),*p2; int i,j,s=0; for(i=0;i 2;i+)pi=stri; for(i=0;i2;i+) for(j=0;pij 0;j+=2) s=10*s+pij-0; cout s; 该程序的输出结果是 ( )。 ( A) 1357 ( B) 2468 ( C) 3556 ( D) 23678
11、24 以下程序的输出结果是 ( )。 #include iostream using namespace std; void fun(char*q) +q; cout *q end1; main() static char*s=“HI“,“HELL0“,“TEST“; char*p; p=s; fun(p); system(“PAUSE“); return 0; ( A)为空 ( B) HI ( C) HELL0 ( D) TEST 25 下列程序用来判断数组中特定元素的位置所在,则输出结果为 ( )。 #include conio.h #include iostream.h int fun(
12、int*p,int n,int*j) int i; *j=0; for(i=0;i n;i+) if(p*j pi)*j=i; return p*j; void main() int a10=1,3,9,0,8,7,6,5,4,2)j;int j; fun(a,10, cout j , aj; ( A) 2, 9 ( B) 3 ( C) 9 ( D) 3, 9 26 以下程序的正确运行结果是 ( )。 #include iostream.h int fun(int); void main() int a=2,i; for(i=0;i 3;i+) cout fun(a) end1; couten
13、d1; int fun(int a) int b=0; static int c=3; b+;c+; return(a+b+c); ( A) 4, 5, 6 ( B) 6, 7, 9 ( C) 7, 8, 9 ( D) 7, 7, 7 27 有以下程序: #include iostream using namespace std; int a; int fun(); int main() externint a; int b; a=10; b=fun(); cout b end1; return 0; int fun() extern int a; return(10*a); 其程序运行后的输
14、出结果是 ( )。 ( A) 10 ( B) 1 ( C) 100 ( D) 1000 28 静态数据成员在 ( )进行初始化。 ( A)成员函数列表 ( B)类体外 ( C)构造函数 ( D)成员函数 29 有如下程序: #include iostream using namespace std; class TestClass1 public: TestClass1 ()cout “TestClass1“; TestClass1 ()cout “TestClass1“; ; class TestClass2:public TestClass1 TestClass1 *p; public:
15、Testclass2()cout “TestClass2“;p=new TestClass1(); TestClass2()cout “TestClass2“;delete p; ); int main() TestClass2 obj; return 0; 执行这个程序的输出结果是 ( )。 ( A) TestClass2TestClass1TestClass1 TestClass1 TestClass2 TestClass1 ( B) TestClass1TestClass2TestClass1 TestClass2 TestClass1 TestClass1 ( C) TestClass
16、2TestClass1TestClass1 TestClass2 TestClass1 TestClass1 ( D) TestClass1TestClass2TestClas1 TestClass1 TestClass2 TestClass1 30 有如下类说明: class TestClass int x; public: TestClass(int n)x=n; ; class TestClass1:public TestClass int y; public: TestClass1(int a,int b); ; 在构造函数 TestClass1的下列定义中,正确的是 ( )。 ( A
17、) TestClass1:TestClass1 (int a,int b):x(a),y(b) ( B) TestClass1:TestClass1 (int a,int b):TestClass(a),y(b) ( C) TestClass1:TestClass1 (int a,int b):x(a),TestClass1(b) ( D) TestClass1:TestClass1 (int a,int b):TestClass(a),TestClass1(b) 31 在声明派生类时,如果不显示地给出继承方式,缺省的类继承方式是私有继承private。已知有如下类定义: class Test
18、Class protected: void fun() ; class TestClass1:TestClass; 则 TestClass类中的成员函数 fun(), TestClass1类中的访问权限是 ( )。 ( A) public ( B) private ( C) protected ( D) virtual 32 下面叙述错误的是 ( ) ( A)对基类成员的访问能力在 private派生类中和 public派生类中是相同的 ( B)基类的 private成员在 public派生类中不可访问 ( C)基类中的 public成员在 protected派生类中是 protected的
19、( D)基类中的 public成员在 protected派生类中仍然是 public的 33 在 C+中,实现封装性需借助于 ( )。 ( A)枚举 ( B)类 ( C)数组 ( D)函数 34 下列关于类和对象的叙述中,错误的是 ( ) ( A)一个类只能有一个对象 ( B)对象是类的具体实例 ( C)类是对某一类对象的抽象 ( D)类和对象的关系是一种数据类型与变量的关系 35 下列关于 C+函数的说明中,正确的是 ( )。 ( A)内联函数就是定义在另一个函数体内部的函数 ( B)函数体的最后一条语句必须是 return语句 ( C)标准 C+要求在调用一个函数之 前,必须先声明其原型
20、( D)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式 36 数据结构分为线性结构和非线性结构,带链的队列属于 _。 37 队列是限定在表的一端进行插入和在另一端进行删除操作的线性表。允许插入的一端称作 _。 38 一棵二叉树第 6层 (根结点为第一层 )的结点最多为 _个。 39 给定一个关键字序列 (24, 19, 32, 43, 38, 6, 13, 22),进行快速排序,扫描一趟后的结果是 _。 40 在一个容量为 24的循环队列中,若头指针 front=8,尾指针 rear=3,则该循环队列中共有 _个元素。 41 若有函数 fun(x,y),并且已经使函数指针变量 p
21、指向函数 fun,则使用 p调用函数 fun的方法是 _。 42 以下程序的运行结果是 _。 #include iostrearn.b fun(int a,int b) int m=0,i=2; i+=m+1; m=i+a+b; return m; void main() int k=4,m=1,p; p=fun(k,m);cout p end1; 43 下列程序的输出结果为: 0bject id=0 0biect id=1 请将程序补充完整。 #include iostream using namespace std; class Point public: Point(int xx=0,i
22、nt yy=0)X=xx;Y=yy;countP+; Point()countP-; int GetX()return X; int GetY()return Y; static void GetC()cout “0bject id=“ countP end1; private: int X,Y; static int countP; ; _/静态数据成员的初始化 int main() Point:GetC(); Point A(4,5); A.GetC(); return 0; 44 有以下程序: #include iostream using namespace std; class My
23、Class public: static int s; MyClass(); void SetValue(int val); ; int MyClass:s=0; MyClass:MyClass() s+; void MyClass:SetValue(int val) s=val; int main() MyClass my3,*p; p=my; for(int k=0;k 3;k+) P- SetValue(k+1); p+; cout MyClass:s end1; return 0; 运行后的输出结果是 _。 45 operator是运算符重载时必须使用的关键字,它和被重载的运算符连在一
24、起,作为 运算符函数的专用函数名,务必把该函数说明为 _的。 46 若有定义语句: int*a,b;,则变量 b的数据类型是 _。 47 若要访问指针变量 p所指向的数据,应使用表达式 _。 48 已知有函数 f的定义如下: int f() static int s=0; s+=2; return s; 则在某程序中第二次执行函数调用语句 f();时,函数 f的返回值是 _。 49 有如下定义: class MA int value; public: MA(int n=0):value(n) ; MA*ta,tb; 其中 MA类的对象名标识符是 _。 50 Staff类含有 int型数据成员
25、ID,两个 Staff对象相等是指它们的 ID相同。下面的函数重载了运算符 “=”,它用来判断两个 Staff对象是否相等,相等时返回true,否则返回 false。请将横线处缺失部分补充完整。 bool Staff:Staff=(const Staff 国家二级( C+)笔试模拟试卷 189答案与解析 1 【正确答案】 C 2 【正确答案】 D 【试题解析】 线性表的顺序存储是用一片连续的空间来存放数据元素,其特点是逻辑上相邻的元素在物理位置上也相邻。数据元素之间逻辑上的先后关系自动隐含在物理位置的相邻元素之中,因此不需要另外开辟空间来保存元素之间的关系。 3 【正确答案】 B 【试题解析】
26、 栈是一种特殊的线性表,其插入和删除运算都只在线性表的一端 进行,而另一端是封闭的。进行插入、删除的一端称为栈顶,封闭的一端称为栈底。栈顶元素是最后被插入的元素,而是最后被删除的,是按先进后出的原则组织数据的。 4 【正确答案】 A 【试题解析】 数据库管理系统在数据库的三级模式之间提供了两层映像,保证了数据库中数据的较高的逻辑独立性和物理独立性。使系统具有较高的通道能力和提高存储空间的利用率是操作系统的职能,而不是数据库管理系统的职能。在数据库系统中没有 “数据和程序一致性 ”这一概念。 5 【正确答案】 B 【试题解析】 自然连接 (Naturaljoin)是一种特殊的等值连接,它满足下面
27、的条件: 两关系间有公共域; 通过公共域的等值进行连接。 6 【正确答案】 B 【试题解析】 通过两种树的遍历序列来推断第三种树的遍历时反复利用前序和中序遍历的性质,就可以确定二叉树,具体:前序遍历的第一个结点 A为树的根结点。中序遍历中 A左边的结点在 A的左子树中, A的右边的结点在 A的右子树中。再分别对 A的左右子树进行前面步骤重复处理,直到每个结点都找到正确的位置。 7 【正确答案】 A 【试题解析】 本题要用到二叉树的两个性质 定义: 二叉树的性质 2:在二叉树的第 k层上,最多有 2k-1(k1,其中 k为层数 )个结点。本题中第 6层的结点数=26-1=32个。这也是叶子结点最
28、大数。 二叉树的性质 3:在任意一棵二叉树中,叶子结点总是比度为 2的结点多一个。本题中,叶子结点最多为 32个,度为2的结点数为 32-1=31个。 知识拓展 “满二叉树 ”是一种特殊的二叉树,指的是除了最后一层外,其他每一层的结点都有两个子结点 (左、右子树配齐 ),也就是说每一层的结点数都是最大数(每 k层有 2k-1个结点,且深度为 m的满二叉树有 2m-1个结点 )。 8 【正确答案】 A 9 【正确答案】 B 10 【正确答案】 D 11 【正确答案】 B 12 【正确答案】 A 13 【正确答案】 B 【试题解析】 可以用文件流对象的成员函数来判别文件流当前的状态: fail,刚
29、进行的操作失败时返回 true,否则返回 false; eof,进行输入操作时,若文件到达文件尾返回 true,否则返回 false; bad,如果进行了非法操作返回 true,否则返回false; good,刚进行的操作成功时返回 true,否则返回 false。 14 【正确 答案】 D 15 【正确答案】 B 16 【正确答案】 D 【试题解析】 此题首先读入数值 4赋给变量 x,因为 x+ 5不成立,因为 “+”后缀,之后 x的值变为 5,执行语句 cout x- end1;输出: 5,之后 x的值变为 4。当读入的数值是 6时,因为 x+ 5成立,所以执行语句 cout xend1;
30、输出 7。 17 【正确答案】 D 18 【正确答案】 A 【试题解析】 函数模板是一系列相关函数的模型或样板,这些函数的源代码形式相同,只是所针对的数据类型不同。因此,函数模 板使一个函数可以定义成对许多不同数据类型完成同一个任务。 19 【正确答案】 A 【试题解析】 此题因为定义的变量 i是 static类型的 (main()函数内部的 i只是一个局部变量 ),所以,选项 A)中 fun1.value()的返回值是 1, Fun:i引用的是外部变量会输出 2; fun2.value();会调用常成员函数 int valueoconstfrerun i+1; 使得外部静态变量 i的值增加为
31、 3,故输出 3。 20 【正确答案】 A 【试题解析】 选项 A)中,重载函数中是允许使用默认参数 的;为了使重载函数有意义,不要使用重载函数来描述毫无相干的函数;重载函数中编译是根据参数表进行选择,包括参数的个数和类型。 21 【正确答案】 D 22 【正确答案】 B 23 【正确答案】 A 【试题解析】 程序中的 “for(i=0;i 2;i+)pi=stri; ”语句将 str中的值赋值给指针数组 p。在接下来的二重 for循环中,跳取 “j+=2”, p指针指向的值即 “1”,“3”, “5”, “7”。在分别对字符到整型的转换,即减去字符 0,然后依次转换为千位,百位,十位,个位
32、“10%” 操作输出接型 s,即 “1357”。 24 【正确答案】 C 【试题解析】 由程序 main主函数入手,调用 fun函数,在 fun函数中执行 “cout *q end1;”语句实现程序输出。主函数中变量 char*s为指针数组,char*p表示 p指向的字符指针数据。 *p就代表 p指向的字符指针。语句 “p=s; ”表明 p指向字符指针 s,而 *p则是 s中的第一个字符串 “HI”。主函数将变量 p传值给函数 fun(char*q)中的 q,在函数体内部首先执行 “+q”语句,就是将 q的指针指向 s中的下一个字 符串,即 “HELL0”,所以输出语句 “cout *qend
33、1; ”输出该字符串值。 25 【正确答案】 A 【试题解析】 由程序中的主函数 main入手,调用 fun函数。其中第一个实参为数组 a的名字,数组名作为实参,传递的是数组的起始地址。所以在 fun函数中指针 D指向了数组的第一个元素 a0。另外实参整型 j传递的是引用,也就是 j的地址。在 fun函数中在 for循环中,依次将当前元素 pi与 j指针值为标识的 p*j进行比较,取较大的。最后循环后的结果就是 p*j存放数组中的最大值,并且指针 j为该值的标识位。可以看出数组的最大值是 9标识位为 2。 26 【正确答案】 C 27 【正确答案】 C 【试题解析】 由主函数 main入手,首
34、先定义外部变量 a,它的作用域为从变量的定义处开始,到本程序文件的末尾,赋值为 10。然后调用 fun函数,在 fun函数中计算 10*a,其中 a的作用域为到文件结尾,所以这里的 a为 10,即 10*10。 28 【正确答案】 B 29 【正确答案】 B 【试题解析】 派生类中构造函数的执行顺序是:先调用基类构造函数,对基类数据成员初始化,然后调用子对象 构造函数,对子对象数据成员初始化;最后执行派生类构造函数本身,对派生类数据成员初始化。由主函数 main入手,首先定义了一个 TestClass2对象 obj。其中 TestClass2公共继承 TestClass1,对象 obj可以访问
35、 TestClass1中的公有成员函数。 TestClass2中定义了一个 TestClass1的指针p,给 p分配新空间,即指向类 TestClass1,输出 “TestClass1”。在 TestClass2的构造函数中首先输出 “TestClass2”,并在 TestClass1构造函数中输出“TestClass1”。 TestClass2析构函数中输出 “ TestClass2”,删除指针 p,输出 “TestClass1”。析构 TestClass1输出 “ TestClass1”。 30 【正确答案】 B 【试题解析】 题目中程序 TestClass为基类, TestClass1为
36、派生类,派生类构造函数的一般形式为:派生类构造函数名 (总参数类表 ):基类构造函数名 (参数列表 )派生类中新增数据成员初始化语句 。派生类 TestClass1的基类函数名为TestClass,总参数为 int a, int b,所以选择 B)。 31 【正确答案】 B 32 【正确答案】 D 33 【正确答案】 B 【试题解析】 此题考查的是 C+语言中对象概念的理解。所谓封装性是指将数据和算法捆绑成一个整体,这个整体就是对象。 C+语言通过建立用户定义类型 “类 ”来支持封装性和信息隐藏。 34 【正确答案】 A 35 【正确答案】 C 【试题解析】 此题考查的是有关函数的概念。内联函
37、数是在函数定义之前加关键字 inline来声明的函数,而不是定义在另一个函数体内部的函数,故选项 A)错误;无返回值的函数 在执行完最后一条语句后,会自动返回而不必加入 return语句,故选项 B)错误;如果函数只是返回值类型不同,而其他完全相同,则不能作为函数重载来使用。 36 【正确答案】 线性结构 【试题解析】 一个数据结构是线性结构还是非线性结构,判断依据是数据结构前后件关系的复杂程度,而与其所使用的存储结构是没有关系的。在一个非空的队列中,每一个元素只有一个前件和后件,因此它属于线性结构。 37 【正确答案】 队尾 38 【正确答案】 32 39 【正确答案】 22, 19, 13
38、, 6, 24, 38, 43, 32 40 【正确答案】 19 41 【正确答案】 (*p)(x,y) 【试题解析】 一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址 (或称入口地址 )赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为 “函数指针变量 ”。函数指针变量定义的一般形式为:类型说明符 (*指针变量名 )();其中 “类型说明符 ”表示被指函数的返回值的类型。 “(*指针变量名 )”表示 “*”后面的变量是定义的指针变 量。最后的空括号表示指针变量所指的是一个函数。
39、 42 【正确答案】 8 43 【正确答案】 int Point:countP=0; 44 【正确答案】 3 45 【正确答案】 public 46 【正确答案】 int或整型 47 【正确答案】 *p 48 【正确答案】 4 【试题解析】 此题考查的是局部静态变量。局部静态变量是在函数或语句块中以static关键字定义的局部变量。其作用域和普通局部变量一样只在定义函数或语句块中有效,但生存周期却是和全局变量一样,一直延续到程 序结束。故第一次调用 f(),局部静态变量 s变为 2。第二次调用 f(), s又自增 2,所以函数 f的返回值是 4。 49 【正确答案】 tb 【试题解析】 此题考查的是对象的定义。对象的定义格式如下:类名对象名 (参数表 ):所以题目中的 tb是对象名标识符,而 ta被定义成类 MA的指针,故空格处应填 tb。 50 【正确答案】 ID=s.ID或 s.ID=ID或 this- ID=s.ID或 s.ID=this- ID 【试题解析】 此题考查运算符的重载。运算符 “=”作为成员函数重载,所以横线处填入的表达式 应该是对象本身 ID与对象 s.ID的比较表达式。