二级C++笔试373.docx
《二级C++笔试373.docx》由会员分享,可在线阅读,更多相关《二级C++笔试373.docx(28页珍藏版)》请在冰豆网上搜索。
二级C++笔试373
二级C++笔试-373
(总分:
100.00,做题时间:
90分钟)
一、选择题(总题数:
35,分数:
70.00)
1.深度为6的满二叉树中,度为2的结点个数为()。
(分数:
2.00)
A.31 √
B.32
C.63
D.64
解析:
[解析]本题要用到二叉树的两个性质定义:
①二叉树的性质2:
在二叉树的第k层上,最多有2k-1(k≥1,其中k为层数)个结点。
本题中第6层的结点数=26-1=32个。
这也是叶子结点最大数。
②二叉树的性质3:
在任意一棵二叉树中,叶子结点总是比度为2的结点多一个。
本题中,叶子结点最多为32个,度为2的结点数为32-1=31个。
[知识拓展]“满二叉树”是一种特殊的二叉树,指的是除了最后一层外,其他每一层的结点都有两个子结点(左、右子树配齐),也就是说每一层的结点数都是最大数(每k层有2k-1个结点,且深度为m的满二叉树有2m-1个结点)。
2.算法的有穷性是指()。
(分数:
2.00)
A.算法程序的长度是有限的
B.算法程序所处理的数据量是有限的
C.算法程序的运行时间是有限的 √
D.算法只能被有限的用户使用
解析:
[解析]算法的有穷性,是指算法必须能在有限的时间内做完,即算法必须能在执行有限个步骤之后终止。
3.以下程序的输出结果是()。
#include<iostream.h>
main()
intm=5;
if(m++>5)
cout<<m;
elsecout<<m--;
(分数:
2.00)
A.7
B.6 √
C.5
D.4
解析:
[解析]此题中,因为m++>5成立(此时m的值变为6),所以执行语句cout<<m;输出结果为6。
4.设有关键码序列(Q,G,M,Z,A,N,B,P,X,H,Y,S,T,L,K,E),采用堆排序法进行排序,经过初始建堆后关键码值A在序列中的序号是()。
(分数:
2.00)
A.1 √
B.4
C.8
D.12
解析:
[解析]建堆的算法:
首先将要排序的所有关键码放到一棵完全二叉树的各个结点中(这时的二叉树不具备堆的特性),然后,从i=[n/2](n为结点的个数)的结点Ki开始,逐步把以K[n/2],K[n/2]-1,K[n/2]-2,…为根的子树排成堆,直到以K1为根的树排成堆,就完成了建堆过程。
此题中,n=16,i=[16/2]=8,即从第8个结点开始,建堆完成后如下图:
[*]
所以经过初始建堆后关键码值A在序列中的序号是1。
5.有以下程序:
#include<iostream>
usingnamespacestd;
inta;
intfun();
intmain()
externinta;
intb;
a=10;
b=fun();
cout<<b<<end1;
return0;
intfun()
externinta;
return(10*
(分数:
2.00)
A.;
<
解析:
[解析]由主函数main入手,首先定义外部变量a,它的作用域为从变量的定义处开始,到本程序文件的末尾,赋值为10。
然后调用fun函数,在fun函数中计算10*a,其中a的作用域为到文件结尾,所以这里的a为10,即10*10。
6.以下程序的输出结果是()。
#include<iostream>
usingnamespacestd;
voidfun(char**q)
++q;
cout<<*q<<end1;
main()
staticchar*s[]="HI","HELL0","TEST";
char**p;
p=s;
fun(p);
system("PAUSE");
return0;
(分数:
2.00)
A.为空
B.HI
C.HELL0 √
D.TEST
解析:
[解析]由程序main主函数入手,调用fun函数,在fun函数中执行“cout<<*q<<end1;”语句实现程序输出。
主函数中变量char*s[]为指针数组,char**p表示p指向的字符指针数据。
*p就代表p指向的字符指针。
语句“p=s;”表明p指向字符指针s,而**p则是s[]中的第一个字符串“HI”。
主函数将变量p传值给函数fun(char**q)中的q,在函数体内部首先执行“++q”语句,就是将q的指针指向s中的下一个字符串,即“HELL0”,所以输出语句“cout<<*q<<end1;”输出该字符串值。
7.在C++中,实现封装性需借助于()。
(分数:
2.00)
A.枚举
B.类 √
C.数组
D.函数
解析:
[解析]此题考查的是C++语言中对象概念的理解。
所谓封装性是指将数据和算法捆绑成一个整体,这个整体就是对象。
C++语言通过建立用户定义类型“类”来支持封装性和信息隐藏。
8.阅读下面的程序:
#include<iostream.h>
voidmain()
intx;
cin>>x;
if(x++>5)
cout<<x<<end1;
else
cout<<x--<<end1;
如果两次执行上述程序,且键盘输入分别为4和6,则输出结果分别是()。
(分数:
2.00)
A.4,6
B.3,6
C.4,7
D.5,7 √
解析:
[解析]此题首先读入数值4赋给变量x,因为x++>5不成立,因为“++”后缀,之后x的值变为5,执行语句cout<<x--<<end1;输出:
5,之后x的值变为4。
当读入的数值是6时,因为x++>5成立,所以执行语句cout<<x<<end1;输出7。
9.设R是一个2元关系,S是一个3元关系,则下列运算中正确的是()。
(分数:
2.00)
A.R-S
B.R×S √
C.R∩S
D.R∪S
解析:
[解析]关系的交(∩)、并(∪)和差(-)运算要求两个关系是同元的,显然作为二元的R和三元S只能做笛卡儿积运算。
10.有如下程序:
#include<iostream.h>
voidmain()
charstr[2][5]="1234","5678"),*p[2];
inti,j,s=0;
for(i=0;i<2;i++)p[i]=str[i];
for(i=0;i<2;i++)
for(j=0;p[i][j]>'/0';j+=2)
s=10*s+p[i][j]-'0';
cout<<s;
该程序的输出结果是()。
(分数:
2.00)
A.1357 √
B.2468
C.3556
D.23678
解析:
[解析]程序中的“for(i=0;i<2;i++)p[i]=str[i];”语句将str中的值赋值给指针数组p。
在接下来的二重for循环中,跳取“j+=2”,p指针指向的值即“1”,“3”,“5”,“7”。
在分别对字符到整型的转换,即减去字符‘0’,然后依次转换为千位,百位,十位,个位“10%”操作输出接型s,即“1357”。
11.自然连接(Naturaljoin)是一种特殊的等值连接,下列哪个(些)是它满足下面的条件()。
Ⅰ、两关系间有公共域Ⅱ、通过公共域的等值进行连接Ⅲ、可进行逆运算
(分数:
2.00)
A.Ⅱ和Ⅲ
B.Ⅰ和Ⅱ √
C.Ⅰ和Ⅲ
D.Ⅰ、Ⅱ和Ⅲ
解析:
[解析]自然连接(Naturaljoin)是一种特殊的等值连接,它满足下面的条件:
①两关系间有公共域;
②通过公共域的等值进行连接。
12.下列程序用来判断数组中特定元素的位置所在,则输出结果为()。
#include<conio.h>
#include<iostream.h>
intfun(int*p,intn,int*j)
inti;
*j=0;
for(i=0;i<n;i++)
if(p[*j]<p[i])*j=i;
returnp[*j];
voidmain()
inta[10]=1,3,9,0,8,7,6,5,4,2)j;intj;
fun(a,10,&j);
cout<<j<<','<<a[j];
(分数:
2.00)
A.2,9 √
B.3
C.9
D.3,9
解析:
[解析]由程序中的主函数main入手,调用fun函数。
其中第一个实参为数组a的名字,数组名作为实参,传递的是数组的起始地址。
所以在fun函数中指针D指向了数组的第一个元素a[0]。
另外实参整型j传递的是引用,也就是j的地址。
在fun函数中在for循环中,依次将当前元素p[i]与j指针值为标识的p[*j]进行比较,取较大的。
最后循环后的结果就是p[*j]存放数组中的最大值,并且指针j为该值的标识位。
可以看出数组的最大值是9标识位为2。
13.()使一个函数可以定义成对许多不同数据类型完成同一个任务。
(分数:
2.00)
A.函数模板 √
B.重载函数
C.递归函数
D.模板函数
解析:
[解析]函数模板是一系列相关函数的模型或样板,这些函数的源代码形式相同,只是所针对的数据类型不同。
因此,函数模板使一个函数可以定义成对许多不同数据类型完成同一个任务。
14.以下描述中,不是线性表顺序存储结构特征的是()。
(分数:
2.00)
A.不便于插入和删除
B.需要连续的存储空间
C.可随机访问
D.需另外开辟空间来保存元素之间的关系 √
解析:
[解析]线性表的顺序存储是用一片连续的空间来存放数据元素,其特点是逻辑上相邻的元素在物理位置上也相邻。
数据元素之间逻辑上的先后关系自动隐含在物理位置的相邻元素之中,因此不需要另外开辟空间来保存元素之间的关系。
15.有如下程序:
#include<iostream>
usingnamespacestd;
inti=1;
classFun
public:
staticinti;
intvalue()returni-1;
intvalue()constreturni+1;
;
intFun:
:
i=2;
intmain()
inti=3;
Funfun1;
constFunfun2;
______
return0;
若程序的输出结果是:
123
则程序中横线处的语句是()。
(分数:
2.00)
A.cout<<fun1.value()<<Fun:
:
i<<fun2.value(); √
B.cout<<Fun:
:
i<<fun1.value()<<fun2.value();
C.count<<fun.value()<<fun2.value()<<Fun:
:
i;
D.cout<<fun2.value()<<Fun:
:
i<<fun1.value();
解析:
[解析]此题因为定义的变量i是static类型的(main()函数内部的i只是一个局部变量),所以,选项A)中fun1.value()的返回值是1,Fun:
:
i引用的是外部变量会输出2;fun2.value();会调用常成员函数intvalueoconstfreruni+1;}使得外部静态变量i的值增加为3,故输出3。
16.下面叙述错误的是()。
(分数:
2.00)
A.对基类成员的访问能力在private派生类中和public派生类中是相同的
B.基类的private成员在public派生类中不可访问
C.基类中的public成员在protected派生类中是protected的
D.基类中的public成员在protected派生类中仍然是public的 √
解析:
[解析]基类的公有成员和保护成员在保护派生类中都成了保护成员,其私有成员仍为基类私有。
17.在进行任何C++流的操作后,都可以用C++流的有关成员函数检测流的状态:
其中只能用于检测输入流状态的操作函数名称是()。
(分数:
2.00)
A.fail
B.eof √
C.bad
D.good
解析:
[解析]可以用文件流对象的成员函数来判别文件流当前的状态:
fail,刚进行的操作失败时返回true,否则返回false;eof,进行输入操作时,若文件到达文件尾返回true,否则返回false;bad,如果进行了非法操作返回true,否则返回false;good,刚进行的操作成功时返回true,否则返回false。
18.有如下程序:
#include<iostream>
usingnamespacestd;
classTestClass1
public:
TestClass1()cout<<"TestClass1";
~TestClass1()cout<<"~TestClass1";
;
classTestClass2:
publicTestClass1
TestClass1*p;
public:
Testclass2()cout<<"TestClass2";p=newTestClass1();
~TestClass2()cout<<"~TestClass2";deletep;
);
intmain()
TestClass2obj;
return0;
执行这个程序的输出结果是()。
(分数:
2.00)
A.TestClass2TestClass1TestClass1~TestClass1~TestClass2~TestClass1
B.TestClass1TestClass2TestClass1~TestClass2~TestClass1~TestClass1 √
C.TestClass2TestClass1TestClass1~TestClass2~TestClass1~TestClass1
D.TestClass1TestClass2TestClas1~TestClass1~TestClass2~TestClass1
解析:
[解析]派生类中构造函数的执行顺序是:
先调用基类构造函数,对基类数据成员初始化,然后调用子对象构造函数,对子对象数据成员初始化;最后执行派生类构造函数本身,对派生类数据成员初始化。
由主函数main入手,首先定义了一个TestClass2对象obj。
其中TestClass2公共继承TestClass1,对象obj可以访问TestClass1中的公有成员函数。
TestClass2中定义了一个TestClass1的指针p,给p分配新空间,即指向类TestClass1,输出“TestClass1”。
在TestClass2的构造函数中首先输出“TestClass2”,并在TestClass1构造函数中输出“TestClass1”。
TestClass2析构函数中输出“~TestClass2”,删除指针p,输出“~TestClass1”。
析构TestClass1输出“~TestClass1”。
19.下列关于C++函数的说明中,正确的是()。
(分数:
2.00)
A.内联函数就是定义在另一个函数体内部的函数
B.函数体的最后一条语句必须是return语句
C.标准C++要求在调用一个函数之前,必须先声明其原型 √
D.编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式
解析:
[解析]此题考查的是有关函数的概念。
内联函数是在函数定义之前加关键字inline来声明的函数,而不是定义在另一个函数体内部的函数,故选项A)错误;无返回值的函数在执行完最后一条语句后,会自动返回而不必加入return语句,故选项B)错误;如果函数只是返回值类型不同,而其他完全相同,则不能作为函数重载来使用。
20.下列变量名中,合法的()。
(分数:
2.00)
A.CHINA √
B.byte.size
C.double
D.A+a
解析:
[解析]变量的定义要符合标识符的定义规则。
选项B)byte-size中含有不合法的字符“-”;选项C)中的变量名是C++中的保留字;选项D)变量名中同样含有非法的字符“+”:
只有选项A)符合要求。
21.在声明派生类时,如果不显示地给出继承方式,缺省的类继承方式是私有继承private。
已知有如下类定义:
classTestClass
protected:
voidfun()
;
classTestClass1:
TestClass;
则TestClass类中的成员函数fun(),TestClass1类中的访问权限是()。
(分数:
2.00)
A.public
B.private √
C.protected
D.virtual
解析:
[解析]程序中的TestClass1为TestClass的派生类,如果不写继承方式,则默认为private,所以TestClass1私有继承TestClass,对于基类中的保护成员,继承类的访问权限为private。
所以选择B)。
22.有如下程序:
#include<iostream>
usingnamespacestd;
classA
public:
A()cout<<"A";
;
classBpublic:
B()cout<<"B";
;
classC:
publicA
Bb;
public:
C()cout<<"C";
;
intmain()
Cobj;
return0;
执行后的输出结果是()。
(分数:
2.00)
A.CBA
B.BAC
C.ACB
D.ABC √
解析:
[解析]此题中,语句Cobj对象初始化首先调用基类的构造函数A(),输出“A”,其次是C类中对象的构造函数的调用,即调用B(),输出“B”;最后是调用自身的构造函数C(),输出“C”。
23.静态数据成员在()进行初始化。
(分数:
2.00)
A.成员函数列表
B.类体外 √
C.构造函数
D.成员函数
解析:
[解析]静态数据成员不能在参数初始化表对静态数据成员初始化,只能在类体外进行初始化。
24.按照“先进后出”原则组织数据的数据结构是()。
(分数:
2.00)
A.队列
B.栈 √
C.舣向链表
D.二叉树
解析:
[解析]栈是一种特殊的线性表,其插入和删除运算都只在线性表的一端进行,而另一端是封闭的。
进行插入、删除的一端称为栈顶,封闭的一端称为栈底。
栈顶元素是最后被插入的元素,而是最后被删除的,是按先进后出的原则组织数据的。
[知识拓展]“栈”其形式如手枪的弹匣,最后压入的子弹总是最先被弹出,而最先压入的子弹最后才被弹出,也就是“先进后出”。
25.关于this指针的说法不正确的是()。
(分数:
2.00)
A.不能在程序中修改this指针
B.this指针可以给其他指针赋值,但不能修改this指针
C.静态成员函数中没有this指针
D.this指针可以被赋值 √
解析:
[解析]this指针不能在程序中修改,不能被幅值;静态成员没有this指针,因为类中只有一个静态成员函数实例,使用this指针无意义。
26.下列语句中,错误的是()。
(分数:
2.00)
A.constintbuffer=-256;
B.constinttemp; √
C.constdouble*point;
D.constdouble*rt=newdouble(5.5);
解析:
[解析]符号常量声明语句的语法格式是:
const类型名符号常量=初值表达式,选项B)中未给常变量赋初值,故错误;而选项C)中定义的是一个指向浮点型常量的指针,而不是定义一个浮点型常量,所以可以不赋初值。
27.下列对重载函数的描述中,()是错误的。
(分数:
2.00)
A.重载函数中不允许使用默认参数 √
B.重载函数中编译是根据参数表进行选择
C.不要使用重载函数来描述毫不相干的函数
D.构造函数重载将会给初始化带来多种方式
解析:
[解析]选项A)中,重载函数中是允许使用默认参数的;为了使重载函数有意义,不要使用重载函数来描述毫无相干的函数;重载函数中编译是根据参数表进行选择,包括参数的个数和类型。
28.在三级模式之间引入两层映像,其主要功能之一是()。
(分数:
2.00)
A.使数据与程序具有较高的独立性 √
B.使系统具有较高的通道能力
C.保持数据与程序的一致性
D.提高存储空间的利用率
解析:
[解析]数据库管理系统在数据库的三级模式之间提供了两层映像,保证了数据库中数据的较高的逻辑独立性和物理独立性。
使系统具有较高的通道能力和提高存储空间的利用率是操作系统的职能,而不是数据库管理系统的职能。
在数据库系统中没有“数据和程序一致性”这一概念。
29.有如下类说明:
classTestClass
intx;
public:
TestClass(intn)x=n;
;
classTestClass1:
publicTestClass
inty;
public:
TestClass1(inta,intb);
;
在构造函数TestClass1的下列定义中,正确的是()。
(分数:
2.00)
A.TestClass1:
:
TestClass1(inta,intb):
x(a),y(b)
B.TestClass1:
:
TestClass1(inta,intb):
TestClass(a),y(b) √
C.TestClass1:
:
TestClass1(inta,intb):
x(a),TestClass1(b)
D.TestClass1:
:
TestClass1(inta,intb):
TestClass(a),TestClass1(b)
解析:
[解析]题目中程序TestClass为基类,TestClass1为派生类,派生类构造函数的一般形式为:
派生类构造函数名(总参数类表):
基类构造函数名(参数列表){派生类中新增数据成员初始化语句}。
派生类TestClass1的基类函数名为TestClass,总参数为inta,intb,所以选择B)。
30.下列工具中为需求分析常用工具的是()。
(分数:
2.00)
A.PAD
B.PFD
C.N-S
D.DFD √
解析:
[解析]需求分析常用的工具有数据流图(DFD)、数据字典(DD)、判定树和判定表。
PAD(问题分析图)、PFD(程序流程图)、N-S(盒式图)都是详细设计的常用工具,不是需求分析的工具。
31.对于浯句cout<<end1<<x;中的各个组成部分,下列叙述中错误的是()。
(分数:
2.00)
A.“cout”是…个输出流对象
B.“end1”的作用是输出回车换行
C.“x”是…个变量
D.“<<”称作提取运算符 √
解析:
[解析]语句cout<<end1<<x;作用是输出回车和变量x的值。
所以题目中选项A)、B)、C)的叙述均正确,只有选项D)叙述错误,“<<”是插入运算符。
32.已知一棵二叉树的先根序列为ABCDEFK,中根序列为DGBAFCK,则结点