1、国家二级( C+)机试模拟试卷 177及答案与解析 一、选择题 1 一个栈的初始状态为空。现将元素 1、 2、 3、 4、 5、 A、 B、 C、 D、 E依次入栈,然后再依次出栈,则元素出栈的顺序是 ( )。 ( A) 12345ABCDE ( B) EDCBA54321 ( C) ABCDE12345 ( D) 54321EDCBA 2 下列叙述中正确的是 ( )。 ( A)循环队列有队头和队尾两个指针,因此,循环队列是非线性结构 ( B)在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况 ( C)在循环 队列中,只需要队尾指针就能反映队列中元素的动态变化情况 ( D)循环队列中
2、元素的个数是由队头指针和队尾指针共同决定 3 在长度为 n的有序线性表中进行二分查找,最坏情况下需要比较的次数是 ( )。 ( A) O(n) ( B) O(n2) ( C) O(log2n) ( D) O(nlog2n) 4 下列叙述中正确的是 ( )。 ( A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 ( B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构 ( C)顺序存储结构能存储有序 表,链式存储结构不能存储有序表 ( D)链式存储结构比顺序存储结构节省存储空间 5 数据流图中带有箭头的线段表示的是 ( )。 ( A)控制流 ( B)事件驱动 (
3、C)模块调用 ( D)数据流 6 在软件开发中,需求分析阶段可以使用的工具是 ( )。 ( A) N-S图 ( B) DFD图 ( C) PAD图 ( D)程序流程图 7 在面向对象方法中,不属于 “对象 ”基本特点的是 ( )。 ( A)一致性 ( B)分类性 ( C)多态性 ( D)标识唯一性 8 一间宿舍可住多个学生,则 实体宿舍和学生之间的联系是 ( )。 ( A)一对一 ( B)一对多 ( C)多对一 ( D)多对多 9 在数据管理技术发展的三个阶段中,数据共享最好的是 ( )。 ( A)人工管理阶段 ( B)文件系统阶段 ( C)数据库系统阶段 ( D)三个阶段相同 10 有三个关
4、系 R、 S和 T如下:由关系 R和 S通过运算得到关系 T,则所使用的运算为 ( )。 ( A)笛卡尔积 ( B)交 ( C)并 ( D)自然连接 11 下列语句中,错误的是 ( )。 ( A) const int buffer=256; ( B) const double*point; ( C) int const buffer=256; ( D) double*const point; 12 if语句的语法格式可描述为: 格式 1: if() 或 格式 2: if() else 关于上面的语法格式,下列表述中错误的是 ( )。 ( A) 部分可以是一个 if语句,例如 if(if(a=O
5、) ( B) 部分可以是一个 if语句,例如 if( )if() ( C)如果在 前加上逻辑非运算符 !并交换 和 的位置,语句功能不变 ( D) 部分可以是一个循环语句,例如 if()while() 13 有如下说明: int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, *p=a; 则数值为 9的表达式是 ( )。 ( A) *p+9 ( B) *(p+8) ( C) *p+=9 ( D) p+8 14 有如下程序段: int i=0, j=1; int &r=i; r=j; int*p=&i; *p=&r; 其中会产生编译错误的语句是 ( )。 ( A) ( B)
6、 ( C) ( D) 15 下列字符串中,不可以用做 C+标识符的是 ( )。 ( A) y_2006 ( B) _TFEST-H ( C) Retum ( D) switch 16 为了取代 C中带参数的宏,在 C+中使用 ( )。 ( A)重载函数 ( B)内联函数 ( C)递归函数 ( D)友元函数 17 通过运算符重载,可以改变运算符 原有的 ( )。 ( A)操作数类型 ( B)操作数个数 ( C)优先级 ( D)结合性 18 在函数中,可以用 auto、 extern、 register和 static这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是
7、 ( )。 ( A) auto ( B) extem ( C) register ( D) static 19 下列运算符函数中肯定不属于类 FunNumber的成员函数的是 ( )。 ( A) int operator-(FunNumber); ( B) FunNumber operator-(); ( C) FunNumber operator-(int); ( D) int operator-(FunNumber, FunNumber); 20 若有下面的函数调用: fun(a+b, 3, max(n1, b) 则 fun的实参个数是 ( )。 ( A) 3 ( B) 4 ( C) 5
8、( D) 6 21 关于运算符重载,下列表述中正确的是 ( )。 ( A) C+已有的任何运算符都可以重载 ( B)运算符函数的返回类型不能声明为基本数据类型 ( C)在类型转换符函数的定义中不需要声明返回类型 ( D)可以通过运算符重载来创建 C+中原来没有的运算符 22 有如下程序: #include using namespace std; int main() void function(double val); double val; function(val); cout using namespace std; class Base public: void fun()coutf
9、un(); ( D) fun(); 29 有如下程序: #inehde using nanmapace std; class arclass public: arclass()tout using namespace std; int i=1; class Fun public: static int i; int value()return i1; int value()constreturn i+1; ; int Fun: i=2; int main() int i=3; Fun fun1; const Fun fun2; _ return 0; 若程序的输出结果是: 123 则程序中下
10、画线处遗漏的语句是 ( )。 ( A) cout using namespace std; class obj static int i; public: obj()i+; obj()i-; static int getVal()return i; ; int obj: i=0; void f()obj ob2; coutgetVal(); delete ob3; cout using namespaee std; class Pair int m, n; public: Pair(int j, int k): m(j), n(k) int get()return m; int get()co
11、nstreturn m+n; ; int main() Pair a(3, 5); const Pair b(3, 5); cout using namespaee std; elass Base protected: Base()cout using namespace std; class Instrument public: virtual void Display()=0; ; class Piano: public Instrument public: void Display() *函数体略 * ; int main() Instrument s; Instrument *p=0;
12、 ; return 0; 下列叙述中正确的是 ( )。 ( A)语句 “Insturment *p=0; ”编译时出错 ( B)语句 “Instrument s; ”编译时出错 ( C)类 Piano中的 Display函数不是虚函数 ( D)类 Instrument是一个虚基类 36 有如下程序: #include using namespace std; class A public: virtual void func1()coutfunc1(); p-func2(); delete p; return 0; 执行这个程序的输出结果是 ( )。 ( A) B1B2 ( B) A1A2 (
13、 C) B1A2 ( D) A1B2 37 关于在调用模板函数时模板实参的使用,下列表述中正确的是 ( )。 ( A)对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略 ( B)对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略 ( C)对于虚拟类型参数所对应的模板实参,若能够省略则必须省略 ( D)对于常规参数所对应的模板实参,任何情况下都不能 省略 38 关于关键字 class和 typename,下列表述中正确的是 ( )。 ( A)程序中的 typename都可以替换为 class ( B)程序中的 class都可以
14、替换为 typename ( C)在模板形参表中只能用 typename来声明参数的类型 ( D)在模板形参表中只能用 class或 typename来声明参数的类型 39 在下列枚举符号中,用来表示 “相对于当前位置 ”文件定位方式的是 ( )。 ( A) ios_base: cur ( B) ios base: beg ( C) ios_base: out ( D) ios base: end 40 下列关于 C+流的描述中,错误的是 ( )。 ( A) coutA表达式可输出字符 A ( B) eof()函数可以检测是否到达文件尾 ( C)对磁盘文件进行流操作时,必须包含头文件 fstr
15、emn ( D)以 ios_base: out模式打开的文件不存在时,将自动建立一个新文件 二、基本操作题 41 请使用 VC6或使用【答题】菜单打开考生文件夹 proj1下的工程 proj1,此工程中含有一个源程序文件 proj1 epp。其中位于每个 注释 “ ERROR *found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: Constructor called The value is 10 Copy constructor called The value is 10 Destructor called Destructor called 注意:只修改注释 “
16、ERROR *found*”的下一行语句,不要改动程序中的其他内容。 proj1 cpp #include using namespace std; class MyClass public: ERROR*found* MyClass(int i) value=i; tout using namespace std; const int MAXELEMENTS=100: 集合最多可拥有的元素个数 class IntegerSet int elemMAXELEMENTS; 用于存放集合元素的数组 int counter;用于记录集合中元素个数的计数器 public: IntegerSet():
17、counter(0) 创建一个空集合 IntegerSet(int data, int size); 利用数组提供的数据创建一个整数集合 void add(int element); 添加一个元素到集合中 void remove(int element); 删除集合中指定的元素 int getCount()constreturn counter; 返回集合中元素的个数 int getElement(int i)constreturn elemi; 返回集合中指定的元素 void show()const; ; void WriteToFile(char*); #endif main cpp #i
18、nclude“IntegerSet h“ #include IntegerSet: IntegerSet(int data, int size): counter(0) for(int i=0; i0; j-) if(element=elemj一 1)break; 如果找到的是等于 element的元素,说明要添加的元素已经存在,直接返回 if(j0) if(element=elemj-1)return; 如果找到的是小于 element的元素, j就是要添加的位置 该元素及其后面的元素依次 后移,腾出插入位置 for(int k=counter; kj; k-) elemk=elemk-1;
19、 elemj=element;将 element插入到该位置 counter+; 计数器加 1 void IntegerSet: remove(int element) *333* *666* void IntegerSet: show()const for(int i=0; i不能重载为类的友元函数; 类型转换函数只能定义为一个类的成员函数,而不能定义为类的友元函数; 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好; 若运算符所需的操作数 (尤其是第一个操作数 )希望有隐式类型转换,则只能选用友元函数; 当运算符函数是一个成员函数时,最左边的操作数 (或者只有最左边的操作数 )
20、必须是运算符类的一个类对象 (或者是 对该类对象的引用 );如果左边的操作数必须是一个不同类的对象,或者是一个内部类型的对象,该运算符函数必须作为一个友元函数来实现。所以答案为 D。 20 【正确答案】 A 【试题解析】 本题考查函数实参个数的基础知识,根据实参的概念, (a+b)、 3、max(n-1, b)分别为其中的 3个实参。故答案为 A。 21 【正确答案】 C 【试题解析】 重载运算符的规则如下: C+不允许用户自己定义新的运算符,只能对已有的 C+运算符进行重载; C+不能重载的运算符只有 5个; 重载不能改变运算符运算对 象的个数; 重载不能改变运算符的优先级和结合性; 重载运
21、算符的函数 不能有默认的参数; 重载的运算符必须和用户定义的自定义类型的对象一起使用,至少应有一个是类对象,即不允许参数全部是 C+的标准类型。故本题答案为 C。 22 【正确答案】 D 【试题解析】 本题考查函数调用及传值方式传递参数,执行函数 function时,并没有将 3的值传回来,而 val又没有初始化,所以会输出一个不确定的值, D选项正确。 23 【正确答案】 B 【试题解析】 本题考查复制构造函数,在以下 3种情况下使用: 程序 中需要新建立一个对象,并用另一个对象对它初始化; 函数的参数为类的对象; 函数的返回值是类的对象。其中 B选项是由赋值运算符重载实现的。 24 【正确
22、答案】 B 【试题解析】 类的成员访问权限有 3种: public(公用 )、 protected(保护 )、private(私有 )。 25 【正确答案】 A 【试题解析】 本题考查常对象的基本知识,常对象只能调用它的常成员函数,而不能调用非 const函数,常对象的成员函数不一定都是常成员函数,只需保证其数据成员是常数据成员即可。所以本题选 A。 26 【正确答案】 D 【试题解析】 私有继承方式为基类的公用成员和保护成员在派生类中成了私有成员,其私有成员仍为基类私有,但派生类对象可以访问基类的保护成员,所以基类对象不能赋值给派生类对象。抽象类是指含有纯虚拟函数的类,所以选项 D正确。 2
23、7 【正确答案】 B 【试题解析】 本题考查公用继承对基类成员的访问属性。在公用继承中,基类的公用成员和保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有。所以本题答案为 B。 28 【正确答案】 B 【试题解析】 本题考查公用继承对基 类成员的访问属性。在公用继承中,基类的公用成员和保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有。本题中想要输出 Base: fun,则必须调用基类的公用成员函数 fun,所以使用 Base: fun();来调用基类的成员函数 fun。 29 【正确答案】 D 【试题解析】 构造函数和析构函数的调用顺序为先构造的后析构,后构造的先析构。所
24、以本题答案为 D。 30 【正确答案】 A 【试题解析】 本题考查构造函数、常成员函数和静态数据成员。外部同名的变量赋值,不能改变类的静态变量值,所以 Fun对象里的 i值为 2,所以本题答案为A。 31 【正确答案】 D 【试题解析】 本题考查构造函数和析构函数的调用顺序,调用顺序为先构造的后析构,后构造的先析构。本题中先定义了一个对象 ob1,会执行构造函数,那么 i就变为了 1;再执行函数 f后,由于又定义了一个对象 ob2,所以再次执行构造函数, i就变为了 2,输出了 2。函数执行完后执行析构函数, i变为了 1,然后又定义了对象指针, i变为了 2。释放 ob3后, i变为了 1,
25、所以答案为 D。 32 【正确答案】 B 【试题解析】 本题考查常对象、常成员函 数及构造函数。常对象只能调用常成员函数,所以本题中,对象 a为普通对象,执行 a get()后,会执行默认构造函数,输出 3;对象 b为常对象,执行 b get()后,会执行常构造函数,输出 8。 33 【正确答案】 C 【试题解析】 本题考查派生类的构造函数和析构菌数,在定义二不派笙类的对象时,先调用基类的构造函数,然后再执行派生类的构造函数;对象释放时,先执行派生类的析构函数,再执行基类的析构函数。本题中定义了一个派生类对象d1,首先执行基类的构造函数,输出 A;然后执行派生类的构造函数,输出 B。所以答案为
26、 C。 34 【正确答案】 A 【试题解析】 默认继承方式为私有继承,私有继承将基类的公用成员和保护成员都变为了私有成员,基类的私有成员依然属于基类私有,派生类不能访问基类的私有成员。所以 A选项正确。 35 【正确答案】 B 【试题解析】 本题考查纯虚函数和抽象类,纯虚函数是在声明虚函数时被 “初始化 ”为 0的函数,包含纯虚函数的类为抽象类,抽象类不能被实例化,所以语句“Instrument s; ”在编译时出错。 36 【正确答案】 C 【试题解析】 本题考查虚函数。虚函数指在基类中 声明为 virtual并在一个或多个派生类中被重新定义的成员函数。题中定义了一个派生类对象 B,并使用类
27、 A的对象指针指向 B,由于基类 A中的 func1为虚函数,所以会执行派生类的func1,输出 B1,而基类中的 func2不是虚函数,所以 p-func2()会执行基类的func2,输出 A2。故答案为 C。 37 【正确答案】 D 【试题解析】 在调用一个模板函数时,编译系统需要足够的信息来判别每个虚拟类型参数所对应的实际类型,可以从两个不同的渠道获得这样的信息:从模板实参表 (用 “”也可以不要,因此选项 D错误。反之,对于某个模板实参,如果从模板函数的实参表中无法获得同样的信息,就不能省略;或者虽然能够获得同样的信息,但在它后面还有其他不能省略的实参,则其自身还是不能省略。 38 【
28、正确答案】 A 【试题解析】 程序中的 typename都可 以替换为 class,但程序中的 class不可以全部替换为 typename。在模板类型形参中除了 typename和 class以外,也可以用常规类型来声明参数的类型,所以 c、 D选项错误。 39 【正确答案】 A 【试题解析】 streamoff定义于 iostream h中,定义有偏移量 offset所能取得的最大值, seek_dir表示移动的基准位置,是一个有以下值的枚举: ios: beg: (文件开头 )、 ios: cur: (文件当前位置 )、 ios: end: (文件结尾 )。 40 【正确答案】 A 【试
29、题解析】 本题考查 C+流,想要输出字符 “A”,则应该是 cout“A”,所以本题答案为 A。 二、基本操作题 41 【正确答案】 (1)MyClass(int i=10) (2)MyClass(const MyClass&p) (3) MyClass() 【试题解析】 (1)考查构造函数参数默认值,题目要求输出语句: The value is 10,从主函数中可以看出, obj1并没有初始化,但是 obj1调用蹦 nt()函数时它的值为 10,由此可知构造函数的形参有默认值,且值 为 10,因此得出语句MyClass(int i=10)。 (2)主要考查考生对复制构造函数的掌握,复制构造函
30、数的形参都为引用,同时为了不改变形参的值要加上 const,因此得出语句 MyClass(const MyClass&p)。 (3)主要考查考生对析构函数的掌握,析构函数和构造函数一样,前面不能添加任何类型,要把 void去掉。 三、简单应用题 42 【正确答案】 (1)const Point&p (2)p1(p1), p2(p2) (3)Point p1, Point p2, Point p3 (4)(lengthl()+length2()+length3() 2 【试题解析】 (1)主要考查考生对函数形参的掌握,由函数的注释可知有本坐标点到达某个坐标点类的距离,再根据函数体 return
31、sqrt(xp x)*(xp x)+(yp y)*(yp y);可知,该坐标点类名为 p,因此可以知道形参为 Point&p,为了不改变该坐标点的值,前面要加上 const。 (2)主要考查考生对构造函数的掌握,对于常变量型私有成员 const Point p1,p2,只能用成员初始化列表进行赋值。 (3)主要考查考生对构造函数的掌握,由空格后面的语句: p1(p1), p2(p2),p3(p3)可知,该构造函数需要进行成员列表初始化,再看类的私有成员 const Point p1, p2, p3,可知 p1, p2, p3是 Point类型,因此形参为 Point p1, Point p2,
32、 Point p3。 (4)主要考查考生对成员函数的掌握,根据函数注释,可知本函数要求计算三角形面积,再看题目的提示: s=(a+b+c) 2。可知空格处要填的是三角形的三条边之和除 以 2,而求边长的函数已经给出,这里直接调用即可。 四、综合应用题 43 【正确答案】 for(int i=0; icounter; i+) 遍历整个集合 (数组 elem) if(element=elemi) 如果 element等于 elemi for(int j=i; jcounter1; j+) 从 i开始遍历集合 elem elemj=elemj+1; 把 elemj+1赋值给 elemj counter-; elem长度自减 1 return;返回 【试题解析】 主要考查考生对有序数组的掌握,题目要求成员函数 remove从集合中删除指定的元素 (如果集合中存在该元素 )。遍历数组 elem中的元素,找出与形参 element相等的元素,并将其删除,每删除一个元素,即将该元素之后的每个元素前移一位,如果不存在与形参 element相等的元素则没有操作。使用下标 i遍历数组, if语句判断是否与 element相等。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1