1、国家二级( C+)机试模拟试卷 178及答案与解析 一、选择题 1 下列关于栈叙述正确的是 ( )。 ( A)栈顶元素最先能被删除 ( B)栈顶元素最后才能被删除 ( C)栈底元素永远不能被删除 ( D)栈底元素最先被删除 2 下列叙述中正确的是 ( )。 ( A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化 ( B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化 ( C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化 ( D)以上说法都不正确 3 某二叉树共 有 7个结点,其中叶子结点只有 1个,则该二 -X树的深度为 (假设根结点在第 1层 )( ) ( A)
2、3 ( B) 4 ( C) 6 ( D) 7 4 软件按功能可以分为应用软件、系统软件和支撑软件 (或工具软件 )。下面属于应用软件的是 ( )。 ( A)学生成绩管理系统 ( B) C语言编译程序 ( C) UNIX操作系统 ( D)数据库管理系统 5 结构化程序所要求的基本结构不包括 ( )。 ( A)顺序结构 ( B) GOTO跳转 ( C)选择 (分支 )结构 ( D)重复 (循环 )结构 6 下面描述中错 误的是 ( )。 ( A)系统总体结构图支持软件系统的详细设计 ( B)软件设计是将软件需求转换为软件表示的过程 ( C)数据结构与数据库设计是软件设计的任务之一 ( D) PAD
3、图是软件详细设计的表示工具 7 负责数据库中查询操作的数据库语言是 ( )。 ( A)数据定义语言 ( B)数据管理语言 ( C)数据操纵语言 ( D)数据控制语言 8 一个教师可讲授多门课程,一门课程可由多个教师讲授。则实体教师和课程间的联系是 ( )。 ( A) 1: 1联系 ( B) 1: m联系 ( C) m: 1联 系 ( D) m: n联系 9 有三个关系 R、 S和 T如下:则由关系 R和 S得到关系 T的操作是 ( )。 ( A)自然连接 ( B)并 ( C)交 ( D)差 10 定义无符号整数类为 UInt,下面可以作为类 UInt实例化值的是 ( )。 ( A) 369 (
4、 B) 369 ( C) 0 369 ( D)整数集合 1, 2, 3, 4, 5 11 C语言对 C语言做了很多改进, C语言相对于 C语言的最根本的变化是 ( )。 ( A)增加了一些新的运算符 ( B)允许函数重载,并允许设置默认参数 ( C)规定函数说明符必须用原型 ( D)引进了类和对象的概念 12 下列 ( )是 C语言的有效标识符。 ( A) _Nol ( B) No 1 ( C) 12345 ( D) int 13 设有定义 int x; float y;,则 10 x y值的数据类型是 ( )。 ( A) int ( B) double ( C) float ( D)不确定
5、14 下列程序的执行结果为 ( )。 #include iostream h void main( ) int a 3, b 0; int * p a; b a: cout *p “, “ b end1; ( A) 3, 4 ( B) 4, 3 ( C) 3, 4 ( D) 4, 4 15 下面程序的运行结果为 ( )。 #include iostream h void main( ) for(int a 0, x 0; !x&a 10; a ) a: cout a end1; ( A) 10 ( B) 11 ( C) 12 ( D) 0 16 下面有关 for循环的正确描述是 ( )。 (
6、A) for循环只能用于循环次数已经确定的情况 ( B) for循环是先执行循环体语句,后判断表达式 ( C)在 for循环中,不能用 break语句跳出循环体 ( D)在 for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来 17 以下程序中调用 cin函数给变量 a输入数值的方法是错误的,其错误原因是( )。 #include iostream h void main( ) int * p, *q, a, b; p &a; cout “input a: “: cin p; ( A) *p表示的是指针变量 p的地址 ( B) p表示的是变量 a的地址,而不是变量 a的值 ( C)
7、 *P表示的是指针变量 P的值 ( D) *P只能用来说明 P是一个指针变量 18 假定 int类型变量占用两个字节,其有定义 int x10 0, 2, 4;则数组 x在内存中所占字节数是 ( )。 ( A) 13 ( B) 6 ( C) 10 ( D) 20 19 下列选 项,不正确的是 ( )。 ( A) for(int a 1; a 10; a ); ( B) int a 1; do a; while(a 10); ( C) int a 1; while(a 10) a: ( D) for(int a 1; a 10; a )a; 20 下面关于数组的初始化正确的是 ( )。 ( A)
8、 char str a, b, c ( B) char str2 a, b, c ( C) char str23 a, b, c, d, e, f ( D) char str( ) a, b, c 21 下列程序的输出结果为 ( )。 #include iostream h void main( ) char*a “hello“, “the“, “world“; char * * pa a: pa; cout * pa end1: ( A) hello ( B) the ( C) world ( D) hellotheworld 22 决定 C语言中函数的返回值类型的是 ( )。 ( A) r
9、eturn语句中的表达式类型 ( B)调用该函数时系统随机产生的类型 ( C)调用该函数时的主调用函数类型 ( D)在定义该函数时所指定的数据类型 23 有以下程序: 椭 nclude iostream h void fun(int a, int b, int c) a 456, b 567, c 678; void main() int x 10, y 20, z 30; fun(x, y, z); cout x , y , z end1; 输出结果是 ( )。 ( A) 30, 20, 10 ( B) 10, 20, 30 ( C) 456, 567, 678 ( D) 678, 567,
10、 456 24 以下叙述正确的是 ( )。 ( A)函数可以嵌套定义但不能嵌套调用 ( B)函数既可以嵌套调用也可以嵌套定义 ( C)函 数既不可以嵌套定义也不可以嵌套调用 ( D)函数可以嵌套调用但不可以嵌套定义 25 下列程序的输出结果是 ( )。 #include iostream h int min(int a, int b) if(a b) return a; else return b; return 0; void main( ) coutmin(1, min(2, 3) end1; ( A) 0 ( B) 1 ( C) 2 ( D) 3 26 下列程序的运行结果为 ( )。 衔
11、 nclude iostream h void print(double a) cout a: void print(int a, int b) cout b a: void main( ) print(1 2); cout “ “: print(3, 4); ( A) 1 2 34 ( B) 2 2 34 ( C) 1 2 43 ( D) 2 2 43 27 对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是 ( )。 ( A)公有类型 ( B)私有类型 ( C)保护类型 ( D)友元类型 28 在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化
12、并执行其他内部管理操作的函数是 ( )。 ( A)友元函数 ( B)虚函数 ( C)构造函数 ( D)析构函数 29 类的析构函数的作用是 ( )。 ( A)一般成员函数的初始化 ( B)类的初始化 ( C)对象的初始化 ( D)删除类创建的对象 30 下列说法正确的是 ( )。 ( A)内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方 ( B)内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方 ( C)类的内联函数必须在类体内定义 ( D)类的内联函数必须在类体外通过加关键字 inline定义 31 下面对静态数据成员的描述中,正确的是 ( )。 ( A)静态数据成员可
13、以在类体内进行初始化 ( B)静态数据成员不可以被类的对象调用 ( C)静态数据 成员不能受 private控制符的作用 ( D)静态数据成员可以直接用类名调用 32 下面对于友元函数描述正确的是 ( )。 ( A)友元函数的实现必须在类的内部定义 ( B)友元函数是类的成员函数 ( C)友元函数破坏了类的封装性和隐藏性 ( D)友元函数不能访问类的私有成员 33 在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是( )。 ( A)派生类的对象可以赋给基类的对象 ( B)派生类的对象可以初始化基类的引用 ( C)派生类的对象可以直接访问基类中的成员 ( D)派生类的对象的地址
14、可以赋给指向基类的指针 34 下面程序的运行结果为 ( )。 #include lostream h class A public: A( ) cout “1“; A( )cout “2“; ; class B: public A public: B( )tout “3“; B( )cout “4“; ; void main( ) B b: ( A) 1234 ( B) 1324 ( C) 1342 ( D) 3142 35 下列关于虚基类的描述,错误的是 ( )。 ( A)设置虚基类的目的是为了消除二义性 ( B)虚基类的构造函数在非虚基类之后调用 ( C)若同一层中包含多个虚基类,这些虚基
15、类的构造函数按它们说明的次序调用 ( D)若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数 36 下列关于多态性的描述,错误的是 ( )。 ( A) C语言中的多态性分为编 译时的多态性和运行时的多态性 ( B)编译时的多态性可通过函数重载实现 ( C)运行时的多态性可通过模板和虚函数实现 ( D)实现运行时多态性的机制称为动态绑定 37 下列运算符中,在 C语言中不能重载的是 ( )。 ( A) * ( B) ( C) ( D) 38 当使用 fstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为 ( )。 ( A) ios in ( B) i
16、os out ( C) ios in ios out ( D)以上都不对 39 下列程序的运行 结果是 ( )。 #include iostream h class A int a: public: A( )a 0; A(int aa) a aa; cout a: ; void main( ) A x, y(2), z(3); cout end1: ( A) 00 ( B) 23 ( C) 34 ( D) 25 40 下面程序的输出结果 是 ( )。 #include iostream h class example int a: public: example(int b)a b; void
17、 print( )a a 1; cout a “ “; void print( )constcout a “ “; ; void main( ) example x(3); const example y(2); x print( ); y print( ); ( A) 2 2 ( B) 4 3 ( C) 4 2 ( D) 3 2 二、基本操作题 41 请使用 VC6或使用【答题】菜单打开考生文件夹 proj1下的工程 proj1,该工程含有一个源程序文件 proj1 cpp。其中位于每个注释 “ ERROR *found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: The
18、 value is 10 注意:只修改注释 “ ERROR *found*”的下一行语句,不要改动程序中的其他内容。 proj1 cpp #include iostream using namespace std; class MyClass int value; public: ERROR *found* void MyClass(int val): value(val) int GetValue()eonstreturn value; void SetValue(int val); ; ERROR*found* inline void SetValue(int val)value val;
19、 int main() MyClass obj(0); obj SetValue(10); ERROR*found*下列语句功能是输出 obj的成员 value的值 cout “The value is“ obj value end1: return 0: 三、简单应用题 42 请使用 VC6或使用【答题】菜单打开考生文件夹 proj2下的工程 proj2,其中定义了 vehicle类,并派生出 motorcar类和 bicycle类。然后以 motorcar和 bicycle作为基类,再派生出 motorcycle类。要求将 vehicle作为虚基类,避免二义性问题。请在程序中的横线处填写适
20、当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 80 150 100 1 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动 “ *found*”。 #include iostream h class vehicle private: int MaxSpeed; int Weight; public: *found* vehicle(int maxspeed, int weight): _ vehicle( ) ; int getMaxSpeed( ) return MaxSpeed; int getWeight( ) return Weight;
21、; *found* class bicycle: _public vehicle private: int Height; public: bicycle(int maxspeed, int weight, int height): Vchicle(maxspeed, weight),Height(height) int getHeight( ) return Height; ; ; *found* class motorcar: _public vehicle private: int SeatNum; public: motorcar(int maxspeed, int weight, i
22、nt seatnum): vehicle(maxspeed, weight),SeatNum(seatnum) int getSeatNum()return SeatNum; ; ; *found* class motorcycle: _ public: motorcycle(int maxsPeed, int weight, int height): vehicle(maxspeed, weight),bicycle(maxspeed, weight, height), motorcar(maxspeed, weight, 1) ; void main( ) motorcycle a(80,
23、 150, 100); cout a getMaxSpeed( ) end1; cout a getWeight( ) end1; cout a getHeight( ) end1; cout a getSeatNum( ) end1; 四、综合应用题 43 使用 VC6打开考生文件夹下的工程 proj3,其中包含主程序文件 main cpp和用户定义的头文件 Array h,整个程序包含有 XArray类的定义和 main主函数的定义。请把主程序文件中的 XArray类的成员函数 sum( )的定义补充完整,补充的内容填写在 “ *333*“与 “ *666*“两行之间。经修改 后运行程序,
24、得到的输出为: 10 d 43 注意:只允许在 “ *333*“和*666*“两行之间填写内容,不允许修改其他任何地方的内容。 Array h #include iostream #include cstdlib using namespace std; class XArray数组类 int*a; int size; public: XArray(int b, int len): size(len)构造函数 if(size 2)cout “参数不合适 “ end1; exit(1); a new intsize; for(int i 0; i size; i )ai bi; int sum(
25、 );返回数组 asize中的最大值与最小值之和 int length( )constreturn size; 返回数组长度 xArray( )deletea, ; void writeToFile(const char*);不用考虑此语句的作用main cpp#include“Array h“ 返回数组 asize中的最大值与最小值之和 int XArray: sum()补充函数体 *333* *666* void main( ) int s110 23, 15, 19, 13, 26, 33, 18, 30, 20, 10; XArray x(s1, 10); int d x sum();
26、 cout x length( ) end1; cout “d “ d end1: writeToFile(“c: test “);不用考虑此语句的作用 国家二级( C+)机试模拟试卷 178答案与解析 一、选择题 1 【正确答案】 A 【试题解析】 栈是先进后出的数据结构,所以栈顶元素最后入栈却最先被删除。栈底元素最先入栈却最后被删除。所以选择 A。 2 【正确答案】 C 【试题解 析】 栈是先进后出的数据结构,在整个过程中,栈底指针不变,入栈与出栈操作均由栈顶指针的变化来操作,所以选择 C。 3 【正确答案】 D 【试题解析】 根据二叉树的基本性质 3:在任意一棵二叉树中,度为 0的叶子结
27、点总比度为 2的结点多一个,所以本题中度为 2的结点为 1 1 0个,所以可以知道本题目中的二叉树的每一个结点都有一个分支,所以共 7个结点共 7层,即度为 7。 4 【正确答案】 A 【试题解析】 软件按功能可以分为:应用软件、系统软件、支撑软件。操作系统、编译程序、汇编程序、网络软件、数据库管 理系统都属于系统软件。所以B、 C、 D都是系统软件,只有 A是应用软件。 5 【正确答案】 B 【试题解析】 1966年 Boehm和 Jacopini证明了程序设计语言仅仅使用顺序、选择和重复三种基本控制结构就足以表达出各种其他形式结构的程序设计方法。 6 【正确答案】 A 【试题解析】 详细设
28、计的任务是为软件结构图中而非总体结构图中的每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节,所以 A错误。 7 【正确答案】 C 【试题解析】 数据定义语言:负 责数据的模式定义与数据的物理存取构建;数据操纵语言:负责数据的操纵,包括查询及增、删、改等操作;数据控制语言:负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。 8 【正确答案】 D 【试题解析】 因为一个教师可讲授多门课程,而一门课程又能由多个老师讲授,所以他们之间是多对多的关系,可以表示为 m: n。 9 【正确答案】 D 【试题解析】 关系 T中的元组是关系 R中有而关系 S中没有
29、的元组的集合,即从关系 R中除去与关系 S中相同元组后得到的关系 T。所以做的是差的运算。 10 【 正确答案】 B 【试题解析】 只有 B选项中 369可以用无符号整数来表示和存储。 A选项中369有负号,选项 C中 0 369是小数都不能用无符号整数类存储。选项 D是一个整数集合得用数组来存储。 11 【正确答案】 D 【试题解析】 C语言最重要的特点是其为一种面向对象的程序设计语言,但是 C语言也包含了 C语言的全部特征。 12 【正确答案】 A 【试题解析】 标识符是一个以字母或下画线开始的,由字母、下画线和数字组成的字符串,标识符不能与任意关键字同名。 13 【正确答案】 C 【试题
30、解析】 由算术运算符组成的表达式中,若含有不同类型的操作数,则系统隐含地将低类型转化为高类型,由低至高的顺序为 intfloatdouble 。 14 【正确答案】 B 【试题解析】 *p为所指对象 a的值,语句 “b a: ”等价于 “b b a; aa 1; ”。 15 【正确答案】 C 【试题解析】 在进入最后一次循环时 a 10,在循环体内执行 “a; ”后 a11,执行完该次循环体计算 for循环的增量部分后 a 12小于 10,循环结束。 16 【正确答案】 D 【试题解析】 选项 A中 for循环可以用于循环次数不确定的情况;选项 B中 for循环是先判断表达式,后执行循环体语句
31、;选项 C中 for循环可以用 break语句跳出循环体,从而接着执行循环体后面的语句。 17 【正确答案】 B 【试题解析】 p表示的是变量 a的地址,定义后 *p表示的是变量 a的值。 18 【正确答案】 D 【试题解析】 x数组共有 10个元素,在花括号内只提供 3个初值,这表示只给前面的 3个成员赋值,后 7个元素的值为 0,所以,一共有 20个字节。 19 【正确答案】 B 【试 题解析】 本题考查的是基本循环语句的使用,选项 A,选项 C和选项 D都为正确的形式,在选项 B中的 while(a 10)后缺少结束符分号 “; ”。 20 【正确答案】 A 【试题解析】 本题考查的是字
32、符数组的初始化。选项 B中用 3个元素初始化大小为 2的数组,越界了;选项 C中应该是 2行 3列的数组,题中使用 3行 2列初始化;选项 D中数组合后应用方括号。 21 【正确答案】 B 【试题解析】 本题主要考查的是指针数组和指向指针的指针之间的关系,其中 a是指针数组, pa是指向指针数组行的指针,所以 pa自加 1相当于指向下一行。 22 【正确答案】 D 【试题解析】 C语言中,在定义该函数时所指定的数据类型决定函数的返回值类型。 23 【正确答案】 B 【试题解析】 本题考查函数中变量的作用范围,在主函数中给变量 x、 y、 z赋值,然后将其作为实参传递给了函数 fun( ),虽然
33、在函数 fun( )中改变了这 3个变量的值,但只是同名的局部变量,不影响函数中变量的值,所以在调用函数 fun( )结束后,主函数 3个变量的值未改变。 24 【正确答案】 D 【试题解析】 在 C语言中,所有的函 数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一个函数,即函数不能嵌套定义,但可以互相调用。但是不能调用 main( )函数。 25 【正确答案】 B 【试题解析】 本题考查的是函数的调用,第一次调用 min(2, 3),因为 2 3,所以返回值为 2,第二次调用 min(1, 2),因为 1 2,所以返回 1。 26 【正确答案】 D 【试题解析】 本题考查的是
34、对重载函数的掌握,因为 a是右结合的,所以 a先自加 1再输出,即为 2 2,之后调用函数 print(int a, int b)输出 b和 a,即43。 27 【正确答案】 D 【试题解析】 所谓的访问控制只包含公有类型、私有类型和保护类型 3种,友元可以是一个函数,也可以是一个类。 28 【正确答案】 C 【试题解析】 构造函数在创建对象时系统自动调用,其功能是使用给定的值将对象初始化。 29 【正确答案】 D 【试题解析】 析构函数就是用来释放对象的,它的调用完成之后,对象也就消失了,相应的内存空间也被释放了。 30 【正确答案】 B 【试题解析】 本题考查的是内联函数的定义,引入内联函
35、数是为了解决程 序中函数调用的效率问题,是以目标代码的增加为代价换取时间的节省;一般函数在运行时被调用,而调用的内联函数在编译时就被替代了,如果不加 inline关键字,则编译器会将在类说明部分定义的任何函数都被认定为内联函数。 31 【正确答案】 D 【试题解析】 静态数据成员必须在类体外初始化,它是类的所有对象的共有成员,需要使用类名调用,静态数据成员的初始化与权限控制无关。 32 【正确答案】 C 【试题解析】 友元函数的定义既可以在类内部进行,也可以在类外部进行。它提高了程序的运行效率,但破坏了类 的封装性和隐藏性,使得类的非成员函数可以访问类的私有成员。 33 【正确答案】 C 【试
36、题解析】 公有继承的派生类和基类是子类型的关系,所谓子类型是类型间一般和特殊的关系,即派生类是基类的子类型或者说基类的操作可以被用于操作派生类的对象。 34 【正确答案】 C 【试题解析】 本题考查的是在继承中构造函数和析构函数的调用顺序,应该是先调用基类的构造函数,再调用派生类的构造函数,调用析构函数时的顺序是先调用派生类的析构函数,后调用基类的析构函数。 35 【正确答案】 B 【试题解 析】 虚基类的引入就是为了消除二义性,其构造函数的调用仍然是按照继承的顺序进行的,对于多个虚基类则按它们说明的次序调用,虚基类的构造函数先于非虚基类的构造函数执行。 36 【正确答案】 C 【试题解析】
37、编译时的多态性是通过函数重载和模板体实现的,运行时的多态性是通过虚函数体实现的。 37 【正确答案】 C 【试题解析】 不能被重载的运算符还包括: “ ”、 “ *”、 “ *”和 “?: ”。 38 【正确答案】 D 【试题解析】 使用 fstream类建立文件流必须定义打开方式,否则 编译器无法判断该文件流是读还是写。 39 【正确答案】 B 【试题解析】 本题考查的是对构造函数的掌握,另外 “ ”运算符是右结合的,所以在进行输出的时候都是先把原来的输出后再自加 1。 40 【正确答案】 C 【试题解析】 “ ”是右结合的,所以先赋值为 3,最后输出 3 1;常成员函数只有常对象才能调用,
38、所以输出 2。 二、基本操作题 41 【正确答案】 (1)MyClass(int val): value(val) (2)Void MyClass SetValue(int val) value val; (3)cout “The value is“ obj GetValue( ) end1: 【试题解析】 (1)考查构造函数,定义构造函数时不能使用 Void,直接使用Myclass(int val)即可。 (2)主要考查成员函数定义,类的成员函数定义时要使用前缀 Myclass,而 inline是内联函数的关键字,在此是错误的,应该删掉 inline并在函数名前加上前缀MyClass,即 v
39、oid MyClass SetValue(int val) value val; 。 (3)考查成员函数调用, value是私有成员,在主函数中不能直接调用 value,可以使用成员函数 GetValue( )来得到 value的值。 三、简单应用题 42 【正确答案】 (1)MaxSpeed(maxspeed), Weight(weight) ; (2)virtual (3)vinual (4)public bicycle, public motorear 【试题解析】 (1)主要考查考生对构造函数的掌握,构造函数使 用初始化列表来对私有成员 MaxSpeed和 weight初始化。 (2)
40、主要考查考生对派生类的掌握,题目要求将 vehiele作为虚基类,避免二义性问题。因此在这里添加 virtual使 vehicle成为虚基类。 (3)主要考查考生对派生类的掌握,题目要求以 motorcar和 bicycle作为基类,再派生出 motorcyele类。在主函数中可以看到 motorcyele类的实例 a调用getHeight函数和 getseatNum函数,由此可知这两个基类都是公有继承,因此得出语句: public bicycle, public motorcar。 四、综合应用题 43 【正确答案】 int XArray: sum( )补充函数体 int i, max a0
41、, min a0; for(i 1; i size; 1 ) if(max ai) max ai; if(min ai) min ai; return max min; 【试题解析】 Xarray类中包含两个数据成员: a是数组的指针, size是数组的长度。 main( )函数中使用数组 s1构造 Xarray对象 x,此时对象 x中, a是包含 10个整型元素的数组指针, size是 10。成员函数 sum( )的作用是求得数组 asize中最大值和最小值之和,所以函数体中需要遍历 a的 10个元素,找出最大值 max和最小值 min,再将两者之和返回,程序首先将数组 a的第一个元素赋给 max和min,然后从下标为 1的元素开始向后遍历,遍历过程中,将当前遍历到的元素与max和 min比较,存在比 max大的元素时,更新 max值;存在比 min小的元素时,更新 min值,最后将两者之和作为函数值返回。