1、国家二级( C+)笔试模拟试卷 73及答案与解析 1 在一个长度为 n的线性表中删除一个元素,最坏情况下需要移动的数据元素数目为 ( )。 ( A) 1 ( B) n-1 ( C) n+1 ( D) n 2 2 下列叙述中,正确的是 ( )。 ( A)入栈运算只需将新元素插到栈顶指针指向的位置 ( B)出栈运算只需将栈顶元素赋给一个指定变量 ( C)出栈运算与读栈顶元素是相同的操作 ( D)读栈顶元素不删除栈顶元素 3 在一个单链表 HL中,若要向表头插入一个由指针 p指向的节点,则需要执行语句序列 ( )。 ( A) HL=p; p- next=HL; ( B) p- next=HL; HL
2、=p; ( C) p- next=HL; p=HL; ( D) p- next=HL- next; HL- next=p 4 已知二叉树的前序序列为 ABDCEFG,中序序列为 DBCAFEG,则其后序序列为( )。 ( A) DCBAFGE ( B) DCBFGEA ( C) DCBFEGA ( D) DCBGFEA 5 一组记录的排序码为 (46, 79, 56, 38, 40, 84),则利用快速排序的方法,以第一个记录为基准得 到的一次划分结果为 ( )。 ( A) 38, 40, 46, 56, 79, 84 ( B) 40, 38, 46, 79, 56, 84 ( C) 40,
3、38, 46, 56, 79, 84 ( D) 40, 38, 46, 84, 56, 79 6 下列关于严格控制 goto语句使用的理解中,错误的是 ( )。 ( A)用一个非结构化的程序设计语言实现一个结构化的构造 ( B)若不使用 goto语句会使功能模糊 ( C)在某种可以改善而不是损害程序可读性的情况下 ( D) goto语句可以完全不用 7 下面不属于软件设计原则的是 ( )。 ( A)抽象 ( B)模块化 ( C)自底向上 ( D)信息隐蔽 8 规范化理论中消除其中多余的数据相关性是靠分解 ( )。 ( A)关系运算 ( B)内模式 ( C)外模式 ( D)视图 9 常用的关系运
4、算是关系代数和 ( )。 ( A)集合代数 ( B)逻辑演算 ( C)关系演算 ( D)字段 10 源程序中应包含一些内部文档,以帮助阅读和理解源程序,源程序的内部文档通常包括选择合适的标识符、注解和 ( )。 ( A)程序的视觉组织 ( B)尽量不用或少用 GOTO语句 ( C)检查输入数据的有效性 ( D)设计良好的输出报表 11 下列关于类概念的描述中,错误的是 ( )。 ( A)类是抽象数据类型的实现 ( B)类是具有共同行为的若干对象的统一描述体 ( C)类是创建对象的模板 ( D)类就是 C语言中的结构类型 12 字符串常量 “hello“的字符个数是 ( )。 ( A) 3 (
5、B) 4 ( C) 5 ( D) 6 13 “or(int x=0, y=0; !x int main () int a=1,4,5; int *p= for (y=0; y 3; y+) z= ( (* (p+y) x) ? *(p+y) :x); cout z end1; return 0; 程序运行后的输出结果是 ( )。 ( A) 1 ( B) 4 ( C) 5 ( D) 2 22 以下 4个程序中,不能实现两个实参值进行交换的是 ( )。 ( A) void swap (float *p, float *q) float *t ,a; t = t = p; *p = *q; *q =
6、 *t; void main () float x = 8.0;y = 9.0; swap ( cout x “, “ y ( B) void swap (float *p, float *q) float a; a = *p; *p = *q; *q = a; void main() float x = 8.0;y = 9.0; swap ( cout x “, “ y end1; ( C) void swap (float *p, float *q) float x; x = *p; *p = *q; *q = x; void main() float a,b.; *a = 8.0;*b
7、= 9.0; swap (a, b) ; ( D) void swap (float a = p; p = q; q = a; void main() float a = 8.0,b = 9.0; swap (a,b); cout x “, “ y 23 有以下程序: #include iostream #include string using namespace std; int main () char s=“n123“; cout strlen (s) “, “ sizeof (s) end1; return 0; ( A)赋初值的字符串有错 ( B) 6,7 ( C) 5,6 ( D
8、) 6,6 24 若有如下程序: #include iostream using namespace std; int s=0; class sample static int n; public: sample (int i) n=i; static void add() s+=n; ; int sample: :s=0; int main () sample a(2),b(5); sample: add (); cout s end1; return 0; 程序运行后的输出结果是( )。 ( A) 2 ( B) 5 ( C) 7 ( D) 3 25 有以下程序: #include iost
9、ream using namespace std; class B private: int a,b; public: B() B(int i,int j); void printb(); ; class A B C; public: A() A(int i,int j); void printa(); ; A:A(int i,int j) :c(i,j) void A:printa() c.printb (); B:B(int i, int j) a=i; b=j; void B: :printb() cout a “, “ b end1; int main () A m(7,8); m.p
10、rinta(); return 0; 该程序运行后的输出结果是 ( )。 ( A) 5,6 ( B) 7,8 ( C) 8,9 ( D) 9,10 26 为了使程序的输出的正确结果为: Now is 2004 7.10 10: 10: 10 那么应在下列程序划线处填入的正确语句是 ( )。 那么应在下列程序划线处填入的正确语句是 ( )。 #include iostream using namespace std; class TIME; class DATE public: DATE(int y=2004,int m=1,int d=1) year=y; month=m; day=d; fr
11、iend void DateTime(DATE private: int year, month, day; ; class TIME public: TIME(iht h=0, int m=0,int s=0) hour=h; minute=m; second=s; friend void DateTime(DATE private: int hour,minute, second; ; _ /函数 DateTime 的首部 cout “Now is“ d.year . d.month . d.day t.hour “:“ t.minute : t.second .end1; int mai
12、n ( ) DATE d(2004,7,10); TIME t(10, 10, 10); DateTime(d,t); return 0; ( A) void DateTime(DATE class A private: int x; protected: int y; public: int z; void setx(int i) x=i; int getx () return x; ; class B : protected A public: void setvalue(int a, int b, int c) setx (a); y=b; z=c; void display() cou
13、t getx ( ) “, “ y “, “ z “, “ end1; ; int main () B obj; obj.setvalue(5, 6, 7); obj.display ( ); return 0; 程序运行后的输出结果是 ( )。 ( A)产生语法错误 ( B) 7,6,5 ( C) 5,6,7 ( D) 7,5,6 28 若有以下程序 : #include iostream using namespace std; class A protected: int a; public: A() a=10; ; class A1 : public A public: A1() a=
14、a+1; ; class A2 : public A public: A2 () a=a+2; ; class B : public A1,public A2 public: B() void print() cout a end1; ; int main ( ) B obj; obj.print(); return 0; 程序运行后的输出结果是 ( )。 ( A)产生语法错误 ( B) 11 ( C) 12 ( D) 10 29 有以下程序: #include iostream using namespace std; class Base public: Base() virtual vo
15、id who() cout “Base Class“end1; Base() ; class Derivel : public Base public: void who() cout “Derivel Class“ end1; ; class Derive2 : public Base public: void who () cout “Derive2 Class“end1; ; int main () Base *p; Derivel obj1; Derive2 obj2; p= p= p- who ( ); return 0; 执行程序后的输出结果是 ( )。 ( A) Base Cla
16、ss ( B) Derivel Class ( C) Derive2 Class ( D)程序编译时出错 30 在进行了任何 C+流的操作后,都可以用 C+流的有关成员函数检测流的状态,其中用于是否进行了非法操作的函数名是 ( )。 ( A) fail ( B) eof ( C) bad ( D) good 31 已知序列 17,18,60,40,7,32,73,65,85,采用冒泡排序法对该序列作降序排序时,第 4趟的结果是【 】。 32 【 】是按照程序语句行的自然顺序,依次执行语句。 33 调试方法中的【 】最适合小规模程序的排错。 34 若 a=12,b=14,c=0,则表达式 “(y
17、=(aB) ?a: B) C) ?y: c”的值为【 】。 35 函数 sstrcmp()的功能是对两个字符串进行比较。当 s所指字符串和 t所指字符串相等时,返回值为 0:当 s所指字符串大于 t所指字符串时,返回值大于 0;当 s所指字符串大于 t所指字符串时,返回值大于 0(功能等同于 strcmp()。请填空。 int Sstrcmp(char *S, char *t) while(*s return 【 】 ; 36 若有以下程序: #include iostream using namespace std; int f(int x, int y) return (y-x)*x; i
18、nt main() int a=3,b=4,c=5,d; d=f(f(a,b) ,f(a,c) ); cout d end1; return 0; 执行后的输出结果是【 】。 37 如果一个数组中的每个元素都是同一类的对象,则该数组被称为【 】。 38 表达式 c3=c1.operator+(c2)或 c3=operator+(c1,c2)还可以表示为【 】 39 下面程序的打印结果是【 】。 #include iostream using namespace std; class Base public: Base(int x) a=x; void show() cout a; privat
19、e: int a; ; class Derived : public Base public: Derived(int i) :Base(i+1) ,b(i) void show() cout b; private: int b; ; int main ( ) Base b(5) , *pb; Derived d(1); pb= pb- show(); return 0; 40 有如下程序: #include iostream using namespace std; class AA public: virtual void f() cout “AA“; ; class BB : publi
20、c AA public: BB() cout “BB“; ; class CC : public BB public: virtual void f() BB:f(); cout “CC“; ; int main() AA aa,*p; BB bb; CC cc; p= p- f(); return O; 运行后的输出结果【 】 41 若有以下程序: #include iostream using namespace std; int main() char str10; cin str; cout str end1; return 0; 当输入为: This is a program! 那么
21、执行程序后的输出结果是【 】。 42 函数 YangHui的功能是把杨辉三角形的数据赋给二位数组的下半三角,形式如下: 其构成规律是: 第 0列元素和主对角线元素均为 1。 其余元素为其左上方和正上方元素值之和。 数据的个数每行递增 1。 请将程序补充完整 。 #define N 6 void YangHui(int xNN) int i, j; x0 0 =1; for(i = 1; i N; i+) xi0 =【 】 = 1; for(j=1; j i; j+) xij=【 】; 国家二级( C+)笔试模拟试卷 73答案与解析 1 【正确答案】 B 【试 题解析】 在一般情况下,要删除第
22、i个元素时,首先是从第 i+1个元素开始,直到第 n个元素之间共 n-i个元素依次向前移动一个位置,删除结束后,线性表的长度减 1。最坏情况指的是删除线性表的第一个元素,则需要移动表中第 1个元素以外所有的元素,答案为 B。 2 【正确答案】 D 【试题解析】 入栈运算需先将栈顶指针加 1,然后将新元素插到栈顶指针指向的位置,选项 A是错误的。出栈运算需将栈顶元素赋给一个指定变量,然后将栈顶指针减 1,选项 B是错误的。出栈运算与读栈顶元素不同之处在于读栈顶元素不删除栈顶元素。答案是选 项 D。 3 【正确答案】 B 【试题解析】 HL为链表的头指针。 HL指示链表中第一个节点的存储位置,在表
23、头插入一个由指针 p指向的节点后,头指针指向 p, p的指针域指向原链表中第一个节点 4 【正确答案】 B 【试题解析】 本题先可用排除法,由二叉树的前序序列为 ABDCEFG可知:二叉树的根节点为 A,因此选项 A错误。通过分析可知, B、 E是 A的左右子节点, D、 C是 B的左右子节点, F、 G是 E的左右子节点。 5 【正确答案】 B 【试题解析】 快速排序的思想是:从线性表中选取一元素,如 本题中的 46,将线性表后面小于 46的元素移到前边,而前面大于 46的元素移到后边。本题中 46是第一个元素,因此只需将线性表后面小于 46的元素移到前边。 6 【正确答案】 D 【试题解析
24、】 goto语句会造成程序的混乱,但在某些地方 goto语句还是需要的,若不使用 goto语句会使功能模糊。 7 【正确答案】 C 【试题解析】 在软件开发过程中,必须遵循软件工程的基本原则。这些原则使用于所有软件项目。这些基本原则包括:抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性、可验证性。选项 C是错 误的,它是一种软件开发的方法,而不属于软件工程的基本原则。 8 【正确答案】 A 【试题解析】 本题考核数据库规范化理论。数据库规范化的基本思想是逐步消除数据依赖中不合适的部分,根本思想是通过分解关系运算来消除多余的数据相关性。 9 【正确答案】 C 【试题解析】 本题考核关系代数
25、运算。关系运算包括关系代数和关系演算。 10 【正确答案】 A 【试题解析】 源程序文档化主要包括 3个方面的内容:标识符的命名、程序中添加注释以及程序的视觉组织。 11 【正确答案】 D 【 试题解析】 类是创建对象的模板,它包含着所创建对象的状态描述和方法的定义。类的完整描述包含了外部接口和内部算法以及数据结构的形式。 12 【正确答案】 D 【试题解析】 本题考核的是字符串常量这个知识点。字符串常量实际上是一个数组,组成数据的字符除显式给出的外,还包括字符结尾处标识字符串结束的符号0。所以字符串的字符个数等于字符个数加 1, C+语言编译器会自动在字符串的末尾加上 0,作为字符串结束标识
26、。故本题答案选项是: D。 13 【正确答案】 C 【试题解析】 此题是典型的 考题。题中 x=0,则 !x永远为真,对于条件表达式“!x”可等价为 “z=(ay x)?ay: x”。因为表达式中的“*(p+y)=py=ay”。 for语句每循环一次,就给变量 z重新赋值一次, z的值其实就是数组和 x相比 较,将数组 a中的最大值赋给 z。当 y=2后,退出循环,输出结果是 5。 22 【正确答案】 C 【试题解析】 本题考核指针和引用作为函数形参。做此类题时,应学会整体比较,要不然花费的时间不亚于一个大的编程题。 首先,这 4个程序都是调用 swap函数,而且目的都一致,交换传入的两个实参
27、值。 分析被调函数 swap()。在选项 A、 B和 C中都是指针作为形参,只有在选项 D中,函数 swap()是以引用作为形参。由指针和引用作为函数形参的特点可知,只要调用了函数,就能达到交换两个实参变量的值,所以这几 个被调函数没有问题。 再看主函数。在选项 C中,没有定义指针类型变量,而是直接给指针变量赋值: “floata, b; *a=8.0; *b=9.0; ”,这显然是非法的。想直接开辟存储空间,交换两个常量值,是不可能的。所以只有选项 C是错误的。 23 【正确答案】 C 【试题解析】 本题考核字符串的长度和字符型数组所占的字节数。本题在定义字符数组时没有定义数组长度,但赋给数
28、组初值,初值的个数即为数组的长度。故数组长度为 6(包括 0)。字符串的长度为有效字符的个数,为 5。所以程序最后输出 5,6。 24 【正确答案】 B 【试题解析】 本题考核静态数据成员和静态成员函数的应用。程序中定义一个类sample,它包括一个静态数据成员 n和一个静态成员函数 add(),并在类的构造函数中给类私有静态数据成员 n赋值。在主函数中,定义对象 a(2)时,通过构造函数使静态数据成员 n的值变为 2,在定义对象 b(5)时,通过构造函数使静态数据成员 n=5(覆盖了前面的 n=2),再执行 “sample: add()”使全局变量 s=5。 25 【正确答案】 B 【试题解
29、析】 本题考核类的定义和应用。程序首 先定义了两个类 A和 B。在类 A中,其私有数据成员 c为类 B的对象。类 A的成员函数 printa()中,调用私有成员对象 c的成员函数 printb()输出类 B私有数据成员 a和 b的值。 26 【正确答案】 A 【试题解析】 本题程序中,分别在类 DATE和 TIME中将普通函数 DateTime声明为友元函数,但该友元函数的定义是在类体外进行的。友元函数是一个普通函数,它虽然可以访问类对象的私有成员,但它毕竟不是类中的成员函数,因此在类体外定义友元函数时,不需要像成员函数一样在函数名前加上 “类名: ”。函数首部的其 他定义照抄类中友元函数的声
30、明。所以函数 DateTime的首部为 void DateTime(DATE&d; TIME &t),即选项 A。 27 【正确答案】 C 【试题解析】 本题考核保护继承中对类成员的访问权限。 在保护继承中,基类公有成员和保护成员都以保护成员身份出现在派生类中,而基类私有成员不可访问。 基类的公有成员和保护成员被继承以后作为派生类的保护成员,这样,派生类的其他成员可以直接访问它们。 由保护派生的类声明的对象,不能访问任何基类的成员。在本题中,基类 A中的 数据成员 y和函数 setx,经过保护继承以后,在派生类 B中成为保护成员,派生类 B的对象不能访问它们。而派生类 B中的函数 setval
31、ue和 display都是公有成员,可以通过对象对它们进行访问。所以程序中对各成员的访问是正确的。本程序的功能是对类中各数据成员进行赋值,然后查看赋值是否正确。 28 【正确答案】 A 【试题解析】 本题考核派生类的定义和使用。本程序有语法错误,这是由于类 B中的 print函数中的语句 “cout a end1; ”要输出成员 a的值,从而产生了二义性。分析如下:程序中定 义了类 A,类 A1和类 A2都是在类 A的基础上以公有继承方式产生的派生类,而类 B是在类 A1和类 A2的基础上经过多重继承方式产生的派生类,所以在类 B中成员 a有两个拷贝,系统无法区分是从 A1继承过来的 a,还从
32、 A2类继承过来的 a。 修改方法有以下两种: 在被访问的成员加上作用域分辨符 “:”。将类 B中的 print()函数体中语句改为: cout A1: a end1; 或 cout A2: a end1; 但两者的输出结果不同,前者输出 11,而后者输出 12。 采用 虚基类的方法。就是在定义 A1和 A2时,在派生方式前加上关键词“virtual”。 29 【正确答案】 C 【试题解析】 本题考核虚函数的应用。本题中,先定义了一个基类 Base,它含有一个虚成员函数 who(),随后定义的类 Derivel和 Derive2都是基类 Base的公有派生类。在主函数中定义了一个指向 Base
33、类的指针,它也被允许指向其派生类。在执行过程中,不断改变它所指向的对象, p- who就能调用不同的函数实现。这是因为使用了虚函数,因而进行动态联编。 程序最后把指针 p指向派生类Derive2的对象,由于函数 who()在基类 Base中是虚函数,所以系统调用 Derive2中的 who()函数,最后输出 Derive2Class。 30 【正确答案】 C 【试题解析】 C+中可以用文件流对象的下列成员函数来判别文件流的当前状态。 函数 is open 判定流对象是否与一个打开的文件相联系,若是,返回 true,否则返回 false。 函数 good 刚进行的操作成功时返回 true,否则返
34、回 false。 函数 fail 与 good()相反,刚进行的操作失败时返回 true,否则返回 false。 函数 bad 如果进行了非法操作返回 true,否则返回 false。 函数 eof 进行输入操作时,若到达文件尾返回 true,否则返回 false。 其中, eof函数只能用于输入流操作。 31 【正确答案】 60, 40, 73, 65, 85, 32, 18, 17, 7 【试题解析】 冒泡排序法的算法基本思想是:通过无序区中相邻记录关键词间的比较和位置交换,使关键词最小的记录如气泡一般逐渐往上 “漂浮 ”直至 “水面 ”。整个算 法是从最下面的记录开始,对每两个相邻的关键
35、词进行比较,且使关键词较小的记录 换至关键词较大的记录之前,使得经过一趟冒泡排序后,关键词最小的记录达到最上端。接着,再在剩下的记录中找关键词最小的记录,并把它换在第 2个位置上。 依此类推,一直到所有记录都有序为止。根据这种思想,每趟的排序结果如下: 初始: 17, 18, 60, 40, 7, 32, 73, 65, 85 第一趟 18, 60, 40, 17, 32, 73, 65, 85, 7 第二趟 60, 40, 18, 32, 73, 65, 85, 17, 7 第 三趟 60, 40, 32, 73, 65, 85, 18, 17, 7 第四趟 60, 40, 73, 65,
36、85, 32, 18, 17, 7 第五趟 60, 73, 65, 85, 40, 32, 18, 17, 7 第六趟 73, 65, 85, 60, 40, 32, 18, 17, 7 第七趟 73, 85, 65, 60, 40, 32, 18, 17, 7 第八趟 85, 73, 65, 60, 40, 32, 18, 17, 7 32 【正确答案】 顺序执行 【试题解析】 结构化程序设计语言仅仅使用顺序、选择和循环 3种基本结构。其中,顺序结构是最基本 、最常用的结构,它采用顺序执行的结构,即按照程序语句行的自然顺序,依次执行语句。 33 【正确答案】 回溯法 【试题解析】 这种调试方
37、法是从出现错误征兆处开始,人工沿控制流程往回追踪,直至发现出错的根源。这是在小程序中常用的一种有效的调试方法。程序变大后,可能的回溯路线显著增加,以致人工进行完全回溯可望而不可及。例如,程序中发现错误处是某个打印语句。通过输出值可推断程序在这一点上变量的值,再从这一点出发。回溯程序的执行过程,反复考虑: “如果程序在这一点上的状态 (变量的值 )是这样,那么程序在上一点的 状态一定是这样 ” ,直到找到错误的位置。 34 【正确答案】 14 【试题解析】 条件运算符是一种在两个表达式中选择一个的操作,它是 C+中惟一的三元运算符。在本题中,先计算 “(aB) ?a: b”,因为 ac的逻辑值为
38、真,所以表达式的值为 y的值,即 14。 35 【正确答案】 *s-*t或 s0-t0 【试题解析】 函数 sstrcmp()有两个字符型指针变量,用来指向两个字符串。比较两个字符串的大小方法是:从第 1个字符开始依次向后比较,若对应的字符相等,则接着比较下一个字符,一直 到两个字符串中的对应字符不相等,或有一个为 “0”,此时对应字符的 ASCII码大的字符串就大。故循环条件是 *s和 *t不为 0,且 *s和 *t相同。空白处应填入返回值,即 “*s-*t”或其等价形式。 36 【正确答案】 9 【试题解析】 本题考核函数的嵌套调用。在主函数中执行语句“d=f(f(a,b) ,f(a,c)
39、; ”调用了 3次 f()函数:调用 f(a,b) 得到的值为 3,调用 f(a,c) 得到的值为 6,调用 f(3,6)得到的值为 9。 37 【正确答案】 对象数组 【试题解析】 对象数 组是指数组元素为对象的数组,该数组中的每一个元素都是同一个类的对象。 38 【正确答案】 c3=c1+c2 【试题解析】 这是运算符重载应用的两种形式。 39 【正确答案】 2 【试题解析】 基类 Base派生出派生类 Derived,在主函数中,定义了基类对象b,基类指针 pb,以及派生类对象 d,并让基类指针 pb指向派生类对象乙在 C+中,当派生类的对象赋值给基类对象时,只能使用派生类对象中从基类继
40、承的成员。所以最后执行语句 “pb- show(); ”是调用基类的成员函数 show(),输出 a的值 2。 40 【正确答案】 BBBBAACC 【试题解析】 本题中,函数 f()在基类 AA中派生类 CC中都声明为虚函数,所以采用动态联编。主函数首先定义类 AA的对象 aa和指针对象 p,然后定义了类 BB的对象 bb,此时调用了类 BB的构造函数输出 BB。再定义类 CC的对象 cc,由于类 CC是类 BB的派生类,所以此时又调用类 BB的构造函数输出 BB。最后执行语句 “p=&cc; p- f(); ”,输出 AA和 CC。 41 【正确答案】 This 【试题解析】 本题考核 C
41、+的标准输入 /输出。提取符可以从输入 流中读取一个字符序列,即一个字符串。在处理这种字符序列时,字符串被认为是一个以空白字符结束的字符序列。因此,本题得到的输入仅仅是第一个空白符之前的字符序列 This。所以程序最后的输出是 This。 42 【正确答案】 xi0 xi-1j-1+xi-1j 【试题解析】 本题考核数组的应用,属于综合型考题。在函数 YangHui中,通过嵌套的 for语句实现杨辉三角各个位置元素的赋值。 由于杨辉三角中,第 0列元素和主对角线元素均为 1。所以可知, xi0=1,xii =1。 杨辉三角中,其余元素为其左上方和正上方元素值之和。若元素为 xij,那么其左上方的元素为 x-1j-1),正上方的元素为 xi-1j。所以 xij的值为 xi-1j-1+xi-1j。