二级C++22.docx
《二级C++22.docx》由会员分享,可在线阅读,更多相关《二级C++22.docx(28页珍藏版)》请在冰点文库上搜索。
二级C++22
二级C++-2-2
(总分:
84.50,做题时间:
90分钟)
一、{{B}}选择题{{/B}}(总题数:
35,分数:
55.50)
1.下面程序的运行结果为{{U}}{{/U}}。
#include<iostream.h>
voidmain()
{
chara='3';
switch(a)
{
case'3':
cout<<"3";
case'2':
cout<<"2";break;
default:
cout<<"1";
}
}
∙A.3
∙B.321
∙C.31
∙D.32
(分数:
2.00)
A.
B.
C.
D. √
解析:
[解析]本题主要考查switch语句的使用,在第一个case处,因为满足条件,所以输出字符3,但这个分支没有break语句终止,所以会继续执行下面的分支语句,即输出字符2,这时出现break语句,结束整个语句,即输出32。
2.从工程管理角度,软件设计一般分为两步完成,它们是{{U}}{{/U}}。
∙A.概要设计与详细设计
∙B.数据设计与接口设计
∙C.软件结构设计与数据设计
∙D.过程设计与数据设计
(分数:
2.00)
A. √
B.
C.
D.
解析:
[解析]从软件工程角度看,软件设计分为概要设计和详细设计。
概要设计就是结构设计,其主要目标就是给出软件的模块结构i详细设计的首要任务就是设计模块的程序流程、算法和数据结构,次要任务就是设计数据库。
3.下列对基类和派生类关系的描述中,错误的是{{U}}{{/U}}。
∙A.派生类是基类的具体化
∙B.派生类是基类的子集
∙C.派生类是基类定义的延续
∙D.派生类是基类的组合
(分数:
1.00)
A.
B. √
C.
D.
解析:
[解析]本题考核基类和派生类的关系。
派生类中包含了基类中的成员,它是对基类定义的扩充和延续,是对基类定义的进一步具体化,而不是基类的子集。
4.一个非空广义表的表头{{U}}{{/U}}。
∙A.不可能是子表
∙B.只能是子表
∙C.只能是原子
∙D.可以是子表或原子
(分数:
2.00)
A.
B.
C.
D. √
解析:
[解析]一个非空广义表的表头可以是子表或原子。
5.有以下程序:
#include<iostream>
usingnamespacestd;
classMyClass
{
public:
MyClass();
~MyClass();
voidSetValue(intval);
private:
staticinti;
};
intMyClass:
:
i=0;
MyClass:
:
MyClass()
{
i++;
cout<<i;
}
MyClass:
:
~MyClass()
{
i--;
cout<<i;
}
voidMyClass:
:
SetValue(intval)
{
i=val;
}
intmain()
{
MyClass*my[2];
intk;
for(k=0;k<2;k++)
my[k]=newMyClass;
for(k=0;k<2;k++)
deletemy[k];
return0;
}
运行后的输出结果是{{U}}{{/U}}。
∙A.1210
∙B.1100
∙C.1234
∙D.输出结果不确定
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]类MyClass中变量i是静态数据成员,它被MyClass类的所有对象共享,但它不属于任何一个对象,它的作用域是类范围。
程序i是用来统计类MyClass所创建对象的个数,每创建一个对象i加1,每删除MyClass类对象i减1。
6.对于语句cout<<setfill('*')<<setw(10)<<1<<setfill('*')<<setw
(2)<<2;的输出结果是
∙A.*********1*2
∙B.********12
∙C.*******1*2
∙D.12********
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]C++语言中setfill的意思是在空格的地方填上setfill函数中的参数字符,setw的意思是设置整个输出字符串的字符个数,本题中用*来代替空格。
7.有如下程序:
#include<iostream>
usingnamespacestd;
classBook{
public:
Book(char*t=""){strcpy(title,t);}
______
private:
chartitle[40];
};
classNovel:
publicBook{
public:
Novel(char*t=""):
Book(t){}
char*Category()const{return"文学";}
};
intmain(){
Book*pb;
pb=newNovel();
cout<<pb->Category();
deletepb;
return0;
}
若程序运行时输出结果是“文学”,则横线处缺失的语句是______。
∙A.char*Category();
∙B.char*Category()const;
∙C.virtualchar*Category()const;
∙D.virtualchar*Category()const=0;
(分数:
2.00)
A.
B.
C.
D. √
解析:
本题考查纯虚函数和抽象类,纯虚函数是在声明虚函数时被“初始化”为0的函数,包含纯虚函数的类为抽象类,抽象类是不能被实例化的,但是可以定义指向抽象类数据的指针变量,当派生类成为具体类后,就可以用这种指针指向派生类的对象,然后通过该指针调用虚函数,实现多态性的操作。
所以本题答案为D。
8.下列关于C++流的叙述中,正确的是
∙A.cin是一个输入流对象
∙B.可以用ifstream定义一个输出流对象
∙C.执行语句序列char*y="PQMNIt";cout<<y;将输出字符串"PQMN"的地址
∙D.执行语句序列charx[80];cin.getll’ne(x,80);时,若输入Happyrnewyear则x中的字符串是"HaPPy"。
(分数:
2.00)
A. √
B.
C.
D.
解析:
[解析]在C++中,cin作为输入流对象,cout作为输出流对象,ifstream作为文件输入流对象,ofstream作为文件输出流对象。
数组指针指向的是数组的首地址,而不是整个数组地址集合。
cin.getline(变量,整数)的作用是得到整行并将其赋值给变量。
9.类A是类B的友元,类B是类C的友元,则下列说法正确的是______。
∙A.类B是类A的友元
∙B.类C是类A的友元
∙C.类A是类C的友元
∙D.以上都不对
(分数:
2.50)
A.
B.
C.
D. √
解析:
[解析]选项A、B和C都不正确,因为友元关系是单项的,并且没有交换性、传递性。
10.有如下程序:
#include<iostream>
usingnamespacestd;
classAA{
intn;
public:
AA(intk):
n(k){}
intget(){returnn;}
intget()const{returnn+1;}
};
intmain()
{
AAa(5);
constAAb(6);
cout<<a.get()<<b.get();
return0;
}
执行后的输出结果是{{U}}{{/U}}。
∙A.55
∙B.57
∙C.75
∙D.77
(分数:
2.00)
A.
B. √
C.
D.
解析:
11.下面内容不属于使用软件开发工具好处的是{{U}}{{/U}}。
∙A.减少编程工作量
∙B.保证软件开发的质量和进度
∙C.节约软件开发人员的时间和精力
∙D.使软件开发人员将时间和精力花费在程序的编制和调试上
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]软件开发工具的好处在于减少编程工作量、保证了软件开发的质量和进度、节约软件开发人员花在程序编制和调试上的时间和精力,可以花更多的时间考虑软件的需求和设计。
12.下列符号中能够作为C++标识符的是______。
∙A.const
∙B.2a
∙C._shape
∙D.-count
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]本题考查C++标识符的命名规则,其规则有如下几点:
①所有标识符必须由字母、数字或下画线组成,且必须由字母或下画线开头;②所有标识符不能使用C++已有的关键字;③大、小写字母表示不同意义,即代表不同的标识符。
选项A是关键字,选项B不能以数字开头,选项D包含了字符“-”,且不能以此字符开头。
故答案为C。
13.结构化程序设计主要强调的是
∙A.程序的规模
∙B.程序的效率
∙C.程序设计语言的先进性
∙D.程序易读性
(分数:
1.00)
A.
B.
C.
D. √
解析:
解析:
结构化程序设计方法的主要原则可以概括为自顶向下、逐步求精、模块化及限制使用goto语句,总的来说可使程序结构良好、易读、易理解、易维护。
14.C++语言做了很多改进,下列描述中_______使得C语言发生了质变,即从面向过程变成面向对象。
∙A.增加了一些新的运算符
∙B.允许函数重载,并允许设置默认参数
∙C.规定函数说明必须用原型
∙D.引进类和对象的概念
(分数:
2.00)
A.
B.
C.
D. √
解析:
15.首先访问结点的左子树,然后访问该结点,最后访问结点的右子树,这种遍历方式称为{{U}}{{/U}}。
∙A.前序遍历
∙B.中序遍历
∙C.后序遍历
∙D.顺序遍历
(分数:
2.00)
A.
B. √
C.
D.
解析:
[解析]前序遍历序列的顺序是先根、再左子树、最后右子树;中序遍历序列的顺序是先左子树、再根、最后右子树;后序遍历序列的顺序是先左子树、再右子树、最后根。
16.下列叙述中正确的是
∙A.实体集之间一对一的联系实际上就是一一对应的关系
∙B.关系模型只能处理实体集之间一对一的联系
∙C.关系模型属于格式化模型
∙D.以上三种说法都不对
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]实体集之间一对一的联系不一定是一一对应的关系。
如在图书馆,“学生”与“座位”之间是一对一的联系,但学生与座位之间不一定是一一对应的关系,因为有可能某些座位是空的,没有学生去坐。
选项A错误。
在关系模型中,由于使用表格数据来表示实体之间的联系,所以,可以直接描述多对多的实体联系。
选项B错误。
关系模型是与格式化模型完全不同的数据模型,它与层次模型、网状模型相比有着本质的区别。
关系模型是用表格数据来表示实体本身及其相互之间的联系,它是建立在数学理论基础上的。
选项C错误。
本题的正确答案是D。
17.以下函数实现的功能是{{U}}{{/U}}。
voidfun(char*s)
{
char*p,*q,temp;
p=s;
q=s+strlen(s)-1;
while(p<q)
{
temp=*p;
*p=*q;
*p=temp;
p++;
q--;
}
}
∙A.将一个字符串首尾颠倒
∙B.计算字符串的长度
∙C.统计字符串中的空格个数
∙D.将字符串中的小写字母变成大写字母
(分数:
2.00)
A. √
B.
C.
D.
解析:
18.软件生命周期中所花费用最多的阶段是{{U}}{{/U}}。
∙A.详细设计
∙B.软件编码
∙C.软件测试
∙D.软件维护
(分数:
2.00)
A.
B.
C.
D. √
解析:
19.若有下面的说明和定义:
structtest
{
charm2;
floatm3;
unionuu{
charu1[5];
floatu2;
}ua;
}MyStruct;
则sizeof(MyStruct)的值是{{U}}{{/U}}。
∙A.10
∙B.11
∙C.12
∙D.9
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]C++中,联合体变量所占内存字节数与其成员中占字节数最多的那个成员相等。
联合体中,浮点变量u2占4个字节,字符型数组u1占5个字节,所以联合体u1占5个字节。
整个结构体所占字节数为10。
20.下面程序的运行结果是
#include<iostream.h>
classbase{
protected:
inta;
public:
base(){cout<<"0";}
};
classbasel:
virtualbase{
public:
basel(){cout<<"1";}
};
classbase2:
virtualbase{
public:
base2(){cout<<"2";}
};
classderived:
publicbasel,publicbase2{
public:
derived(){cout<<"3";}
};
voidmain()
{
derivedobj;
cout<<end1;
}
∙A.0123
∙B.3120
∙C.0312
∙D.3012
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]本题考查的是含有虚基类的继承中构造函数的调用顺序,应该先调用基类的构造函数,接着是按照派生类继承列表的顺序依次调用虚基类的构造函数,最后调用派生类自己的构造函数。
21.有如下数组声明:
intnum[10];,下标值引用错误的是
∙A.num[10]
∙B.num[5]
∙C.num[3]
∙D.num[0]
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]数组定义中的数字指的是数组的大小,而下标是从0开始的,所以题中数组的最后一个元素是num[9]。
22.下面的描述中,正确的是{{U}}{{/U}}。
∙A.virtual可以用来声明虚函数
∙B.含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类
∙C.即使基类的构造函数没有参数,派生类也必须建立构造函数
∙D.静态数据成员可以通过成员初始化列表来初始化
(分数:
2.00)
A. √
B.
C.
D.
解析:
23.下列关于信息和数据的叙述不正确的是{{U}}{{/U}}。
∙A.信息是数据的符号表示
∙B.信息是数据的内涵
∙C.信息是现实世界事物的存在方式或运动状态的反映
∙D.数据是描述现实世界事物的符号记录
(分数:
2.00)
A. √
B.
C.
D.
解析:
24.有如下语句序列:
intx=100,&r=x;
cout<<x<<'-'<<r<<end1:
己知其中变量x的地址为0012FF7C,则执行该语句序列的输出结果为{{U}}{{/U}}。
∙A.100-100
∙B.100-0012FF7C
∙C.0012FF7C-100
∙D.0012FF7C-0012FF7C
(分数:
2.00)
A. √
B.
C.
D.
解析:
[解析]在语句intx=100,&r=x;中声明r初始化对x的引用,所以x和&r的值都是100。
25.下列关于this指针的叙述中,正确的是{{U}}{{/U}}。
∙A.任何与类相关的函数都有this指针
∙B.类的成员函数都有this指针
∙C.类的友元函数都有this指针
∙D.类的非静态成员函数才有this指针
(分数:
2.00)
A.
B.
C.
D. √
解析:
[解析]本题考查this指针的使用。
类的每一个成员函数都有一个隐含的常量指针,即this指针。
类的静态成员函数不能含有this指针,因为this指针是一个指向本对象的指针。
26.有以下程序:
#include<iostream>
usingnamespacestd;
intmain()
{
intnum[2][3],*p;
intt,i,j,k=10;
p=num[0];
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
k++;
*p=k;
for(t=2;t<*p;t++)
{
if(!
(*p%t))
{
j--;*p--;
break;
}
*p++;
}
}
cout<<*(p-1)<<end1;
return0;
}
程序运行后的输出结果是{{U}}{{/U}}。
∙A.19
∙B.11
∙C.29
∙D.23
(分数:
1.00)
A.
B.
C. √
D.
解析:
[解析]本题考核数组与指针的关系。
程序首先初始化指针p,让其指向二维数组num的首元素,即num[0][0]。
程序中,第1个for循环是为二维数组的每行元素赋值而设置的循环,第2个for循环是为二维数组的每列元素赋值而设定的,第3个for循环是为判断数组元素是否是素数而设置的。
在第3个for循环中,如果*p的值能被小于它的数整除(即不是素数),则执行“j--;*p--;”,然后跳出第3个for循环。
j--的含义是让其前面的赋值语句重新赋值,而*p--的含义是使指针指向前一个单元。
语句“*p++;”将指针移到下一个单元,在下一次循环时,k加1,并k赋给*p,看*p是否为素数,这样一直到满足条件为止,即数组num[2][3]中的数都为素数。
最后数组num中各元素的值分别为大于10的素数,即分别为:
11,13;17,19,23,29。
程序最后要求输出*p的值,由于此时指针已指向数组num的最后一个元素,即num[1][2]。
所以输出的值是29。
27.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是
∙A.acbed
∙B.decab
∙C.deabc
∙D.cedba
(分数:
1.00)
A.
B.
C.
D. √
解析:
[解析]依据后序遍历序列可确定根结点为c;再依据中序遍历序列可知其左子树由deba构成,右子树为空;又由左子树的后序遍历序列可知其根结点为e,由中序遍历序列可知其左子树为d,右子树由ba构成,如下图所示。
求得该二叉树的前序遍历序列为选项D)。
[*]
28.有如下程序:
#include<iomanip>
#include<iostream>
usingnamespacestd;
intmain(){
cout<<setfill('*')<<setw(6)<<123<<456;
return0;
}
运行时的输出结果是{{U}}{{/U}}。
∙A.***123***456
∙B.***123456***
∙C.***123456
∙D.123456
(分数:
2.00)
A.
B.
C. √
D.
解析:
[解析]在主函数中第一次输出时调用函数setfill('*')设置填充字符为‘*’,调用函数setw(6)设置每次输出的宽度为6,所以第一次输出123时,多余的三个空位用‘*’填充,即结果为***123,第二次从输出流中输出456。
29.下列关于子类型的描述中,错误的是{{U}}{{/U}}。
∙A.子类型关系是可逆的
∙B.公有派生类的对象可以初始化基类的引用
∙C.只有公有的继承下,派生类是基类的子类型
∙D.子类型关系是可传递的
(分数:
2.00)
A. √
B.
C.
D.
解析:
30.下列关于宏的叙述中正确的是{{U}}{{/U}}。
∙A.宏名必须用大写字母表示
∙B.宏定义必须位于源程序中所有语句之前
∙C.宏替换没有数据类型限制
∙D.宏调用比函数调用耗费时间
(分数:
2.00)
A.
B.
C. √
D.
解析:
[解析]本题考查宏的相关知识点。
宏名没有大小写限制;宏定义可以放在程序中的任何位置,其有效范围是从定义开始到文件结束;宏替换可以代替任何数据类型,不受数据类型的限制;函数影响运行时间,宏调用影响编译时间。
31.按照标识符的要求,下列选项中,{{U}}{{/U}}符号不能组成标识符。
∙A.连接符
∙B.下划线
∙C.大小写字母
∙D.数字字符
(分数:
2.00)
A. √
B.
C.
D.
解析:
32.有如下程序:
#include<iostream>
usingnamespacestd;
voidfl(int8,.x,tnt8>-y){intz=x;x=y;y=z;}
voidf2(intx,inty){intz=x;x=y;y=z;}
intmain(){
intx=10,y=26;
f1(x,y);
f2(x,y);
cout<<y<<endl;
return0;
}
运行时的输出结果是______。
∙A.10
∙B.16
∙C.26
∙D.36
(分数:
1.00)
A. √
B.
C.
D.
解析:
[解析]该题考查了函数参数传递的两种方式:
引用传递和值传递。
引用传递时x和y会交换,而传值时二者不交换,因此选10。
33.数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。
下列图符名标识的图符不属于数据流图合法图符的是
∙A.控制流
∙B.加工
∙C.数据存储
∙D.源和潭
(分数:
1.00)
A. √
B.
C.
D.
解析:
解析:
数据流图包括4个方面,即加工(转换)(输入数据经加工变换产生输出)、数据流(沿箭头方向传送数据的通道,一般在旁边标注数据流名)、存储文件(数据源)(表示处理过程中存放各种数据的文件)、源和潭(表示系统和环境的接口,属系统之外