軟件工程知識技能水平:
1.基本數據結構與算法知識,有基本的代碼分析能力;
2.面向對象程序設計,並且掌握一門具體的編程語言,有基本的編碼能力;
3.掌握設計模式、UML圖,加深對於面向對象的理解,有基本的設計能力;
一、 選擇題(30分)
1. 需求分析最終結果是產生( B )。
A. 項目開發計划 B. 需求規格說明書
C. 設計說明書 D. 可行性分析報告
[答案與解析]本題摘自百度文庫,主要考查對於需求分析的理解。
2.為了提高軟件的可維護性,在編碼階段應注意( D )
A.保存測試用例和數據 B.提高模塊的獨立性
C.文檔的副作用 D.養成好的程序設計風格
[答案與解析]本題摘自百度文庫,主要考查對於編碼規范的理解。
3.Kristie想獲得能支持她的決定的證據。她目前打算重新安排辦公室的空間,以使得她組內成員的工作環境更加舒適。她認為除了應該仔細考慮改變的客觀方面以外,為她工作的人的想法也很重要。Kristie組里的員工認為她是一個好的傾聽者,當他們有問題的時候,他們經常會詢問她的意見。Kristie的工作方式屬於 (D)
A.理性的外向的
B.理性的內向的
C.感性的外向的
D.感性的內向的
[答案與解析]本題摘自課堂習題,先做決定再找證據,所以是感性的。
4.設n是描述問題規模的非負整數,下列程序段的時間復雜度是(B)
x=0;
While(n>=(x+1)*(x+1))
x=x+1;
A.O(logn) B.O(n1/2 ) C. O(n ) O( n2)
[答案與解析]本題摘自408真題。
5.選擇一個排序算法時,除算法 的時空效率之外,還需要考慮(D)
(1)數據的規模(2)數據的存儲方式(3)算法的穩定性(4)數據的初始狀態
A.(3) B.(1)(2) C.(2)(3)(4) D.以上全部
[答案與解析]本題摘自408真題。
6. 軟件項目規划的第一步是(D)
A.確定項目預算 B.選擇團隊的組織模型 C.確定項目的約束 D.建立項目的目標和范圍
[答案與解析]本題摘自清華06年期末考試。
7.下列關於設計模式的說法錯誤的是(A)
A.適配器模式⽤我們需要的接口對可以修改的類進⾏包裝。
B.策略模式將算法的選擇和算法的實現分離
C.橋接模式將抽象部分和實現部分分離,使它們都可以獨⽴地變化
D. 模板⽅法和⼯⼚⽅法都是將業務划分抽象層和具體層
[答案與解析]本題為原創,主要考查設計模式的理解。
8.下列哪個階段不屬於軟件生存周期的三大階段(C )。
A、計划階段 B、開發階段
C、編碼階段 D、維護階段
[答案與解析]本題摘自百度文庫,主要考查軟件生存周期。
9、瀑布模型把軟件生命周期划分為八個階段:問題的定義、可行性研究、軟件需求分析、系統總體設計、詳細設計、編碼、測試和運行、維護。八個階段又可歸納為三個大的階段:計划階段、開發階段和( C)。
A、詳細計划 B、可行性分析
C、 運行階段 D、 測試與排錯
[答案與解析]本題摘自百度文庫,主要考查對於瀑布模型的理解。
10、軟件工程方法學的目的是:使軟件生產規范化和工程化,而軟件工程方法得以實施的主要保證是(C )
A、 硬件環境 B、軟件開發的環境
C、軟件開發工具和軟件開發的環境 D、 開發人員的素質
[答案與解析]本題摘自百度文庫,主要考查對於軟件工程的理解。
二、 簡答題(25分)
1.名詞解釋(15分)
(1) 多態:
(2) 重構:
(3) 模塊化:
(4) 可修改性:
(5) 實現視圖:
[答案與解析]
本題主要考查對於軟件工程重要概念的理解與掌握。
多態:在面向對象語言中,接口的多種不同的實現方式即為多態;
重構:通過調整程序代碼改善軟件的質量、性能,使其程序的設計模式和架構更趨合理,提高軟件的擴展性和維護性;
模塊化:是指解決一個復雜問題時自頂向下逐層把系統划分成若干模塊的過程,有多種屬性,分別反映其內部特性;
可修改性:可修改性描述了程序能夠被正確修改的難易程度;
實現視圖:也稱開發視圖,它描述了在開發環境中軟件的靜態結構。
2.一個系統能完全做到內部無耦合嗎?請回答並給出你的理由。(5分)
[答案與解析]
本題主要考查對於耦合性的理解。
在軟件工程中,模塊之間是存在依賴關系就必然存在耦合,理論上說絕對的零耦合是做不到的,但可以通過一些現有的方法將耦合降至最低
3.面向對象的方法可以適用開發任何系統么?面向對象方法的優勢是什么? (5分)
[答案與解析]
本題主要考查對於面向對象方法的理解。
不適用大系統的開發;適用於事物多,業務邏輯復雜,數據量大的應用系統和網站
優勢:a、分析、設計中的對象和軟件中的對象的一致性
b、實現軟件復用,簡化程序設計
c、系統易於維護
d、縮短開發周期
三、 設計分析題(45分)
1. 以下語句描述某個程序中的模塊。對於每個模塊,請確定該模塊是否有高內聚特性,並簡要給出理由。(10分)
a. 模塊”InventorySearchByID”搜索庫存中的記錄,以查看是否與指定范圍的ID號匹配,返回包含任何匹配記錄的數據結構。
b. 模塊“ ProcessPurchase”從庫存中刪除購買的產品,為客戶打印收據並更新日志。
c. 模塊“ FindSet”處理用戶的請求,從清單中確定與請求匹配的項目集,並將項目格式化為可顯示給客戶的列表。
[答案與解析]
本題主要考查對於耦合性的理解。本題選自《軟件工程理論與實踐》課后習題
a. 模塊”InventorySearchByID”具有很高的內聚性;它僅執行一種功能(搜索)。
b. 可以預期模塊“ ProcessPurchase”具有相對較低的內聚性,因為它涉及非常不同的功能:打印收據供用戶使用在邏輯上與更新數據存儲完全不同。
c. 可以期望模塊“ FindSet”具有相對較低的內聚性,因為它調用了非常不同的功能:解析輸入,對數據進行搜索以及輸出格式化。
2. 假設有一個“加油站控制系統”(GSCS),該系統將用於幫助管理美式汽油或加油站。我們假設加油站主要提供兩種服務:
•有一家小商店可存放汽車零件。商店內至少有一個收銀機,該收銀機由加油站的一名出納員操作。
•有許多加油站,客戶可以在這些處停放汽車,與系統交互以通過信用卡付款,然后再抽加油。或者,客戶可以進入商店並直接向收銀員付款,以現金或信用卡方式支付其汽油費。
因此,GSCS有兩個主要的用戶類別。第一類是收銀員,他使用GSCS記錄客戶購買汽車零件的情況。 GSCS必須允許收銀員輸入所購買零件的類型和數量,然后計算總購買價格並處理付款。第二類是購買汽油的客戶。這些客戶指定購買的天然氣的數量和類型,在加油處支付或向收銀員付款,然后自行加油。
該系統還必須與其他自動化系統進行交互以執行其任務。例如,為了接受信用卡付款,GSCS必須與信用卡公司維護的系統對接。信用卡系統負責檢查客戶的帳戶是否信譽良好並可以容納購買金額,並負責從客戶的帳戶中扣款並最終向加油站付款。這些外部系統的操作超出了GSCS的范圍,但GSCS需要知道外部系統將如何傳達其任務是否操作完成。
(1)請畫出加油站控制系統的用例圖。(10分)
[答案與解析]
本題主要考查對於UML圖的理解與掌握。本題選自《軟件工程理論與實踐》課后習題
(2)請畫出加油站控制系統的類圖。(10分)
(3)在以下來自GSCS的程序片段中,使用以下選擇,標識出與good programming style 不一致的沖突。 (8分)
(a)普遍適用性
(b)高效率
(c)格式化
(d)文檔說明
(e)沒有違反
片段1:
void PrintPartFile(){
/* Open the parts.dat file. Print each line to standard output. */
/* Close the file. */
ifstream PartFile (“parts.dat”);
char line[100];
while (PartFile.getline(line,100))
cout << line << “\n”;
PartFile.close();
}
(a),使用此函數只能讀取和打印一個文件。 它可以更有普適性。
片段2:
int ValidateParts (PartList &parts, PartList &master){
/* Validate and count the parts in the part list (parts). */
/* If a part in the list (parts) does not exist in the master list, */
/* return -1. */
/* If all parts in the list (parts) exist in the master list, */
/* return the sum of the quantities of each part in the list (parts). */
int total = 0;
for (int i=0; i < parts.getcount(); i++)
if (!master.Exists(parts[i])) return -1;
for (int j=0; j < parts.getcount(); j++)
total += parts[i].getquantity();
return total;
}
(b)可以將兩個循環組合在一起以使此代碼更高效。
(4)請用你熟悉的語言編寫通用的打印函數,所編寫的函數應滿足上述good programming style .(7分)
void Print(istream &is, ostream &os){
……
}
[答案與解析]
本題主要考查對於編程規范的掌握。
void Print(istream &is, ostream &os){
/* Print each line of the input stream (is) to the output stream (os). */
char line[MAXLINE];
while (is.getline(line,MAXLINE))
os << line << “\n”;
}