一、改錯題
使用VC6開啟考生資料夾下的工程kt11_1,此工程包含一個源程式檔案kt11_,但該程式執行有問題,請改正函式中的錯誤,使該程式的輸出結果為:
Valuesare:1,2and3
Pressanykeytocontinue
源程式檔案kt11_清單如下:
#include
classCommonBase
{ public:
intx; };
/*****************found*****************/
classDeriveCommonA::publicCommonBase
{ public:
inty; };
classDeriveCommonB:publicCommonBase
{ public:
intz; };
/*****************found*****************/
classOverlapping:publicDeriveCommonA;publicDeriveCommonB
{ public:
voidDisplay()
{ cout<<"Valuesare:"<
intmain()
{ Overlappingov;
/*****************found*****************/
ov.x=1;
ov.y=2;
ov.z=3;
lay();
return0; }
【試題解析】
(1)主要考查對派生類定義的理解,C++規定的繼承格式是在類名的後面加冒號,之後是繼承方式和繼承類的名稱,題目中錯誤的使用了作用域運算子;
(2)主要考查多繼承的定義,多繼承的格式基本上和單繼承相同,不過在多個基類之間應該使用逗號分開,題目中錯誤的使用了分號,分號在C++中是結束標誌;
(3)主要考查對派生類的物件訪問的掌握,x是類CommonBase的成員,如果不加限制的訪問就會產生二義性,編譯程式不知道這個x是A類的,還是B類的,所以必須使用作用域限制符“::”,為了解決這個問題可以使用虛基類。
二、簡單應用題
請編寫函式fun(),該函式的功能是判斷字串是否為迴文,若是則函式返回1,主函式中輸出YES;否則返回0,主函式中輸出NO。迴文是指順讀和倒讀都一樣的字串。
例如:字串LEVEL是迴文,而字串123312就不是迴文。
注意:部分源程式已存在檔案kt11_中。
請勿修改主函式main和其他函式中的任何內容,僅在函式fun的花括號中填寫若干語句。
檔案kt11_的內容如下:
#include
#include
#defineN80
intfun(char*str)
{
}
voidmain()
{ chars[N];
cout<<"Enterastring:"<
gets(s);
cout<<"nn";
puts(s);
if(fun(s))
cout<<"YESn";
else
cout<<"NOn"; }
【參考答案】
int fun(char *str)
{
int i,n=0,fg=1;
char *p=str;
while(*p)
{ n++; p++; }
for(i=0;i
if(str[i]==str[n-1-i]) ;
else
{ fg=0; break; }
return fg;
}
【試題解析】
本題的解題思路是:先利用迴圈中指標的移動來求得字串的長度n,然後用一個for迴圈依次取得陣列中的前半部分元素,用取得的前半部分內的元素逐個與後半部分內的對應位置的元素進行比較,如果相同,不做任何工作,接著取下一個元素,繼續比較;如果不相同,可以判斷該字串肯定不是迴文,就給標誌變數fg賦值0(fg的初始值為1)。最終把fg作為函式的返回值返回(fg值為1表明是迴文,fg值為0表明不是迴文)。
三、綜合應用題
使用VC6開啟考生資料夾下的工程kt11_3。此工程包含一個kt11_,其中定義了類queue,但該類的定義並不完整。請按要求完成下列操作,將程式補充完整。
(1)完成類queue的無引數的建構函式的定義,要求把資料成員bl和el都初始化為0,同時輸出queueinitialized。請在註釋“//**1**”之後新增適當的語句。
(2)完成類queue的.成員函式qput(intj)的定義,它的功能是把新的元素加入佇列,過程是先依據bl的值判斷陣列是否已經滿了,如果是就輸出queueisfull,否則bl自加一,並且把引數j的值存入bl指向的陣列元素中,請在註釋“//**2**”之後新增適當的語句。
(3)完成類queue的成員函式qget()的定義,它的功能是把佇列開頭的元素提取出佇列,並返回該值,過程是先比較el和bl的值判斷佇列是否已空,如果是就輸出queueisempty,
否則el自加一,並且把el指向的陣列元素返回,請在註釋“//**3**”之後新增適當的語句。
程式輸出結果如下:
queueinitialized
queueinitialized
3311
4422
注意:除在指定位置新增語句之外,請不要改動程式中的其他內容。
源程式檔案kt11_清單如下:
#include
classqueue
{ intq[100];
intbl,el;
public:
queue();
voidqput(intj);
intqget(); };
queue::queue()
{ //**1** }
voidqueue::qput(intj)
{ //**2**
{ cout<<"queueisfulln";
return; }
bl++;
q[bl]=j; }
intqueue::qget()
{ //**3**
{ cout<<"queueisemptyn";
return0; }
el++;
returnq[el]; }
voidmain()
{
queueaa,bb;
(11);
(22); (33);
(44);
cout<
cout<
}
【參考答案】
(1)bl=el=0;
cout<<"queue initializedn";
(2)if(bl==100)
(3)if(el==bl)
【試題解析】
主要考查對於具體的一個佇列類的掌握,對列是一種特殊的儲存結構,應使用先進先出原則。題目中bl和el分別指向佇列的開頭和結尾,其中(2)是佇列的標準插入操作,(3)是佇列的標準的刪除操作,注意它們的操作方式和先判斷後操作的原則。