国家二级(C++)笔试模拟试卷128(题后含答案及解析)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
国家二级(C++)笔试模拟试卷128(题后含答案及解析)
题型有:1. 选择题 2. 填空题
选择题(每小题2分,共70分)下列各题A、B、C、D四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上。
1.设有一个10阶的对称矩阵A[10][10],采用压缩存储方式按行将矩阵中下三角部分的元素存入一维数组B[]中,A[0][0]存入B[0]中,则A[8][5]在B[]中()位置。
A.32
B.33
C.41
D.65
正确答案:C
解析:设有一个10阶的对称矩阵A[10][10],采用压缩存储方式按行将矩阵中下三角部分的元素存入一维数组B[]中,A[0][0]存入B[0]中,则A[8][5]在B[]中41=1+2+3+4+5+6+7+8+5位置。
2.设F是一个森林,B是由F转换得到的二叉树,F中有几个非叶结点,则B中右指针域为空的结点有()个。
A.n-1
B.n
C.n+1
D.n+2
正确答案:C
解析:具体方法是:①将森林中的每棵树变为二叉树。
②因为转换所得的二叉树的根结点的右子树均为空,故可将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。
3.在一个无向图中,所有顶点的度数之和等于所有边数的()倍。
A.3
B.2
C.1
D.1/2
正确答案:B
解析:在一个无向图中,所有顶点的度数之和等于所有边数的2倍。
4.由两个栈共享一个向量空间的好处是()。
A.减少存取时间,降低下溢发生的几率
B.节省存储空间,降低上溢发生的几率
C.减少存取时间,降低上溢发生的几率
D.节省存储空间,降低下溢发生的几率
正确答案:B
解析:由两个栈共享一个向量空间的好处是节省存储空间,降低上溢发生的几率。
5.设数组data[m]作为循环队列SQ的存储空间,front为队头指针,rear 为队尾指针,则执行出队操作后其头指针front值为()。
A.front=front+1
B.front=(front+1)%(m-1)
C.front=(front-1)%m
D.front=(front+1)%m
正确答案:D
解析:设数组data[m]作为循环队列SQ的存储空间,front为队头指针,rear 为队尾指针,则执行出队操作后其头指针front值为front=(front+1)%m。
6.一个非空广义表的表头()。
A.不可能是子表
B.只能是子表
C.只能是原子
D.可以是子表或原子
正确答案:D
解析:一个非空广义表的表头可以是子表或原子。
7.用某种排序方法对关键字序列(25,84,21,47,15,27,68,35,20)进行排序时,序列的变化情况如下:20,15,21,25,47,27,68,35,8415,20,21,25,35,27,47,68,8415,20,2重,25,27,35,47,68,84则所采用的排序方法是()。
A.选择排序
B.希尔排序
C.归并排序
D.快速排序
正确答案:D
解析:快速排序的基本思想是基于分治策略的。
对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分三步处理:①分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。
②递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。
③合并(Merge):
由于对分解出的两个子序列的排序是就地进行的,所以在L[p..q]和L[q +1..r]都排好序后不需要执行任何计算L[p..r)就已排好序。
8.适于对动态查找表进行高效率查找的组织结构是()。
A.有序表
B.分块有序表
C.三叉排序树
D.线性链表
正确答案:C
解析:适于对动态查找表进行高效率查找的组织结构是三叉排序树。
9.不定长文件是指()。
A.文件的长度不固定
B.记录的长度不固定
C.字段的长度不固定
D.关键字项的长度不固定
正确答案:B
解析:不定长文件是指记录的长度不固定。
10.n个顶点.的连通图至少有()条边。
A.n-1
B.n
C.n+1
D.0
正确答案:A
解析:n个顶点的连通图至少有n-1条边。
11.下列实现C语言语句printf(“Hello!”)的相同功能的语句是()。
A.cout>>”Hello!”
B.cin>>”Hello!”
C.cout<<”Hello!”
D.cin<<”Hello!”
正确答案:C
解析:C++输出语句语法。
12.下面关于数组的初始化正确的是()。
A.chara[]={‘a’,’b’,’c’}
B.chara[2]={‘a’,’b’,’c’}
C.chara[2][3]={{‘a’,’b’},{‘e’,’d’},{‘e’,’f’}}
D.chara[]={“a”,”b”,”c”}
正确答案:D
解析:”“是字符串符号,而不是字符符号。
13.下面是关于静态成员的说法,其中不正确的是()。
A.静态函数没有this指针
B.同一个类的不同对象拥有相同的静态数据成员
C.静态数据成员的初始化必须在类外进行
D.静态函数可以访问所有数据成员
正确答案:D
解析:只有静态函数才能访问静态成员。
14.类的析构函数的作用是()。
A.一般成员函数的初始化
B.类的初始化
C.对象的初始化
D.删除类创建的对象
正确答案:C
解析:构造函数的目的是对象初始化。
15.下列关于C++多态性的叙述,正确的是()。
A.C++语言的多态性分为编译时的多态性和运行时的多态性
B.编译时的多态性可通过虚函数实现
C.运行时的多态性可通过函数重载实现
D.运行时的多态性可通过操作符重载实现
正确答案:C
解析:运行时的多态性可通过函数重载实现。
16.不能重载的运算符是()。
A.+
B./
C.*
D.-
正确答案:C
解析:在C++中,不能重载的运算符有6个,它们是“.”,“*”,“->”,“::”,“sizeof”和三目运算符“?:”。
17.下列关于重载函数的调用时选择的依据中,错误的是()。
A.根据函数参数个数不同
B.根据函数参数类型不同
C.根据函数名字不同
D.根据函数的返回值不同
正确答案:C
解析:函数的重载要求函数名相同。
18.C++程序的执行是从()开始执行的?
A.main函数
B.程序的第一行
C.<iostream.h>
D.<stdio.h>
正确答案:A
解析:从主函数开始执行。
19.下列关于动态联编的叙述中,错误的是()。
A.动态联编的基础是虚函数
B.动态联编时在运行时确定所调用的函数代码
C.只有通过基类的指针或引用才能实现动态联编
D.重载也是动态联编
正确答案:D
解析:重载是静态联编。
20.设A是一个类的类名,下面函数的参数的引用形式是()。
A.function(A&p)
B.function(A p)
C.function(A*p)
D.function(constA)
正确答案:A
解析:重载的语法。
21.对于函数原型void function(int x,float y,char z=‘a’),合法的函数调用是()。
A.function(2,3.Of)
B.function(2,3,4)
C.function(2)
D.function( )
正确答案:A
解析:由于只有第三个参数有默认值,故要求给出前两个参数的值。
22.下面的程序输出的结果是()。
#include<iostream>using namespace std;void main( ){int a=2;int&c=a;a++;cout<<c;} A.2
B.3
C.4
D.*a
正确答案:B
解析:c是a的引用,故a++相当于c++。
23.下面程序输出的结果是()。
#include<iostream>using namespace std;void swap(int&a,int &b){int temp;temp=a;a=b;b=temp;}void main( ){int x=2;int y=3;swap(x,y);cout<<x<<y;}
A.23
B.32
C.ab
D.ba
正确答案:B
解析:函数的参数是引用,故能实现引用调用。
24.下面程序输出的结果是()。
#include<iostream>using namespace std;int test(int n1,int n2){return n1+n2;} float test(int f1,float f2){return f1-f2;}float test(float x,float y){return(x+y)/2;}float test(float x,int y){return(x+y)*2;} void main( ){int a1=10;float a2=2.5f;cout<<test(a1,a2);}
A.12.5
B.7.5
C.6.25
D.25
正确答案:B
解析:此处为函数的重载,第一个参数为int,第二个参数为float,故执行第二个函数。
25.下面程序输出的结果是()。
#include<iostream>using namespace std;class A{int X;public:A(int x):x(++x){}~A( ){cout <<x;}};class B:public A{int y;
public:B(int y):A(y),y(y){}~B( ){cout <<y;};};void main( ){B b(3);}
A.34
B.43
C.33
D.44
正确答案:A
解析:对象创建的次序为:先基类,后派生类;析构时,先派生类,后基类。
26.应在下面程序下划线中填写的正确的语句是()。
#include <iostream>using namespace std;class A{public:void test( ){cout<<”this is A!”;}};class B:public A{void test( ){______//显示调用基类函数test( )cout<<”this is B!”;}};void main( ){} A.A::test( )
B.test( )
C.B::test( )
D.this->test( )
正确答案:A
解析:A::表示A的作用域。
27.在C++中,继承的方式有()种。
A.2
B.3
C.4
D.5
正确答案:B
解析:类继承方式有三种,它们分别是公有、私有和保护。
28.要想在A类的基础上公有派生出B类,合法的C++语句是()。
A.B:public A{}
B.B::public A{}
C.B:drived A{}
D.B.public A{}
正确答案:A
解析:C++派生格式。
29.根据下面的程序,可以在主程序中使用的合法语句是()。
#include<iostream>using namespace std;class Person{int age;voidtest( ){} public:Person(intage){this->age=age;}void ShowAge( ){cout<<”the Person’s age is”,<<age;}};void main( ){Person wang(23);} A.wang.age=45
B.wang.wang(45)
C.wang.ShowAge( )
D.wang.test( )
正确答案:C
解析:ShowAse是类的公有成员,可以由对象访问,其他的为私有成员,类对象不能访问。
30.根据下面的程序,可以在主程序中使用的合法语句是()。
#include<iostream>using namespace std;class Person{int age;public:void SetAge(int x){age=x;}void ShowAge( ){cout<<”the Person’s age is”<<age;}};class Student:private Person{public:int study_code;};void main( ){Student wangqiang;wangqiang.study_code=23;}
A.wangqiang.age=231
B.wangqiang.Setage(23)
C.wangqiang.ShowAge( )
D.wangqiang.study_code=12
正确答案:D
解析:由于是私有继承,基类中所有成员成为派生类中的私有成员,故不能由派生类的对象访问,只有派生类的公有成员可由派生类对象访问。
31.下列关于虚函数的描述,错误的是()。
A.构造函数可以是虚函数
B.析构函数可以是虚函数
C.虚函数必须通过引用或基类的指针实现
D.虚函数的函数名必须与基类中对应的虚函数的函数名完全相同
正确答案:A
解析:构造函数不能是虚函数。
32.要实现多态性,派生类中的虚函数必须()。
A.函数名、参数及返回值必须与基类中对应的虚函数完全相同
B.参数个数不必与基类中对应的虚函数的函数名完全相同
C.参数类型不必与基类中对应的虚函数的函数名完全相同
D.返回值类型不必与基类中对应的虚函数的函数名完全相同
正确答案:A
解析:函数名、参数及返回值必须与基类中对应的虚函数完全相同。
33.下列特点不是构造函数的特点的是()。
A.构造函数的函数名必须与类名相同
B.构造函数可以重载
C.构造函数必须有返回值
D.构造函数在对象创建时,自动执行
正确答案:C
解析:构造函数不能有返回值。
34.已知类A中有如下一函数说明V oid Test(A&a);其中参数A&a的含义是()。
A.参数类型为指向A的指针类型
B.A为指针类型的形参
C.a为A类型的引用
D.为A类型的指针
正确答案:C
解析:参见引用的语法。
35.下列关键字不能作为函数返回值类型的是()。
A.float
B.int
C.double
D.virtual
正确答案:D
解析:virtual是虚函数的标志,而不是返回值的标志。
填空题(每空2分,共30分)请将每一个空的正确答案写在答题卡上。
注意:以命令关键字填空的必须拼写完整。
36.在程序设计阶段应该采取______和逐步求精的方法,把一个模块的功能逐步分解,细化为一系列具体的步骤,继而用某种程序设计语言写成程序。
正确答案:自顶向下
解析:程序设计时,应先考虑总体,后考虑细节,逐步使问题具体化,对复杂的问题,应该设计一些子目标作为过渡。
上述方法概括为:自顶向下,逐步求
精。
37.注释一般分为序言性注释和______注释。
正确答案:功能性
解析:注释一般分为序言性注释和功能性注释。
序言性注释通常位于每个程序的开头部分,给出程序的整体说明;功能性注释的位置一般嵌在源程序体中,主要描述其后的语句或程序做什么。
38.在面向对象方法中,类的实例称为______。
正确答案:对象
解析:在面向对象的程序设计方法中,类是具有相同属性或方法的对象的抽象,对象是类的实例。
39.某二叉树中度为2的结点有18个,则该二叉树中有______个叶子结点。
正确答案:19
解析:在任意一棵二叉树中,度数为0的结点(即叶子结点)总比度为2的结点多一个,因此该二叉树中叶子结点为18+1=19。
40.数据流图的类型有______和事务型。
正确答案:变换型
解析:典型的数据流类型有两种:变换型和事务型。
41.表达式x=operator-(y,z)可以表示为______。
正确答案:x=y-z
解析:运算符函数有两种调用形式,第一种是像一般函数那样用函数名调用,即y.operator-(z)或者operator-(y,z);另一种是通过运算符构成表达式,即y-z。
42.以下函数模板max( )的功能是返回数组a中最大元素的值。
请将横线处缺失部分补充完整。
template<typename T>T max(T a[],int n) { T m=a[0] for(int i=1;i<n;i++) if(a[i]>m)______;return m;}
正确答案:m=a[i]
解析:此题考查的是函数模板、if语句、for循环等知识点。
函数模板max( )的功能是返回数组a中最大元素的值,所以当a[i]是最大值时,应将a[i]的值赋值给m。
43.重载的关系运算符和逻辑运算符的返回类型应当是______。
正确答案:bool
解析:关系运算符和逻辑运算符重载后只能是true或者false,即返回值为bool型。
44.如果不使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问从基类继承的成员。
下列程序没有使用多态机制,其输出结果是______。
#include<iostream>using namespace std;class Base{ public:void print( ){cout<<’B’;}};class Derived:public Base{ public:void print( ){cout<<’D’;}}; int main( ) { Derived* pd=new Derived( );Base* pb=pd;pb->print( );pd->print( );delete pd;return 0;} 正确答案:BD
解析:因为本题中的print( )函数不是虚函数,所以通过基类指针pb调用的print( )函数,是基类中的版本,而通过派生类指针pb调用的print( )函数是派生类中的版本。
因此,程序运行时会先输出一个字符’B’,然后输出字符’D’。
45.对于派生类的构造函数,在定义对象时构造函数的执行顺序为:先执行调用______的构造函数,再执行调用子对象类的构造函数,最后执行派生类的构造函数体中的内容。
正确答案:基类
解析:对于派生类的构造函数,在定义对象时构造函数的执行顺序为:先执行调用基类的构造函数,再执行调用子对象类的构造函数,最后执行派生类的构造函数体中的内容。
46.动态多态性通过______实现。
正确答案:虚函数
解析:动态多态性是在程序运行过程中才动态确定操作所针对的对象。
动态多态性是通过虚函数实现的。
47.执行下列程序的输出结果是______:#include<iostream>using namespace std;class TestClass1 { public:void fun1( ){cout<<”TestClass1\n”;} virtual void fun2( ){cout<<”TestClass1\n”;} };class TestClass2:public TestClass1 { public:void fun1( ){cout<<”TestClass2\n”;} void fun2( ){cout<<”TestClass2\n”;} };void f(TestClass1&b)<b.fun1( );b.fun2( );} int main( ) { TestClass2 obj;f(obj);return 0;}
正确答案:TestClass1TestClass2
解析:主函数中首先定义TestClass2对象obj,然后执行“f(obj);”。
“void f(TestClass1& b)(b.fun1);b.fun2( );}”语句中fun中参数为TestClass1类型的对
象b,其中调用fun1( )和fun2( )。
基类TestClass1中的fun2( )为虚函数,所以派生类中的fun2也是虚函数,所以输出为调用TestClass1中的fun1,TestClass2中的fun2。
即结果为TestClass1和TestClass2。
48.定义一个函数名为fun,返回值为int,没有参数的纯虚函数的定义是______。
正确答案:virtual int fun( )=0;
解析:纯虚函数是在声明虚函数时被“初始化”为0的函数。
定义的一般形式为:virtual函数类型函数名(参数列表)=0。
所以,根据题目要求,答案为“virtual int fun( )=0;”。
49.重新定义标识符的作用域规定是外层变量被隐藏,______变量是可见的。
正确答案:内层
解析:重新定义标识符的作用域规定是外层变量被隐藏,内层变量可见。
50.如果表达式x=y*z中的“*”是作为成员函数重的运算符,采用运算符函数调用格式,该表达式还可以表示为______。
正确答案:x=y.operator*(z)或x=y.operator*(z)
解析:运算符函数有两种调用形式,第一种是像一般函数那样用函数名调用,即y.operator*(z)或者operator*(y,z);另一种是通过运算符构成表达式,即y*z。