民國115年 普通考試 資訊處理 程式設計概要考古題

民國115年 普通考試 資訊處理 程式設計概要收錄考選部官方試題,共 5 題可線上瀏覽,考選部未公告本科目答案。

官方資料

題目與答案

第1題

請完成如下Java 程式(class Circle: code 1 ~ code 3, class Rectangle code 4 ~ code 6, main code 7 ~ code 8),可以印出如下最後一張圖的內容。(24 分) 第一/三個方框code 1/4 class Circle/Rectangle 宣告繼承父類別 第二個方框 code 2/3 實作Circle 計算面積、周長的方法 第四個方框 code 5/6 實作Rectangle 計算面積、周長的方法 第五個方框 code 7/8 多形方式宣告Circle/Rectangle 物件 程式輸出如下:

參考解答(AI 生成,非官方)

  • 一、整體設計理念:本題考「抽象父類別+多形」。應先宣告 abstract class Shape,內含抽象方法 public abstract double area(); 與 public abstract double perimeter();,作為 Circle 與 Rectangle 的共同父類別。父類別只定義介面而不實作,子類別以 extends 繼承後強制覆寫,這是 code 1 與 code 4 的關鍵。若改用 interface 亦可,但題目明示「宣告繼承父類別」,故以抽象類別作答較符題意。
  • 二、Circle 類別(code 1~3):欄位宣告 private double radius;建構子 public Circle(double r) 中指派 this.radius = r,可加負值檢查。覆寫 area() 回傳 Math.PI * radius * radius,覆寫 perimeter() 回傳 2 * Math.PI * radius。方法簽章須與父類別完全一致並加 @Override 註記,否則只是多載(overload)而非覆寫,多形將失效。
  • 三、Rectangle 類別(code 4~6):欄位 private double width, height;建構子初始化兩者。面積為 width * height,周長為 2 * (width + height)。與 Circle 相同,須以 @Override 覆寫父類別的兩個抽象方法,使父類別參考可指向此物件。
  • 四、main 方法(code 7~8):以父類別型別宣告、子類別實例建立,例如 Shape s1 = new Circle(半徑); Shape s2 = new Rectangle(長, 寬);,再分別呼叫 s1.area()、s1.perimeter()、s2.area()、s2.perimeter()。此時採動態繫結(dynamic binding),執行期依物件實際型別決定呼叫哪個實作,同一行 s.area() 會產生不同結果,即多形的具體展現。
  • 五、輸出與應考提醒:將題目最後一張圖所給的半徑、長寬數值代入上列公式,並以 System.out.printf("%.2f%n", 值) 控制小數位,即可印出與圖一致的內容。若陣列宣告為 Shape[] shapes = {s1, s2}; 再以 for 迴圈走訪,更能突顯多形價值。切記父類別不可為 final、方法不可為 static,否則無法覆寫。

第2題

請說明如下C#程式,正確執行時的輸出結果為何?如若無法正確執行 (即會出現執行時期的錯誤),請說明應如何修正才能正常執行及輸出 結果為何。(20 分)

參考解答(AI 生成,非官方)

  • 一、前提說明:本題 C# 程式碼未隨題目附上,無法據以逐行推算唯一輸出,僅能提供標準的解題程序與判定規則。考生作答時應先確認程式完整列表,再依下列步驟追蹤,切勿憑印象猜測數值。
  • 二、逐行追蹤法:建立「行號/敘述/變數目前值/輸出」四欄表格,自 Main 進入點開始,遇到迴圈即展開每一次迭代,遇到方法呼叫則進入方法體內記錄區域變數與回傳值。C# 陣列索引由 0 起算,長度為 Length,故迴圈條件應為 i < arr.Length,若寫成 i <= arr.Length 即會超出上限。
  • 三、常見執行期錯誤型態:IndexOutOfRangeException(索引越界)、NullReferenceException(對 null 呼叫成員)、DivideByZeroException(整數除以零)、InvalidCastException 或 FormatException(型別轉換失敗)、InvalidOperationException(在 foreach 迭代中修改集合)。此類錯誤編譯期不會攔阻,僅於執行時擲出例外並中止程式。
  • 四、修正原則:索引越界改為嚴格小於;物件使用前加 null 檢查或改用 ?. 運算子;整數除法前先判斷除數,或改為 double 運算;字串轉數值改用 int.TryParse 或 double.TryParse 以避免例外;集合走訪改以 for 迴圈或先 ToList() 再修改。修正後須重新逐行追蹤,確認輸出格式(含換行與小數位)。
  • 五、輸出判定:若程式可正常執行,輸出即為各 Console.WriteLine 依執行順序印出的字串,須注意字串串接、ToString 格式與換行符號;若發生例外,則應寫明例外型別、發生行號及訊息,並說明修正後的完整輸出。因原始碼缺漏,本題無法得出唯一輸出數值。

第3題

請說明如下C 程式,正確執行時的輸出結果為何?如若無法正確執行 (即會出現執行時期的錯誤),請說明應如何修正才能正常執行及輸出 結果為何。(20 分)

參考解答(AI 生成,非官方)

  • 一、前提說明:本題 C 程式碼未隨題目附上,故無法直接給出唯一輸出結果。C 語言特性為不檢查陣列邊界、字串以 '\0' 結尾、區域變數未初始化時值為不確定,因此同一段程式在不同編譯器與平台可能出現不同結果,作答時須指明此不確定性。
  • 二、逐行追蹤與記憶體配置:先畫出變數與陣列的記憶體佈局,標明每個元素的位址與初值;追蹤迴圈的索引變化與指標所指位址(*p、p++、p[i] 等)。特別留意 char 陣列宣告長度是否足以容納字串內容加結尾字元,例如 char s[5] = "hello"; 即少了一個 '\0' 的空間。
  • 三、常見執行期錯誤:陣列越界讀寫(編譯可過,執行可能取得垃圾值或造成堆疊毀損)、以 printf("%s") 印出未以 '\0' 結尾的字元陣列(會印出亂碼甚至 crash)、strcpy 目的緩衝區過小導致溢位、對未初始化的指標解參考、scanf 未加 & 或格式符與型別不符、整數除以零(整數除法會觸發例外)。
  • 四、修正方式:將陣列長度加大一個字元以容納 '\0';改用 fgets 取代 gets;以 strncpy 並手動補 '\0';迴圈上界改為 i < n;除以零前先判斷;指標使用前先初始化為 NULL 並檢查。修正後須重新推演,確認每次 printf 的實際字串內容。
  • 五、輸出判定:若程式可正常執行,輸出為各 printf 依序印出的內容,須注意格式符(%d、%c、%s、%f)與換行;若發生執行期錯誤,應寫明錯誤型別(如 Segmentation fault)、可能原因與修正後輸出。因原始碼缺漏,無法得出唯一數值。

第4題

請說明如下Python 程式,使用PQ_recursive(3)呼叫後,正確執行時的輸 出結果為何?如若無法正確執行(即會出現執行時期的錯誤),請說明應 如何修正才能正常執行及輸出結果為何。(18 分)

參考解答(AI 生成,非官方)

  • 一、前提說明:本題 Python 程式未隨題目附上,PQ_recursive(3) 的實際輸出取決於函式內部的遞迴關係、終止條件與資料結構(可能為 priority queue,以 heapq 或排序清單實作),因此無法憑題幹推得唯一結果,僅能提供追蹤與判定方法。
  • 二、遞迴追蹤法:由 PQ_recursive(3) 起,展開為對 PQ_recursive(2)、PQ_recursive(1) 等的呼叫,畫出遞迴樹並標註每層的引數、區域變數與回傳值;注意 Python 採傳值傳遞物件參考,若函式內對可變物件(list、dict)做 append、pop、sort 等操作,會影響外層同一物件,造成共享狀態(aliasing)。
  • 三、常見錯誤型態:RecursionError: maximum recursion depth exceeded(缺少或錯誤的終止條件)、IndexError: pop from empty list(對空堆積取出元素)、TypeError(比較不可比較的型別,如 heapq 內元素為 tuple 時第二欄不可比)、以可變物件作為預設參數(def f(x, acc=[]))導致跨呼叫累積。
  • 四、修正方式:補上明確的基底情況(base case),如 if n <= 0: return;取出前先判斷容器是否為空;heapq 元素改為 (priority, index, value) 三元組以避免比較錯誤;預設參數改為 None 並在函式內初始化;必要時以 sys.setrecursionlimit 提高上限,但根本仍應修正終止條件。
  • 五、輸出判定:若正常執行,輸出即為各 print 依呼叫順序印出的內容,須注意遞迴「去程」與「回程」的列印位置差異,以及優先權佇列取出順序(最小堆積由小到大)。因原始碼缺漏,無法得出唯一數值。

第5題

請完成如下的JavaScript function 觸動方式(第一條粗黑線)及內容(第 二~第六條粗黑線)。可以顯示如下網頁頁面,並在按下"Submit"按鈕後, 觸動JS function 根據使用者的輸入,顯示計算複利的本利和。(18 分)

參考解答(AI 生成,非官方)

  • 一、頁面結構(第一條粗黑線,觸動方式):以 HTML 表單呈現,包含三個 <input type="text" id="principal">、id="rate"、id="years" 供輸入本金、年利率與年數,並設 <button type="button" onclick="calculate()">Submit</button>;另備 <div id="result"></div> 作為輸出區。事件可綁在按鈕的 onclick,或以 form 的 onsubmit="calculate(); return false;" 避免頁面重新載入。
  • 二、取得使用者輸入(第二、三條):在 function calculate() 內以 document.getElementById('principal').value 取得字串,再以 parseFloat() 或 Number() 轉為數值;利率若以百分比輸入須除以 100。轉換後以 isNaN() 檢查,若有空白或非數字,於結果區顯示提示訊息並中止運算。
  • 三、複利公式與計算(第四、五條):本利和 A = P × (1 + r)^n,其中 P 為本金、r 為每期利率、n 為期數;JavaScript 以 Math.pow(1 + r, n) 計算次方。若為每年複利 m 次,則改用 A = P × (1 + r/m)^(m×n),作答時應說明所採用假設。
  • 四、輸出與格式化(第六條):以 amount.toFixed(2) 保留兩位小數,再指派 document.getElementById('result').innerHTML = '本利和:' + amount.toFixed(2);,或使用 textContent 以避免 HTML 注入。可同時輸出利息 = A − P,使畫面資訊完整。
  • 五、注意事項:需確認 id 與 getElementById 字串完全一致、script 置於 body 末端或使用 DOMContentLoaded 確保元素已載入;輸入負值或期數為零應加以驗證。因題目未附完整頁面與函式框線內容,實際變數名稱與欄位標籤應依題目圖示調整。