PP-DSE 資訊及通訊科技 請在此貼上電腦條碼 卷二 (D) 香港考試及評核局 香港中學文憑考試 考生編號 Pascal 練習卷資訊及通訊科技 採用的程式編寫語言 ( 請選一項 ) C Visual Basic Java 試卷二 (D) 軟件開發 試題答題簿 本試卷必須用中文作答 一小時三十分完卷 考生須知 ( 一 ) 宣布開考後 考生須首先在第 1 頁之適當位置填寫考生編號 並在第 1 3 5 及 7 頁之適當位置貼上電腦條碼 ( 二 ) 在合適的方格選取所採用的程式編寫語言 若選取超過一個方格或不選取任何方格 將不獲給分 ( 三 ) 本試卷全部試題均須回答答案須寫在本試題答題簿中預留的空位內不可在各頁邊界以外位置書寫 ( 四 ) 如有需要 可要求派發補充答題紙每一紙張均須填寫考生編號 填畫試題編號方格 貼上電腦條碼 並用繩縛於簿內 ( 五 ) 試場主任宣布停筆後 考生不會獲得額外時間貼上電腦條碼及填畫試題編號方格 香港考試及評核局保留版權 Hong Kong Examinations and Assessment Authority All Rights Reserved 2012 PP-DSE-ICT 2D 1 1 *A200C02D*
本試卷全部試題均須回答 1. 下列算法處理整數陣列 M 其索引由 1 至 n 步 1: 初始化 M 每個元素的值為其索引 步 2: p 2 步 3: 當 p 2 n 執行步 4 至 7 步 4: q (n/p) 的整數部分 步 5: 設 i 由 2 至 q 執行步 6 步 6: M[i * p] 0 步 7: p p + 1 假設 n = 16M 的內容經步 1 初始化後如下所示 M[1] M[2] M[3] M[4] M[5] M[6] M[7] M[8] 1 2 3 4 5 6 7 8 M[9] M[10] M[11] M[12] M[13] M[14] M[15] M[16] 9 10 11 12 13 14 15 16 (a) (i) 利用循環寫出步 1 的偽代碼 (ii) 填上步 3 的循環首兩遍迭代後 M 的內容 第一遍 M[1] M[2] M[3] M[4] M[5] M[6] M[7] M[8] M[9] M[10] M[11] M[12] M[13] M[14] M[15] M[16] 第二遍 M[1] M[2] M[3] M[4] M[5] M[6] M[7] M[8] M[9] M[10] M[11] M[12] M[13] M[14] M[15] M[16] (iii) 步 3 的循環執行了多少次? (iv) 按序列出當步 3 的循環執行時所有 q 的值 (v) 細看在 (a)(ii) M 值的樣式 這個算法有什麼用途? (10 分 ) PP-DSE-ICT 2D 2 2
請在此貼上電腦條碼 (b) 假設步 5 改動為 設 i 由 p 至 q 執行步 6 這個改動對此算法有何影響? 試簡略說明 (2 分 ) (c) 此算法透過一個程式編譯成為子程式庫內的一個子程式 某主程式以這個子程式來編寫 (i) 代碼生成器 偵錯程式 連接程式和載入程式這四類程式中 哪一類程式把這個主程式的可執行檔案放進主記憶體內執行? (ii) 當執行這個主程式時 這個子程式會與主程式的可執行檔案連接 試寫出此類連接方法的名稱 並舉出其中一個優點 (3 分 ) PP-DSE-ICT 2D 3 3 續後頁
2. 志明編寫了一個程式 協助機場航空交通管制員記錄將要降落的航班 降落的次序是先到先處理 每一航班以其航班編號來識別 例如 A1 志明使用一個陣列 F 來儲存最多六個航班編號 (a) F[i] 儲存第 i 班要降落航班的航班編號 即 F[1] 儲存下一班要降落航班的航班編號 假設最初有三班航班 C3 A1 和 B2 要降落 如下所示 : F[1] F[2] F[3] F[4] F[5] F[6] 航班編號 C3 A1 B2 (i) (1) 航班 C3 已降落 而航班 Z6 加入 等候降落 試完成下列 F 航班編號 F[1] F[2] F[3] F[4] F[5] F[6] A1 (2) 然後 航班 A1 已降落 而兩班航班 S19 和 T20 隨後依次加入 等候降落 試完成下列 F 航班編號 F[1] F[2] F[3] F[4] F[5] F[6] (ii) 雖然以上對 F 的操控簡單直接 但它不是一個好算法 為什麼? 試簡略說明 (3 分 ) PP-DSE-ICT 2D 4 4
請在此貼上電腦條碼 (b) 志明有另一選擇 他可利用以下的數據結構操控降落的次序 整數變量 X 和 Y 是用來儲存 F 的陣列索引 F[1] F[2] F[3] F[4] F[5] F[6] 航班編號 C3 A1 B2 X = 1 Y = 3 當一航班降落後 F[X] 不會再被採用之後 X 的值便增加 1 當一航班加入等待降落 Y 的值便增加 1 而其航班編號會賦值至 F[Y] (i) X 和 Y 在實現這個數據結構時有什麼功能? (ii) 假設初始時航班 C3 A1 和 B2 依次等待降落 而 X = 1 和 Y = 3 (1) 航班 C3 已降落 而航班 Z6 加入 等候降落 試完成下列 F X 和 Y 航班編號 F[1] F[2] F[3] F[4] F[5] F[6] C3 X = 2 Y = 2 (2) 然後 航班 A1 已降落 而兩班航班 S19 和 T20 隨後依次加入 等候降落 試完成下列 F X 和 Y 航班編號 F[1] F[2] F[3] F[4] F[5] F[6] C3 X = 2 Y = 2 (iii) 要確定是否所有等候降落的航班都已降落 須要檢查哪一項條件? (iv) 若在 (b)(ii)(2) 的航班 T20 降落後 另一航班 E5 加入 等候降落 這樣會出現哪類錯誤? (8 分 ) PP-DSE-ICT 2D 5 5 續後頁
(c) 志明要開發一些新系統取代機場現有的系統 完成收集用戶要求 ( 任務 0) 後便可開始任務 1 2 和 3 任務 完成任務所須的週數 描述 任務 0 5 收集用戶要求 任務 1 20 編寫 測試和偵錯供航空交通管制員使用的 ATC 系統 任務 2 15 當程式編寫員開始編寫 ATC 系統 便可在接機大堂安裝 FID 系統顯示屏幕 任務 3 10 完成 ATC 系統和安裝顯示屏幕後 便可編寫 測試和偵錯 FID 系統的程式 (i) 試為志明完成以下的甘特圖 週數任務 5 10 15 20 25 30 35 40 45 50 任務 0 任務 1 任務 2 任務 3 (ii) 志明應使用哪種系統轉換策略? 試簡略說明 (4 分 ) PP-DSE-ICT 2D 6 6
請在此貼上電腦條碼 作答第 3 題時 考生不得加入新的變量 否則不獲給分 3. 某程式模擬在唱片播放機內的選擇曲目此播放機載入唱片後會讀取曲目的總數 而預設的曲目編號是 1 播放機按鈕的作用如下展示 向後 向前 按下此按鈕會播放上一首曲目 按下此按鈕會播放下一首曲目 考生需使用下列變量來編寫一些子程式 模擬選擇曲目 變量 TrackNum 描述 儲存當前曲目編號整數變量 TrackTotal 儲存曲目總數整數變量 (a) 假設初始的曲目編號是 1 而曲目總數是 13 編寫子程式或類別 LoadInit 來初始化 TrackNum 和 TrackTotal 並以按址調用方式返回這兩個值 (3 分 ) PP-DSE-ICT 2D 7 7 續後頁
(b) 編寫函數 BackTrack 返回按下 向後 按鈕後的曲目編號 若當前曲目編號是 1 則其值保持不變 TrackNum 需以按值調用方式傳遞至此函數 (3 分 ) (c) 編寫函數 NextTrack 返回按下 向前 按鈕後的曲目編號 若下一首曲目編號超過曲目總數 則將曲目編號設定為 1 TrackNum 和 TrackTotal 需以按值調用方式傳遞至此函數 (2 分 ) (d) 模擬一棵新的 隨意選擇 按鈕 使按下此按鈕後便會從曲目編號 1 至 TrackTotal 當中隨機選擇一首曲目 已知函數 myrand 無需變元而可被調用 並返回一隨機數 r 而 0 r < 1 試編寫函數 shuffle 模擬 隨意選擇 按鈕 而 TrackTotal 需以按值調用方式傳遞至 shuffle PP-DSE-ICT 2D 8 8 (2 分 )
(e) 測試 (b) 內的函數是需要一個測試計劃 假設曲目總數是 13 提議兩種不同情境的測試值及其預期結果 (1) 測試值 : 預期結果 : (2) 測試值 : 預期結果 : (2 分 ) (f) 假設這個程式以物件導向程式語言編寫 下列的類別圖代表按鈕物件 Button ButtonName Private ButtonPressed() Public ButtonCheck() (i) 這個類別有多少個方法? (ii) 寫出這個類別的屬性 (iii) 這個類別的名稱是什麼? (3 分 ) PP-DSE-ICT 2D 9 9 續後頁
4. 某煤氣燃料公司使用文字檔 gas.txt 來儲存客戶的煤氣錶累計讀數 每位客戶的記錄有兩個文字欄 :accnum 和 accreading accnum 儲存客戶號碼 而 accreading 儲存對應的煤氣錶累計讀數 下圖展示的例子是一個有四筆記錄的 gas.txt accnum accreading 1 2 3 4 5 0 1 5 2 7 2 9 6 9 7 4 0 3 4 4 6 7 8 9 0 0 9 9 9 8 9 0 1 3 3 2 0 0 2 6 accreading 是一個由四個字符組成的字串 其數值範圍是從 0000 至 9999 當 accreading 的值達 9999 其隨後的值為 0000 子程式 usage 是用來計算煤氣用量本月份的煤氣錶讀數 curreading 會傳遞至此子程式來計算煤氣用量 並把它賦值至全程變量 unitsconsumed [Pascal 版本 ] 行號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 內容 var unitsconsumed : integer; procedure usage(clientnum : string; curreading : integer); var infile : text; clientfound : Boolean; ClientST accnum accreading : string; accvalue : integer; begin assign(infile 'gas.txt'); reset(infile); clientfound := false; while not clientfound do begin readln(infile ClientST); accnum := copy(clientst 1 6); accreading := copy(clientst 7 4); if clientnum = accnum then begin (a)(v) 部 unitsconsumed := curreading accvalue; clientfound := true; end; end; end; (c) 部 PP-DSE-ICT 2D 10 10
[C 版本 ] 行號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 內容 int unitsconsumed; void usage(char clientnum[] int curreading) { FILE *infile; int clientfound; char accnum[7] accreading[5]; int accvalue; } [Visual Basic 版本 ] 行號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 infile = fopen("gas.txt" "r"); clientfound = 0; while (!clientfound) { fscanf(infile "%6s%4s" accnum accreading); if (strcmp(clientnum accnum) == 0) { (a)(v) 部 unitsconsumed = curreading accvalue; clientfound = 1; } } (c) 部 內容 Dim unitsconsumed As Integer Sub usage(byval clientnum As String ByVal curreading As Integer) Dim infile As IO.StreamReader Dim clientfound As Boolean Dim ClientST accnum accreading As String Dim accvalue As Integer infile = IO.File.OpenText("gas.txt") ClientST = infile.readline() clientfound = False while Not clientfound accnum = ClientST.SubString(0 6) accreading = ClientST.SubString(6 4) If clientnum = accnum Then (a)(v) 部 unitsconsumed = curreading accvalue clientfound = True End If ClientST = infile.readline() End While (c) 部 End Sub PP-DSE-ICT 2D 11 11 續後頁
[Java 版本 ] 行號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 內容 static int unitsconsumed; static void usage(string clientnum int curreading) throws IOException { boolean clientfound; String ClientST accnum accreading; int accvalue; } BufferedReader infile = new BufferedReader(new FileReader("gas.txt")); ClientST = infile.readline(); clientfound = false; while (!clientfound) { accnum = ClientST.substring(0 6); accreading = ClientST.substring(6 10); if (clientnum.compareto(accnum) == 0) { (a)(v) 部 unitsconsumed = curreading accvalue; clientfound = true; } ClientST = infile.readline(); } (c) 部 (a) (i) 已知 accnum 的最後一個數位是檢查數位 這個檢查數位的功能是什麼? (ii) 就作用域 (scope) 而言 在行號 3 至 6 所說明的變量是哪種變量? (iii) clientnum 在計算煤氣用量時有什麼作用? (iv) clientfound 在計算煤氣用量時有什麼作用? (v) 在行號 15 要對 accreading 進行什麼操作? (5 分 ) PP-DSE-ICT 2D 12 12
(b) 客戶號碼為 678900 的客戶在本月的煤氣錶讀數是 0012 (i) 提出一項可由行號 16 內的語句引致的問題 (ii) 寫出在行號 16 後插入的一句 IF 語句來解決此問題 (3 分 ) (c) 寫出行號 21 的程式語句作正確的檔案處理操作 (d) while 循環可能會變成一個無限循環 (i) 為什麼? (ii) 重寫 while 循環的第一行 以避免這個問題出現 (1 分 ) (3 分 ) (e) 煤氣燃料公司決定以一個新系統取代舊系統 由以下三名成員組成的團隊負責開發這個新系統 : 項目經理 (PM) 系統分析員 (SA) 程式編寫員 (P) 配對下列團隊成員的職責第一項是例子 主要職責 團隊成員 分配資源和角色予各開發團隊成員 PM 收集用戶要求和撰寫用戶要求規格 制訂開發計劃內重要的里程碑 編寫程式及進行測試 (3 分 ) 試卷完 PP-DSE-ICT 2D 13 13
請勿在此頁書寫寫於此頁的答案 PP-DSE-ICT 2D 14 14
請勿在此頁書寫寫於此頁的答案 PP-DSE-ICT 2D 15 15
請勿在此頁書寫寫於此頁的答案 PP-DSE-ICT 2D 16 16