1、国家二级( C+)笔试模拟试卷 241及答案与解析 1 下列叙述中正确的是 ( A)数据的逻辑结构与存储结构必定是一一对应的 ( B)由于计算机存储空间是向量式的存储结构,因此,数据的存储结构一定是线性结构 ( C)程序设计语言中的数组一般是顺序存储结构,因此,利用数组只能处理线性结构 ( D)以上三种说法都不对 2 在设计程序时,应采纳的原则之一是 ( A)不限制 goto语句的使用 ( B)减少或取消注解行 ( C)程序越短越好 ( D)程序结构应有助于读者理解 3 下列叙述中正确的是 ( )。 ( A)线性链表的各元素在存储空间中的位置必须是连续的 ( B)线性链表的头元素一定存储在其他
2、元素的前面 ( C)线性链表中的各元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面 ( D)线性链表中的各元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的 4 下列选项中不属于软件生命周期开发阶段任务的是 ( )。 ( A)软件测试 ( B)概要设计 ( C)软件维护 ( D)详细设计 5 对如下二叉树 进行后序遍历的结果为 ( )。 ( A) ABCDEF ( B) DBEAFC ( C) ABDECF ( D) DEBFCA 6 在长度为 n的顺序表的第 i(1in+1)个位置上插入一个元素,元素的移动次数为 _。 ( A) n-i+1 ( B)
3、n-i ( C) i ( D) i-1 7 数据处理的最小单位是 ( A)数据 ( B)数据元素 ( C)数据项 ( D)数据结构 8 用链表表示线性表的优点是 ( A)便于随机存取 ( B)花费的存储空间较顺序存储少 ( C)便于插入和删除操作 ( D)数据元素的物理顺序与逻辑顺 序相同 9 数据字典 (DD) 是定义以下哪种系统描述工具中的数据的工具 ( )。 ( A)数据流程图 ( B)系统流程图 ( C)程序流程图 ( D)软件结构图 10 在单链表中,增加头结点的目的是 ( A)方便运算的实现 ( B)使单链表至少有一个结点 ( C)标识表结点中首结点的位置 ( D)说明单链表是线性
4、表的链式存储实现 11 有以下程序: #include iostream #include math using namespace std;class pointprivate: double x; double y;public: point(double a, double b x=a; y=b; friend double distance (point a, point b ; ;double distance(point a, point b return sqrt(a. x-b. x )*(a. x -b. x )+ (a. x -b. x)*(a. x-b. x);int ma
5、in () point p1 (1,2); point p2(5,2); cout distance (p1, p2) end1; return 0; 程序运行后的输出结果是 ( A) 1 ( B) 5 ( C) 4 ( D) 6 12 关于 const修饰符的说法中,错误的是 ( A) const既可以修饰成员函数,也可以修饰数据成员,还可以修饰对象 ( B)若 const修饰了一个对象,则该对象中的所有数据成员都无法被更新 ( C)常对象无法调用一般成员函数 ( D)常成员函数只能 被常对象调用,不能被一般对象调用 13 以下选项中合法的实型常数是 ( A) 5 E 2.0 ( B) E-
6、3 ( C) .2 E0 ( D) 1.3 E 14 为了避免嵌套的 ifelse 语句的二义性, C+规定与 else配对的是 ( A)缩排位置相同的 if ( B)在其之前未配对的 if ( C)在其之前未配对的最近的 if ( D)同一行上的 if 15 类的析构函数的作用是 ( )。 ( A)一般成员函数 ( B)类的初始化 ( C)对象的初始化 ( D)删除对象 16 类的析构函数的作用是 _。 ( A)一般成员函数 ( B)类的初始化 ( C)对象的初始化 ( D)删除对象创建的所有对象 17 执行下列程序 int fun(int x1, int x2) int x; x1 x2
7、?(x=3): (x=4); return x+x1; void main() cout fun(7, 8); 后输出结果是 _。 ( A) 9 ( B) 10 ( C) 11 ( D) 12 18 下列关于运 算符重载不正确的是 ( A)运算符重载不能改变运算符的操作数个数 ( B)运算符重载不能改变运算符的优先级 ( C)运算符重载不能改变运算符的结合性 ( D)运算符重载能改变对预定义类型数据的操作方式 19 在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是 ( A)派生类的对象可以赋给基类的对象 ( B)派生类的对象可以初始化基类的引用 ( C)派生类的对象可以直接
8、访问基类中的成员 ( D)派生类的对象的地址可以赋给指向基类的指针 20 若已定义: int a =0, 1, 2, 3, 4, 5, 6, 7, 8, 9, *p=a, i; 其中0i9,则对 a数组元素不正确的引用是 ( A) ap a ( B) *( int s=O; class sample static int n; public: sample(int i) n=i; static void add() s+=n; ; int sample:s=O; int main() sample a(2),b(5); sample: :add(); cout s end1; return 0
9、; 程序运行后的输出结果是 ( A) 2 ( B) 5 ( C) 7 ( D) 3 26 若有以下程序: #include iostream using namespace std; int main() int a4 4 = 1,2,3,-4,0,-12,-13,14, -21,23,0,-24,-31,32,-33,0; int i,j,s = 0; for(i=0;i 4;i+) for(j=O;j 4;j+) if(ai j =0) continue; s+=a i j; cout s end1; return 0; 执行后的输出结果是 ( )。 ( A) -138 ( B) 141
10、( C) 75 ( D) -1 27 下列叙述中,正确的是 ( )。 ( A) while语句构成的循环不能用其他语句构成的循环来代替 ( B) do-while语句构成的循环只能用 break语句退出 ( C)用 while语句构成的循环,只有在 while后的表达式为非 0时才执行循环 ( D) do-while语句构成的循环,只有在 while后的表达式为 0时才结束循环 28 一个类的友元函数或友元类可以通过成员操作符访问该类的 ( )。 ( A)私有成员 ( B)保护成员 ( C) 公有成员 ( D)所有成员 29 在 int a=10, * p= cout val; return
11、0; void function(double val) val 3; 编译运行这个程序将出现的情况是 ( A)编译出错,无法运行 ( B)输出: 3 ( C)输出: 3.0 ( D)输出一个不确定的数 35 在类声明中,紧跟在 “public:”后声明的成员的访问权限是 ( )。 ( A)私有 ( B)公有 ( C)保护 ( D)默认 36 问题处理方案的正确而完整的描述 称为 _。 37 诊断和改正程序中错误的工作通常称为 _。 38 有如下程序 : #include iostream using namespace std; class A public: A()cout “A“; ;
12、class B:private A public: B()cout B; ; int main() Aa; B b; return 0; 这个程序的输出结果是 _。 39 下面是一个递归函数,其功能是使数组中的元素反序排列,请将函数补充完整。 void reverse(int * a, int size) if(size 2)return; int k=a0; a0=asize-1; asize-1=k; reverse(a+l, _); 40 C+是一种面向对象的程序设计语言,它充分支持面向对象思想中的三个主要特征是 _性; _性和 _性。 41 已知递归函数 f的定义如下: int f(i
13、nt n) if(n 1)return 1; /递归结束情况 else return n*f(n-2);/递归 ) 则函数调用语句 f(5)的返回值是 _。 42 在下列的程序的横线处填上适当的语句,使该程序的输出为 12。 #include iostream.h using namespace std; class Base public: int a, b; Base(int i)a i; ; class Derived: public Base int a; public: Derived(int x): Base(x), b(x+1); void show() 43 下面是一个栈类的模
14、板,其中 push函数将元素 i压入栈顶, pop函数弹出栈顶元素。栈初始为空, top值为 0,栈顶元素在 stacktop-1中,在下面横线处填上适当 语句,完成栈类模板的定义。 template class Tstack enumsize=1000; T stacksize; int top; public: Tstack(): top(0) void push(const T void main() extern int x, y; cout add(x, y) end1; int x(20),y(5); int add(int a, int b) int s=a+ b; return
15、 s; 48 下列程序段的输出结果是【 】。 cout fixed 509 123456789 end1; 49 下面程序输出的结果是【 】。 #include iostream using namespace std; class A public: virtual void show() cout “A!“; ; class B: public A public: void show() cout “B!“; ; class C: public B public: void show()cout “C!“; ; void show_info(A void main() A ia; B ib
16、; C ic; show_info(ia);show_info(ib); show_info(ic); 50 已知数组 a中有 n个元素,下列语句将数组 a中从下标 x1开始的 k个元素移动到从下标 x2开始的 k个元素中,其中 O =xl x2 n, x2+k n,请将下列语句补充完整。 For(int i=x1+k-1; i =x1; i-) a_=ai; 国家二级( C+)笔试模拟试卷 241答案与解析 1 【正确答案】 D 【试题解析】 一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构,因此,数据的逻辑结构与存储结构不一 定是一一对应的。选项 A中的说法是错误的。虽然计算机的
17、存储空间是向量式的存储结构,但由于一种数据的逻辑结构根据需要可以表示成多种存储结构,例如,线性链表是线性表的链式存储结构。一般来说,在线性表的链式存储结构中,各数据结点的存储序号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。在线性链表中,各数据元素之间的前后件关系是由各结点的指针域来指示的。因此,数据的存储结构不一定是线性结构。选项 B 中的说法也是错误的。虽然程序设计语言中的数组一般是顺序存储结构,但是,利用数组也能处理非线性结构。例如,满 二叉树与完全二叉树是非线性结构,实际上也是利用了程序设计语言中的数组来处理二叉树这样的非线性结构。选项 C中的说法也是错误的。 2 【
18、正确答案】 D 【试题解析】 滥用 goto语句将使程序流程无规律,可读性差,因此 A不选;注解行有利于对程序的理解,不应减少或取消, B 也不选;程序的长短要依照实际情况而论,而不是越短越好, C也不选。 3 【正确答案】 D 【试题解析】 在线性链表中,各元素在存储空间中的位置是任意的,各元素的顺序也是任意的,依靠指针来实现数据元素的前后件关系。 4 【正确 答案】 C 【试题解析】 软件的生命周期可分为软件定义、软件开发及软件运行维护三个阶段。其中软件定义阶段的主要工作有可行性研究与计划制订和需求分析等;软件开发阶段的主要工作有概要设计、详细设计和测试等;软件运行维护阶段的主要工作是软件
19、的运行及后期的维护等。 5 【正确答案】 D 6 【正确答案】 A 7 【正确答案】 C 【试题解析】 数据处理的最小单位是数据项;由若干数据项组成数据元素;而数据是指能够被计算机识别、存储和加工处理的信息载体;数据结构是指数据之间的相互关系和数据运算。 故正确答案为选项 C)。 8 【正确答案】 C 【试题解析】 链式存储结构克服了顺序存储结构的缺点:它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。故链式存储结构下的线性表便于插入和删除操作。 9 【正确答案】 A 【试题解析】 本题考查数据字典的作用,数据字典是对数据流程图中出现的被命名的图形元
20、素的确切解释。 10 【正确答案】 A 【试题解析】 头结点不仅标识了表中首结点的位置,而且根据单链表 (包含头结点 )的结构,只要掌握了表头, 就能够访问整个链表,因此增加头结点目的是为了便于运算的实现。 11 【正确答案】 C 【试题解析】 本题考核友元函数的应用。分析程序:类 point中定义了两个私有成员 x和 y,以及一个友元函数 distance。从而,函数 distance可以访问类 point中的任何成员。在函数 distance中,返回值为 sqrt (a. x- b. x)*(a. x-b. x)+(a. y-b. y)*(a. y-b. y)。由此可知,函数 distan
21、ce的功能是计算 a、 b两点之间的距离。在主函数 main 中,先定 义两点: p1(1,2)和 p2(5, 2)。然后调用函数 distance计算两点之间的距离为 4,所以程序最后输出为 4。 12 【正确答案】 D 【试题解析】 本题考察 const修饰符的含义及其修饰不同对象的规则。常成员函数既能被常对象调用,也能被一般对象调用,一旦 const修饰了一个对象,则对象的所有数据成员都无法更新。 13 【正确答案】 C 【试题解析】 本题考查实型常数的指数表示法,可以肯定的是指数不能为小数即必须为整数,故排除 A。由于符号 E 前面必须有数字,故 B 也是错误的。 D在指数符号 后面没
22、有数字,是错误的。答案为 C。 14 【正确答案】 C 【试题解析】 C+规定 else总是与之前未配对的最近的 if进行配对,这样可以避免二义性,也便于编译器分析。 15 【正确答案】 D 【试题解析】 类的析构函数是在类的对象被释放的时候自动调用,它的作用是删除已经创建完成的对象。 16 【正确答案】 D 17 【正确答案】 C 18 【正确答案】 D 【试题解析】 运算符重载的规则是重载时不能改变运算符的操作数个数,不能改变运算符的优先级,不能改变运算符的结合性 ,不能改变对预定义类型数据的操作方式。注意:运算符重载的关键字是 operator。 19 【正确答案】 C 【试题解析】 友
23、元函数的定义既可以在类内部进行,也可以在类外部进行。它提高了程序的运行效率,但破坏了类的封装性和隐藏性,使得类的非成员函数可以访问类的私有成员。 20 【正确答案】 D 【试题解析】 通常,引用一个数组元素可以用下标法,如 ap-a形式,或指针法,如 *(&ai)的形式。本题中 a9=9, a10显然超出了数组范围,注意,数组的下标是从 0开始的。 21 【正确答案】 D 【试题解析】 C+语言最重要的特点是其为一种面向对象的程序设计语言,但是C+语言也包含了全部的 C语言的特征。 22 【正确答案】 B 【试题解析】 本题考核函数重载。所谓函数重载,是指同一个函数名可以对应多个函数的实现。进
24、行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。即重载函数不许具有相同的形参列表。函数的返回类型不能作为函数重载的判断依据。 const是函数的一部分参与函数的重载 23 【正确答案】 A 【试题解析】 本题考核 C+的标识符 定义。 C+规定标识符由大小写字母、数字字符 (0 9)和下划线组成,并且以字母或下划线开始,后跟 0个或多个字母、数字字符或下划线。由此可知 A) 选项中的连接符不能用于组成标识符。 24 【正确答案】 B 【试题解析】 本题考核静态数据成员和静态成员函数的应用。类 sample中定义两个私有成员 x和 y,其中 y为静态数据成员。并定义函数 prin
25、t()为静态成员函数。在主函数中,定义对象 s1(10)时,通过构造函数使对象 s1的私有成员 x=10,静态数据成员 y=10。定义 s2(20)时,通过构造函数使对象 s2的私有成员 x=20,静态数据成员 y=10+20=30。程序最后调用静态成员函数 print输出对象 s2的私有成员 x的值 20,对象 s1、 s2共享的静态数据成员 y的值 30。 25 【正确答案】 B 【试题解析】 本题考核静态数据成员和静态成员函数的应用。程序中定义一个类sample,它包括一个静态数据成员 n和一个静态成员函数 add,并在类的构造函数中给类私有静态数据成员 n赋值。在主函数 main 中,
26、定义对象 a(2)时,通过构造函数使静态数据成员 n 的值变为 2,在定义对象 b(5)时,通过构造函数使静态数据 成员 n=5(覆盖了前面的 n=2),再执行 sample:add()使全局变量 s=5。 26 【正确答案】 A 【试题解析】 本题属于综合题,考查多个方面的知识点。程序首先定义了一个二维数组 a,并初始化其值。在内层 for循环体中,遇到大于等于 0的数,就继续执行下次循环,否则就执行 “s+=aij”,即把其值累加并保存在变量 s中。所以本题双重循环的功能是:计算数组中所有负数的累加和,即 s=-138。 27 【正确答案】 C 【试题解析】 本题考核对 do-while语
27、句、 while语句 基本语法的掌握。选项 A中, while语句构成的循环体可由其他语句构成的循环体代替,所以选项 A不正确。选项 B中, do-while语句构成的循环,当 while的条件表达式的值为 0时,也可结束循环,所以选项 B 也不正确。选项 C是正确的。选项 D可参照选项 B,当使用 break 语句时,也可退出循环。故选项 D也不正确。 28 【正确答案】 D 【试题解析】 在 C+中,如果想让类中的成员数据可以被其他函数访问,可以通过友元函数声明来分享类中的资源。除了友元函数外,还有友元类。类的友元函数对类的属性和方法的访问能 力等同于类的成员函数。 29 【正确答案】 C
28、 30 【正确答案】 A 【试题解析】 此题考查的是乘法运算符的重载函数原型声明。因为操作的对象是类对象,所以重载函数的参数至少有一个是类对象。故选项 A)中两个参数都为double型是错误的。 31 【正确答案】 B 【试题解析】 内联函数用 inline修饰,用于取代 C语言中的宏定义。 Inline是个建议机制而不是强制机制,也就是说,程序员可以指定任意函数为 inline函数,但是编译器会根据系统情况来决定是否将其 inline处理。对于较大 的函数,编译器往往会取消其 inline特性。 Inline:函数的特点之一就是执行速度快,他实质是在编译时将函数的目标代码插入到每个调用该函数
29、的地方,从而没有出栈入栈、保护现场等开销,提高了效率。在类体内定义的成员函数,自动被编译器当做内联函数处理,在类体外定义的成员函数,如果用 inline修饰,编译器也认为是一种内联建议。 32 【正确答案】 B 【试题解析】 在同一作用域中,两个变量不能够重名。 33 【正确答案】 C 【试题解析】 本题考核模板的声明。模板声明的开始部分为: template类型形参表。其中,类型形参表可以包含基本数据类型,也可以包含类类型。类型形参需要加前缀 class。如果类型形参多于一个,则每个类型形参都要使用class。形参表中的参数是惟一的,而且至少在函数定义体中出现厂次。形参表中至少有一个形参的类
30、型必须用类型形参表中的形参来定义。所以只有 C选项的声明是正确的。 34 【正确答案】 D 【试题解析】 本题考查的是函数参数的传递。在 C+中,函数在传递参数时,总是将实参值的副本传递 (拷贝 )给被调用函数的形参,即传值调用。因此,在函数中对形参所作 的任何操作都不会改变函数外的实参。故本题 function()函数不会对主函数中的 val变量造成任何改变, val也没有被初始化,所以输出的是一个不确定的值:故应该选择 D。 35 【正确答案】 B 【试题解析】 此题考查的是类的访问权限。在 C+语言中,类的访问权限有公有(public)、保护 (protect)和私有 (private)
31、3种。 36 【正确答案】 算法 37 【正确答案】 程序调试 38 【正确答案】 AAB 39 【正确答案】 size-2 【试题解析】 函 数体的基本功能是将大小为 size的数组 a的首尾元素进行交换。交换一次后,未交换部分的首元素地址为 a+1,未交换的元素个数为 size-2。 40 【正确答案】 封装、继承、多态 41 【正确答案】 15 【试题解析】 此题考查的是递归算法。本题中 f()函数在 n小于等于 1时返回值为 1,其余情况返回值为 n*(n-2),由此分析可以得到 f(5)=5*f(3)=5*3*f(1)=5*3*1=15。 42 【正确答案】 eout Base: a
32、。 【试题解析】 本题考查的是基类和派生类 的构造函数。派生类构造函数的执行顺序:首先调用基类的构造函数,调用顺序按它们被继承时说明的顺序;然后调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容。本题要求结果是输出 12,分析题目,首先调用基类的构造函数,然后是调用子对象的构造函数,横线处要求输出基类成员 a的值,填入 toutBase: a即可。 43 【正确答案】 Stack-top或 sIacktop-=1 或 stacktop=top-1 【试题解析】 此题考查的是堆栈数据结构。分析题目,首 先利用函数voidpush(constT i)将 i压入栈,然
33、后 Tpop()将元素弹出,但由于在压入栈的时候, top值已经增加 1;要弹出元素,须使 top 先减 1,才能把栈顶元素弹出。 44 【正确答案】 4 【试题解析】 C+程序中的引用实际上是为变量起个别名,其后的任何操作都相当于对原变量的操作。所以最后输出 4。 45 【正确答案】 vinual A或 vinual public A或 virtual privaIe A或 virtual protrcted A与 virtual A或 virtual public A或 virtual privateA或 virtual protccted A 【试题解析】 由于每执行一次 A类的构造函数
34、,都将输出一个字符 A,输出结果中只有一个 A,且第一个输出为 A, D继承 B,可知必有 B继承 A。由题中要求 c肯定继承某个类,所以,这里的 C只能是继承于 A,保证输出中只有一个A, A必须为虚基类,所以本题中的空都填 vmal A。 46 【正确答案】 +x 【试题解析】 C+语言中用成员函数重载 +x为 x.operator+()用友元函数重载+x为: operator+(x)。 47 【正确答案】 25 48 【正确答案】 123457 【试题解析】 fixed 的意义是在小数点后保留六位,所以 fixed 输出为509.123457。 49 【正确答案】 A! A! A! 【试题解析】 由于基类中没有声明虚函数,故调用的全部是基类的函数。 50 【正确答案】 X2+k-1 【试题解析】 此题考查的是数组的操作。 ai表示从下标 x1开始的第 i个元素,若为第一次循环,则 i为 xt+k-1,按照题目将数组 a中从下标 x1开始的 k个元素移 动到从下标 x2开始的 k 个元素中的要求,所以将 ai赋值给下标为 X2+k-1的元素。