2016計算機二級C++上機模擬試題及答案

  一、改錯題

2016計算機二級C++上機模擬試題及答案

使用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)是隊列的標準的刪除操作,注意它們的操作方式和先判斷後操作的原則。