注意 : 請務必填寫姓名 : 1. 以下題目應全部作答 應考編號 : 2. 科目總分為 100 分 3. 作答時不須抄題目, 但請標明題號, 並請用藍 ( 黑 ) 色原子筆橫向書寫 題目 : 一 ( 每階段 4 分, 共 20 分 ) 軟體工程是以工程的手法開發軟體系統, 其中需求工程是風險最高 也是最困難的步驟, 其中區分需求擷取 需求分析建模 建立需求規格 需求驗證與確認 需求變更演化管理五個階段, 請簡述這五個階段的活動內容 二 ( 每項 3 分, 共 項, 計 30 分 ) 以下 C# 程式是簡化的門禁警示系統, 其 UML 設計圖如下所示 (1) 請完成 UML 設計圖 關係線 (2) 請分別寫出執行程式 的輸出 (3) 請說明程式中 IMonitor 和 Monitor 的關係, 以及 Monitor 的規範 (4) 請說明程式中,static 屬性 (attribute) 和 static 方法 (method) 的用 第 1 頁, 共 5 頁
途 public class Alert { public Alert() { warning = 0; public String sendalert(int code) { warning = code; if (code == 2) { Console.Write("Urgent! "); return "Urgent!"; else if (code == 1) { Console.Write("HELP! "); return "HELP!"; else { Console.Write("OK! "); return "OK"; public bool wasalertsend() { if (warning == 0) return false; return true; private int warning; public class Door { public Door() {status ="CLOSE"; public String Status { get { return status; set { status = value; private String status; public interface IMonitor { int execute(); public class Monitor:IMonitor{ public Monitor(Door d) {door = d; public int execute() { String s = door.status; if (s =="BROKEN") return 2; else if (s =="OPEN") return 1; else return 0; private Door door; public class Server { public Server(Alert a) { alert = a; public void monitor() { int code = doormonitor.execute(); if (code > 0) alert.sendalert(code); public void setmonitor(imonitor dm){ doormonitor = dm; private IMonitor doormonitor; private Alert alert; public class ServerApp { private static Door door; private static Alert alert; private static IMonitor monitor; private static Server server; private static void testalert(string msg) { door = new Door(); alert = new Alert(); monitor = new Monitor(door); Server server = new Server(alert); server.setmonitor(monitor); door.status = msg; server.monitor(); if (!alert.wasalertsend()) Console.Write("OK! "); public static void test01() { alert = new Alert(); Console.WriteLine(alert.sendAlert(2)); public static void test02() { door = new Door(); door.status = "OPEN"; Console.WriteLine(door.Status); public static void test03() { Door door = new Door(); Monitor monitor = new Monitor(door); door.status = "OPEN"; Console.WriteLine(monitor.execute()); public static void test04() { testalert("open"); testalert("close"); testalert("broken"); 第 2 頁, 共 5 頁
Server - status + monitor() + setmonitor(imonitor) <<interface>> IMonitor + execute() Alert - warning + sendalert(int) + wasalertsend() Monitor + execute() Door - status + getstatus() + setstatus(string) String 三 有一家公司須要建置資料庫, 管理生產商品所需零件的供應狀況 各零件的供應廠商只會有一家, 分別記錄廠商編號 (sno), 以及地區 (sregion) 供應的零件則分為不同的編號 (pno), 尺寸 (psize), 售價 (pprice), 及數量 (qty) 其資料庫表格如下 : Supplier (sno, sregion) Part (pno, psize, pprice, sno, qty) 後來管理階層決定, 每一種零件的供應商可以有多家, 每一家供應 (Supply) 的零件數量是不一, 尺寸及售價需相同, 各自供應地區不同, 於是資料庫表格必須進行修改 ( 共 30 分 ): ( 一 ) 請問這個資料庫表格要如何修改 ( 可增加表格並調整欄位 ), 才能符合第三正規化 (Third Normal Form, 3NF), 第 3 頁, 共 5 頁
請注意需全列所有修改後的資料庫表格 (5 分 ) ( 二 ) 請以修改後的資料庫寫出 SQL 指令, 列出所有零件供應 關係的完整資訊, 也就是依照零件編號排序顯示下列欄位 : 零件編號, 尺寸, 售價, 供應廠商編號, 及數量 (5 分 ) ( 三 ) 請以修改後的資料庫寫出 SQL 指令, 分別列出各零件不 分地區的總供應數量 [ 提示 : 零件, 總供應數量 ] (10 分 ) ( 四 ) 承上題, 如果要 將零件 A 的總數量限為 1000, 可能 需考慮什麼問題? (10 分 ) 四 關於資料結構與演算法, 請回答以下問題 ( 共 20 分 ): ( 一 ) 請比較 Stack 與 Queue 兩種資料結構的差異 (4 分 ) ( 二 ) 請舉例說明 Stack 與 Queue 兩種結構分別適合用於什麼情形 (4 分 ) ( 三 ) 為了記錄每個人與人之間的好友關係, 可以使用 graph 記錄 一個節點 (node) 代表一個人, 而連接節點與節點之間的邊 (edge) 則代表人與人之間的關係 請以廣度搜尋法 (Breadth-First Search, BFS) 搜尋以下的 graph, 尋訪結果順序為何? (6 分 ) 第 4 頁, 共 5 頁
A B D F C E G ( 四 ) 承上題, 請寫出深度搜尋法 (Depth-First Search, DFS) 演算法, 找出某人能透過好友關係連結到的所有人 (6 分 ) 第 5 頁, 共 5 頁