111 高普考普通考試 資訊處理 程式設計概要 考古題詳解
第 一、(一) 題10 分
以下是完整的 C# 程式碼,請回答程式執行結果為何?
internal class Program { static void Main(string[] args) { float p = 5.5f; int r = calc_square(p); Console.WriteLine(String.Format("Result:{0}", r)); }
static int calc_square(float param)
{
int result = (int)(param * param);
return result;
}
}
登入後即可作答並保存紀錄。
核心觀念
- 浮點數運算(Floating-Point Arithmetic):單精準度浮點數(
float)的數值相乘與資料型態表現。 - 明確型別轉換(Explicit Type Casting):在 C# 中,將浮點數(
float、double)強制轉型為整數(int)時,採用向零截斷(Truncation toward zero,即直接捨去小數部分),而非四捨五入。 - 字串格式化與標準輸出(String Formatting):
String.Format的複合格式化語法{0}替換機制,以及Console.WriteLine的換行輸出。
解題方法
本題採程式碼逐步追蹤(Code Tracing)切入分析:
- 進入程式進入點
Main:
- 宣告單精準度浮點數變數 並賦值:
float p = 5.5f;。 - 呼叫靜態方法
calc_square(p),將 的值()以傳值方式(Pass by Value)傳入函式。
- 執行方法
calc_square(float param):
- 參數
param接收到數值 。 - 執行運算式
(param * param): 運算結果之資料型態為float(值為 )。 - 執行強制轉型
(int)(param * param): 在 C# 規格中,浮點數型別強制轉換為整數型別時,會自動將小數部分截斷(無條件捨去):
第 一、(二) 題10 分
以下是完整的 C# 程式碼,請回答程式執行結果為何?
static void Main(string[] args) { float rate = 2.5f; float amount = 10f; computing(rate, ref amount); Console.WriteLine( String.Format("Rate: {0}, Amount: {1}", rate, amount)); }
static void computing(float rate, ref float amt) { rate *= 10; amt *= rate; }
登入後即可作答並保存紀錄。
核心觀念
本題的核心考點為 C# 的參數傳遞機制(Parameter Passing Mechanisms) 與 變數作用域(Variable Scope),並輔以基礎的浮點數格式化輸出規則:
- 傳值呼叫(Call by Value / Pass by Value):
- C# 的實值型別(Value Types,如
float、int等)在預設情況下採用傳值傳遞。 - 呼叫端(
Main)將引數的值複製一份給被呼叫端(computing)的區域參數。被呼叫端在函式內對該參數的修改,僅影響其區域堆疊(Stack)中的複本,不會回傳或影響呼叫端的原始變數。
- 傳參考呼叫(Call by Reference / Pass by Reference,
ref關鍵字):
- 參數前若加上
ref修飾詞,傳遞的是該變數的記憶體位址(Reference / Alias)。 - 被呼叫端的參數與呼叫端的引數共用同一個記憶體空間。被呼叫端對該參數的任何運算與修改,會直接同步反映在呼叫端的原始變數上。
- C# 浮點數預設字串格式化:
float在未指定小數位數格式(使用預設一般格式G)轉為字串時,若數值為整數,不會自動補尾隨零(Trailing Zeros)或小數點;例如250f轉為字串會呈現"250",而2.5f則呈現"2.5"。
解題方法
本題為程式追蹤題,採逐步追蹤記憶體狀態法(Trace Table)進行推導:
步驟一:Main 函式初始化變數
float rate = 2.5f;:於Main的堆疊配置變數rate,其值為 。float amount = 10f;:於Main的堆疊配置變數amount,其值為 。
步驟二:呼叫 computing(rate, ref amount)
- 第一個引數
rate:以**傳值(By Value)**傳入,被呼叫端建立獨立複本參數rate = 2.5。 - 第二個引數
ref amount:以**傳參考(By Reference)**傳入,參數amt成為Main中amount的別名(共用同一記憶體位址)。
步驟三:執行 computing 函式內部敘述
rate *= 10;
- 將區域參數
rate乘以 : - 注意:此變更僅存在於
computing函式的區域複本中。
amt *= rate;
- 將
amt乘以當前區域變數rate(即 ):
第 二、(一) 題10 分
目前以瀏覽器為主的應用程式大多以 JavaScript 進行前端程式的設計,請閱讀以下各列程式碼,並回答每一列程式碼的意義。
-
let iconList = [];
-
for (const extId of fs.ls("/extension")) {
-
let extension = fs.read(
/extension/${extId}/extension.js); -
ext = eval(extension);
-
iconList.push(fs.read(
/extension/${extId}/${ext.icon})); -
}
-
for (const [index, element] of Object.entries($("span .treeIcon"))) {
-
if (typeof element === "object") {
-
{iconList[index]}">`);
-
}
-
}
登入後即可作答並保存紀錄。
核心觀念
本題為典型的 JavaScript 與前端 DOM 操作之綜合語法試題,涵蓋以下核心觀念:
- 變數宣告與資料結構:使用
let、const進行區塊作用域(Block Scope)宣告,以及動態陣列(Array)與物件(Object)之建立與操作(如push方法)。 - ES6+ 迭代語法與物件拆解:
- 樣板字面值(Template Literals):以反引號()與
${}進行動態字串內插。 for...of迴圈:遍歷可迭代物件(Iterable)。Object.entries與解構賦值(Destructuring Assignment):將物件的鍵值對(Key-Value pairs)拆解為[key, value]陣列形式。
- 動態程式碼執行:內建全域函式
eval的運作機制,將字串解析並作為 JavaScript 程式碼即時執行。 - 類檔案系統 API(Mock / Extension FileSystem):透過虛擬或自定義檔案系統物件
fs進行目錄走訪(ls)與檔案讀取(read)。 - jQuery DOM 選取與渲染機制:
- jQuery 選擇器語法(層級選擇器
$("span .treeIcon"))。 - jQuery 物件的「類陣列(Array-like)」特性與屬性過濾(透過
typeof篩選真正的 DOM 物件)。 .append於指定節點動態插入 HTML 元素。
解題方法
解答「逐列說明程式碼意義」題型時,評分重點在於精確指出關鍵語法機制、API 輸入輸出、變數狀態變化,以及該列在整體演算法流程中的功能定位,切忌僅提供字面直譯。
解題架構切入分為兩大處理階段:
- 階段一(第 1 至 7 列):外掛程式掃描與圖示載入
走訪
/extension根目錄下的所有外掛資料夾,讀取其設定檔extension.js,透過eval解析出外掛物件以取得圖示檔案路徑,最後將讀取到的圖示資料依序彙整至全域陣列中。 - 階段二(第 9 至 13 列):DOM 節點過濾與圖示動態渲染
以 jQuery 選取所有具備
.treeIcon類別的 DOM 節點,利用Object.entries展開其內部屬性,經型別檢查排除非 DOM 元素之內建屬性後,依序將對應的圖示以<img>標籤動態附加至畫面上。
選項分析
本題為非選擇題(程式碼逐行釋義簡答題),無選項需進行是非辨析。評分關鍵在於能否精準識別各行程式碼之語言特性與邊界陷阱(詳見【答案】中的逐列完整解析)。
解題技巧
- 掌握第 10 列的「過濾陷阱」: jQuery 物件 `
第 二、(二) 題10 分
以下程式碼請依執行先後說明執行的結果。
-
<button onclick="dialog()">Confirm</button>
- <p id="result"></p>
- <script>
-
window.addEventListener('load', function () {
-
alert('Hello!');
-
})
-
function dialog() {
-
var message;
-
if (confirm("Press a button!")) {
-
message = "You pressed OK!";
-
} else {
-
message = "You pressed Cancel!";
-
}
-
document.getElementById("result").innerHTML = message;
-
}
- </script>
登入後即可作答並保存紀錄。
核心觀念
本題屬於 Web 前端技術(HTML 與 JavaScript)的程式追蹤題,核心在於測驗考生對 JavaScript 執行時序(Execution Order)、事件驅動模型(Event-Driven Model) 與 DOM 操作 的理解:
- 網頁載入生命週期與
load事件:window.addEventListener('load', ...)會在整份網頁資源(含 DOM 結構、樣式表、圖片等)載入完成後自動觸發回呼函式(Callback Function)。 - 瀏覽器原生對話方塊(Dialogs):
alert(message):顯示提示訊息視窗,僅有「確定」按鈕,使用者確認後程式方繼續往下執行。confirm(message):顯示確認訊息視窗,提供「確定」與「取消」按鈕;按下「確定」回傳布林值true,按下「取消」回傳false。
- DOM 操作與事件綁定:按鈕透過 HTML 屬性
onclick="dialog"綁定點擊事件;document.getElementById("result").innerHTML則用於將字串寫入指定id的 HTML 標籤內。
解題方法
本題必須依照時間先後順序與使用者的操作行為進行階段式推導:
階段一:網頁初始載入(Page Load)
- 瀏覽器解析 HTML 標籤,在畫面上建立:
- 一個顯示文字為
Confirm的按鈕。 - 一個內容為空的段落元素
<p id="result"></p>。
- 執行
<script>內的程式碼:註冊load事件監聽器並宣告dialog函式。 - 當網頁完全載入完成時,觸發
load事件,立即執行匿名函式:
- 瀏覽器跳出警告視窗(Alert),顯示文字:
Hello!。 - 使用者按下「確定」關閉視窗後,頁面停留於初始畫面。
階段二:使用者點擊按鈕(Button Click)
當使用者點擊畫面上的 Confirm 按鈕時,觸發 onclick 事件並呼叫 dialog 函式:
- 執行
confirm("Press a button!"):
- 瀏覽器跳出確認視窗,顯示訊息
Press a button!,並提供「確定(OK)」與「取消(Cancel)」按鈕。
- 根據使用者在確認視窗中的選擇,產生兩種分支結果:
- 分支 A(點擊「確定 / OK」):
confirm回傳true,進入if區塊。- 變數
message被賦值為"You pressed OK!"。 - 分支 B(點擊「取消 / Cancel」):
第 三 題20 分
請使用 C、C++、C#、Java 或 Python 程式語言撰寫一支完整的程式,將班級學生的百分制成績轉換為等第制成績,轉換的規則如下:
| 百分制成績 | 等第制成績 |
|---|---|
| 成績 (平均數 2 個標準差) | A |
| (平均數 1 個標準差) 成績 (平均數 2 個標準差) | B |
| 平均數 成績 (平均數 1 個標準差) | C |
| (平均數 1 個標準差) 成績 平均數 | D |
| (平均數 2 個標準差) 成績 (平均數 1 個標準差) | E |
| 成績 (平均數 2 個標準差) | F |
程式執行需讓使用者輸入班級所有學生的百分制成績,成績以空白格隔開;程式再將班級的平均成績、變異數與標準差、每位學生的編號、百分制成績與等第制成績列印出。
程式可使用所採用之程式語言的統計函數、模組或套件來求算平均成績、變異數與標準差。以下為程式執行之參考範例。
備註:斜體加外框線之整數為使用者所輸入,其餘皆為程式執行的輸出。
請輸入班級修課學生的百分制成績(以空白格隔開):100 90 80 70 60 50 40 30 20 10
班級平均成績=55
班級變異數成績=825
班級標準差成績=28.72
第 1 位學生的百分制成績=100,等第制成績=B
第 2 位學生的百分制成績=90,等第制成績=B
第 3 位學生的百分制成績=80,等第制成績=C
第 4 位學生的百分制成績=70,等第制成績=C
第 5 位學生的百分制成績=60,等第制成績=C
第 6 位學生的百分制成績=50,等第制成績=D
第 7 位學生的百分制成績=40,等第制成績=D
第 8 位學生的百分制成績=30,等第制成績=D
第 9 位學生的百分制成績=20,等第制成績=E
第 10 位學生的百分制成績=10,等第制成績=E
登入後即可作答並保存紀錄。
核心觀念
本題考查輸入資料處理、描述統計量計算,以及依門檻進行分級判斷。
令班級有 位學生,成績為 ,班級平均數、變異數與標準差定義如下:
範例的變異數使用母體變異數,分母為 ;若使用樣本變異數,分母會是 ,計算結果便不符合題目範例。
解題方法
先將使用者輸入的空白分隔成績轉為數值,再計算平均數、母體變異數與標準差。接著依照各區間的上下界,逐一判定每位學生的等第。程式使用 Python statistics 模組的 mean、pvariance 與 pstdev 函數。
以題目輸入的 10 筆成績為例:
因此,各級距的分界為:
例如,100 分落在 ,所以是 B;80 分落在 ,所以是 C。
Python 程式
第 四 題20 分
問卷常被使用來進行服務滿意度調查,以下數據是某單位資訊中心新系統使用的滿意度調查結果,數值為人次。請以 Python 程式製作一張圓餅圖,圖上須顯示出百分比及標籤。
非常滿意:65
滿意:97
普通:103
不滿意:45
非常不滿意:51
登入後即可作答並保存紀錄。
核心觀念
本題評量 Python 在「資料視覺化」(Data Visualization)領域的基礎應用能力,屬於公職考試資訊處理類科近年極為常見的實務應用題型。
- 核心套件:Python 資料視覺化主流標準函式庫
matplotlib.pyplot。 - 核心函式:
plt.pie圓餅圖繪製函式。 - 關鍵參數:
- 數值串列(
x):代表各扇區大小的人次資料。 - 標籤參數(
labels):對應各扇區的文字標籤。 - 百分比顯示格式(
autopct):格式化字串(Format String),由系統自動依數值佔總和之比例計算百分比並格式化輸出。
解題方法
本題解題切入點為運用最簡潔且具備高可讀性的 Python 程式碼滿足題目要求的「圓餅圖」、「顯示百分比」與「顯示標籤」三大要件。
- 模組匯入:匯入
matplotlib.pyplot並命名為標準慣用別名plt。 - 資料結構建立:
- 定義滿意度分類標籤串列:
labels = ['非常滿意', '滿意', '普通', '不滿意', '非常不滿意']。 - 定義對應人次數值串列:
sizes = [65, 97, 103, 45, 51]。
- 百分比計算邏輯:
總人次 。
各項目百分比公式為:
在
matplotlib中,設定參數autopct='%1.1f%%'即可由系統自動完成上述計算,並將浮點數格式化保留至小數點後第一位,結尾顯示%符號。 - 圖表繪製與顯示:
- 呼叫
plt.pie(sizes, labels=labels, autopct='%1.1f%%')繪圖。 - 加入圖表標題
plt.title提升圖表完整度。 - 呼叫
plt.show輸出圖形。
選項分析
本題為非選擇題(程式撰寫題),無選項。針對評分標準中必備的程式碼核心組成元件逐一分析如下:
import matplotlib.pyplot as plt:必備。若漏寫套件匯入,程式無法執行,必遭扣分。labels=labels參數:必備。題旨明定「圖上須顯示出標籤」,若未設定此參數,圖形將僅有色塊而無類別文字。autopct='%1.1f%%'參數:必備。
第 五、(一) 題10 分
以下為 Python 完整程式碼,請回答執行的結果為何?
class Employee: all = []
def __init__(self, idno, first_name, last_name):
self.id = idno
self.first_name = first_name
self.last_name = last_name
Employee.all.append(self)
def __repr__(self):
return f"ID={self.id}, Name={self.first_name} {self.last_name}"
if name == "main": e1 = Employee('001', 'Peter', 'Lee') e2 = Employee('002', 'Ann', 'Lo') print(Employee.all)
登入後即可作答並保存紀錄。
核心觀念
本題主要測驗 Python 物件導向程式設計(Object-Oriented Programming, OOP)的核心機制,包含以下重點:
- 類別屬性(Class Attribute)與實例共用性:
在類別本體內、方法外宣告的變數(如
all = [])為類別屬性,由該類別所建立的所有實例(Instances)共同享有同一份記憶體參照,而非每個實例獨立擁有。 - 初始化方法(
__init__Constructor): 每當透過Employee(...)產生物件實例時,Python 會自動呼叫__init__方法。利用Employee.all.append(self),可將當前建立的實例(self)自動註冊至類別層級的清單中。 - 物件表現形式(
__repr__魔術方法):__repr__用於定義物件的「官方字串表示形式」。當印出包含物件的容器(例如本題的list)時,Python 內部會逐一呼叫容器內各元素的__repr__來呈現內容。 - 格式化字串常值(f-string):
以
f"..."語法進行變數字串替換,將物件屬性值直接內插至字串中。
解題方法
按照程式執行流程逐步追蹤(Trace):
-
類別載入階段: 解析
class Employee,初始化類別屬性Employee.all = [](指向一個空的串列)。 -
主程式進入點(
if __name__ == "__main__":):
- 建立物件
e1: 執行e1 = Employee('001', 'Peter', 'Lee')。 - 傳入參數:
idno = '001',first_name = 'Peter',last_name = 'Lee'。 - 物件屬性賦值:
e1.id = '001',e1.first_name = 'Peter',e1.last_name = 'Lee'。 - 執行
Employee.all.append(self):將e1加入清單。 - 此時
Employee.all內容為[e1]。 - 建立物件
e2: 執行e2 = Employee('002', 'Ann', 'Lo')。
第 五、(二) 題10 分
以下為 C# 的類別程式碼,類別 Employee 內的欄位不可以由非繼承的類別讀取或寫入,請檢視此程式是否可以正確執行?若無法正確執行的話,請寫出正確的程式碼。
public abstract class Employee { private string id; private string name; private int age;
public Employee()
{
}
}
public class Staff : Employee { public Staff(string _id, string _name, int _age) { this.id = _id; this.name = _name; this.age = _age; } }
登入後即可作答並保存紀錄。
核心觀念
本題的核心考點為物件導向程式設計(OOP)中的**封裝性(Encapsulation)與存取修飾詞(Access Modifiers)的可見度範圍,以及類別繼承(Inheritance)**時子類別對父類別成員的存取權限。
在 C# 語言中,常用的成員存取修飾詞定義如下:
private(私有):僅能在宣告該成員的類別本體內部存取。即使是繼承該類別的子類別(衍生類別),亦無法直接讀取或寫入。protected(受保護):僅限於宣告該成員的類別本身,以及其「衍生類別(子類別)」內部存取;其他非繼承的類別皆無法讀取或寫入。public(公開):完全開放存取,不受任何類別或組件限制。
解題方法
- 檢驗程式碼之執行性:
- 在原始程式碼中,基底類別
Employee將欄位宣告為私有成員:
private string id;
private string name;
private int age;
- 子類別
Staff繼承自Employee,並於建構子中嘗試直接存取並指派這些欄位:
this.id = _id;
this.name = _name;
this.age = _age;
- 依據 C# 語法規則,衍生類別不可直接存取基底類別的
private成員。因此,此程式在編譯時期就會產生錯誤(例如:CS0122: 'Employee.id' is inaccessible due to its protection level),無法通過編譯,更無法正確執行。
- 修正切入點:
- 題目明確規範:「類別 Employee 內的欄位不可以由非繼承的類別讀取或寫入」。
- 該條件即為存取修飾詞
protected的標準定義(僅自身與繼承類別可存取,非繼承類別皆阻擋)。 - 將
Employee類別內id、name、age的存取修飾詞由private改為protected,即可同時滿足題目設定的存取權限限制,並使子類別Staff能合法存取該欄位,讓建構子指派敘述編譯成功。
選項分析(程式碼診斷與錯誤追蹤)
- 基底類別宣告
public abstract class Employee: - 正確。宣告為抽象類別(
abstract),代表不可直接實例化,專門作為衍生類別繼承使用,語法與設計語意皆合規。 - 基底類別欄位宣告
private string id; private string name; private int age;: - 錯誤。