109 司法特考三等 檢察事務官電子資訊組 程式語言 考古題詳解
第 一 題25 分
(一)試說明下列 JSP 元素的功用。(10 分)
(1) <%-- --%>
(2) <%! %>
(3) <%= %>
(4) <% %>
(二)試在下列 Java 指令中套用(一)小題之元素,使之成為 JSP 程式,並說明其執行結果。(15 分)
Java 指令:
/* Java 指令 */
int[] Array = {12, 5, 36, 43, 10};
int len = Array.length;
int temp;
for (int i = len - 2; i >= 0; i--) for (int j = 0; j <= i; j++) { if (Array[j] > Array[j + 1]) { temp = Array[j]; Array[j] = Array[j + 1]; Array[j + 1] = temp; } }
for (int i = 0; i < Array.length; i++) System.out.print(" " + Array[i]);
登入後即可作答並保存紀錄。
核心觀念
- JSP 轉譯機制與生命週期(Translation & Life Cycle):
JSP 網頁在 Web 容器(如 Apache Tomcat)首次接收請求時,會先被轉譯(Translation)為對應的 Java Servlet 類別原始碼(繼承自
HttpJspBase),接著編譯(Compilation)成 Bytecode(.class)。因此,JSP 元素的語法差異本質上決定了該段程式碼「被放置在 Servlet 類別的何處」以及「變數的有效範圍(Scope)與生命週期」。 - JSP 腳本元素(Scripting Elements)與註解:
- JSP 註解(
<%-- --%>):伺服端註解,於轉譯期直接被忽略,不編譯、不傳輸至客戶端。 - JSP 宣告(
<%! %>):定義類別層級的成員變數(Member Variables)或成員方法(Methods),位於轉譯後 Servlet 的_jspService方法之外。 - JSP 運算式(
<%= %>):將表達式計算結果轉換為字串並寫入回應串流(相當於out.print(...)),位於_jspService內,結尾嚴禁加分號。 - JSP 小指令碼(
<% %>):撰寫一般的 Java 控制流程與邏輯,置於_jspService方法本體之內,每次請求皆會執行,變數為區域變數(Local Variables),每道陳述句結尾必須加分號。
- 氣泡排序法(Bubble Sort): 相鄰元素兩兩比較,若前項大於後項則進行交換,每輪將尚未排序範圍內的最大值「沉底」推至陣列末端。本題演算為標準遞增(由小到大)排序。
解題方法
(一)JSP 各元素功用說明
<%-- --%>(JSP 註解 / JSP Comment):
- 功用:供程式開發人員在 JSP 原始碼中撰寫說明文字。
- 機制:屬於伺服器端註解。當 Web 容器將 JSP 轉譯為 Servlet 時,此標籤內的內容會被完全忽略,既不會出現在轉譯後的 Java 原始檔中,也不會被送至客戶端瀏覽器(於瀏覽器點選「檢視網頁原始碼」無法看到)。
<%! %>(JSP 宣告 / JSP Declaration):
- 功用:用來宣告類別層級的成員變數(全域變數)、類別靜態變數或成員方法。
- 機制:內容會被直接放置於轉譯後 Servlet 類別本體之中、但位於
_jspService方法之外。在此宣告的變數生命週期隨 Servlet 實例而存續,為所有請求(Requests)所共享,需注意執行緒安全(Thread-Safe)問題。
<%= %>(JSP 運算式 / JSP Expression):
- 功用:用來計算一段 Java 運算式的值,並直接輸出至網頁客戶端。
- 機制:轉譯時會被封裝為
out.print(...)敘述句置於_jspService方法內部。其內容必須能產生具體數值或物件(自動呼叫toString轉為字串輸出)。語法上絕對不能以分號(;)結尾。
<% %>(JSP 小指令碼 / JSP Scriptlet):
- 功用:用來撰寫一般的 Java 程式邏輯(如條件分支
if-else、迴圈for/while、物件實例化等)。 - 機制:內容會被原封不動搬移至 Servlet 的
_jspService方法之內。在此處定義的變數屬於區域變數,每次客戶端發出請求調用服務時皆會重新配置,生命週期僅限於該次請求執行期間。每道 Java 陳述句結尾必須加上分號(;)。
(二)Java 指令套用為 JSP 程式與執行結果分析
- 套用原則:
- 將原始 Java 的多行註解
/* Java 指令 */改寫為 JSP 註解<%-- ... --%>。 - 變數宣告部分:可將暫存變數
temp透過<%! %>宣告為成員變數(或將陣列宣告於此),以完整展現題目(一)要求之宣告語法。 - 演算法邏輯部分:陣列初始化、雙重迴圈的氣泡排序演算法屬於控制邏輯,放入
<% %>小指令碼中。 - 輸出部分:將原本印至伺服器控制台的
System.out.print(...),改以<%= %>搭配迴圈動態輸出至網頁用戶端。
- 氣泡排序追蹤推導:
- 初始陣列:
Array = {12, 5, 36, 43, 10},長度 。 - 第一輪(), 由 至 :
- :比較 與 ,因 ,交換 。
- :比較 與 ,不交換。
- :比較 與 ,不交換。
- :比較 與 ,因 ,交換 。
- (本輪最大值 浮至最末位)
- 第二輪(), 由 至 :
- :比較 與 ,不交換。
- :比較 與 ,不交換。
- :比較 與 ,因 ,交換 。
- (次大值 定位)
- 第三輪(), 由 至 :
- :比較 與 ,不交換。
第 二 題25 分
程式執行時常需要呼叫副程式以完成特定工作,試說明常見的六種呼叫副程式方法。
登入後即可作答並保存紀錄。
核心觀念
本題考查程式語言(Programming Languages)中副程式呼叫時的引數傳遞機制(Parameter Passing Methods / Modes)。 副程式(Subprogram / Procedure / Function)執行時,呼叫端(Caller)與被呼叫端(Callee)必須透過引數進行資料交換。其核心理論涵蓋:
- 資料流動模式(Data Transfer Modes):
- 傳入模式(In mode):呼叫端傳遞資料給副程式。
- 傳出模式(Out mode):副程式將計算結果傳回呼叫端。
- 雙向模式(In/Out mode):資料雙向流通。
- 語意與求值時機(Evaluation Strategies):
- 及早求值(Eager / Strict Evaluation):引數在副程式執行前即完成求值。
- 延遲求值(Lazy / Non-strict Evaluation):引數等到副程式內部實際需要時才進行求值。
- 記憶體實作機制:利用堆疊訊框(Stack Frame / Activation Record)的本機變數配置、實體記憶體位址參照(Aliasing),或是閉包程式碼(Thunk)實作。
解題方法
依據經典程式語言設計理論(如 Sebesta 與 Pratt 等學者之體系),常見的六種呼叫副程式(引數傳遞)方法如下:
1. 傳值呼叫(Call-by-Value / Pass-by-Value)
- 傳遞模式:傳入模式(In mode)。
- 運作機制:呼叫副程式時,系統計算實引數(Actual Parameter)的值,並將該值複製到副程式形式引數(Formal Parameter)專屬的本機記憶體空間中。副程式內部對形式引數所做的任何更動,僅影響其區域變數,呼叫端的實引數數值完全不受影響。
- 優缺點:
- 優點:具安全性與封裝性,保護呼叫端的原始變數不被意外竄改。
- 缺點:若傳遞大型結構或陣列,複製成本高(需額外空間與時間複雜度)。
- 代表語言:C、Pascal(預設模式)、Java(基本資料型別)。
2. 傳結果呼叫(Call-by-Result / Pass-by-Result)
- 傳遞模式:傳出模式(Out mode)。
- 運作機制:呼叫副程式時,不自實引數傳入初始值;形式引數在副程式內部作為本機變數進行運算,待副程式執行結束即將返回時,才將形式引數的最終運算結果複製寫回呼叫端的實引數位址。
- 優缺點:
- 優點:語意專注於資料輸出,適合多回傳值設計。
- 缺點:若呼叫時傳入相同的實引數變數給多個結果參數(例如
sub(x, x)),因寫回記憶體的順序未定義,可能產生非決定性(Non-deterministic)錯誤。 - 代表語言:Ada(宣告為
out模式的參數)。
3. 傳值結果呼叫(Call-by-Value-Result / Copy-in Copy-out / Copy-Restore)
- 傳遞模式:雙向模式(In/Out mode)。
- 運作機制:兼具傳值與傳結果的特質。呼叫副程式開始時,先將實引數的值複製給形式引數(Copy-in);副程式執行期間,對形式引數的操作皆在區域記憶體完成;當副程式結束返回呼叫端前,再將形式引數的最新值複製回實引數(Copy-out)。
- 優缺點:
- 優點:副程式執行期間無須透過指標間接定址,存取效能高於純粹傳址。
- 缺點:需要兩次資料複製的開銷;若副程式中途發生未捕捉之例外中斷,實引數可能不會被寫回;且存在別名(Aliasing)不一致風險。
- 代表語言:Ada(宣告為
in out模式且編譯器採複製實作時)、Fortran IV。
4. 傳址呼叫(Call-by-Reference / Pass-by-Reference)
- 傳遞模式:雙向模式(In/Out mode)。
- 運作機制:呼叫副程式時,傳遞實引數的「記憶體位址」(Memory Address / Reference)。此時形式引數直接成為實引數的「別名(Alias)」,副程式內部對形式引數的任何讀寫操作,皆透過位址即時反映到呼叫端的實引數本體。
- 優缺點:
- 優點:無論資料結構多大,僅傳遞固定大小的位址指標,空間與傳遞效率極高。
- 缺點:破壞資料封裝性,副程式容易產生非預期的副作用(Side Effects);別名現象亦會阻礙編譯器的程式碼最佳化。
- 代表語言:C++(以
&宣告參考參數)、Pascal(var參數)、Fortran 77。
5. 傳名呼叫(Call-by-Name)
- 傳遞模式:雙向模式(In/Out mode,晚期繫結 Late Binding)。
- 運作機制:基於巨集展開與文字替換(Textual Substitution)原理。實引數在副程式呼叫時不進行求值,而是將副程式程式碼中出現形式引數之處,直接以實引數的文字表示式取代。底層實作上,編譯器會為引數產生稱為 Thunk(無引數輔助副程式)的閉包程式碼,每次副程式存取該引數時,都會重新執行一次 Thunk 進行動態求值。
- 優缺點:
- 優點:彈性極高,可實作如詹森裝置(Jensen's Device)等靈活演算法;
第 三 題25 分
pandas 是 Python 語言的一個重要資料分析套件,透過簡易的資料格式與操作,方便使用者進行資料分析,試說明此 pandas 套件的主要特性。
登入後即可作答並保存紀錄。
核心觀念
本題評量考生對 Python 資料科學核心生態系中 pandas 套件之架構、設計理念與核心特性的掌握程度。其核心觀念涵蓋:
- 基礎依賴與定位:pandas 是以 NumPy 為基礎構建的高階資料分析與操作套件,旨在提供直覺、高效且靈活的結構化資料處理能力。
- 核心資料結構抽象化:一維的
Series與二維的DataFrame,以及其結合「資料內容(Values)」與「軸標籤(Index/Columns)」的資料模型。 - 資料處理生命週期:資料載入(I/O)、資料清洗(缺失值與異常值處理)、資料轉換(合併、分組聚合、塑形)至時間序列分析。
解題方法
本題為標準的資訊類科「套件功能與架構申論題」。作答時切忌僅以口語簡述「很好用、能畫表」,應採取由抽象資料結構到底層運算特性、由靜態結構到動態操作的系統化論述架構:
- 點出底層基礎與兩大核心結構:明確寫出
Series與DataFrame,說明兩者的維度與特性。 - 歸納六大關鍵特性:
- 標籤化索引與自動對齊機制(Automatic Alignment)。
- 健全的缺失值(Missing Data)處理能力。
- 彈性的資料重塑、樞紐分析與切片選取。
- 高效的「分割-套用-合併」(Split-Apply-Combine)群組聚合機制。
- 豐富且異質的資料讀寫(I/O)支援。
- 原生支援的時間序列(Time Series)功能。
- 輔以底層效能與生態整合:提及底層透過 C/Cython 與 NumPy 實作向量化運算,兼顧開發彈性與執行效能。
選項分析
本題為申論問答題,非選擇題,故無個別選項之正誤判斷。評分重點在於是否具備結構化條列能力,並精確使用資訊專業術語(如:DataFrame、向量化運算、標籤對齊、Split-Apply-Combine 等)。
解題技巧
- 答題架構口訣:「兩結構、雙對齊、洗缺失、分合組、時序通、高效讀」。
- 高分關鍵:
- 務必提及「標籤對齊(Label Alignment)」,這是 pandas 與純粹的 NumPy 陣列最關鍵的差異。
- 提及重要方法或關鍵字(如
dropna、fillna、groupby、merge、date_range),以展現真實程式開發經驗。
- 常見陷阱:
- 誤將 pandas 與純數值運算套件 NumPy 混為一談,漏答「處理異質資料(Heterogeneous Data Types)」與「缺失值」的能力。
- 忽略「時間序列分析」,時間序列處理是金融與系統日誌分析中 pandas 最常被命題的強項之一。
【答案】
pandas 套件之主要特性說明
Python 的 pandas(名稱源自 Panel Data 與 Python Data Analysis)是目前資料科學與資料工程領域最關鍵的表格型結構資料處理套件。其主要特性歸納如下:
一、 具備雙重核心資料結構(Core Data Structures)
pandas 提供兩種高階且標籤化的核心資料結構,使結構化資料的操作更加直覺:
Series:具備軸標籤(Index)的一維同質(Homogeneous)陣列,可視為含索引的欄向量或定長字典。DataFrame:具備雙軸標籤(列索引 Index、行標籤 Columns)的二維異質(Heterogeneous)表格結構,每行可容納不同資料型態(如整數、浮點數、字串、布林值),各行本質上皆為一個Series。
第 四 題25 分
試說明物件導向程式語言的內建及自定例外處理方式,並舉例說明其用法。
登入後即可作答並保存紀錄。
核心觀念
本題旨在測驗物件導向程式語言(Object-Oriented Programming, OOP)中的例外處理機制(Exception Handling Mechanism)。核心觀念涵蓋以下面向:
- 例外(Exception)的本質:在 OOP 中,例外並非單純的錯誤代碼(Error Code),而是被封裝成物件(Object)。當異常事件發生時,程式會實例化一個例外物件並將其「拋出(Throw)」,再由外層呼叫堆疊尋找對應的處理區塊進行「捕獲(Catch)」,藉此將正常商務邏輯與錯誤處理邏輯分離,提高程式的強健性(Robustness)與可讀性。
- 例外類別階層架構:物件導向語言(如 Java、C#)通常具備嚴謹的單一繼承根源(如 Java 的
java.lang.Throwable,其下分為嚴重的系統錯誤Error與應用層面的Exception)。 - 內建例外(Built-in Exception):語言核心或標準函式庫預先定義好的例外類別(例如除以零
ArithmeticException、陣列索引越界ArrayIndexOutOfBoundsException、空指標參照NullPointerException等),用以反映執行階段的底層或語法層級異常。 - 自定例外(Custom / User-defined Exception):開發者依據具體領域業務規則(Domain Logic)自行設計的例外類別,透過繼承語言既有的基礎例外類別(如
Exception),提供具備明確業務意義的錯誤通知(例如餘額不足、帳號不存在)。 - 例外處理五大核心機制(關鍵字):
try:監控可能引發例外的程式碼區塊。catch:攔截並處理特定型態的例外物件。finally:無論是否發生例外均保證執行的清理區塊(常用於釋放系統資源)。throw:明確在程式中拋出一個例外物件。throws:標註於方法簽章(Method Signature)後方,向呼叫端聲明該方法可能拋出的例外型態。
解題方法
本題為標準的觀念與實作題,答題結構應採取「定義與機制說明 處理流程分析 程式範例示範」之三層架構:
- 示範語言選擇:以台灣公職國家考試《程式語言》閱卷中最普遍認可、例外架構最完整的 Java 為主要說明語言(其概念亦可對應至 C# 或 C++)。
- 內建例外處理之剖析:
- 說明內建例外之自動觸發(Implicit Throw)或標準函式庫拋出方式。
- 展示
try-catch-finally的語法結構,並搭配「除以零(Divide-by-Zero)」的數學運算實例。
- 自定例外處理之剖析:
- 說明定義步驟:宣告類別並繼承
Exception(或RuntimeException),提供傳入錯誤訊息的建構子。 - 說明使用步驟:在業務邏輯判斷不符時,使用
throw new 自定例外拋出,並在方法標頭宣告throws,最後由呼叫端使用try-catch接管。 - 給予具體應用範例:以銀行提款(餘額不足)之經典範例進行完整說明。
解題技巧
- 關鍵字精準區分(高頻陷阱):
throw為動詞,用於方法主體內部,後方接「例外物件實例」(例如:throw new MyException;)。throws為宣告詞,用於方法名稱後方,後方接「例外類別名稱」(例如:void withdraw throws MyException)。
- 多重 catch 的排列順序:
- 若同時捕獲多個例外,子類別例外必須置於父類別例外之前;若父類別(如
Exception)置於最上方,將導致下方的子類別catch區塊形成無法執行的無效程式碼(Unreachable Code),在編譯時期即會報錯。
- 自定例外繼承體系的選擇:
- 繼承
Exception:屬於檢查型例外(Checked Exception),編譯器會強制要求呼叫端必須顯式處理(try-catch或throws)。 - 繼承
RuntimeException:屬於非檢查型例外(Unchecked Exception),通常用於程式邏輯錯誤,不強制在語法層面顯式捕捉。國考作答時建議繼承Exception,最能展現完整的檢查與傳遞流程。
【答案】
物件導向程式語言(以 Java 為代表)之內建及自定例外處理方式,其核心概念、處理流程與程式範例說明如下:
一、例外處理機制概述
物件導向語言透過「物件」來封裝異常狀態。處理流程主要依循五大關鍵字:
try:將可能產生例外的程式碼置於其中。catch:指定要攔截的例外型別,當型別相符時執行對應的修復或記錄邏輯。