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];