111 地方特考四等 資訊處理 程式設計概要 考古題詳解

111 年・地方特考・四等・資訊處理
試題代碼 程式設計概要

第 一 題25 分

針對以下 Java 程式,執行後輸出為何?

public class Count { public static int A(int x) { if (x < 20) x = A(x + 5) + B(x); return x; }

public static int B(int x) {
    System.out.print("*");
    return 3 * x;
}

public static int C(int x) {
    System.out.print("*");
    return 3 * A(x - 3);
}

public static boolean D(boolean x, boolean y) {
    return ((x || !y) || (x && y));
}

public static boolean E(boolean x, boolean y) {
    return (!x && (x && y));
}

public static void main(String[] args) {
    System.out.println(A(3));       // ____
    System.out.println(B(3));       // ____
    System.out.println(C(3));       // ____
    System.out.println(D(true, true));  // ____
    System.out.println(E(true, false)); // ____
}

}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題為經典的 Java 程式追蹤題,綜合測驗考生四大核心程式概念:

  1. 遞迴呼叫(Recursion)與基底條件(Base Case):方法呼叫自身的堆疊展開(Unwinding)與逐層回溯計算。
  2. 運算式求值順序(Evaluation Order)與副作用(Side Effect):在運算式 x = A(x + 5) + B(x) 中,Java 規範保證運算元由左至右(Left-to-Right)求值。先執行左側遞迴呼叫,再執行右側函式;函式執行過程中所觸發的螢幕輸出即為副作用。
  3. 螢幕輸出方法的區別:System.out.print 不會自動換行,輸出的字元會停留在當前列;System.out.println 則會在輸出內容後加上換行字元。因此,在方法內部由 print 印出的星號(*)會與後續 println 印出的數值串接在同一列。
  4. 布林邏輯運算與短路求值(Short-Circuit Evaluation):||(邏輯或)與 &&(邏輯且)的真值表計算與短路特性,以及布林代數中的恆真/恆假化簡。

解題方法

解題切入點在於將程式分為「數值遞迴追蹤」與「布林邏輯化簡」兩大部分,並以**呼叫堆疊(Call Stack)**自頂向下展開、再自底向上回溯的方式記錄數值與副作用。

1. 遞迴函式行為分析

  • 方法 B(x)B(x):每次呼叫印出一個 *(不換行),並回傳數值 3x3x。
  • 方法 A(x)A(x):
  • 當 x<20x < 20:先遞迴呼叫 A(x+5)A(x + 5),再呼叫 B(x)B(x),兩者結果相加後回傳。
  • 當 x≥20x \ge 20:觸發基底條件,直接回傳 xx。
  • 方法 C(x)C(x):先印出一個 *(不換行),接著回傳 3×A(x−3)3 \times A(x - 3)。

2. 布林運算式化簡分析

  • 方法 D(x,y)D(x, y):回傳式為 ((x∨¬y)∨(x∧y))((x \lor \neg y) \lor (x \land y))。
  • 方法 E(x,y)E(x, y):回傳式為 (¬x∧(x∧y))(\neg x \land (x \land y))。

各行輸出分析

第一行:System.out.println(A(3));

  1. 向下展開遞迴呼叫:
  • A(3)A(3):因 3<203 < 20,計算 A(3+5)+B(3)→A(8)+B(3)A(3 + 5) + B(3) \rightarrow A(8) + B(3)
  • A(8)A(8):因 8<208 < 20,計算 A(8+5)+B(8)→A(13)+B(8)A(8 + 5) + B(8) \rightarrow A(13) + B(8)
  • A(13)A(13):因 13<2013 < 20,計算 A(13+5)+B(13)→A(18)+B(13)A(13 + 5) + B(13) \rightarrow A(18) + B(13)
  • A(18)A(18):因 18<2018 < 20,計算 A(18+5)+B(18)→A(23)+B(18)A(18 + 5) + B(18) \rightarrow A(23) + B(18)
  • A(23)A(23):因 23≥2023 \ge 20,直接回傳 2323。
  1. 向上回溯並執行副作用:
  • 回到 A(18)A(18):左側為 2323,接著執行 B(18)B(18)。
  • B(18)B(18) 印出 *,回傳 3×18=543 \times 18 = 54。
  • A(18)=23+54=77A(18) = 23 + 54 = 77。
  • 回到 A(13)A(13):左側為 7777,接著執行 B(13)B(13)。
  • B(13)B(13) 印出 *,回傳 3×13=393 \times 13 = 39。
  • A(13)=77+39=116A(13) = 77 + 39 = 116。
  • 回到 A(8)A(8):左側為 116116,接著執行 B(8)B(8)。
  • B(8)B(8) 印出 *,回傳 3×8=243 \times 8 = 24。
  • A(8)=116+24=140A(8) = 116 + 24 = 140。
  • 回到 A(3)A(3):左側為 140140,接著執行 B(3)B(3)。
  • B(3)B(3) 印出 *,回傳 3×3=93 \times 3 = 9。
  • A(3)=140+9=149A(3) = 140 + 9 = 149。
  1. 輸出結果:
  • 回溯過程中呼叫了 4 次 BB,共印出 4 個星號 ****(未換行)。
  • 最後由 System.out.println(149) 印出 149 並換行。
  • 該行輸出為:****149

第二行:System.out.println(B(3));

  1. 呼叫 B(3)B(3):
  • 執行 System.out.print("*"),印出一個 *。
  • 回傳 3×3=93 \times 3 = 9。
  1. 輸出結果:
  • 接續印出之星號,由 System.out.println(9) 印出 9 並換行。
  • 該行輸出為:*9

第三行:System.out.println(C(3));

  1. 呼叫 C(3)C(3):
  • 執行 System.out.print("*"),先印出 1 個 *。
  • 接著計算回傳值:3×A(3−3)=3×A(0)3 \times A(3 - 3) = 3 \times A(0)。
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 二 題25 分

以下 JavaScript 程式,其功能為驗證輸入密碼是否合法,其合法規則如下:

(1) 密碼不為空。
(2) 密碼長度必須是 6、7 或 8。
(3) 密碼包含至少一個大寫與一個小寫英文字母。

若違反規則 (1),跳出視窗顯示「Empty」;若違反規則 (2),跳出視窗顯示「6~8 char」;若違反規則 (3),跳出視窗顯示「Uppercase and lowercase」;若無違反規則,則在頁面密碼後面顯示「ok」。

完成程式碼空格 (I)、(II)、(III)、(IV)、(V),使執行正確。

<html> <head> <title>Verification</title> </head> <script> function verifyPass() { var password = document.getElementById("password").____;
if (password === ____) {
    alert("Empty");
    return false;
}
else if ((password.length < ____) || (password.length > ____)) {
    alert("6~8 char");
    return false;
}
else if (!(password.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/))) {
    alert("Uppercase and lowercase");
    return false;
}
else {
    document.getElementById("M").____ = "ok";
    return false;
}

} </script>

<body> <h1 style="color:blue">Password</h1> <h3>Password Verification</h3> <form onsubmit="return verifyPass()"> <td>Enter Password:</td> <input type="password" id="password" value=""> <span id="M" style="color:red"></span> <br><br> <input type="submit" value="Submit"> </form> </body> </html>

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題評量重點為 JavaScript 在網頁前端之表單驗證(Form Validation)與 DOM(Document Object Model,文件物件模型)元素操作,主要涵蓋以下觀念:

  1. 表單輸入元素的值讀取:HTML 表單中 <input type="password"> 的文字內容存放在該 DOM 節點的 value 屬性中。
  2. 字串比對與嚴格相等運算子(Strict Equality Operator):使用 === 比較時,型別與值皆須相同;未輸入之表單輸入欄位預設回傳空字串 ""(型別為 string)。
  3. 字串長度(String.prototype.length)與邏輯判斷:針對連續整數區間 6≤length≤86 \le \text{length} \le 8,其否定條件(違規條件)依笛摩根定律與不等式邏輯為 length<6∨length>8\text{length} < 6 \lor \text{length} > 8。
  4. HTML 元素內容輸出:修改行內元素(如 <span>)的文字或標記內容,標準 DOM 屬性為 innerHTML、innerText 或 textContent。

解題方法

本題為 JavaScript 程式碼填空題,需依據題目設定的三項驗證邏輯與介面輸出規範,依序推導各空格:

  1. 取得密碼字串(空格 I): HTML 代碼為 <input type="password" id="password" value="">。取得 input 輸入框之值,需存取其 value 屬性,因此為 .value。
  2. 驗證規則 (1)「密碼不為空」(空格 II): 當使用者未在 <input> 內輸入任何字元時,其 value 為長度為 0 的空字串 ""。判斷式 password === "" 成立時,即觸發 alert("Empty")。
  3. 驗證規則 (2)「長度必須是 6、7 或 8」(空格 III、IV): 合法長度為 6≤length≤86 \le \text{length} \le 8。程式中 else if 結構用以攔截「非法」輸入並發出警告,故判定條件為反向的聯集:長度小於 6(password.length < 6)或長度大於 8(password.length > 8)。因此空格 (III) 填 6,空格 (IV) 填 8。
  4. 驗證規則 (3)「包含大小寫字母」: 程式碼中已預設正則表達式 /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/ 進行前瞻斷言檢驗,此部分無空格。
  5. 通過驗證於頁面呈現結果(空格 V): HTML 代碼為 <span id="M" style="color:red"></span>。若所有驗證皆通過,程式需在該 <span> 元素中放入字串 "ok"。變更非表單標籤(如 <span>、<div>)的內容,可使用 innerHTML、innerText 或 textContent 屬性。

空格逐一解析

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 三 題25 分

針對以下 C 程式,其輸出為下列表格,說明 compress 函式的功能,並完成程式碼空格 (I)、(II)、(III)、(IV),使之執行正確。

程式輸出:

2 4
6 5
2 4 6
6 5 4
1 4 8
3 5
4 6

程式碼:

#include <stdio.h>

#define SIZE 10

int op(int data[][SIZE], int x, int y, int n) { int value = 0;

for (int i = x; i < x + n; i++)
    for (int j = y; j < y + n; j++)
        value = value + data[i][j];

return value / (n * n);

}

void print(int target[][SIZE], int size) { for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) printf("%d ", target[x][y]); printf("\n"); } }

void compress(int data[][SIZE], int ____[][SIZE], int size, int n) { int cSize = ____;

for (int x = 0; x < cSize; x++)
    for (int y = 0; y < cSize; y++)
        target____ = op(data, x * n, y * n, n);

____(target, cSize);

}

int main() { int data[][SIZE] = { {1, 2, 3, 4, 5, 6}, {3, 4, 5, 6, 7, 8}, {5, 6, 1, 2, 3, 4}, {7, 7, 9, 9, 5, 5}, {2, 2, 4, 4, 8, 8}, {1, 1, 5, 5, 9, 9} };

int target[SIZE][SIZE];

compress(data, target, 4, 2);
compress(data, target, 6, 2);
compress(data, target, 6, 3);

return 0;

}

🖼️ 本題原卷含圖表。基於試題來源之版權考量,本站不轉載原卷影像; 題目文字已完整轉錄,圖表請自行參閱考選部公告之試題原檔。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考 C 語言二維陣列的傳遞、巢狀迴圈與整數除法。

op(data, x, y, n) 會取出以 (x, y) 為左上角、大小為 n×nn \times n 的區塊,將區塊元素加總後除以 n2n^2,回傳該區塊的整數平均值。因為 value 與除數都是整數,除法會捨去小數部分。

compress 將大小為 size × size 的資料,切成多個 n×nn \times n 區塊;每個區塊以其整數平均值代表,存入 target,再印出壓縮後的矩陣。

解題方法

輸入資料的每一邊長度為 size,每個區塊的邊長為 n,所以壓縮後的矩陣邊長是:

cSize=sizencSize = \frac{size}{n}

外層與內層迴圈分別走訪壓縮矩陣的列與欄。第 x 列、第 y 欄所代表的原始資料區塊,左上角座標是 (x * n, y * n),因此計算結果存入 target[x][y]。完成填值後,以 print(target, cSize) 印出壓縮矩陣。

四個空格依序為:

  • (I) target
  • (II) size / n
  • (III) [x][y]
  • (IV) print

完整的 compress 函式如下:

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 四 題25 分

針對以下 C# 程式,其輸出為 80、85,完成程式碼空格 (I)、(II)、(III)、(IV)、(V),使之執行正確。

public ____ class Score { protected int[] data; protected int value;

public Score(int[] d) {
    data = new int[d.Length];
    value = 0;

    for (int i = 0; i < d.Length; i++)
        data[i] = d[i];
}

private void print() {
    Console.WriteLine("" + value);
}

protected abstract void compute(int[] weight);

public void getValue(int[] weight) {
    compute(weight);
    ____();
}

}

public class WeightScore : Score { public WeightScore(int[] data) : ____(data) { }

protected ____ void compute(int[] weight) {
    int totalWeight = 0;

    for (int i = 0; i < data.Length; i++) {
        value = value + data[i] * weight[i];
        totalWeight = totalWeight + weight[i];
    }

    value = value / ____;
}

}

public class Test { static void Main(string[] args) { int[] data1 = {90, 80, 70, 85}; int[] data2 = {90, 80, 80, 85}; int[] weight1 = {1, 2, 3, 4}; int[] weight2 = {4, 2, 1, 3};

    Score x = new WeightScore(data1);
    Score y = new WeightScore(data2);

    x.getValue(weight1);
    y.getValue(weight2);
}

}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題評量 C# 物件導向程式設計(OOP)的核心語法與基礎演算法,重點涵蓋以下觀念:

  1. 抽象類別與抽象方法(Abstract Class & Method):當類別內定義了尚未實作的抽象方法(abstract void compute(...))時,該類別必須明確宣告為抽象類別(abstract class),無法直接實例化。
  2. 方法呼叫與封裝(Encapsulation):物件內部私有方法(private)的調用與執行流程串接。
  3. 建構子繼承與鏈結(Constructor Chaining):在 C# 中,衍生類別(子類別)欲呼叫基礎類別(父類別)的建構子,必須使用 : base(...) 語法,此處與 Java 的 super(...) 不同。
  4. 方法覆寫與多型(Method Overriding & Polymorphism):衍生類別實作基礎類別的抽象方法或虛擬方法時,C# 強制要求使用 override 修飾詞。
  5. 加權平均數(Weighted Average)演算法:加權平均計算公式為: xˉw=∑i=0n−1(data[i]×weight[i])∑i=0n−1weight[i]\bar{x}_w = \frac{\sum_{i=0}^{n-1} (\text{data}[i] \times \text{weight}[i])}{\sum_{i=0}^{n-1} \text{weight}[i]}

解題方法與空格分析

空格 (I):abstract

  • 語法依據:在類別 Score 中,定義了 protected abstract void compute(int[] weight);。
  • 推導:依據 C# 語言規範,只要類別內包含至少一個抽象方法,該類別本身就必須使用 abstract 關鍵字宣告為抽象類別,否則編譯器會報錯(CS0513)。因此填入 abstract。

空格 (II):print

  • 流程追蹤:
  1. Main 方法中分別以 x.getValue(weight1); 與 y.getValue(weight2); 啟動執行。
  2. 題目說明執行輸出結果為 80 與 85。
  3. 觀察 Score 類別內具備輸出功能的成員函式:
private void print {
Console.WriteLine("" + value);
}
  1. getValue 方法在呼叫 compute(weight) 計算完成後,必須將結果輸出至螢幕。因為方法內部語法為 ____;,直接呼叫同類別內的私有成員方法 print。因此填入 print。

空格 (III):base

  • 語法依據:衍生類別建構子委派至基礎類別建構子。
  • 推導:
  1. 父類別 Score 定義了帶有參數的建構子 public Score(int[] d),未定義無參數建構子。
  2. 子類別 WeightScore 在建立實體時,必須先呼叫父類別的建構子以初始化陣列 data。
  3. C# 規定子類別指定呼叫父類別建構子的關鍵字為 base,語法為 : base(data)。因此填入 base。

空格 (IV):override

  • 語法依據:抽象方法的實作與覆寫。
  • 推導:
  1. 基礎類別宣告了 protected abstract void compute(int[] weight);。
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

其他考古題