第
1題: 試題一(共15分)
閱讀下列說明和圖,回答問題1至問題4,將解答填入答題紙的對應欄內。
[說明]
某公司欲開發(fā)一款外賣訂餐系統(tǒng),集多家外賣平臺和商戶為一體,為用戶提供在線瀏覽餐品、訂餐和配送等服務。該系統(tǒng)的主要功能是:
1.入駐管理。用戶注冊:商戶申請入駐,設置按時間段接單數(shù)量閱值等。系統(tǒng)存儲商戶/用戶信息。
2.餐品管理。商戶對餐品的基本信息和優(yōu)惠信息進行發(fā)布、修改、刪除。系統(tǒng)存儲相關信息。
3.訂餐。用戶瀏覽商戶餐單,選擇餐品及數(shù)量后提交訂餐請求。系統(tǒng)存儲訂餐訂單。
4.訂單處理。收到訂餐請求后,向外賣平臺請求配送。外賣平臺接到請求后發(fā)布配送單,由平臺騎手接單,外賣平臺根據(jù)是否有騎手接單返回接單狀態(tài)。若外賣平臺接單成功,系統(tǒng)給支付系統(tǒng)發(fā)送支付請求,接收支付狀態(tài)。支付成功,更新訂單狀態(tài)為已接單,向商戶發(fā)送訂餐請求并由商戶打印訂單,給用戶發(fā)送訂單狀態(tài):若支付失敗,更新訂單狀態(tài)為下單失敗,向外賣平臺請求取消配送,向用戶發(fā)送下單失敗。若系統(tǒng)接到外賣平臺返回接單失敗或超時未返回接單狀態(tài),則更新訂單狀態(tài)為下單失敗,向用戶發(fā)送下單失敗。
5.配送。商戶備餐后,由騎手取餐配送給用戶。送達后由用戶掃描騎手出示的訂單上的配送碼后確認送達,訂單狀態(tài)更改為已送達,并發(fā)送給商戶。
6.訂單評價。用戶可以對訂單餐品、騎手配送服務進行評價,推送給對應的商戶、所在外賣平臺,商戶和外賣平臺對用戶的評價進行回復。系統(tǒng)存儲評價?,F(xiàn)采用結構化方法對外賣訂餐系統(tǒng)進行分析與設計,
獲得如圖1-1所示的上下文數(shù)據(jù)。
流圖和圖1-2所示的0層數(shù)據(jù)流圖。

圖1-1 上下文數(shù)據(jù)流圖

圖1-2 0層數(shù)據(jù)流圖
問題1(4分)
使用說明中的詞語,給出圖1-1的實體E1~E4的名稱。
問題2(4分)
使用說明中的詞語,給出圖1-2中的數(shù)據(jù)存儲D1-D4 的名稱。
問題3(4分)
根據(jù)說明和圖中術語,補充圖1-2中缺失的數(shù)據(jù)流及其起點和終點。
問題4(3分)
根據(jù)說明,采用結構化語言對“訂單處理”的加工邏輯進行描述。
答案解析與討論:
www.listenjay.com/st/5221616898.html第
2題: 試題二
按照下列圖表,填寫答題紙的對應欄內。
[說明]
為了提高接種工作,提高效率,并未了抗擊疫情提供疫苗接種數(shù)據(jù)支撐,需要開發(fā)一個信息系統(tǒng),下述需求完成該系統(tǒng)的數(shù)據(jù)庫設計。
(1)記錄疫苗供應商的信息,包括供應商名稱,地址和一個電話。
(2)記錄接種醫(yī)院的信息,包括醫(yī)院名稱、地址和一個電話。
(3)記錄接種者個人信息,包括姓名、身份證號和一個電話。
(4)記錄接種者疫苗接種信息,包括接種醫(yī)院信息,被接種者信息,疫苗供應商名稱和接種日期,為了提高免疫力,接種者可能需要進行多次疫苗接種,(每天最多接種一次,每次都可以在全市任意一家醫(yī)院進行疫苗接種)。
【概念模型設計】
根據(jù)概念模型設計階段完成的實體聯(lián)系圖,得出如下關系模式(不完整):

圖2-1 E-R圖
【邏輯結構設計】
根據(jù)概念模型設計階段完成的實體聯(lián)系圖,得出如下關系模式(不完整):
供應商(供應商名稱、地址、電話)
醫(yī)院(醫(yī)院名稱、地址、電話)
供貨(供應商名稱,(a),供貨內容)
被接種者(姓名、身份證號、電話)
接種(接種者身份證號,(b),醫(yī)院名稱、供應商名稱)
[問題1](4分)
根據(jù)問題描述,補充圖2-1的實體聯(lián)系圖(不增加新的實體)。
[問題2](4分)
補充邏輯結構設計結果中的(a)(b)兩處空缺,并標注主鍵和外健完整性約束。
[問題3](7分)
若醫(yī)院還兼有核酸檢測的業(yè)務,檢測時可能需要進行多次植酸檢測(每天最多檢測一次),但每次都可以在全市任意一家醫(yī)院進行檢測。
請在圖2-1中增加“被檢測者”、實體及相應的屬性。醫(yī)院與被檢測者之間的“檢測”聯(lián)系及必要的屬性,并給出新增加的關系模式。
“被檢測者”實體包括姓名、身份證號、地址和一個電話?!皺z測”聯(lián)系需要包括檢測日期和檢測結果等。答案解析與討論:
www.listenjay.com/st/522171226.html第
4題: 試題四(共15分)
閱讀下列說明和C代碼,回答問題至問題3,將解答寫在答題紙的對應欄內。
【說明】
工程計算中經常要完成多個矩陣相乘的計算任務,對矩陣相乘進行以下說明。
(1)兩個矩陣相乘要求第一個矩陣的列數(shù)等于第二個矩陣的行數(shù),計算量主要由進行乘法運算的次數(shù)決定,假設采用標準的矩陣相乘算法,計算Amxn*Bxp"需要m*n*p次行乘法運算的次數(shù)決定、乘法運算,即時間復雜度為O(m*n*p)。
(2)矩陣相乘滿足結合律,多個矩陣相乘時不同的計算順序會產生不同的計算量。以矩陣AI5×100,A2100*8,A38x50三個矩陣相乘為例,若按(A1*A2)*A3計算,則需要進行5*100*8+5*8*50-6000次乘法運算,若按A1*(A2*A3)計算,則需要進行100*8*50+5*100*50=65000次乘法運算。
矩陣鏈乘問題可描述為:給定n個矩陣對較大的,可能的計算順序數(shù)量非常龐大,用蠻力法確定計算順序是不實際的。經過對問題進行分析,發(fā)現(xiàn)矩陣鏈乘問題具有最優(yōu)子結構,即若A1*A2**An的一個最優(yōu)計算順序從第k個矩陣處斷開,即分為A1*A2*…*Ak和Ak+1*Ak+2**An兩個子問題,則該最優(yōu)解應該包含A1*A2**Ak的一個最優(yōu)計算順序和Ak+1*Ak+2**An的一個最優(yōu)計算順序。據(jù)此構造遞歸式:
其中,cost【jj】表示Ai+1*Ai+2*Aj+1的最優(yōu)計算的計算代價。最終需要求解cost[O][n-1]?!綜代碼】算法實現(xiàn)采用自底向上的計算過程。首先計算兩個矩陣相乘的計算量,然后依次計算3個矩陣、4個矩陣、…、n個矩陣相乘的最小計算量及最優(yōu)計算順序。下面是該算法的語言實現(xiàn):
(1) 主要變量說明
n:矩陣數(shù)
seq[]:矩陣維數(shù)序列
cos[i][j]:二維數(shù)組,長度為n*n,其中元素cost[i][j]表示Ai+1*Ai+2**Aj+1的最優(yōu)的計算代價trace[][]:二維數(shù)組,長度為n*n,其中元素trace[i][j]表示Ai+1*Ai+2**Aj+1的最算對應的劃分位置,即k(2)函數(shù)cmmine N100 cost[N[N]
return cost[0][n-1];
【問題1】(8分)
根據(jù)以上說明和C代碼,填充C代碼中的空(1)~(4)。
【問題2】(4分)
根據(jù)以上說明和C代碼,該問題采用了(⑤)算法設計策略,時間復為(6)(用O符號表)。
【問題3】(3分)
考慮實例n=4,各個矩陣的維數(shù)為A1為15*5,A2為5*10,A3為10*20,A4為20*25,即維度序列為15,5,10,20和25。則根據(jù)上述C代碼得到的一個最優(yōu)計算順序為_(7)(用加括號方式表示計算順序),所需要的乘法運算次數(shù)為(8)。
答案解析與討論:
www.listenjay.com/st/5221926532.html第
5題: 閱讀下列說明和C++代碼。將應填入(n)處的字句寫在答題紙的對應欄內。
【說明】
在軟件系統(tǒng)中,通常不會給用戶提供取消、不確定或者錯誤操作的選擇,允許將系統(tǒng)恢復到原先的狀態(tài)?,F(xiàn)使用備忘錄(Memento)模式實現(xiàn)該要求,得到如圖5-1所示的類圖。Memcnto 包含了要被恢復的狀態(tài)。Originator創(chuàng)建并在Memento中存儲狀態(tài)。Caretaker負責從Memento中恢復狀態(tài)。
【C++代碼】
#include
#include
#include
using namespace std;
public:
void setState(string state)(this>sate-state;string get
StateO{fretumn state;}Memento saveStateToMemento0){
return (1)
void getStateFromMemento(MementoMemento){
state=(2)_
class CareTaker{
private:
vectormementoList;
pubilc:
viod(3){mementoL ist.push back(state)
(4)_;return mementoList(index);}
intmian( ){
Originator*originator=new Originator();
CareTaker*careTaker=new CareTaker();
originator->setState("State #1");
originator->setState("State #2");
careTaker->add(_(5)_);
originator->setState("State #3");
careTaker->add(( 6 ));
originator->setState("State #4");
cout <<"Current State:"<<"+"
originator->getStateFromMemento(careTaker->get(0);
cout<<"First saved State:"originator->getStateFromMemento(careTaker->get(1);
cout<<"second save State"<<"+"
答案解析與討論:
www.listenjay.com/st/5222028861.html第
6題: 試題六(共15分)
閱讀下列說明和Java代碼,將應填入(n)處的字句寫在答題紙的對應欄內。
【說明】
在軟件系統(tǒng)中,通常都會給用戶提供取消、不確定或者錯誤操作的選擇,允許將系統(tǒng)恢復到原先的狀態(tài)。現(xiàn)使用備忘錄(Memento)模式實現(xiàn)該要求,得到如圖6-1所示的類圖。Memento包含了要被恢復的狀態(tài)。Originator創(chuàng)建并在Memento中存儲狀態(tài)。Caretaker負責從Memento中恢復狀態(tài)。

【Uava代碼】
import java.util.*;
class Memento {
private String state;
public Memento(String state){this.state=state;}
public String getState(){return state;}
}
class Originator{
private String state;
public void setState(String state){this.state=state;}
public String getState(){ retum state;}
public Memento saveStateToMemento(){
Return (1)
}
public void getStateFromMemento(Memento Memento){
state =(2)
}
class CareTaker
Public(3)
mementoLstadd如aney
}
public (4)
return memensoLint get (imdat
}
}
class MementoPaneDems{
pubic static voiid main(Stringf]
Ohgiator aniginutor-te Origmrfy
CareThker careTukeznwCmiie)
aniginuntorseStte(State1#)
orginxtorsCSuat(State2#);
careThiket add_(5)
oiginatoseSated"(State 3")
careTaker add (6)_
originutor_setState(State#4)
(1) new Memento(state)
(2) Memento.getState()
(3) void add(Memento state)
(4) Memento get(int index)
(5) care Taker.add(originator.saveState ToMemento()
(6) care Taker.add(originator.saveState ToMemento()
答案解析與討論:
www.listenjay.com/st/5222116487.html