2011年下半年(下午)《軟件設計師》真題
《2011年下半年(下午)《軟件設計師》真題》由會員分享,可在線閱讀,更多相關《2011年下半年(下午)《軟件設計師》真題(8頁珍藏版)》請在裝配圖網上搜索。
1、2011年下半年(下午)《軟件設計師》真題 注意:圖片可根據實際需要調整大小 卷面總分:6分 答題時間:240分鐘 試卷題量:6題 練習次數:0次 問答題 (共6題,共6分) 1.Pay&Drive系統(tǒng)(開多少付多少)能夠根據駕駛里程自動計算應付的費用。 系統(tǒng)中存儲了特定區(qū)域的道路交通網的信息。道路交通網由若干個路段(Road Segment)構成,每個路段由兩個地理坐標點(Node)標定,其里程數(Distance)是已知的。在某些地理坐標點上安裝了訪問控制(Access Control)設備,可以自
2、動掃描行駛卡(Card)。行程(Trajectory)由一組連續(xù)的路段構成。行程的起點(Entry)和終點(Exit)都裝有訪問控制設備。 系統(tǒng)提供了3種行駛卡。常規(guī)卡(Regular Card)有效期(Valid Period)為一年,可以在整個道路交通網內使用。季卡(Season Card)有效期為三個月,可以在整個道路交通網內使用。單次卡(Minitrip Card)在指定的行程內使用,且只能使用一次。其中,季卡和單次卡都是預付卡(Prepaid Card),需要客戶(Customer)預存一定的費用。 系統(tǒng)的主要功能有:客戶注冊、申請行駛卡、使用行駛卡行駛等。 使用常規(guī)卡行駛,在
3、進入行程起點時,系統(tǒng)記錄行程起點、進入時間(Date Of Entry)等信息。在到達行程終點時,系統(tǒng)根據行駛的里程數和所持卡的里程單價(Unit Price)計算應付費用,并打印費用單(Invoice)。 季卡的使用流程與常規(guī)卡類似,但是不需要打印費用單,系統(tǒng)自動從卡中扣除應付費用。 單次卡的使用流程與季卡類似,但還需要在行程的起點和終點上檢查行駛路線是否符合該卡所規(guī)定的行駛路線。 現采用面向對象方法開發(fā)該系統(tǒng),使用UML進行建模。構建出的用例圖和類圖分別如圖3-1和圖3-2所示。 【問題1】(4分) 根據說明中的描述,給出圖3-1中U1和U2所對應的用例,以及(1)所對應
4、的關系。 【問題2】(8分) 根據說明中的描述,給出圖3-2中缺少的C1~C6所對應的類名以及(2)~(3)處所對應的多重度(類名使用說明中給出的英文詞匯)。 【問題3】(3分) 根據說明中的描述,給出Road Segment、Trajectory和Card所對應的類的關鍵屬性(屬性名使用說明中給出的英文詞匯)。 ?收藏查看解析視頻解析 參考答案: 【問題1】(4分) U1:使用常規(guī)卡行駛U2:使用單次卡行駛(各1分) (1):extend(2分) 【問題2】(8分,各1分) C1:RoadSegment C2:Trajectory C3:Card C4:Regular
5、Card C5:PrepaidCard C6:MinitripCard (2)1(3)1..3 【問題3】(3分,每個類1分) RoadSegment的屬性:Distance Trajectory的屬性:Entry、Exit、DateOfEntry Card的屬性:UnitPrice、ValidPeriod 正確答案: 本題解析: 【問題1】(4分) U1:使用常規(guī)卡行駛U2:使用單次卡行駛(各1分) (1):extend(2分) 【問題2】(8分,各1分) C1:RoadSegmen
6、t C2:Trajectory C3:Card C4:RegularCard C5:PrepaidCard C6:MinitripCard (2)1(3)1..3 【問題3】(3分,每個類1分) RoadSegment的屬性:Distance Trajectory的屬性:Entry、Exit、DateOfEntry Card的屬性:UnitPrice、ValidPeriod 試題分析 本題考查面向對象開發(fā)相關知識,涉及UML用例圖、類圖以及類圖設計時的設計模式。UML目前在面向對象軟件開發(fā)中廣泛使用,是面向對象軟件開發(fā)考查的重要內容。 【問題1】 本題主要考查用例圖。 用
7、例之間的關系主要有以下三種: (1)包含關系。當可以從兩個或兩個以上的用例中提取公共行為時,應該使用包含關系來表示它們。用《include》表示。 (2)擴展關系。如果一個用例明顯地混合了兩種或兩種以上的不同場景,即根據情況可能發(fā)生多種分支,則可以將這個用例分為一個基本用例和一個或多個擴展用例,這樣使描述可能更加清晰。用《extend》表示。 (3)泛化關系。當多個用例共同擁有一種類似的結構和行為的時候,可以將它們的共性抽象成為父用例,其他的用例作為泛化關系中的子用例。 在本題中,從題目的描述中,我們不難看出,用例圖中缺失的用例有“使用常規(guī)卡行駛”和“使用單次卡行駛”,那么U1和U2具
8、體對應哪個用例,我們根據題目說明,并結合用例圖來看,“使用季卡行駛”與U1是泛化關系,由此可知U1應該是“使用常規(guī)卡行駛”,而U2是“使用單次卡行駛”,根據題目描述“單次卡的使用流程與季卡類似,但還需要在行程的起點和終點上檢查行駛路線是否符合該卡所規(guī)定的行駛路線”,由此可知,U1是對“使用季卡行駛”的擴展,由此第1空應填《extend》。 【問題2】 本問題考查類圖。對于這個題目,我們應該結合題目的描述及給出的類圖來求解。根據題目的描述,本系統(tǒng)包含的類主要有路段(Road Segment)、地理坐標點(Node)、訪問控制(Access Control)設備、自動掃描行駛卡(Card)、行
9、程(Trajectory)、常規(guī)卡(Regular Card)、季卡(Season Card)、單次卡(Minitrip Card)、預付卡(Prepaid Card)和客戶(Customer)等。 從類圖中C1與類Node的關系和C2與AccessControlNode的關系,再結合題目描述“路段由兩個地理坐標點(Node)標定”可以知道C1應該是路段類,而由題目描述“行程(Trajectory)由一組連續(xù)的路段構成。行程的起點(Entry)和終點(Exit)都裝有訪問控制設備”可以知道C2應該是行程(Trajectory)類。 而從類圖看,C4和C5是繼承于C3的,再結合類圖中C3與客
10、戶類和行程類的關系,可知C3應該是一切卡的抽象類,因此是自動掃描行駛卡(Card),而C5是C6和季卡的父類,再根據題目描述“季卡和單次卡都是預付卡(PrepaidCard)”可知C5是預付卡(PrepaidCard),而C6是單次卡(MinitripCard),而C4是常規(guī)卡(RegularCard)。 在UML中,多重度又稱重復度,多重度表示為一個整數范圍n..m,整數n定義所連接的最少對象的數目,而m則為最多對象數(當不知道確切的最大數時,最大數用*號表示)。最常見的多重性有0..1、0..*、1..1和1..*,而*與0..*是等價的。 空(2)和(3)描述的是客戶與卡之間的多重度
11、,題目告訴我們系統(tǒng)有三種卡,因此一個客戶最多可以持有這三種卡,因此空(3)應填1..3。而一個卡只能被一個客戶持有,因此客戶這端應該填1。 【問題3】 根據題目描述,RoadSegment類應該包含的關鍵屬性是里程數(Distance),因為這能標識一個路段的長度;而Trajectory類應該包含的關鍵屬性是起點(Entry)、終點(Exit)、進入時間(Date Of Entry),這樣才能說明某一次行程是何時從哪里開始到那里結束的;而Card類的關鍵屬性應包含有效期(Valid Period)和里程單價(Unit Price)。 2.某大型商場內安裝了多
12、個簡易的紙巾售賣機,自動出售2元錢一包的紙巾,且每次僅售出一包紙巾。紙巾售賣機的狀態(tài)圖如圖5-1所示。 采用狀態(tài)(State)模式來實現該紙巾售賣機,得到如圖5-2所示的類圖。其中類State為抽象類,定義了投幣、退幣、出紙巾等方法接口。類SoldState、SoldOutState、NoQuarterState和HasQuarterState分別對應圖5-1中紙巾售賣機的4種狀態(tài):售出紙巾、紙巾售完、沒有投幣、有2元錢。 【C++代碼】 #include<iostream> using namespace std; //以下為類的定義部分 class TissueMach
13、ine;//類的提前引用 class State{ public: virtual void insertQuarter( ?。?0;//投幣 virtual void ejectQuarter( )=0;//退幣 virtual void turnCrank( ?。?0;//按下“出紙巾”按鈕 virtual void dispense( ?。?0;//出紙巾 }; /*類SoldOutState、NoQuarterState、HasQuarterState、SoldState的定義省略,每個類中均 定義了私有數據成員TissueMachine*tissueMachine
14、;*/ class TissueMachine{ private: (1)*soldOutState,*noQuarterState,*hasQuarterState,*soldState,*state; int count;//紙巾數 public: TissueMachine(int numbers); void setState(State*state); State*getHasQuarterState( ); State*getNoQuarterState( ?。? State*getSoldState( ?。? State*getSoldOutState(
15、?。? int getCount( ); //其余代碼省略 }; //以下為類的實現部分 void NoQuarterState::insertQuarter( ?。﹞ tissueMachine->setState((2)); } void HasQuarterState::ejectQuarter( ){ tissueMachine->setState((3)); } void SoldState::dispense( ?。﹞ if(tissueMachine->getCount( )>0){ tissueMachine->setState((4)); }
16、 else{ tissueMachine->setState((5)); } }//其余代碼省略 正確答案: 本題解析: (1)State (2)tissueMachine->getHasQuarterState() (3)tissueMachine->getNoQuarterState() (4)tissueMachine->getNoQuarterState() (5)tissueMachine->getSoldOutState() 本題考查基本面向對象設計模式的運用能力。 狀態(tài)
17、設計模式主要是能夠使一個對象的內在狀態(tài)改變時允許改變其行為,使這個對象看起來像是改變了其類。由類圖可知類State是類SoldState、SoldOutState、NoQuarterState和HasQuarterState的父類,它抽象了這四個類的共有屬性和行為。在使用中,無論是這四個類中那個類的對象,都可被當作State對象來使用。 而根據題目的描述,我們可以知道一個紙巾售賣機它由4種狀態(tài),分別是售出紙巾、紙巾售完、沒有投幣、有2元錢。 在本題中,根據程序我們不難知道第(1)空是要定義5個對象指針,而這些對象指針都應該屬于State類型,因此第一空答案為State。 而第(2)在類N
18、oQuarterState(沒有投幣)的insertQuarter()函數中,而這個函數是投幣函數,在該函數中,使用了tissueMachine類的setState方法,該方法是設置紙巾售賣機的當前狀態(tài),根據題目給出的紙巾售賣機狀態(tài)圖,我們可以知道,從沒有投幣狀態(tài),經過投幣后,應該轉換到有2元錢狀態(tài)。而setState方法的參數是一個State的對象,因此第(2)空應該是一個有2元錢對象,而這里我們可以新創(chuàng)建一個該對象,也可以通過tissueMachine類的getHasQuarterState方法來獲得這樣一個對象,所以第(2)空答案應該是“tissueMachine->getHasQuar
19、terState()”或“new HasQuarterState”。 而第(3)在類HasQuarterState(有2元錢)的ejectQuarter()函數中,而這個函數是退幣函數,在該函數中,也使用了tissueMachine類的setState方法,該方法是設置紙巾售賣機的當前狀態(tài),根據題目給出的紙巾售賣機狀態(tài)圖,我們可以知道,從有2元錢狀態(tài),經過退幣后,應該轉換到沒有投幣狀態(tài)。而setState方法的參數是一個State的對象,因此第(3)空應該是一個沒有投幣對象,而這里我們可以新創(chuàng)建一個該對象,也可以通過tissueMachine類的getNoQuarterState方法來獲得這
20、樣一個對象,所以第(3)空答案應該是“tissueMachine->getNoQuarterState()”或“new NoQuarterState”。 而同樣的道理,我們可以知道第(4)空的答案是“tissueMachine->getNoQuarterState()”或“new NoQuarterState”。第(5)空的答案是“tissueMachine->getSoldOutState()”或“new SoldOutState”。 3.某公司欲開發(fā)招聘系統(tǒng)以提高招聘效率,其主要功能如下: (1)接受申請 驗證應聘者所提供的自身信息是否完整,是否說明了
21、應聘職位,受理驗證合格的申請,給應聘者發(fā)送致謝信息。 (2)評估應聘者 根據部門經理設置的職位要求,審查已經受理的申請;對未被錄用的應聘者進行謝絕處理,將未被錄用的應聘者信息存入未錄用的應聘者表,并給其發(fā)送謝絕決策;對錄用的應聘者進行職位安排評價,將評價結果存入評價結果表,并給其發(fā)送錄用決策,發(fā)送錄用職位和錄用者信息給工資系統(tǒng)。 現采用結構化方法對招聘系統(tǒng)進行分析與設計,獲得如圖1-1所示的頂層數據流圖、圖1-2所示0層數據流圖和圖1-3所示1層數據流圖。 圖1-2 0層數據流圖 圖1-3 1層數據流圖 【問題1】(3分) 使用說明中的術語,給出圖中E1~E3所對應的
22、實體名稱。 【問題2】(2分) 使用說明中的術語,給出圖中D1~D2所對應的數據存儲名稱。 【問題3】(6分) 使用說明和圖中的術語,給出圖1-3中加工P1~P3的名稱。 【問題4】(4分) 解釋說明圖1-2和圖1-3是否保持平衡,若不平衡請按如下格式補充圖1-3中數據流的名稱以及數據流的起點或終點,使其平衡(使用說明中的術語或圖中符號)。 正確答案: 本題解析: 【問題1】(3分,各1分) E1:應聘者E2:部門經理E3:工資系統(tǒng) 【問題2】(2分,各1分) D1:未錄用的應聘者
23、表D2:評價結果表 【問題3】(6分,各2分) P1:驗證信息P2:審查申請P3:職位安排評價 【問題4】(4分) 不平衡。圖1-2中加工的輸入輸出流與其子圖1-3中的輸入輸出流的數量不同。 本題考查數據流圖(DFD)的應用,是一種比較傳統(tǒng)的題目,要求考生細心分析題目中所描述的內容。DFD是一種便于用戶理解、分析系統(tǒng)數據流程的圖形工具。是系統(tǒng)邏輯模型的重要組成部分。 【問題1】 本問題要求我們給出圖1-1中的實體E1~E3的名稱。這個需要我們從題目中的描述和該圖來獲得。題目中有信息描述:“驗證應聘者所提供的自身信息是否完整,是否說明了應聘職位,受理驗證合格的申請,給應聘者發(fā)送
24、致謝信息”我們結合0層數據流圖可知,E1為應聘者;另外,根據題目描述“根據部門經理設置的職位要求,審查已經受理的申請”,再結合頂層圖,我們可以知道E2是部門經理,再根據描述“發(fā)送錄用職位和錄用者信息給工資系統(tǒng)”和頂層數據流圖可知,E3是工資系統(tǒng)。 【問題2】 本問題考查數據存儲的確定。根據題目的描述“對未被錄用的應聘者進行謝絕處理,將未被錄用的應聘者信息存入未錄用的應聘者表”,結合1層數據流圖我們可知D1為未錄用的應聘者表;根據題目描述“對錄用的應聘者進行職位安排評價,將評價結果存入評價結果表”,再結合1層數據流圖我們可知D2為評價結果表。 【問題3】 本題要求我們找出圖中缺失的加工名
25、稱。對比圖1-2和1-3我們不難發(fā)現,圖1-3中的上半部分為圖1-2中加工“接受申請”轉換而來,而下半部分是圖1-2中加工“評估應聘者”轉換而來,那么根據題目描述“驗證應聘者所提供的自身信息是否完整,是否說明了應聘職位,然后受理驗證合格的申請”,我們可以知道這里應該有兩個加工,分別是“驗證信息”和“受理申請”,因此P1應該為“驗證信息”。而根據題目描述“審查已經受理的申請;對未被錄用的應聘者進行謝絕處理,將未被錄用的應聘者信息存入未錄用的應聘者表,并給其發(fā)送謝絕決策;對錄用的應聘者進行職位安排評價”,我們可以知道,這里應該牽涉到三個加工,分別是“審查申請”、“謝絕應聘者”和“職位安排評價”,再
26、結合圖1-3,我們不難知道P2應該為“審查申請”,P3為“職位安排評價”。 【問題4】 本題主要考查父圖與子圖的平衡原則。在0層數據流圖中,加工“接受申請”輸入數據流有“應聘者信息”、“應聘職位”,而其輸出數據流有“致謝信息”和“已受理的申請”,而在1層數據流圖的上半部分中,體現出來“應聘者信息”、“應聘職位”和“致謝信息”這些數據流,而沒有“已受理的申請”這條輸出數據流,因此這里缺少了這條數據流,其起點是加工“受理申請”。 而同樣的道理,我們可以知道在0層數據流圖中與加工“評估應聘者”有關的數據流在1層數據流圖中缺失了“錄用職位”這條數據流,而這條數據流的起點是“P3”,其終點應該是E
27、3;另外從與“評估應聘者”到E1有一條“決策”數據流,而在1層數據流圖中體現出來的是“錄用決策”,但根據題目意思,決策應該有錄用決策和謝絕決策之分,應該還缺失了“謝絕決策”這條數據流,其起點是加工“謝絕應聘者”,其終點是“E1”。 4.某物流公司為了整合上游供應商與下游客戶,縮短物流過程,降低產品庫存,需要構建一個信息系統(tǒng)以方便管理其業(yè)務運作活動。 【需求分析結果】 (1)物流公司包含若干部門,部門信息包括部門號、部門名稱、經理、電話和郵箱。一個部門可以有多名員工處理部門的日常事務,每名員工只能在一個部門工作。每個部門有一名經理,只需負責管理本部門的事務和人
28、員。 (2)員工信息包括員工號、姓名、職位、電話號碼和工資;其中,職位包括:經理、業(yè)務員等。業(yè)務員根據托運申請負責安排承運貨物事宜,例如:裝貨時間、到達時間等。一個業(yè)務員可以安排多個托運申請,但一個托運申請只由一個業(yè)務員處理。 (3)客戶信息包括客戶號、單位名稱、通信地址、所屬省份、聯系人、聯系電話、銀行賬號,其中,客戶號唯一標識客戶信息的每一個元組。每當客戶要進行貨物托運時,先要提出貨物托運申請。托運申請信息包括申請?zhí)?、客戶號、貨物名稱、數量、運費、出發(fā)地、目的地。其中,一個申請?zhí)枌ㄒ坏囊粋€托運申請;一個客戶可以有多個貨物托運申請,但一個托運申請對應唯一的一個客戶號。 【概念模型設
29、計】 根據需求階段收集的信息,設計的實體聯系圖和關系模式(不完整)如圖2-1所示。 【關系模式設計】 部門(部門號,部門名稱,經理,電話,郵箱) 員工(員工號,姓名,職位,電話號碼,工資,(a)) 客戶((b),單位名稱,通信地址,所屬省份,聯系人,聯系電話,銀行賬號) 托運申請((c),貨物名稱,數量,運費,出發(fā)地,目的地) 安排承運((d),裝貨時間,到達時間,業(yè)務員) 【問題1】(5分) 根據問題描述,補充四個聯系、聯系的類型,以及實體與子實體的聯系,完善圖2-1所示的實體聯系圖。 【問題2】(8分) 根據實體聯系圖,將關系模式中的空(a)~(d)補充完整。分別
30、指出部門、員工和安排承運關系模式的主鍵和外鍵。 【問題3】(2分) 若系統(tǒng)新增需求描述如下: 為了數據庫信息的安全性,公司要求對數據庫操作設置權限管理功能,當員工登錄系統(tǒng)時,系統(tǒng)需要檢查員工的權限。權限的設置人是部門經理。為滿足上述需要,應如何修改(或補充)圖2-1所示的實體聯系圖,請給出修改后的實體聯系圖和關系模式。 正確答案: 本題解析: 【問題1】(5分) 【問題2】(8分) 【問題3】(2分,聯系1分,關系模式1分) 關系模式:權限(員工號,權限,設置人)或權限(員工號,
31、權限,部門經理)。 試題分析 本題考查數據庫概念結構設計、概念至邏輯結構轉換等內容。 此類題目要求考生認真閱讀題目,根據題目的需求描述,給出實體間的聯系。 【問題1】 本題主要考查根據題目描述補充完整ER圖。 在本題中,根據題目描述“一個部門可以有多名員工處理部門的日常事務,每名員工只能在一個部門工作”,我們可以知道部門與員工間存在一對多的聯系“屬于”;根據題目描述“每個部門有一名經理,只需負責管理本部門的事務和人員”我們可以知道,經理與部門之間存在一對一的管理聯系;然后我們根據題目描述“業(yè)務員根據托運申請負責安排承運貨物事宜,一個業(yè)務員可以安排多個托運申請,但一個托運申請只由一個
32、業(yè)務員處理”可知,在業(yè)務員和托管申請之間存在一個1對多的安排承運的聯系;而根據題目描述“每當客戶要進行貨物托運時,先要提出貨物托運申請。其中,一個申請?zhí)枌ㄒ坏囊粋€托運申請;一個客戶可以有多個貨物托運申請,但一個托運申請對應唯一的一個客戶號”可以,客戶和托運申請之間存在一個1對多的申請聯系。另外,不管是業(yè)務員還是經理,他們都是員工,因此業(yè)務員和經理是員工實體的子實體。 【問題2】 該問題要我們補充完整各關系模式中缺失的屬性并給出各關系模式的主鍵。要補充各關系模式缺失的屬性應該根據題目的描述和ER圖轉換為關系模式的轉換原則來完成。a空是要我們補充員工信息關系模式所缺失的屬性,根據題目的描述
33、,員工信息包括:員工號、姓名、職位、電話號碼和工資,而這些已經存在于員工關系模式中了,但是根據ER轉換的原則,我們知道部門與員工之間存在一對多的聯系,而這個聯系沒有轉換為獨立的關系模式,因此,需要將聯系的屬性和1端關系模式的主鍵放到多端當中來作為外鍵,因此a空應填屬性“部門號”。其中員工關系模式的主鍵為員工號,而外鍵為部門號。 b空是要我們補充客戶關系模式所缺失的屬性,根據題目的描述,客戶信息包括客戶號、單位名稱、通信地址、所屬省份、聯系人、聯系電話、銀行賬號。因此b空應該填“客戶號”這個屬性。 c空是要我們補充托運申請關系模式所缺失的屬性。根據題目描述托運申請信息包括申請?zhí)枴⒖蛻籼?、貨?/p>
34、名稱、數量、運費、出發(fā)地、目的地。再結合ER圖分析可得出c空應該填“申請?zhí)枺蛻籼枴薄? d空是要我們補充安排承運關系模式所缺失的屬性。安排承運是有聯系轉換而來的一個關系模式,其中包含的屬性應該包括其本身的屬性和聯系兩端實體關系模式的主鍵,應該可知d空應該填“申請?zhí)枴保鴺I(yè)務員的主鍵就是屬性“業(yè)務員”。這個關系模式的主鍵應該是申請?zhí)枺怄I是業(yè)務員,因為業(yè)務員是業(yè)務員關系模式的主鍵,其實就是員工號。 同樣的道理,對于部門關系模式,其主鍵為部門號,而外鍵為“經理”。 【問題3】 根據本題描述“為了數據庫信息的安全性,公司要求對數據庫操作設置權限管理功能,當員工登錄系統(tǒng)時,系統(tǒng)需要檢查員工的
35、權限。權限的設置人是部門經理?!蔽覀兙涂梢灾?,應該有一個實體“權限”,而這個實體與部門經理之間存在一種一對多的聯系,其中部門經理端為一端。 5.某大型商場內安裝了多個簡易的紙巾售賣機,自動出售2元錢一包的紙巾,且每次僅售出一包紙巾。紙巾售賣機的狀態(tài)圖如圖6-1所示。 采用狀態(tài)(State)模式來實現該紙巾售賣機,得到如圖6-2所示的類圖。其中類State為抽象類,定義了投幣、退幣、出紙巾等方法接口。類SoldState、SoldOutState、NoQuarterState和HasQuarterState分別對應圖6-1中紙巾售賣機的4種狀態(tài):售出紙巾、
36、紙巾售完、沒有投幣、有2元錢。 【Java代碼】 import java.util.*; interface State{ public void insertQuarter( );//投幣 public void ejectQuarter( ?。?//退幣 public void turnCrank( );//按下“出紙巾”按鈕 public void dispense( ?。?//出紙巾 } class TissueMachine{ (1)soldOutState,noQuarterState,hasQuarterState,soldState,state;
37、state=soldOutState; int count=0;//紙巾數 public TissueMachine(int numbers){/*實現代碼省略*/} public State getHasQuarterState( ?。﹞return hasQuarterState;} public State getNoQuarterState( ){return noQuarterState;} public State getSoldState( ?。﹞return soldState;} public State getSoldOutState( ){return s
38、oldOutState;} public int getCount( ?。﹞return count;} //其余代碼省略 } class NoQuarterState implements State{ TissueMachine tissueMachine; public void insertQuarter( ?。﹞ tissueMachine.setState((2)); } //構造方法以及其余代碼省略 } class HasQuarterState implements State{ TissueMachine tissueMachine; public
39、void ejectQuarter( ?。﹞ tissueMachine.setState((3)); } //構造方法以及其余代碼省略 } class SoldState implements State{ TissueMachine tissueMachine; public void dispense( ){ if(tissueMachine.getCount( ?。?0){ tissueMachine.setState((4)); }else{ tissueMachine.setState((5));} } }
40、 正確答案: 本題解析: (1)State (2)tissueMachine.getHasQuarterState() (3)tissueMachine.getNoQuarterState() (4)tissueMachine.getNoQuarterState() (5)tissueMachine.getSoldOutState() 本題考查基本面向對象設計模式的運用能力。 狀態(tài)設計模式主要是能夠使一個對象的內在狀態(tài)改變時允許改變其行為,使這個對象看起來像是改變了其類。由類圖可知類State是類SoldState、SoldOutStat
41、e、NoQuarterState和HasQuarterState分的父類,它抽象了這四個類的共有屬性和行為。在使用中,無論是這四個類中那個類的對象,都可被當作State對象來使用。 而根據題目的描述,我們可以知道一個紙巾售賣機它由4種狀態(tài),分別是售出紙巾、紙巾售完、沒有投幣、有2元錢。 在本題中,根據程序我們不難知道第(1)空是要定義5個對象的引用,而這些變量都應該屬于State類型,因此第一空答案為State。 而第(2)在類NoQuarterState(沒有投幣)的insertQuarter()函數中,而這個函數是投幣函數,在該函數中,使用了tissueMachine類的setSta
42、te方法,該方法是設置紙巾售賣機的當前狀態(tài),根據題目給出的紙巾售賣機狀態(tài)圖,我們可以知道,從沒有投幣狀態(tài),經過投幣后,應該轉換到有2元錢狀態(tài)。而setState方法的參數是一個State的對象,因此第(2)空應該是一個有2元錢對象,而這里我們可以新創(chuàng)建一個該對象,也可以通過tissueMachine類的getHasQuarterState方法來獲得這樣一個對象,所以第(2)空答案應該是“tissueMachine.getHasQuarterState()”或“new HasQuarterState”。 而第(3)在類HasQuarterState(有2元錢)的ejectQuarter()函數
43、中,而這個函數是退幣函數,在該函數中,也使用了tissueMachine類的setState方法,該方法是設置紙巾售賣機的當前狀態(tài),根據題目給出的紙巾售賣機狀態(tài)圖,我們可以知道,從有2元錢狀態(tài),經過退幣后,應該轉換到沒有投幣狀態(tài)。而setState方法的參數是一個State的對象,因此第(3)空應該是一個沒有投幣對象,而這里我們可以新創(chuàng)建一個該對象,也可以通過tissueMachine類的getNoQuarterState方法來獲得這樣一個對象,所以第(3)空答案應該是“tissueMachine.getNoQuarterState()”或“new NoQuarterState”。 而同樣的
44、道理,我們可以知道第(4)空的答案是“tissueMachine.getNoQuarterState()”或“new NoQuarterState”。第(5)空的答案是“tissueMachine.getSoldOutState()”或“new SoldOutState”。 6.設某一機器由n個部件組成,每一個部件都可以從m個不同的供應商處購得。供應商j供應的部件i具有重量wij和價格cij。設計一個算法,求解總價格不超過上限cc的最小重量的機器組成。 采用回溯法來求解該問題: 首先定義解空間。解空間由長度為n的向量組成,其中每個分量取值來自集合{1,2,…
45、,m},將解空間用樹形結構表示。 接著從根結點開始,以深度優(yōu)先的方式搜索整個解空間。從根結點開始,根結點成為活結點,同時也成為當前的擴展結點。向縱深方向考慮第一個部件從第一個供應商處購買,得到一個新結點。判斷當前的機器價格(c11)是否超過上限(cc),重量(w11)是否比當前已知的解(最小重量)大,若是,應回溯至最近的一個活結點;若否,則該新結點成為活結點,同時也成為當前的擴展結點,根結點不再是擴展結點。繼續(xù)向縱深方向考慮第二個部件從第一個供應商處購買,得到一個新結點。同樣判斷當前的機器價格(c11+c21)是否超過上限(cc),重量(w11+w21)是否比當前已知的解(最小重量)大。若是
46、,應回溯至最近的一個活結點;若否,則該新結點成為活結點,同時也成為當前的擴展結點,原來的結點不再是擴展結點。以這種方式遞歸地在解空間中搜索,直到找到所要求的解或者解空間中已無活結點為止。 【C代碼】 下面是該算法的C語言實現。 (1)變量說明 n:機器的部件數 m:供應商數 cc:價格上限 w[][]:二維數組,w[i][j]表示第j個供應商供應的第i個部件的重量 c[][]:二維數組,c[i][j]表示第j個供應商供應的第i個部件的價格 bestW:滿足價格上限約束條件的最小機器重量 bestC:最小重量機器的價格 bestX[]:最優(yōu)解,一維數組,bestX[i]表示
47、第i個部件來自哪個供應商 cw:搜索過程中機器的重量 cp:搜索過程中機器的價格 x[]:搜索過程中產生的解,x[i]表示第i個部件來自哪個供應商 i:當前考慮的部件,從0到n-1 j:循環(huán)變量 (2)函數backtrack int n=3; int m=3; int cc=4; int w[3][3]={{1,2,3},{3,2,1},{2,2,2}}; int c[3][3]={{1,2,3},{3,2,1},{2,2,2}}; int bestW=8; int bestC=0; int bestX[3]={0,0,0}; int cw=0; int cp=
48、0; int x[3]={0,0,0}; int backtrack(int i){ int j=0; int found=0; if(i>n-1){/*得到問題解*/ bestW=cw; bestC=cp; for(j=0;j<n;j++){ (1); } return 1; } if(cp<=cc){/*有解*/ found=1; } for(j=0;(2);j++){ /*第i個部件從第j個供應商購買*/ (3); cw=cw+w[i][j]; cp=cp+c[i][j]; if(cp<=cc&&(4)){/*深度搜索,擴展當前結點*/ if(
49、backtrack(i+1)){found=1;} } /*回溯*/ cw=cw-w[i][j]; (5); } return found; } 正確答案: 本題解析: (1)bestX[j]=x[j] (2)j<m (3)x[i]=j (4)cw<bestW (5)cp=cp-c[i][j] 本題考查回溯法的應用。 在題目的描述中告訴了我們回溯法的基本思想。其實回溯法主要有兩個過程,一個是向前探索,只要在當前滿足設定的判定條件時,才向前探索,而另外一個就是回溯,在兩種情況下,
50、需要回溯,其分別是當不滿足設定條件時和求的一個解的時候。 下面我們來具體分析本試題。根據題目給出的注釋,我們知道第(1)空所處的位置是得到問題的一個解時,我們該怎么辦,根據題目描述,應該是將這個解記錄下來,存放到bestX數組當中,而求得的解是保存在x數組當中的,因此這里需要循環(huán)將x數組中的元素值賦給bestX數組,因此第(1)空答案為bestX[j]=x[j]。 第(2)空是for循環(huán)中的循環(huán)判定條件,根據題目注釋我們知道該循環(huán)的作用是確定第i個部件從第j個供應商購買,那么在確定第i個部件到底是從哪個供應商購買時,需要比較從各供應商購買的情況,因此循環(huán)的次數為供應商數,因此第(2)空答案
51、是j<m。結合這個循環(huán)體當中的語句和我們對回溯法的理解,我們可以發(fā)現循環(huán)下面的語句是要考慮將第i個部件從供應商j當中購買,也就是j是當前解的一部分,因此需要將j記錄到解當中來,所以第(3)空應該是x[i]=j。 第(4)空是if語句中的一個條件,根據題目注釋,我們可以知道如果該if語句表達式的計算結果為真,需要進行深度搜索,擴展當前結點,那么如果要繼續(xù)向前探索,就需要滿足設定的條件,也就是當前總重量要小于bestW,而當前總價格要小于等于cc,因此第(4)空的答案應該填cw<bestW。 根據題目注釋,第(5)空是在回溯下面的語句,根據回溯的原則我們可以知道,回溯時,要將當前考慮的結點的重量和價格從總重量和總價格中減去,因此第(5)的答案是cp=cp-c[i][j]。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。