软考 | 2017年上半年 软件设计师 下午试卷
試題一
閱讀下列說明,回答問題 1 至問題 4, 將解答填入答題紙的對應欄內。
【說明】
某醫療器械公司作為復雜醫療產品的集成商,必須保持高質量部件的及時供應。為了實現這一目標,該公司欲開發一采購系統。系統的主要功能如下:
(1)驗證裝運部件。通過訪問采購訂單并將其與提單進行比較來驗證裝運的部件,并將提單信息發給 S/R 職員。 如果收貨部件項目出現在采購訂單和提單上,則已驗證的提單和收貨部件項目將被送去檢驗。否則,將 S/R 職員提交的裝運錯誤信息生成裝運錯誤通知發送給供應商。
(2) 檢驗部件質量。通過訪問質量標準來檢查裝運部件的質量,并將己驗證的提單發給檢驗員。如果部件滿足所有質量標準,則將其添加到接受的部件列表用于更新部件庫存。如果部件未通過檢查,則將檢驗員創建的缺陷裝運信息生成缺陷裝運通知發送給供應商。
(3)更新部件庫存。庫管員根據收到的接受的部件列表添加本次采購數量,與原有庫存量累加來更新庫存部件中的庫存量。標記訂單采購完成。
現采用結構化方法對該采購系統進行分析與設計,獲得如圖 1-1 所示的上下文數據流圖和圖 1-2 所示的 0 層數據流圖。
圖 1-2 0 層數據流圖
【問題 1】(5 分)
使用說明中的詞語,給出圖 1-1 中的實體 E1 ~E5
【問題 2】(4 分)
使用說明中的詞語,給出圖 1-2 中的數據存儲 D1~D4 的名稱。
【問題 3】(4 分)
根據說明和圖中術語,補充圖 1-2 中缺失的數據流及其起點和終點。
【問題 4】(2 分)
用 200 字以內文字,說明建模圖 1-1 和圖 1-2 時如何保持數據流圖平衡。
試題二
閱讀下列說明,回答問題 1 至問題 3,將解答填入答題紙的對應欄內。
【說明】
某房屋租賃公司擬開發一個管理系統用于管理其持有的房屋、租客及員工信息。請根據下述需求描述完成系統的數據庫設計。
【需求描述】
【概念模型設計】
根據需求階段收集的信息,設計的實體聯系圖(不完整)如圖 2-1所示。
【邏輯結構設計】
根據概念摸型設計階段完成的實體聯系圖,得出如下關系模式(不完整):
聯系電話(電話號碼,租客編號)
租客(租客編號,姓名,銀行賬號,聯系人姓名,聯系人電話)
員工(員工編號,姓名,聯系電話,類別,月工資, (a) )
公寓樓( (b) ,地址,經理編號)
公寓(樓編號,公寓號,臥室數,衛生間數〉
合同(合同編號,租客編號,樓編號,公寓號,經理編號,簽訂日期,
起始日期,租期, (c) ,押金)
【問題 1】(4.5 分)
補充圖 2-1 中的“簽約”聯系所關聯的實體及聯系類型。
【問題 2】(4.5 分)
補充邏輯結構設計中的(a)、(b)、(c)三處空缺。
【問題 3】(6 分)
在租期內,公寓內設施如出現問題,租客可在系統中進行故障登記,填寫故障描述,每項故障由系統自動生成唯一的故障編號,由公司派維修工進行故障維修,系統需記錄每次維修的維修日期和維修內容。請根據此需求,對圖 2-1 進行補充,并將所補充的 ER 圖內容轉換為一個關系模式,請給出該關系模式。
試題三
閱讀下列系統設計說明,回答問題 1 至問題 3,將解答填入答題紙的對應欄內。
【說明】
某玩具公司正在開發一套電動玩具在線銷售系統,用于向注冊會員提供端對端的玩具 定制和銷售服務。在系統設計階段,“創建新訂單 (New Order)” 的設計用例詳細描述如 表 3-1 所示,候選設計類分類如表 3-2 所示,并根據該用例設計出部分類圖如圈子 3-1 所示。
表 3-1 創建新訂單 (NewOrder) 設計用例
表 3-2 候選設計類分類
在訂單處理的過程中,會員可以點擊“取消訂單"取消該訂單。如果支付失敗,該訂單將被標記為掛起狀態,可后續重新支付,如果掛起超時 30 分鐘未支付,系統將自動取消該訂單。訂單支付成功后,系統判斷訂單類型: (1)對于常規訂單,標記為備貨狀態,訂單信息發送到貨運部,完成打包后交付快遞發貨; (2)對于定制訂單,會自動進入定制狀態,定制完成后交付快遞發貨。會員在系統中點擊”收貨"按鈕變為收貨狀態,結束整個訂單的處理流程。根據訂單處理過程所設計的狀態圖如圖 3-2 所示。
【問題 1】(6 分)
根據表 3-1 中所標記的候選設計類,請按照其類別將編號C1~C12 分別填入表 3-2 中的(a)、(b)和(c)處。
【問題 2】 (4 分〉
根據創建新訂單的用例描述,請給出圖 3-1 中 X1~X4 處對應類的名稱。
【問題 3】 (5 分)
根據訂單處理過程的描述,在圖 3-2 中 S1~S5 處分別填入對應的狀態名稱。
試題四
閱讀下列說明和 C 代碼,回答問題 1 至問題 3,將解答寫在答題紙的對應欄內。
【說明】
假幣問題:有 n 枚硬幣,其中有一枚是假幣,己知假幣的重量較輕。現只有一個天平,要求用盡量少的比較次數找出這枚假幣。
【分析問題】
將 n 枚硬幣分成相等的兩部分:
(1)當 n 為偶數時,將前后兩部分,即 1…n/2 和 n/2+1…0,放在天平的兩端,較輕的一端里有假幣,繼續在較輕的這部分硬幣中用同樣的方法找出假幣:
(2)當 n 為奇數時,將前后兩部分,即 1…(n -1)/2 和(n+1)/2+1…0,放在天平的兩端,較輕的一端里有假幣,繼續在較輕的這部分硬幣中用同樣的方法找出假幣:若兩端重量相等,則中間的硬幣,即第 (n+1)/2 枚硬幣是假幣。
【C 代碼】
下面是算法的 C 語言實現,其中:
【問題一】
根據題干說明,填充 C 代碼中的空(1)-(3)
【問題二】
根據題干說明和 C 代碼,算法采用了(4)設計策略。函數getCounterfeitCoin 的時間復雜度為(5)(用 O 表示)。
【問題三】
若輸入的硬幣數為 30,則最少的比較次數為(6),最多的比較次數為(7)。
從下列的 2 道試題(試題五至試題六)中任選 1 道解答。
如果解答的試題數超過 1 道,則題號小的 1 道解答有效。
試題五
閱讀下列說明和 C++代碼,將應填入(n)處的字句寫在答題紙的對應欄內。
【說明】
某快餐廳主要制作井出售兒童套餐,一般包括主餐(各類比薩)、飲料和玩具,其餐品種類可能不同,但其制作過程相同。前臺服務員(Waiter)調度廚師制作套餐。現采用生成器(Builder) 模式實現制作過程,得到如圖 5-1 所示的類圖。
【C++代碼】
#include<iostream> #include <string> using namespace std;class Pizza {private: string parts;public:void setParts(string parts) { this->parts=parts; }string getParts() { return parts; } };class PizzaBuilder {protected:Pizza* pizza;public:Pizza* getPizza() { retum pizza; }void createNewPizza() { pizza = new Pizza(); }( 1 ); }class HawaiianPizzaBuilder :public PizzaBuilder {public:void buildParts() { pizza->setParts("cross +mild +ham&pineapple"); } }class SpicyPizzaBuider: public PizzaBuilder {public:void buildParts() { pizza->setParts("pan baked +hot +ham&pineapple"); } }Class Waiter{private:PizzaBuilder* pizzaBuilder;public:void setPizzaBuilder(PizzaBuilder* pizzaBuilder) { /*設置構建器*/( 2 )}Pizza* getPizza() { return pizzaBuilder->getPizza(); }void construct() { /*構建*/pizzaBuilder->createNewPizza();( 3 )} };int main(){Waiter*waiter=new Waiter();PizzaBuilder*hawaiian pizzabuilder=newHawaiianPizzaBuilder()( 4 );( 5 );cout<< "pizza: "<< waiter->getPizza()->getParts()<< endl; }程序的輸出結果為:
pizza: cross + mild + ham&pineapple試題六
閱讀下列說明和 Java 代碼,將應填入 (n) 處的字句寫在答題紙的對應欄內。
【說明】
某快餐廳主要制作并出售兒童套餐,一般包括主餐(各類比薩)、飲料和玩具,其餐品種類可能不同,但其制作過程相同。前臺服務員(Waiter) 調度廚師制作套餐。現采用生成器 (Builder) 模式實現制作過程,得到如圖 6-1 所示的類圖。
【Java 代碼】
class Pizza {private String parts;public void setParts(String parts) { this.parts = parts;}public String toString() { return this.parts; } }abstract class PizzaBuilder {protected Pizza;public Pizza getPizza() { return pizza; }public void createNewPizza() { pizza = new Pizza(); }public (1) ; }class HawaiianPizzaBuilder extends PizzaBuilder {public void buildParts() { pizza.setParts("cross + mild +ham&pineapp1e”}; }class SpicyPizzaBuilder extends PizzaBuilder {public void buildParts() { pizza.setParts("pan baked + hot +pepperoni&salami"); } }class Waiter {private PizzaBuilder;public void setPizzaBuilder(PizzaBuilder pizzaBuilder) { /*設置構建器*/(2) ;}public Pizza getPizza(){ return pizzaBuilder.getPizza(); }public void construct() { /*構建*/pizzaBuilder.createNewPizza();(3) ;} }Class FastFoodOrdering {public static viod mainSting[]args) {Waiter = new Waiter();PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();(4) ;(5) ;System.out.println("pizza: " + waiter.getPizza());} }程序的輸出結果為:
pizza:cross + mild + ham&pineapple總結
以上是生活随笔為你收集整理的软考 | 2017年上半年 软件设计师 下午试卷的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB实战-分片概念和原理
- 下一篇: windbg调试ACPI ASL Cod