試題一
閱讀下列說明,回答問題1至問題4,將解答填入答題紙的對應欄內。
【說明】
某證券交易所為了方便提供證券交易服務,欲開發一證券交易平台,該平台的主要功能如下:
(1)開戶。根據客戶服務助理提交的開戶信息,進行開戶,並將客戶信息存入客戶記錄中,賬戶信息(余額等)存入賬戶記錄中;
(2)存款。客戶可以向其賬戶中存款,根據存款金額修改賬戶余額;
(3)取款。客戶可以從其賬戶中取款,根據取款金額修改賬戶余額;
(4)證券交易。客戶和經紀人均可以進行證券交易(客戶通過在線方式,經紀人通過電話),將交易信息存入交易記錄中;
(5)檢查交易。平台從交易記錄中讀取交易信息,將交易明細返回給客戶。
現采用結構化方法對該證券交易平台進行分析與設計,獲得如圖1-1所示的上下文數據流圖和圖1-2所示的0層數據流圖。
問題:1.1 (3分)
使用說明中的詞語,給出圖1-1中的實體E1-E3的名稱。
問題:1.2 (3分)
使用說明中的詞語,給出圖1-2中的數據存儲D1-D3的名稱。
問題:1.3 (4分)
根據說明和圖中的術語,補充圖1-2中缺失的數據流及其起點和終點。
問題:1.4 (5分)
實際的證券交易通常是在證券交易中心完成的,因此,該平台的“證券交易”功能需將交易信息傳遞給證券交易中心。針對這個功能需求,需要對圖1-1和圖1-2進行哪些修改,請用200字以內的文字加以說明。
答案
問題:1.1
E1:客戶服務助理,E2:客戶,E3:經紀人。
本題要求識別E1-E3具體為哪個外部實體,通讀試題說明,可以了解到適合充當外部實體的包括:客戶、客戶服務助理、經記人。具體的對應關系,可以通過將頂層圖與題目說明進行匹配得知。如:從圖中可看出E1會向交易平台發出數據流開戶信息;;而從試題說明根據客戶服務助理提交的開戶信息,進行開戶,並將客戶信息存入客戶記錄中,賬戶信息存入賬戶記錄中可以看出,E1對應是客戶服務助理。E2、E3同理可得。
問題:1.2
D1:客戶記錄,D2:賬戶記錄,D3:交易記錄。
本題要求識別存儲,解決這類問題,以圖的分析為主,配合說明給存儲命名,因為存儲相關的數據流一般展現了這個存儲中到底存了些什么信息,如從圖中可以看到D1中有客戶信息,而D2中有賬戶信息,題目說明中又有根據客戶服務助理提交的開戶信息,進行開戶,並將客戶信息存入客戶記錄中,賬戶信息存入賬戶記錄中。自然D1應為客戶記錄,D2應為賬戶記錄。同理,D3為交易記錄。
問題:1.3
數據流名稱:修改賬戶余額,起點:存款,終點:D2。
數據流名稱:修改賬戶余額,起點:取款,終點:D2。
數據流名稱:交易信息存入交易記錄,起點:證券交易,終點:D3。
缺失數據流1
名稱:修改賬戶余額,起點:存款,終點:D2。
理由:從試題說明客戶可以向其賬戶中存款,根據存款金額修改賬戶余額可以看出,這個功能有操作根據存款金額修改賬戶余額。據此可以了解到從該功能應有數據流存款至D2,而0層圖沒有。
缺失數據流2:
名稱:修改賬戶余額,起點:取款,終點:D2。
理由:從試題說明客戶可以從其賬戶中取款,根據取款金額修改賬戶余額可以看出,這個功能有操作根據取款金額修改賬戶余額。據此可以了解到從該功能應有數據流取款至D2,而0層圖沒有。
缺失數據流3
名稱:交易信息存入交易記錄,起點:證券交易,終點:D3。
理由:從試題說明客戶和經紀人均可以進行證券交易,將交易信息存入交易記錄中可以看出,這個功能有操作將交易信息存入交易記錄中。據此可以了解到從該功能應有數據流證券交易至D3,而0層圖沒有。
問題:1.4
增加外部實體證券交易中心,原來證券交易中的交易信息的數據流終點改為證券交易中心,數據流檢測交易中的起點改為證券交易中心。
本題強調實際的證券交易通常是在證券交易中心完成,這個證券交易中心屬於典型的外部實體,所以需要增加外部實體證券交易中心。由於該平台的證券交易功能需將交易信息傳遞給證券交易中心,因此將原來證券交易中的交易信息的數據流終點改為證券交易中心,數據流檢測交易中的起點改為證券交易中心。
試題四
閱讀下列說明和C代碼,回答問題1至問題3,將解答寫在答題紙的對應欄內。
【說明】
模式匹配是指給定主串t和子串s,在主串t中尋找子串s的過程,其中s稱為模式。如果匹配成功,返回s在t中的位置,否則返回-1 。
KMP算法用next數組對匹配過程進行了優化。KMP算法的偽代碼描述如下:
1.在串t和串s中,分別設比較的起始下標i=j=0。
2.如果串t和串s都還有字符,則循環執行下列操作:
(1)如果j=-l或者t[i]=s[j],則將i和j分別加1,繼續比較t和s的下一個字符;
(2)否則,將j向右滑動到next[j]的位置,即j =next[j]。
3.如果s中所有字符均已比較完畢,則返回匹配的起始位置(從1開始);否則返回-1.
其中,next數組根據子串s求解。求解next數組的代碼已由get_next函數給出。
【C代碼】
(1)常量和變量說明
t,s:長度為lt,ls的字符串
next:next數組,長度為ls
(2)C程序
#include <stdio.h>
#include <stdlib.h> #include <string.h>
/*求next[]的值*/
void get_next( int *next, char *s, int ls) { int i=0,j=-1; next[0]=-1;/*初始化next[0]*/
while(i < ls) /*還有字符*/ { if(j==-1 ll s[i]==s[j]) /*匹配*/ { j++; i++; if( s[i]==s[j]) next[i] = next[j]; else next[i] = j; } else j = next[j]; } } int kmp( int *next, char *t,char *s, int lt, int ls ) { Int i= 0,j =0 ; while (i < lt && (1) ) { if( j==-1 || (2) ) { i ++ ; j ++ ; } else (3) ; } if (j >= ls) return (4) ; else
return -1; }
問題:4.1 (8分)
根據題干說明,填充C代碼中的空(1)~(4).
問題:4.2 (2分)
根據題干說明和C代碼,分析出kmp算法的時間復雜度為(5)(主串和子串的長度分別為lt和ls,用O符號表示)。
問題:4.3 (5分)
根據C代碼,字符串“BBABBCAC”的next數組元素值為(6)(直接寫素值,之間用逗號隔開)。若主串為“AABBCBBABBCACCD”,
子串為“BBABBCAC”,則函數Kmp的返回值是(7)。
答案
(1):j<ls (2):t[i]==s[j]; (3):get_next(next, s, ls), j=next[j] (4):i+1-ls (5):O(ls+lt) (6):[-1,-1,1,-1,-1,2,0,0] (7):6
試題五
閱讀下列說明和java代碼,將應填入 (n) 處的字句寫在答題紙的對應欄內。
【說明】
某發票(lnvoice)由抬頭(Head)部分、正文部分和腳注(Foot)部分構成。現采用裝飾(Decorator)模式實現打印發票的功能,得到如圖6-1所示的類圖。
問題:6.1 【java代碼】
class invoice { public void printInvoice() { System.out.println ( "This is the content of the invoice!"); } } class Decorator extends Invoice { protected Invoice ticket; public Decorator(lnvoice t) { ticket = t; } public void printInvoice() { if(ticket != null) (1) ; } } class HeadDecorator extends Decorator { public HeadDecorator(lnvoice t) { super(t); } public void printInvoice () { System.out.println( "This is the header of the invoice! "); (2) ; } } class FootDecorator extends Decorator { public FootDecorator(Invoice t) { super(t); } public void printlnvoice() { ( 3) ; System.out.println( "This is the footnote of the invoice! "); } } Class test { public static void main(String[] args) { Invoice t =new Invioce(); Invoice ticket; ticket= (4) ; ticket.printInvoice(); System.out.println(“------------------“); ticket= (5) ; ticket.printInvoice(); } }
程序的輸出結果為:
This is the header of the invoice!
This is the content of the invoice!
This is the footnote of the invoice!
----------------------------
This is the header of the invoice!
This is the footnote of the invoice!
答案
(1)ticket.printInvoice() (2)super.printInvoice() (3)super.printInvoice() (4)new HeadDecorator(new FootDecorator(t)) (5)new HeadDecorator(new FootDecorator(null))