2015年计算机二级考试《C++》突破试卷(2)
23在c++语言中,数据封装要解决的问题是( )。
A.数据的规范化
B.便于数据转换
C.避免数据丢失
D.防止不同模块之间数据的非法访问
参考答案:D
参考解析:数据封装为了防止不同模块间数据的非法访问及修改。
24在C++中,Cin是一个( )。
A.类B.对象C.模板D.函数
参考答案:B
参考解析:本题考查流对象cin,属于基础知识,cin是输人流对象,负责从键盘获取数据,然后送到内存。本题答 案为B。
25在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是( )。
A.派生类的对象可以赋给基类的对象
B.派生类的对象可以初始化基类的引用
C.派生类的对象可以直接访问基类中的成员
D.派生类的对象的地址可以赋给指向基类的指针
参考解析:公有继承的派生类和基类是子类型的关系,所谓子类型是类型间一般和特殊的关系,即派生类是基类的子类型或者说基类的操作可以被用于操作派生类的对象。
26要建立文件流并打开当前目录下的文件6le.dat用于输入,下列语句中错误的是( )。
A.ifstream fin=ffstream.open(”file.dat”);
B.ifstream*fin=new ifstream(”file.dat”);
C.ifstream fin;fin.open(”file.dat”);
D.ifstream*fin=new ifstream();fin->open(”file.dat”);
参考答案:A
参考解析:本题考查对文件流输入的操作,可以调用文件流的成员函数pen,一般形式如下:文件流对象.0pen(磁盘文件名,输入/输出方式)。根据以上格式,可以判断A选项错误。
27某二叉树有5个度为2的结点,则该二叉树中的叶子结点数是( )。
A.10B.8C.6D.4
参考解析:根据二叉树的基本性质3:在任意一颗二叉树中,度为0的叶子结点总是比度为2的结点多一一个,所以本题中是5+1=6个。
28下面的语句中错误的是( )。
A.int a=5;int x[a];B.eonst int a=5;int x[a];C.int n=5;int *P=new int[a];D.const int n=5;int *p=new int[a];
参考答案:A
参考解析:在c++中定义数组时,数组的范围参数在静态定义时必须是一个常数,而在动态分配内存定义时可以是常数,也可以是一个赋了值的参数故选项A是错误的定义方法。
29if语句的语法格式可描述为:
格式l:if(<条件>)<语句>
或
格式2:if(<条件>)<语句l>
else<语句2>
关于上面的语法格式,下列表述中错误的是( )。
A.<条件>部分可以是一个if语句,例如if(if(a==0)…)…
B.<语句>部分可以是一个if语句,例如if(…)if(…)…
C.如果在<条件>前加上逻辑非运算符!并交换<语句l>和<语句2>的位置,语句功能不变
D.<语句>部分可以是一个循环语句,例如if(…)while(…)…
参考答案:A
参考解析:本题考查if语句,if语句的条件部分不能嵌套if语句,所以A选项错误;B选项就是if语句嵌套;C选项其实就是将判断条件颠倒,然后执行语句也颠倒,所以效果一样;D选项也正确。
30结构化程序设计的基本原则不包括( )。
A.多态性B.自顶向下C.模块化D.逐步求精
参考答案:A
参考解析:结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用goto语句,所以选择A。
31下列有关继承和派生的叙述中,正确的是( )。
A.派生类不彘访问基类的保护成员
B.作为虚基类的类不能被实例化
C.派生类应当向基类的构造函数传递参数
D.虚函数必须在派生类中重新实现
参考解析:派生类可以访问基类的保护成员,而不能访问基类的私有成员。作为虚基类的类可以被实例化。虚函数如果没有派生类中重新实现,那么仍然使用基类的成员函数。
32下列关于this指针的描述中,正确的是( )。
A.类的成员函数都有this指针
B.类的友元函数都有this指针
C.任何与类相关的函数都有this指针
D.类的非静态成员函数都有this指针
参考答案:D
参考解析:this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员时,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。另外,全局函数和静态函数都不能使用this指针。所以答案为D。
33已知函数f的原型是void f(int*a,long&B.;,变量v1、v2的定义是:
int v1;long:v2;
下列调用语句中正确的是( )。
A.f(v1,&v2);B.f(v1,v2);C.f(&v1,&v2);D.f(&v1,v2);
参考答案:D
参考解析:函数参数的3种传递方式:①将变量名作为形参和实参,即传值方式;②传递变量指针;③引用形参,本题中函数f的第一个形参为指针,那么调用f函数时,第一一个参数必须是地址,所以必须是&v1.第二个形参为引用,所以对应实参为v2即可。故本题答案为D。
34设有表示学生选课的三张表,学生s(学号,姓名,性别,年龄,身份证号),课程c(课号,课名),选课Sc(学号,课号,成绩),则表Sc的关键字(键或码)为( )。
A.课号,成绩
B.学号,成绩
C.学号,课号
D.学号,姓名,成绩
参考解析:学号是学生表s的主键,课号是课程表c 的主键,所以选课表sc的关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号,所以选择c。
35有如下程序:
#inClude using namespaCe耐: Class MyClass{
publiC:
MyClass(){++Count;}
~MyClass(){--Count;}
statiC int getCount(){retum Count;} private:
statiC int Count;
}; ‘ int MyClass::Count=0;
int main() {
MyClass obj;
Cout<
MyClass+ptr=new MyClass: Cout<
Cout<
}
执行这个程序的输出结果是( )。
A.121B.232C.221D.122
参考答案:A
参考解析:本题考查静态数据成员。静态数据成员在内存中只占一份空间,静态数据成员属于类,即使不定义对象,也会给静态数据成员分配空间,可以被引用。本题中先是定义了一个对象obj,执行构造函数使得静态数据成员count变为了l,然后又定义了指针对象,执行构造函数后,count变为了2,释放指针后,执行析构函数,使得count变为了1。所以本题答案为A。
36数据流图中带有箭头的线段表示的是( )。
A.控制流B.事件驱动C.模块调用D.数据流
参考答案:D
参考解析:数据流图中带箭头的线段表示的是数据流,即沿箭头方向传送数据的通道,一般在旁边标注数据流名。
37下列程序的运行结果为( )。
#include template
class FF
{TT al,a2,a3; public:
FF(TT bl,TT b2,TT b3){al=bl;a2=b2;a3=b3;} TT Sum(){return al+a2+a3;};
}
void main()
{ FFx(int(1.1),2,3),Y(int(4.2),5,6); cout<
A.6.1 15.2B.6 15C.6 15.2D.6.1 15
参考答案:B
参考解析:本题考查模板函数的应用,表达式int(1.1)和int(4.2)足将1.1和4.2强制转换为整型。
38下列选项中不属于结构化程序设计原则的是( )。
A.可封装B.自顶向下C.模块化D.逐步求精
参考答案:A
参考解析:结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用goto语句,所以选择A。
39有三个关系R,S和T如下:
其中关系T由关系R和s通过某种操作得到,该操作为( )。
A.选择B.投影C.交D.并
参考答案:D
参考解析:并关系T中包含了关系R与s中的所有元组,所以进行的是并的运算。
40下列控制格式输入/输出的操作符中,能够设置浮点数精度的是( )。
A.setpreCisionB.setwC.setfillD.showpoint
参考答案:A
参考解析:iomanip中定义的操纵符包括:setfill(ch) 用ch填充空白、setprecision(n)将浮点精度置为n、setw(w)、读写w个字符的值showpoint没置小数点。
二、基本操作题
41清使用VC6或使用【答题】菜单打开考生文件夹projl下的工程projl,此工程中包含了类Pets(“宠物”) 和主函数main的定义。程序中位于每个“//ERROR****found ****”之后的一行语句有错误,请加以改 正。改正后程序的输出结果应为:
Name:sonny Type:dog
Name:John Type:dog
Name:Danny Typc:cat
Name:John Type:dog
注意:只修改每个“//ERROR ****found ****”下的那一行,不要改动程序中的其他内容。
#include
using namespace sm; enum Pets_type{d09,cat,bird,fish};
class Pets{ private:
char *name; Pets_type type; public:
Pets(const char *name=”sonny”,Pets_type type=dog);
Pets&operator=(const Pets&s);
~Pets();
void show()eonst;};
Pets::Pets(eonst char$naIne,Pets_type type)
//构造函数 {
This ->name=new char[strlen(name)+1];
strcpy(this一>name,name);
//ERROR *********found********* type=type;
}{ Pets::~Pets()//析构函数,释放name所指向的字符串
{ //ERROR *********found********* name=’/0‘;
}
Pets&Pets::0perator=(const Pets&s){
if(&s==this)//确保不要向自身赋值 return *this;
delete[]name;
name=new char[strlen(S.name)+1];//ERROR *********found*********
strcpy(this一>nmne,name); type=S.type:
return *this;}
void Pets::show()const
cout<<“Name:”<
参考解析:
(1)this一>type=type;
(2)delete[]name;
(3)strepy(this->name,s.name);
三、简单应用题
42请使用VC6或使用【答题】菜单打开考生文件夹proj2下的工程proj2,该工程中包含一个程序文件main.Cpp,其中有坐标点类point、线段类Line和三角形类Triangle的定义.还有main函数的定义。程序中两
Side l:9.43398 Side 2:5
Side 3:8 area:20 注意:只在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。
#inClude #nClude using namespaCe std;
Class Point{//坐标点类 publiC:
Const double x,y;
Point(double x=0.0,double Y=0.0):x(x),Y(Y){} //**********found**********
double distanCeTo(_____) Const{
//到指定点的距离
return sqrt((x-P.X)*(x-P.x)+(Y-P.Y)*(Y-P.Y)); }
};
Class Line{//线段类 publiC:
eonst Point pl,p2;//线段的两个端点
//**********found**********
Line(Point pl,Point p2):——{}
double length()eonst/retum pl.distanCeTo(p2);}//线段的长度 };
Ct彝SS Triangle{//三角形类 publiC:
Const Point pl,p2,p3;//三角形的三个顶点 //**********found**********
Triangle(_____):pl(p1),p2(p2),p3(p3){} double lengthl()Const{//边pl,p2的长度
retum Line(pl,p2).1ength(); }
double length2()Const{//边p2,p3的长度 return Line(p2,p3).1ength();
}
double length3()Const{//边p3,pl的长度 returnLine(p3,pl).1ength();
}
double area()Const{//三角形面积
//**********found********** double s=_____;
return sqrt(s{(S-lengthl())*(s-length2())*(s—length3())); }
};
int main(){
Triangle r(Point(0.0,8.0),Point(5.0,0.0),Point(0.0,0.0)); Cout<<”Side l:”<
Cout<<”Side 2:”<
retum 0;
参考解析:
(1)eonst Point&P
(2)pl(p1),p2(p2)
(3)Point pl,Point p2,Point p3
(4)(1engthl()+length2()+length3())/2
四、综合应用题
43请使用VC6或使用【答题】菜单打开考生文件夹proj3下的工程proj3,其中声明的DataList类,是一个用于表示数据表的类。DataList的重载运算符函数0perator+,其功能是求当前数据表与另一个相同长度的数据表之和;即它返回一个数据表,其每个元素等于相应两个数据表对应元素之和。请编写这个operator+函数。程序的正确输出应该是:
两个数据表: 1,2,3,4,5,6 3,4,5,6,7,8 两个数据表之和:
4,6,8,10,12,14 要求:
补充编制的内容写在“//********333********”与“//********666********”之间,不得修改程序
的其他部分。
注意:程序最后将结果输出到文件。ut.dat中。输出函数writeToFile已经编译为。bj文件,并且在本程序中调用。
//DataList.h
#inClude using namespaCe std;
ClaSS DataList{//数据表类 intfen;
double*d; publiC:
DataList(int len,double data[]=NULL); DataList(DataList&data);
int length()Const{retum len;}
double getElement(int i)Constt return d[i];}
DataList operator+(Const DataList&list)Const;//两个数据表求和 void show()Const;//显示数据表
};
void writeToFile(Char$,Const DataList&); //main.Cpp
#inClude”DataList.h”
DataList::DataList(int len,double data[]):len(ien){ d=new double[1en];
for(int i=0;i
d㈨i=(data==NULL?0.0:data[i]);
}
DataList::DataList(DataList&data):len(data.1en){ d=new double[1en];
for(int i=0;i
DataList DataList::0perator+(Con8t DataList&list,)Const{//两个数据表求和 double*dd=new double[1ist.1ensth()];
//********333********
//********666********
return DataList(1ist.1ength(),dd); }
void DataList::show()Const{//显示数据表 f()r(int。i=0;i
eout<
Cout<
int main(){
double sl[]={1,2,3,4,5,6};
double s2[]={3,4,5,6,7,8};
DataList list1(6,sl),list2(6,s2);//定义两个数据表对象 eout<<”两个数据表:”<
listl.show(): list2.show(); eout<
(1istl+list2).show();
writeToFile(””,listl+list2); return 0:
参考解析:
f0T(int i=0;i
dd[i]=d[i]+list.d[i];