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 程式追蹤題,綜合測驗考生四大核心程式概念:
- 遞迴呼叫(Recursion)與基底條件(Base Case):方法呼叫自身的堆疊展開(Unwinding)與逐層回溯計算。
- 運算式求值順序(Evaluation Order)與副作用(Side Effect):在運算式
x = A(x + 5) + B(x)中,Java 規範保證運算元由左至右(Left-to-Right)求值。先執行左側遞迴呼叫,再執行右側函式;函式執行過程中所觸發的螢幕輸出即為副作用。 - 螢幕輸出方法的區別:
System.out.print不會自動換行,輸出的字元會停留在當前列;System.out.println則會在輸出內容後加上換行字元。因此,在方法內部由print印出的星號(*)會與後續println印出的數值串接在同一列。 - 布林邏輯運算與短路求值(Short-Circuit Evaluation):
||(邏輯或)與&&(邏輯且)的真值表計算與短路特性,以及布林代數中的恆真/恆假化簡。
解題方法
解題切入點在於將程式分為「數值遞迴追蹤」與「布林邏輯化簡」兩大部分,並以**呼叫堆疊(Call Stack)**自頂向下展開、再自底向上回溯的方式記錄數值與副作用。
1. 遞迴函式行為分析
- 方法 :每次呼叫印出一個
*(不換行),並回傳數值 。 - 方法 :
- 當 :先遞迴呼叫 ,再呼叫 ,兩者結果相加後回傳。
- 當 :觸發基底條件,直接回傳 。
- 方法 :先印出一個
*(不換行),接著回傳 。
2. 布林運算式化簡分析
- 方法 :回傳式為 。
- 方法 :回傳式為 。
各行輸出分析
第一行:System.out.println(A(3));
- 向下展開遞迴呼叫:
- :因 ,計算
- :因 ,計算
- :因 ,計算
- :因 ,計算
- :因 ,直接回傳 。
- 向上回溯並執行副作用:
- 回到 :左側為 ,接著執行 。
- 印出
*,回傳 。 - 。
- 回到 :左側為 ,接著執行 。
- 印出
*,回傳 。 - 。
- 回到 :左側為 ,接著執行 。
- 印出
*,回傳 。 - 。
- 回到 :左側為 ,接著執行 。
- 印出
*,回傳 。 - 。
- 輸出結果:
- 回溯過程中呼叫了 4 次 ,共印出 4 個星號
****(未換行)。 - 最後由
System.out.println(149)印出149並換行。 - 該行輸出為:
****149
第二行:System.out.println(B(3));
- 呼叫 :
- 執行
System.out.print("*"),印出一個*。 - 回傳 。
- 輸出結果:
- 接續印出之星號,由
System.out.println(9)印出9並換行。 - 該行輸出為:
*9
第三行:System.out.println(C(3));
- 呼叫 :
- 執行
System.out.print("*"),先印出 1 個*。 - 接著計算回傳值:。
第 二 題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,文件物件模型)元素操作,主要涵蓋以下觀念:
- 表單輸入元素的值讀取:HTML 表單中
<input type="password">的文字內容存放在該 DOM 節點的value屬性中。 - 字串比對與嚴格相等運算子(Strict Equality Operator):使用
===比較時,型別與值皆須相同;未輸入之表單輸入欄位預設回傳空字串""(型別為string)。 - 字串長度(
String.prototype.length)與邏輯判斷:針對連續整數區間 ,其否定條件(違規條件)依笛摩根定律與不等式邏輯為 。 - HTML 元素內容輸出:修改行內元素(如
<span>)的文字或標記內容,標準 DOM 屬性為innerHTML、innerText或textContent。
解題方法
本題為 JavaScript 程式碼填空題,需依據題目設定的三項驗證邏輯與介面輸出規範,依序推導各空格:
- 取得密碼字串(空格 I):
HTML 代碼為
<input type="password" id="password" value="">。取得 input 輸入框之值,需存取其value屬性,因此為.value。 - 驗證規則 (1)「密碼不為空」(空格 II):
當使用者未在
<input>內輸入任何字元時,其value為長度為 0 的空字串""。判斷式password === ""成立時,即觸發alert("Empty")。 - 驗證規則 (2)「長度必須是 6、7 或 8」(空格 III、IV):
合法長度為 。程式中
else if結構用以攔截「非法」輸入並發出警告,故判定條件為反向的聯集:長度小於 6(password.length < 6)或長度大於 8(password.length > 8)。因此空格 (III) 填6,空格 (IV) 填8。 - 驗證規則 (3)「包含大小寫字母」:
程式碼中已預設正則表達式
/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/進行前瞻斷言檢驗,此部分無空格。 - 通過驗證於頁面呈現結果(空格 V):
HTML 代碼為
<span id="M" style="color:red"></span>。若所有驗證皆通過,程式需在該<span>元素中放入字串"ok"。變更非表單標籤(如<span>、<div>)的內容,可使用innerHTML、innerText或textContent屬性。
空格逐一解析
第 三 題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) 為左上角、大小為 的區塊,將區塊元素加總後除以 ,回傳該區塊的整數平均值。因為 value 與除數都是整數,除法會捨去小數部分。
compress 將大小為 size × size 的資料,切成多個 區塊;每個區塊以其整數平均值代表,存入 target,再印出壓縮後的矩陣。
解題方法
輸入資料的每一邊長度為 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 函式如下:
第 四 題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)的核心語法與基礎演算法,重點涵蓋以下觀念:
- 抽象類別與抽象方法(Abstract Class & Method):當類別內定義了尚未實作的抽象方法(
abstract void compute(...))時,該類別必須明確宣告為抽象類別(abstract class),無法直接實例化。 - 方法呼叫與封裝(Encapsulation):物件內部私有方法(
private)的調用與執行流程串接。 - 建構子繼承與鏈結(Constructor Chaining):在 C# 中,衍生類別(子類別)欲呼叫基礎類別(父類別)的建構子,必須使用
: base(...)語法,此處與 Java 的super(...)不同。 - 方法覆寫與多型(Method Overriding & Polymorphism):衍生類別實作基礎類別的抽象方法或虛擬方法時,C# 強制要求使用
override修飾詞。 - 加權平均數(Weighted Average)演算法:加權平均計算公式為:
解題方法與空格分析
空格 (I):abstract
- 語法依據:在類別
Score中,定義了protected abstract void compute(int[] weight);。 - 推導:依據 C# 語言規範,只要類別內包含至少一個抽象方法,該類別本身就必須使用
abstract關鍵字宣告為抽象類別,否則編譯器會報錯(CS0513)。因此填入abstract。
空格 (II):print
- 流程追蹤:
Main方法中分別以x.getValue(weight1);與y.getValue(weight2);啟動執行。- 題目說明執行輸出結果為
80與85。 - 觀察
Score類別內具備輸出功能的成員函式:
private void print {
Console.WriteLine("" + value);
}
getValue方法在呼叫compute(weight)計算完成後,必須將結果輸出至螢幕。因為方法內部語法為____;,直接呼叫同類別內的私有成員方法print。因此填入print。
空格 (III):base
- 語法依據:衍生類別建構子委派至基礎類別建構子。
- 推導:
- 父類別
Score定義了帶有參數的建構子public Score(int[] d),未定義無參數建構子。 - 子類別
WeightScore在建立實體時,必須先呼叫父類別的建構子以初始化陣列data。 - C# 規定子類別指定呼叫父類別建構子的關鍵字為
base,語法為: base(data)。因此填入base。
空格 (IV):override
- 語法依據:抽象方法的實作與覆寫。
- 推導:
- 基礎類別宣告了
protected abstract void compute(int[] weight);。