第
3題: 閱讀下列說(shuō)明和圖,回答問(wèn)題1至問(wèn)題3,將解答填入答題紙的對(duì)應(yīng)欄內(nèi)。
【說(shuō)明】
某運(yùn)輸公司決定為新的售票機(jī)開(kāi)發(fā)車(chē)票銷(xiāo)售的控制軟件。圖3-1給出了售票機(jī)的面板示意圖以及相關(guān)的控制部件。

售票機(jī)相關(guān)部件的作用如下所述:
(1)目的地鍵盤(pán)用來(lái)輸入行程目的地的代碼(例如,200表示總站)。
(2)乘客可以通過(guò)車(chē)票鍵盤(pán)選擇車(chē)票種類(lèi)(單程票、多次往返票和座席種類(lèi))。
(3)繼續(xù)/取消鍵盤(pán)上的取消按鈕用于取消購(gòu)票過(guò)程,繼續(xù)按鈕允許乘客連續(xù)購(gòu)買(mǎi)多張票。
(4)顯示屏顯示所有的系統(tǒng)輸出和用戶提示信息。
(5)插卡口接受MCard(現(xiàn)金卡),硬幣口和紙幣槽接受現(xiàn)金。
(6)打印機(jī)用于輸出車(chē)票。
假設(shè)乘客總是支付恰好需要的金額而無(wú)需找零,售票機(jī)的維護(hù)工作(取回現(xiàn)金、放入空白車(chē)票等)由服務(wù)技術(shù)人員完成。
系統(tǒng)采用面向?qū)ο蠓椒ㄩ_(kāi)發(fā),使用UML進(jìn)行建模。系統(tǒng)的頂層用例圖和類(lèi)圖分別如圖3-2和圖3-3所示。


?【問(wèn)題1】(5分)
根據(jù)說(shuō)明中的描述,給出圖3-2中A1和A2所對(duì)應(yīng)的參與者,U1所對(duì)應(yīng)的用例,以及(1)、(2)處所對(duì)應(yīng)的關(guān)系。
?【問(wèn)題2】(7分)
根據(jù)說(shuō)明中的描述,給出圖3-3中缺少的C1~C4所對(duì)應(yīng)的類(lèi)名以及(3)~(6)處所對(duì)應(yīng)的多重度。
?【問(wèn)題3】(3分)
圖3-3中的類(lèi)圖設(shè)計(jì)采用了中介者(Mediator)設(shè)計(jì)模式,請(qǐng)說(shuō)明該模式的內(nèi)涵。
答案解析與討論:
m.xiexiliangjiufa.com/st/380935084.html第
4題: 閱讀下列說(shuō)明和C代碼,回答問(wèn)題1至問(wèn)題3,將解答寫(xiě)在答題紙的對(duì)應(yīng)欄內(nèi)。
【說(shuō)明】
對(duì)有向圖進(jìn)行拓?fù)渑判虻姆椒ㄊ牵?br />(1)初始時(shí)拓?fù)湫蛄袨榭眨?br />(2)任意選擇一個(gè)入度為0的頂點(diǎn),將其放入拓?fù)湫蛄兄校瑫r(shí)從圖中刪除該頂點(diǎn)以及從該頂點(diǎn)出發(fā)的??;
(3)重復(fù)(2),直到不存在入度為0的頂點(diǎn)為止(若所有頂點(diǎn)都進(jìn)入拓?fù)湫蛄袆t完成拓?fù)渑判?,否則由于有向圖中存在回路無(wú)法完成拓?fù)渑判颍?br />函數(shù)int* TopSort(LinkedDigraph G)的功能是對(duì)有向圖G中的頂點(diǎn)進(jìn)行拓?fù)渑判颍祷赝負(fù)湫蛄兄械捻旤c(diǎn)編號(hào)序列,若不能完成拓?fù)渑判?,則返回空指針。其中,圖G中的頂點(diǎn)從1開(kāi)始依次編號(hào),頂點(diǎn)序列為v1,v2,…,vn,圖G采用鄰接表示,其數(shù)據(jù)類(lèi)型定義如下:
#define MAXVNUM 50 /*最大頂點(diǎn)數(shù)*/
typedef struct ArcNode{ /*表結(jié)點(diǎn)類(lèi)型*/
int adjvex; /*鄰接頂點(diǎn)編號(hào)*/
struct ArcNode *nextarc; /*指示下一個(gè)鄰接頂點(diǎn)*/
}ArcNode;
typedef struct AdjList{ /*頭結(jié)點(diǎn)類(lèi)型*/
char vdata; /*頂點(diǎn)的數(shù)據(jù)信息*/
ArcNode *firstarc; /*指向鄰接表的第一個(gè)表結(jié)點(diǎn)*/
}AdjList;
typedef struct LinkedDigraph{ /*圖的類(lèi)型*/
int n; /*圖中頂點(diǎn)個(gè)數(shù)*/
AdjList Vhead[MAXVNUM]; /*所有頂點(diǎn)的頭結(jié)點(diǎn)數(shù)組*/
}LinkedDigraph;
例如,某有向圖G如圖4-1所示,其鄰接表如圖4-2所示。

函數(shù)TopSort中用到了隊(duì)列結(jié)構(gòu)(Queue的定義省略),實(shí)現(xiàn)隊(duì)列基本操作的函數(shù)原型如下表所示:
函 數(shù) 原 型 | 說(shuō) 明 |
void InitQueue(Queue*Q) | 初始化隊(duì)列(構(gòu)造一個(gè)空隊(duì)列) |
bool IsEmpty(Queue Q) | 判斷隊(duì)列是否為空,若是則返回true,否則返回false |
void EnQueue(Queue*Q,int e) | 元素入隊(duì)列 |
void DeQueue(Queue*Q,int*p) | 元素出隊(duì)列 |
【C代碼】
int *TopSort(LinkedDigraph G) {
ArcNode *p; /*臨時(shí)指針,指示表結(jié)點(diǎn)*/
Queue Q; /*臨時(shí)隊(duì)列,保存入度為0的頂點(diǎn)編號(hào)*/
int k = 0; /*臨時(shí)變量,用作數(shù)組元素的下標(biāo)*/
int j = 0, w = 0; /*臨時(shí)變量,用作頂點(diǎn)編號(hào)*/
int *topOrder, *inDegree;
topOrder = (int *)malloc((G.n+1) * sizeof(int)); /*存儲(chǔ)拓?fù)湫蛄兄械捻旤c(diǎn)編號(hào)*/
inDegree = (int *)malloc((G.n+1) * sizeof(int)); /*存儲(chǔ)圖G中各頂點(diǎn)的入度*/
if (!inDegree || !topOrder) return NULL;
(1) ; /*構(gòu)造一個(gè)空隊(duì)列*/
for ( j = 1; j <= G.n; j++ ) { /*初始化*/
topOrder[j] = 0; inDegree[j] = 0;
}
for (j = 1; j <= G.n; j++) /*求圖G中各頂點(diǎn)的入度*/
for( p = G.Vhead[j].firstarc; p; p = p->nextarc )
inDegree[p-> adjvex] += 1;
for (j = 1; j <= G.n; j++) /*將圖G中入度為0的頂點(diǎn)保存在隊(duì)列中*/
if ( 0 == inDegree[j] ) EnQueue(&Q,j);
while (!IsEmpty(Q)) {
(2) ; /*隊(duì)頭頂點(diǎn)出隊(duì)列并用w保存該頂點(diǎn)的編號(hào)*/
topOrder[k++] = w;
/*將頂點(diǎn)w的所有鄰接頂點(diǎn)的入度減1(模擬刪除頂點(diǎn)w及從該頂點(diǎn)出發(fā)的弧的操作)*/
for(p = G.Vhead[w].firstarc; p; p = p->nextarc) {
(3)-= 1;
if (0 ==(4)) EnQueue(&Q, p->adjvex);
}/* for */
}/* while */
free(inDegree);
if ( (5) )
return NULL;
return topOrder;
} /*TopSort*/
?【問(wèn)題1】(9分)
根據(jù)以上說(shuō)明和C代碼,填充C代碼中的空(1)~(5)。
?【問(wèn)題2】(2分)
對(duì)于圖4-1所示的有向圖G,寫(xiě)出函數(shù)TopSort執(zhí)行后得到的拓?fù)湫蛄小H魧⒑瘮?shù)TopSort中的隊(duì)列改為棧,寫(xiě)出函數(shù)TopSort執(zhí)行后得到的拓?fù)湫蛄小?br />?【問(wèn)題3】(4分)
設(shè)某有向無(wú)環(huán)圖的頂點(diǎn)個(gè)數(shù)為n、弧數(shù)為e,那么用鄰接表存儲(chǔ)該圖時(shí),實(shí)現(xiàn)上述拓?fù)渑判蛩惴ǖ暮瘮?shù)TopSort的時(shí)間復(fù)雜度是(6)。
若有向圖采用鄰接矩陣表示(例如,圖4-1所示有向圖的鄰接矩陣如圖4-3所示),且將函數(shù)TopSort中有關(guān)鄰接表的操作修改為針對(duì)鄰接矩陣的操作,那么對(duì)于有n個(gè)頂點(diǎn)、e條弧的有向無(wú)環(huán)圖,實(shí)現(xiàn)上述拓?fù)渑判蛩惴ǖ臅r(shí)間復(fù)雜度是(7)。

從下列的2道試題(試題五和試題六)中任選1道解答。如果解答的試題數(shù)超過(guò)1道,則題號(hào)小的1道解答有效。
答案解析與討論:
m.xiexiliangjiufa.com/st/3809416600.html第
5題: 閱讀下列說(shuō)明和C++代碼,將應(yīng)填入 (n) 處的字句寫(xiě)在答題紙的對(duì)應(yīng)欄內(nèi)。
【說(shuō)明】
某軟件公司現(xiàn)欲開(kāi)發(fā)一款飛機(jī)飛行模擬系統(tǒng),該系統(tǒng)主要模擬不同種類(lèi)飛機(jī)的飛行特征與起飛特征。需要模擬的飛機(jī)種類(lèi)及其特征如表5-1所示。
表5-1
飛機(jī)種類(lèi) | 起飛特征 | 飛行特征 |
直升機(jī)(Helicopter) | 垂直起飛(VerticalTakeOff) | 亞音速飛行 (SubSonicFly) |
客機(jī)(AirPlane) | 長(zhǎng)距離起飛 (LongDistanceTakeOff) | 亞音速飛行 (SubSonicFly) |
殲擊機(jī)(Fighter) | 長(zhǎng)距離起飛 (LongDistanceTakeOff) | 超音速飛行 (SuperSonicFly) |
鷂式戰(zhàn)斗機(jī)(Harrier) | 垂直起飛(VerticalTakeOff) | 超音速飛行 (SuperSonicFly) |
為支持將來(lái)模擬更多種類(lèi)的飛機(jī),采用策略設(shè)計(jì)模式(Strategy)設(shè)計(jì)的類(lèi)圖如圖5-1所示。

圖5-1中,AirCraft為抽象類(lèi),描述了抽象的飛機(jī),而類(lèi)Helicopter、AirPlane、Fighter和Harrier分別描述具體的飛機(jī)種類(lèi),方法fly()和takeOff()分別表示不同飛機(jī)都具有飛行特征和起飛特征;類(lèi)FlyBehavior與TakeOffBehavior為抽象類(lèi),分別用于表示抽象的飛行為與起飛行為;類(lèi)SubSonicFly與SuperSonicFly分別描述亞音速飛行和超音速飛行的行為;類(lèi)VerticalTakeOff與LongDistanceTakeOff分別描述垂直起飛與長(zhǎng)距離起飛的行為。
【C++ 代碼】
#include
using namespace std;
class FlyBehavior {
public : virtual void fly() = 0;
};
class SubSonicFly:public FlyBehavior{
public: void fly(){ cout << "亞音速飛行!" << endl; }
};
class SuperSonicFly:public FlyBehavior{
public: void fly(){ cout << "超音速飛行!" << endl; }
};
class TakeOffBehavior {
public: virtual void takeOff() = 0;
};
class VerticalTakeOff:public TakeOffBehavior{
public: void takeOff(){ cout << "垂直起飛!" << endl; }
};
class LongDistanceTakeOff:public TakeOffBehavior {
public: void takeOff (){ cout << "長(zhǎng)距離起飛!" << endl; }
};
class AirCraft{
protected:
(1) ;
(2) ;
public:
void fly(){(3); }
void takeOff() {(4); };
};
class Helicopter: public AirCraft {
public:
Helicopter (){
flyBehavior = new(5);
takeOffBehavior = new(6);
}
(7){
if(!flyBehavior) delete flyBehavior;
if(!takeOffBehavior) delete takeOffBehavior;
}
};
//其它代碼省略
答案解析與討論:
m.xiexiliangjiufa.com/st/3809511481.html