1、国家二级( C+)笔试模拟试卷 231及答案与解析 1 下列关系运算的叙述中,正确的是 ( A)投影、选择、连接是从二维表行的方向进行的运算 ( B)并、交、差是从二维表的列的方向来进行运算 ( C)投影、选择、连接是从二维表列的方向进行的运算 ( D)以上 3种说法都不对 2 数据结构作为计算机的一门学科,主要研究数据的逻辑结构、对各种数据结构进行的运算,以及 ( A)数据的存储结构 ( B)计算方法 ( C)数据映象 ( D)逻辑存储 3 有如下类定义: class Point private: static int how_many; ; _how_many=0; 要初始化 Point类
2、的静态成员 how_many,在下画线处应填入的内容是 ( A) int ( B) static int ( C) int Point: ( D) static int Point: 4 有如下类声明: class Base protected: int amount; public: Base(int n=0):araount(n) int getAmount( )constretum amount; ; class Derived:public Base protected; int value; public: Derived(int m, int n):value(n1), Base(
3、n) int getData( )constreturn value+amount; ; 已知 x是一个 Derived对象,则下列表达式中正确的是 ( A) x value+x getAmount( ) ( B) x getData( )-x getAmount( ) ( C) x getData( )-x amount ( D) x value+x amount 5 下列叙述中正确的是 ( )。 ( A)一个逻辑数据结构只能有一种存储结构 ( B)逻辑结构属于线性结构,存储结构属于非线性结构 ( C)一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率 ( D)一个逻辑数
4、据结构可以有多种存储结构,且各种存储结构影响数据处理的效率 6 下列叙述 中正确的是 ( )。 ( A)软件测试应该由程序开发者来完成 ( B)程序经调试后一般不需要再测试 ( C)软件维护只包括对程序代码的维护 ( D)以上三种说法都不对 7 用链表表示线性表的优点是 ( A)便于随机存取 ( B)花费的存储空间较顺序存储少 ( C)便于插入和删除操作 ( D)数据元素的物理顺序与逻辑顺序相同 8 下列叙述中正确的是 ( A)在模块化程序设计中,一个模块应尽量多的包括与其他模块联系的信息 ( B)在自顶向下、逐步细化的设计过程中,首先应设计解决问题的每一个细节 ( C)在模块化程序设计中,一
5、个模块内部的控制结构也要符合结构化原则 ( D)在程序设计过程中,不能同时采用结构化程序设计方法与模块化程序设计方法 9 以下程序中函数 scmp的功能是返回形参指针 s1和 s2所指字符串中较小字符串的首地址。 #include string char*scmp(char*s1,char*s2) if(strcmp(s1,s2) 0) return(s1); else retrun(s2); main() int i; char string20,str320; for(i=0; i 3; i+ ( A) abcd ( B) abba ( C) abc ( D) abca 10 下列关系模型
6、中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数的是 ( A)选择 ( B)连接 ( C)投影 ( D)并 11 以下四种说法中,正确的一项是 ( )。 ( A) C+允许在字符串上进行整体操作 ( B)语句: char vn=“Brown“; 将 vn定义成一个有 5个元素的数组,因为“Brown“中含有 5个字符 ( C)对指针只要赋给一个地址值就可以了 ( D)一维的指针数组实际上是一个二维数组 12 下列有关拷贝构造函数的描述中错误的是 ( A)拷贝构造函数是一种构造函数 ( B)拷贝构造函数与一般的构造函数一样,可以设置多个形参 ( C)每一个类中都必须有一个拷贝构造函数
7、 ( D)拷贝构造函数的功能是用一个已知对象去初始化一个正在创建的对象。 13 有以下程序 #include iostream using namespace std; class Complex public: Complex (double r=0, double i =0 :re(r) ,im (i) double real() const return re; double imag() const return im; Complex operator + (Complex c const return Complex(re+c.re, im+c.im); privane: doub
8、le re,im; ; int main Complex a =Complex (1,1)+Complex(5); cout a.real() + a.imag() i endl return 0; 程序执行后的输出结果是 ( A) 6+6i ( B) 6+1i ( C) 1+6i ( D) 1+1i 14 有如下程序: #include iostream using namespace std:class Testpublic: Test() n+=2; Test() n-=3; ; static int getNum() return n;privaue: static int n:;in
9、t Test:n=1;int main() Test* p=new Test; delete p; cout “n=“ Test:getNum() end1; return 0; 执行后的输出结果是 ( A) n=0 ( B) n=1 ( C) n=2 ( D) n=3 15 面向对象程序设计思想的主要特征中不包括 ( A)继承性 ( B)功能分解,逐步求精 ( C)封装性和信息隐藏 ( D)多态性 16 判断 char型变量 c是否为小写字母的正确表达式是 ( )。 ( A) a c z ( B) (c A) int main() int a=1,b; switch(a) case 1:b=
10、30; case 2:b=20; case 3:b=10; default:b=0; cout b endl; return 0; ( A) 30 ( B) 20 ( C) 10 ( D) 0 22 下面是类 MyChss 的定义,对定义中语句描述正确的是 ( )。 class MyClasspublic: void MyClass(int a)X=a; ) / int f(int a, int b) / X=a; Y=b; int f(int a, int b, int c=0) / X=a; Y=b; Z=c; stahc void g ()X=10; ) / private: int X
11、, Y, Z; ; ( A)语句 是类 MyClass的构造函数定义 ( B)语句 和语句 实现类成员函数的重载 ( C)语句 实现对类成员变量 X的更新操作 ( D)语句 和 都不正确 23 若有以下程序: #include iostream using namespace std; class Base public: Base() x=0; int x; ; class Derivedl:virtual public Base publiC: Derivedl() X=10; ; Class Derived2:Virtual public Base public: Dedved2() x
12、=20; ; class Derived:public Delivedl,protected Derived2; int main() Derived obj; cout obj.X endl; return 0; 该程序运行后的输出结果是 ( )。 ( A) 20 ( B) 30 ( C) 10 ( D) 0 24 以下结构类型可用来构造链表的是 _ 。 ( A) street aaint a; int *b; ; ( B) struct bb int a; bb*b; ; ( C) struct ccint *a; cc b; ; ( D) struct dd int *a; aa b;
13、; 25 以下 C+语言中用于单行注释的是 ( A) / ( B) /* ( C) */ ( D) | 26 下面程序的结果是 #include iostream.h class A public: A( ) cout “construtA“ endl; virtualA( ) cout “destructA“endl; ; class B: public A ; class C: public A ; class D: public B, public C ; void main( ) D d; ( A) constructA destructA ( B) constructA constr
14、uctA destructA destructA ( C) constructA constructA constructA destructA destructA destructA ( D) constructA onstructA constructA constructA destructA destructA destructA destructA 27 下面关于 break语句的描述中,不正确的是 ( A) break可以用于循环体内 ( B) break语句可以在 for循环语句中出现多次 ( C) break语句可以在 switch语句中出现多次 ( D) break语句可用于
15、 if条件判断语句内 28 有以下程序: #include iostream using namespace std; class Point public: void SetPoint(int x,int y); void Move(int xOff,int yOff); int GetX() return X; int GetY() return Y; private: int X,Y; ; void Point:SetPoint(int x, int y) X=x; Y=y; void Point: :Move(int xOff, int yOff) X+=xOff; Y+=yOff;
16、int main () Point p1; p1.SetPoint(1,2); p1.Move (5, 6); cout“Point1 is (“ p1.GetX() , p1.GetY() “)“ end1; return 0; 执行后的输出结果是 ( )。 ( A) Point1 is (6,8) ( B) Point1 is (1,2) ( C) Point1 is (5,6) ( D) Point1 is (4,4) 29 虚函数必须是类的 ( )。 ( A)成员函数 ( B)友元函数 ( C)构造函数 ( D)析构函数 30 下列程序输出的结果是 ( )。 #include stdi
17、o.h sub1(char a, char b) char c; c=a; a=b; b=c: sub2(char*a,charb) charc; c=*a; ”a=b: b=c; sub3(char*a, char*b) char c; c=*a; ”a=*b; *b=c: void main() char a,b; a=A;b=B; sub1(a, b); putchar(a); p ( A) ABABAB ( B) ABBBBA ( C) ABBABA ( D) ABABBA 31 如果一个类至少有一 个纯虚函数,那么就称该类为 ( )。 ( A)抽象类 ( B)虚基类 ( C)派生类
18、( D)以上都不对 32 以下程序的结果是 #include iostream h void main( ) char * p=“abcdefgh“, * r; long * q; q=(long * )p; q+; r=(char * )q; cout r end1; ( A) defg ( B) cdef ( C) ghab ( D) efgh 33 在 C+语言中 ,打开一个文件就是将这个文件与一个什么建立关联 ? ( A)流 ( B)类 ( C)结构 ( D)对象 34 有关构造函数的叙述不正确的是 ( A)构造函数名必须和类名一致 ( B)构造函数在定义对象时自动执行 ( C)构造函
19、数无任何函数类型 ( D)在一个类中构造函数有且仅有一个 35 设 x, y, t均为 int 型变量,执行语句: x y=3; t=+x|+y;,完成后, y的值为 ( )。 ( A)不确定 ( B) 4 ( C) 3 ( D) 1 36 在最坏情况下,冒泡排序的时间复杂度为 _。 37 若函数模板在调用时有【 】,则调用它时必须强制实例化。 38 在面向对象的程序设计中,用来请求对象执行某一处理或回答某些信息的要求称为【 】。 39 从工程管理的角度来看,软件设计分两步来完成。首先是概要设计,然后是【 】。 40 软件结构是以【 】为基础而组成的一种控制层次结构。 41 执行下列程序的输出
20、结果是 _: #include iostream using namespacestd; class TestClassl public: void funl()cout “TestClassln“; virtual void fun2() cout “TestClassln“; ; class TestClass2:public TestClass1 public: 42 表达式 x. operator (y. operator (0) ) 还可以写成 _。 43 在 C+语 言中,一个函数的定义前加上关键字【 】时,该函数就声明为内联函数。 44 非成员函数应声明为类的【 】函数才能访问这
21、个类的 private 成员。 45 下列程序的输出结果是【 】。 #include iostream using namespace std; void fun (int class Base public: Base(int x,int y) a=x; b=y; void Show() cout “Base: “ a , b “ “; private: int a,b; ; class Derived : public Base public: Derived(int x, int y, int z) : Base(x,y),c(z) void Show() cout “Derived:“
22、 c end1; private: int c; ; int main() Base b(100,100),*pb; Derived d(10,20,30); pb= pb- Show(); pb= pb- Show(); return 0; 47 若有以下程序: #include iostream using namespace std; int f(int x, int y) return (y-x)*x; int main() int a=3,b=4,c=5,d; d=f(f(a,b) ,f(a,c) ); cout d end1; return 0; 执行后的输出结果是【 】。 48
23、指针变量所保存的不是一般的数据值,而是程序中另一个对象的 _。 49 程序的结果为【 】。 #include”iostream h” template typename T T total(T * data) T s=0; while( * data) s+= * data +; return s; int main( ) int x = 2, 4, 6, 8, 0, 12, 14, 16, 18 ; cout total(x); r 50 下列程序的输出结果为【 】。 #inelude iostream. h int void main() int n=3, m=12; max(m, n)+
24、 cout “m=“ m “, n= “ n end1; 国家二级( C+)笔试模拟试卷 231答案与解析 1 【正确答案】 C 【试题解析】 在关系模型的数据语言中,一般除了运用常规的集合运算 (并、交、差、笛卡尔积等 ),还定义了一些专门的关系运算,如投影、选择 、连接等。前者是将关系 (即二维表 )看成是元组的集合,这些运算主要是从二维表的行的方向来进行的。后者是从二维表的列的方向来进行运算的。 2 【正确答案】 A 【试题解析】 数据结构是研究数据元素及其之间的相互关系和数据运算的一门学科,它包含 3个方面的内容,即数据的逻辑结构、存储结构和数据的运算。 3 【正确答案】 C 4 【正
25、确答案】 B 5 【正确答案】 D 【试题解析】 数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式,一种数据结构可以根据需要采用不同的存储结构,常 用的存储结构有顺序和链式结构。采用不同的存储结构,其处理的效率是不同的。 6 【正确答案】 D 7 【正确答案】 C 【试题解析】 链式存储结构克服了顺序存储结构的缺点:它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。故链式存储结构下的线性表便于插入和删除操作。 8 【正确答案】 C 【试题解析】 选项 A错误,在模块化设计中,要求将一个大程序按人们能理解的大小规模进行分解,使每个模块都能易
26、于理解,各模块的功能尽量单一,各模块之间的联系尽量 的少。 选项 B 错误,自顶向下、逐步细化的设计过程,主要包括两个方面:将复杂问题的解法分解和细化成由若干模块组成的层次结构;将一个模块的功能逐步分解细化为一系列的处理步骤,直到某种程序设计语言的语句或某种机器指令。即在自顶向下、逐步细化的设计过程中,是按照先全局后局部、先整体后细节、先抽象后具体的方法设计程序。 选项 D错误,由于在模块化程序设计中,一个模块内部的控制结构也要符合结构化原则,所以,在程序设计过程中,结构化程序设计方法与模块化程序设计方法是要同时采用的。 选项 C为正确答案。 9 【正确答案】 B 10 【正确答案】 B 【试
27、题解析】 关系代数中包括传统的集合运算和专门的关系运算。经过选择或投影运算得到的新关系的属性个数最多不会超过原关系中的属性个数。经过连接运算得到的新关系最多不少于原关系中属性的个数。 11 【正确答案】 A 12 【正确答案】 B 【试题解析】 本题考核拷贝构造函数的概念。拷贝初始化构造函数实际上也是构造函数,它是在初始化时被调用,将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。拷贝构造函数具有的特点是:拷贝构造函数也是一种构造函数,因 此函数名与类相同,并且不能指定函数返回类型:只有一个参数,是对同类的某个对象的引用:每一个类中都必须有一个拷贝构造函数。如果类中没有声明拷贝构造
28、函数,编译器会自动生成一个具有上述形式的公有的拷贝构造函数 13 【正确答案】 B 【试题解析】 本题考核类与对象、运算符重载。运算符 “+”在类 Complex中作为成员函数重载,实现两个对象的数据成员的相加。所以 main 函数中语句“Complex a =Complex(1, 1) + Complex(5);”的作用相当于 “Complex a(1+5, 1);”即对象 a的数据成员 re的值为 6, imag的值为 1,所以输出为 6+1i。 14 【正确答案】 A 【试题解析】 本题考核静态数据成员与静态成员函数的定义与使用方式。静态数据成员是类中所有对象共享的成员,而不是某个对象的
29、成员题中变量 n 是静态数据成员,对象对其操作的结果具有叠加作用, main 函数中先定义了 Test的对象*p,然后又 delete p,所以对静态数据 n进行了两次操作,分别是 “n+=2”和 “n-=3”, n 的初始值是 1,那么 n最后的值变为 0。 main 函数最后通过调用静态函数getNum得到 n 的值,并输出。 15 【正确答案】 B 【试题解析】 C+是一种面向对象的程序设计语言,它充分支持面向对象思想中的 3个主要特征:封装性,继承性、多态性。 B 选项所描述是结构化程序设计的思想。 16 【正确答案】 D 【试题解析】 字符型数据在计算机内部是以 ASCII码存储的,
30、英文大写字母和小写字母在 ASCII 码表中都是连续的。大写字母 A Z是从 65 90,小写字母a z是从 97 122。所以只要变量 c大于等于 a并且等于小于 z就能保证其的小写字母。 17 【正确答案】 D 【试题解析】 指针变量如果指向同一个数组的元素,则可以进行比较,所以 A是正确的。指针变量的赋值就是将一个变量地址赋给一个指针变量。并且指针变量可以是空值,即该指针不指向任何变量。 B同样也是正确的。指针变量加减一个整数是将该指针变量的原值 (是一个地址 )和它指向的变量所占用的内存单元字节数相加或相减。即 C也是正确的。如果两个指针指向同一个数组元素,两个指针是可以相减的,标识两
31、个指针之间的元素个数。但是它们是不可相加的。 18 【正确答案】 B 【试题解析】 符号常量声明语句的语法格式是: const类型名符号常量 =初值表达式,选项 B中未给常变量赋初值,故错误;而选项 C中定义的是一个指向浮点型常量的指针,而不是定义一个浮点型常量,所以可以不赋初值。 19 【正确答案】 C 20 【正确答案】 A 21 【正确答案】 D 【试题解析】 由于在 case分支的语句后没有出现跳转语句,所以程序将一直执行到 switch 语句结束。即逐步给变量 b 赋值 30、 20、 10和 0,最后 b 的值为 0。 22 【正确答案】 D 23 【正确答案】 A 24 【正确答
32、案】 B 【试题解析】 如果要 构造链表,则必须有指向下一个结点的指针。 25 【正确答案】 A 【试题解析】 C+语言中的注释与 C浯言不同, C语言的注释符号只有 /* */,而C +在此基础上又加上了 /,此注释用于单行注释。注意:注释不影响程序的运行。 26 【正确答案】 B 【试题解析】 类 D继承了类 C和类 B,所以在构造的时候分别构造类 B 和类C。 27 【正确答案】 D 【试题解析】 本题考查的是 break 语句的使用, break 可以结束 switch 语句和for循环语句,但是不能使用在条件判断语句内。 28 【正确答案】 A 【试题解析】 本题考核对象的定义与使用
33、。程序中定义了一个类 Point,在主函数中定义了一个 Point类的对象 p1,然后通过对象 p1调用其成员函数 SetPoint()和 Move()实现移位的操作。 29 【正确答案】 A 30 【正确答案】 B 31 【正确答案】 A 32 【正确答案】 D 【试题解析】 C+语言规定,如果指针变量 q 已指向数组中的一个元素,则 (q+指向同一数组中的下一个元素 (而不是将 q 的值简单的加 1)。本题中 q 是 long型指针,每个 long型数据占内存字节数为 4,所以 q+则由当前位置向右移动 4个字节,所以最后显示出的是 efgh。注意:请注意 * (P+)与 ( * p)+的
34、区别。 33 【正确答案】 A 【试题解析】 C+的 I/O 系统是通过一种称为流的机制来实现文件和控制台的I/O 操作。简单地说,在 C+中,输入输出操作是通过流来完成的。而文件流以磁盘文件以及其他可按文件方式进行管理的外部设备为输入输出对象。每个文件流都应当与一个打开的文件相联系;关闭一个文件就是取消这种联系。 34 【正确答案】 D 【试题 解析】 本题考查构造函数的基本知识。构造函数名字与类名相同;可以重载;不需要参数;不需要指定返回类型等。本题答案为 D。 35 【正确答案】 C 【试题解析】 对 |构成的语句从左向右执行,如果出现真,则 |后面的语句不执行。 36 【正确答案】 n
35、(n-1)/2 【试题解析】 冒泡排序法是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为 n,则在最坏的情况下,冒泡排序需要经过 n/2遍的从前往后的扫描和 n/2遍的从后往前的扫描,需要的比较次数为 n(n-1)/2。 37 【正确答案】 常规参数 38 【正确答案】 消息 【试题解析】 消息是一个实例与另一个实例之间传递的信息,它请求对象执行某一处理或回答某一要求的信息,它统一了数据流和控制流。 39 【正确答案】 详细设计 【试题解析】 本题属于记忆题,从工程管理的角度来看,软件设计分两步来完成。首先是概要设计,然后是详细设计。概要设计,即总体设计。将软件需求转化为数据结
36、构和软件的系统结构。详细设计,即过程设计。通过对结构表示进行细化,得到软件的详细的数据结构和算法。 40 【正确答案】 模块 【试题解析】 采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解,模块化使得软件容易测试和调试,因而有利于提高软件的可靠性,也有利于软件的组织管理,大型程序可由不同的程序员编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的部分。注意:软件结构的定义,模块操作其他的所有特点。 41 【正确答案】 TestClass1 TestClass2 【试题解析】 主函数中首先定义 TestClass2 对象 obj,然后执行 “f(obj); ”。在“void
37、 f(TestClass1&b)b.fun1(); b.fun2(); ”语句中, fun 中参数为 TestClass1类型的对象 b,其中调用 fun1()和 fun2()。基类 TestClass1中的 fun2()为虚函数,所以派生类中的 fun2 也是虚函数,因此输出为调用 TestClass1中的 fun1,TestClass2中的 fun2。即结果为 TestClass1 和 TestClass2。 42 【正确答案】 x y或 x (y ) 【试题解析】 因为卜 operator (0) 是对成员 y重载运算符,所以是成员重载,在参数表中又有一个 参数,是重载后缀,即 x (y
38、 ) 。 43 【正确答案】 inline 【试题解析】 内联函数的声明方法。 44 【正确答案】 友元 45 【正确答案】 1000 【试题解析】 本题考核引用作为函数参数的使用。引用作为形参,它实际上就是实参,函数对形参的访问和修改就是对实参的访问和修改,题中函数 fun 对形参的操作是自增 2倍,所以经过函数调用后,实参的值自增 2倍,即输出 1000。 46 【正确答案】 Base: 100,100 Base: 10,20 【试题解析】 本题考 核对象指针的应用。主函数中通过对象指针 pb分别调用其类成员函数 Show()和派生类成员函数 Show()先后输出 Base: 100,100Base:10,20。 47 【正确答案】 9 【试题解析】 本题考核函数的嵌套调用。在主函数中执行语句“d=f(f(a,b) ,f(a,c); ”调用了 3次 f()函数:调用 f(a,b) 得到的值为 3,调用 f(a,c) 得到的值为 6,调用 f(3,6)得到的值为 9。 48 【正确答案】 内存地址 49 【正确答案】 20 【试题解析】 要理解 * data的含意。 50 【正确答案】 m 13, n 3 【试题解析】 本题考察引用作为形参进行参数传递的知识。 max函数的功能是返回较大的那个数,而 max(m, n)+的作用是将较大值再进行增一运算。