二级C++80.docx
《二级C++80.docx》由会员分享,可在线阅读,更多相关《二级C++80.docx(15页珍藏版)》请在冰豆网上搜索。
二级C++80
二级C++-80
(总分:
66.00,做题时间:
90分钟)
一、选择题(总题数:
20,分数:
36.00)
1.语句ofstreamf("SALARY.DAT",ios:
:
app|ios:
:
binary);的功能是建立流对象f,试图打开文件SALARY.DAT并与之连接,并且
(分数:
2.00)
A.若文件存在,将文件写指针定位于文件尾;若文件不存在,建立一个新文件 √
B.若文件存在,将其置为空文件;若文件不存在,打开失败
C.若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件
D.若文件存在,打开失败;若文件不存在,建立一个新文件
解析:
[解析]本题考查的是文件流的操作,app表示以追加方式打开文件(即将指针移至文件尾),binary表示以二进制方式打开文件。
2.一个函数为voidf(int,charch="a"),另一个函数为voidf(int),则它们
(分数:
1.00)
A.不能在同一程序中定义
B.可以在同一程序中定义并可重载
C.可以在同一程序中定义,但不可以重载 √
D.以上说法均不正确
解析:
[解析]本题函数的调用。
只要满足参数列表不同的条件,就可以在同一程序中对同名的函数进行定义。
但是由于其中一个函数有默认值,因此当程序中出现语句“x=f(10);”时,就会产生二义性,不能确定调用函数f(10)还是调用函数f(10,"a"),此时这两个函数不能重载。
3.下列各组类型声明符中,含义相同的一组是
(分数:
2.00)
A.unsignedlongint和long
B.signedshortint和short √
C.unsignedshort和short
D.shinlint和short
解析:
[解析]signedshortint(有符号短整型数),简写为short或int,字长为2字节共16位二进制数,数的范围是-32768~32767。
加上不同的修饰符,整型数有以下几种类型:
signedlongint(有符号长整型数),简写为long,字长为4字节共32位二进制数,数的范围是-2147483648~2147483647;unsignedshortint(无符号短整型数),简写为unsignedint,字长为2字节共16位二进制数,数的范围是0~65535;unsigned:
longint(无符号长整型数),简写为unsignedlong,字长为4字节共32位二进制数,数的范围是0~4294967295。
4.下列叙述中正确的是
(分数:
2.00)
A.软件测试的目的是证明程序是否正确
B.软件测试的目的是尽可能多的发现程序中的错误 √
C.软件测试的目的是使程序运行结果正确
D.软件测试的目的是使程序符合结构化原则
解析:
[解析]软件测试的目标是在精心控制的环境下执行程序,以发现程序中的错误,给出程序可靠性的鉴定。
由此可知,测试不是为了证明程序是正确的,而是在设想程序有错误的前提下进行的,其目的是设法暴露程序中的错误和缺陷。
测试只能说明程序有错,而不能证明程序无错,希望通过有限次的测试就能发现程序中的所有错误是不可能的,即完全测试是不可能的。
5.数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。
下列图符名标识的图符不属于数据流图合法图符的是____。
(分数:
2.00)
A.控制流 √
B.加工
C.数据存储
D.源和潭
解析:
[解析]数据流图由4种基本成分构成:
数据流,数据处理(即加工),数据存储和外部实体(即源和潭)。
而控制流式程序流程图中的图符,它不属于数据流图的合法图符。
6.在结构化程序设计思想提出之前,在程序设计中曾强调程序的效率。
与程序的效率相比,人们更重视程序的
(分数:
1.00)
A.安全性
B.一致性
C.可理解性 √
D.合理性
解析:
解析:
结构化程序设计方法设计出的程序具有明显的优点。
其一,程序易于理解、使用和维护;其二,提交了编程工作的效率,降低了软件开发成本。
其中,人们更重视前者。
7.软件按功能可以分为应用软件、系统软件和支撑软件(或工具软件),下面属于系统软件的是______。
(分数:
2.50)
A.编辑软件
B.操作系统 √
C.教务管理系统
D.浏览器
解析:
[解析]编辑软件和浏览器属于工具软件,教务系统是应用软件。
8.下列各类函数中,不是类的成员函数的是____。
(分数:
2.00)
A.构造函数
B.抽象类
C.派生类 √
D.以上都不对
解析:
[解析]构造函数包括默认构造函数和拷贝构造函数等,析构函数和构造函数一样属于类的特殊的成员函数。
而友元函数则是为了增加类的访问灵活性而允许其他类的成员函数或全局函数访问类的内部变量或成员函数的一种机制,其缺点是破坏了类的封装性。
9.下列关于运算符重载的描述中,正确的是
(分数:
2.00)
A.运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符 √
B.一元运算符只能作为成员函数重载
C.二元运算符重载为非成员函数时,参数表中有一个参数
D.C++中可以重载所有的运算符
解析:
[解析]本题考查的知识点是:
运算符的重载。
运算符重载为成员函数时,形参个数一般为运算符的元数减1,因为此成员函数所属的对象可成为运算符的一个运算分量。
重载为非成员函数时,形参个数一般和运算符元数相等。
所以,二元运算符重载为非成员函数时,参数表中应有两个参数,选项C不正确;运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符,选项A是正确的。
一元运算符中,“-”取负、“++”增1、“--”减1等运算符均可重载为成员函数,故选项B不正确。
C++中,有“.”、“.*”、“->*”、“:
:
”、“?
:
”五个运算符不能重载,故选项D不正确。
本题应该选择A。
10.在C++语言中,封装是借助于什么达到的?
(分数:
2.00)
A.结构
B..类 √
C.数组
D.函数
解析:
[解析]C++基本的性质就是它的封装性,而封装性主要是靠类来实现的。
11.下列程序的输出结果是____。
#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。
12.有以下类定义
classMyClass
{
public:
MyClass(){cout<<l;)
};
则执行语句MyClassa,b[2],*p[2];后,程序的输出结果是
(分数:
2.00)
A.11
B.111 √
C.1111
D.11111
解析:
[解析]本题考核构造函数和析构函数。
题中定义了类MyClass的对象a,对象数据b,所以调用了构造函数3次,输出111。
然后定义了对象指针*p[2],由于指针没有实例话,所以不会调用构造函数。
13.有如下程序:
#include<iostream>
usingnamespaeestd;
classA{
public:
virtualvoidfunc1(){cout<<"A1";}
voidrune2(){cout<<"A2";}
};
classB:
publicA{
public:
voidfunc1(){cout<<"B1";}
voidfunc2(){cout<<"B2";}
};
intmain(){
A*P=newB;
P->func1();
P->func2();
deleteP;
return0;
执行这个程序的输出结果是______。
(分数:
1.00)
A.B1B2
B.A1A2
C.B1A2 √
D.A182
解析:
[解析]本题考查虚函数。
虚函数指在基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。
题中定义了一个派生类对象B,并使用类A的对象指针指向B,由于基类A中的func1为虚函数,所以会执行派生类的func1,输出B1,而基类中的func2不是虚函数,所以p->func2()会执行基类的func2,输出A2。
故答案为C。
14.下面程序的输出是
main()
{intx=100,a=10,b=20,ok1=5,ok2=0;
if(a<b)
if(b!
=15)
if(!
ok1)
else
if(ok2)x=10
x=-1
cout<<x<<end1;
}
(分数:
2.00)
A.-1 √
B.0
C.1
D.不确定的值
解析:
[解析]本题考察订语句的嵌套,else总是与最近的那个if配对,只要考生按照逻辑表达式的值进行细心判断就可以得到正确的答案。
考生需要注意的是,在C++语言中,0表示假,非0即为真,因此可以用数字作为逻辑判断的依据。
15.以下程序输出的结果是____。
#include<iostream>
usingnamespacestd;
intmain()
{
int**x,*y,z=10;
y=&z;
x=&y;
cout<<**x+1<<endl;
return0;
}
(分数:
2.00)
A.11 √
B.x的地址
C.y的地址
D.运行错误
解析:
[解析]执行语句y=&z;后,指针y指向了变量z。
执行语句x=&y;后,指针**x指向z。
所以**x的值为z的值10,那么程序最后输出为11。
16.有如下程序:
#include<iostream>
usingnamespacestd;
classB{
public:
virtualvoidshow(){cout<<"B";}
};
classD:
publicB{
public:
voidshow(){cout<<"D";}
};
voidfunl(B*ptr){ptr->show();}
voidfun2(B&ref);ref.show();}
voidfun3(Bb){b.show();}
intnlain(){
Bb,*P=DewD;
Dd;
funl(p);
fun2(b);
fun3(d);
return0;
}
程序的输出结果是
(分数:
2.00)
A.BBB
B.BBD
C.DBB √
D.DBD
解析:
[解析]基类指针可以指向派生类对象,在对象作为参数传递时,是通过“传值调用”传递给函数的,是单向传递。
使用对象指针对函数参数进行传递时,是通过“传址调用”传递给函数的,即函数的形参对象和实参对象指针变量指向同一内存地址;使用对象引用作为函数参数时,也是通过“传址调用”传递给函数的。
funl(p)传递的是类D对象的地址,所以调用类D的是show(),fun2(b)调用的和传递的都是类B的对象引用,所以调用类B的show()。
调用’fun3(d)时,由于voidfun3(Bb)传递的虽然是D类对象,但是形参是B类对象,所以调用基类B的show()。
17.对如下二叉树进行后序遍历的结果为______。
(分数:
2.50)
A.ABCDEF
B.DBEAFC
C.ABDECF
D.DEBFCA √
解析:
[解析]二叉树的遍历有3种:
前序、中序和后序。
后序遍历首先遍历左子树或左子结点,然后遍历右子树或右子结点,最后访问根结点。
分析本题二叉树,对其进行后序遍历的结果为DEBFCA。
18.对于算法的每一步,指令必须是可执行的。
算法的____要求算法在有限步骤之后能够达到预期的目的。
(分数:
2.00)
A.可行性 √
B.有穷性
C.正确性
D.确定性
解析:
19.有关构造函数的说法不正确的是____。
(分数:
1.00)
A.构造函数名字和类的名字一样
B.构造函数在说明类变量时自动执行
C.构造函数无任何函数类型
D.构造函数有且只有一个 √
解析:
20.C++语言中关于构造函数的说法正确的是____。
(分数:
1.00)
A.构造函数的函数名不必和类名相同
B.构造函数只能有一个
C.每个类必定有构造函数 √
D.构造函数必有返回值
解析:
二、填空题(总题数:
17,分数:
30.00)
21.在长度为n的线性表中查找一个表中不存在的元素,需要的比较次数为__1__。
(分数:
2.00)
解析:
n[解析]在长度为n的线性表中查找一个表中不存在的元素,需要的比较次数为n。
22.软件危机出现于20世纪60年代末,为了解决软件危机,人们提出用1的原理来设计软件,这就是软件工程诞生的基础。
(分数:
1.00)
解析:
软件工程学
23.在声明派生类时,如果不显式地给出继承方式,那么默认的类继承方式是私有继承prirate。
已知有如下类定义:
classBase{
protected:
voidfun(){}
};
ClassDerived:
Base{};
则Base类中的成员函数fun()在Derived类中的访问权限是1(注意:
要求填写private、protected或public中的一项)。
(分数:
2.00)
解析:
private[解析]私有继承方式下对基类的所有成员都具有私有访问权限。
即派生类对象不能访问基类的所有成员,派生类内部访问也不能访问基类的私有成员。
24.多数运算符既能作为类的成员函数重载,也能作为类的非成员函数重载,但口运算符只能作为类的__1__函数重载。
(分数:
2.00)
解析:
成员[解析][]不可能作为非成员函数重载。
25.cin.getline(line,sizeof(line),"x")表示的意思是读取90个字符存放到line如果遇到1则结束输入。
(分数:
1.00)
解析:
"x"字符
26.执行下列语句序列:
imx=1,&y=x;
cout<<x<<"-"<<y<<end1;
输出结果为1。
(分数:
2.00)
解析:
1-1[解析]题目中首先定义了一个变量x,并初始化为1,然后为x添加一个别名y。
第二条语句将依次输出x的值,"-",及y的值,而y是x的别名,所以也输出x的值,即答案为1-1。
27.下列程序编译错误,因为add函数返回值是一个引用,故对return返回值的要求是1。
#included<iostream.h>
int&add(intx,inty)
{
returnx+y;
}
voidmain()
{
inti=3,j=19;
cout<<(add(i,j)+=20)<<endl;
}
(分数:
2.00)
解析:
不能是表达式[解析]引用是变量的别名,其实质是变量的地址。
return在返回值时,如果其后为表达式,则系统为该表达式生成一个临时变量,用于存放该表达武的结果,函数执行完毕之后该变量被系统回收,因此,返回的该变量的地址对调用函数来说已经没有意义了。
28.数据库保护分为安全性控制、1、并发性控制和数据的恢复。
(分数:
2.00)
解析:
完整性控制[解析]安全性控制是指防止XX的用户有意或无意存取数据库中的数据,以免数据被泄露、更改或破坏;完整性控制是指保证数据库中数据及语义的正确性和有效性,防止任何对数据造成错误的操作;并发性控制是指正确处理好多用户、多任务环境下的并发操作,防止错误发生;数据的恢复是指当数据库被破坏或数据不正确时,使数据库能恢复到正确的状态。
29.以下程序运行后的输出结果是__1__。
#include<iostream>
usingnamespacestd;
intmain()
{
inti=10,i:
0;
do{
j=j+i;
i--;
}while(i>2);
cout<<j<<end1;
return0;
}
(分数:
1.00)
解析:
52[解析]do-while语句的特点:
先执行循环体,后判断条件。
第1次循环执行后,j和i的值分别为10和9。
判断循环条件为真,继续执行循环体,j和i分别为19和8。
继续上述执行过程,直到i的值为2时,表达式“2>2”不再成立,退出循环。
此时j的值为52。
30.执行"cout<<char("A"+2)<<end1;"语句后得到的输出结果为__1__。
(分数:
2.00)
解析:
C[解析]本题考察强制类型转化,char()在这里作为一个强制类型转化函数存在,将整数转化为字符。
31.下面程序的运行结果是1和2。
#include<iostream.h)
#defineN10
#defines(x)x*x
#definef(x)(x*x)
voidmain()
{inti1,i2;
i1=1000/s(N);i2=1000/f(N);
cout<<i1<<""<<i2;
}
(分数:
2.00)
解析:
100010。
[解析]对于define宏定义语句,系统会在编译前进行替换。
本题替换过程如下:
i1=1000/s(N)
i1=1000/s(10)
i1=1000/10*10
i1=1000
i2=1000/f(N)
i2=1000/{(10)
i2=1000/(10*10)
i2=10
32.完成下列类的构造函数,初始化语句为__1_。
#include<iostream.h>
classTest
{
private:
intx,y;
public,
voidTest(intinitx,intinity){
2
}
voidprintx(){cout<<x<<"—"<<y<<"="<<x-y;}
};
voidmain()
{
Testx(300,200);
x.printx();}
(分数:
2.00)
解析:
x=initx;y=inity;[解析]本题考查的是类的私有数据如何从接口成员函数那里数据的。
本题虽然简单,却体现了类的数据封装思想,并指明了如何完成这种封装。
33.类中包含了一个静态成员函数,则main函数中和P.f1(P);语句具有同样功能的语句为1。
#include<iostream.h>
classM
{public:
M(intA){A=a;B+=a;}
staticvoidf1(Mm);
private:
intA;
staticintB;};
voidM:
:
f1(Mm)
{
cout<<“A=“<<m.A((end1;
cout<<“B=”<<m.B<<end1;
}
intM:
:
B=10;
voidmain()
{
MP(5);
P.f1(P);
}
(分数:
2.00)
解析:
M:
:
f1(P);。
[解析]由于f1是类M的静态成员函数,即说明类M的任何对象都共享一份f1,因此,不仅可以从对象那里访问f1,还可以用域操作符:
:
通过类名来访问。
34.阅读下面程序:
#include<iostream.h>
intfun(inta,intb)
{
intt;
c=a*b:
returnc;
}
voidmain()
{
inta=3,b=5,c=4,x=0;
x=fun(fun(a,b),c);
cout<<x<<endl;
}
其运行结果是1。
(分数:
2.00)
解析:
60
35.以下程序实现栈的入栈和出栈的操作。
其中有两个类:
一个是节点类node,它包含点值和指向上一个节点的指针prev;另一个类是栈类stack,它包含栈的头指针top。
生成的链式栈如下图所示。
〈imgsrc="tp/jsj/2jc++j28.1.gif"〉
下面是实现程序,请填空完成此程序。
#include〈iostream〉
usingnamespacestd;
classstack;
classnode
{
intdata;
node*prev;
public:
node(intd,node*n)
{
data=d;
prev=n;
}
friendclassstack;
};
classstack
{
node*top;//栈头
public:
stack()
{
top=0;
}
voidpush(inti)
{
node*n=1;
top=n;
}
intpop()
{
node*t=top;
if(top)
{
top=top-〉prev;
intc=t-〉data;
deletet;
returnc;
}
return0;
}
intmain()
{
stacks;
s.push(6);
s.push(3);
s.push
(1);
return0;
}
(分数:
1.00)
解析:
newnode(i,top)[解析]本题考核友元类以及对象成员的应用,属于综合考题。
本程序中定义了两个类node和stack,用于实现堆栈的压入和弹出操作。
其中,类stack是类node的友元类,这样类stack中的成员可以访问类node中的所有成员。
在类node中,定义两个私有变量:
整型变量data和对象指针prev。
变量data用于保存节点的数值,而对象指针prey用于指向上一节点。
在类node的构造函数中,形参是数据d和对象指针n。
在类stack中,定义了一个私有变量,栈顶指针top,并在构造函数中赋值0(即指针为空)。
函数push()实现入栈操作,即把形参i压入栈中,那么此时应该创建一个新的节点,并让这个节点的prev指针指向栈顶,即top。
然后让top指针指向新的节点。
所以在push()函数中应填入“node*n=newnode(i,top)”。
类stack中的pop()函数实现数据的弹出功能。
先定义了一个对象指针t指向栈顶节点。
然后判断堆栈是否为空,如果为空,则返回0,否则就弹出栈顶节点的值。
那么应该先将栈顶指针后退一个节点,然后把对象t指针指向的节点值弹出,并删除节点t。
36.软件测试分为白箱(盒)测试和黑箱(盒)测试。
等价类划分法属于__1__测试。
(分数:
2.00)
解析:
黑箱或黑盒或黑箱(盒)[解析]本题考查软件工程的测试。
对于软