107 鐵路特考員級 資訊處理 程式設計概要 考古題詳解
第 一 題25 分
請依據下列 C++ 程式碼執行後,試問輸出結果為何?
#include <stdio.h> #include <stdlib.h>
int ABC(int n) { if (n <= 1) return 1; else return n * ABC(n - 1); }
int main() { int i, sum = 0;
for (i = 0; i < 8; i = i + 1) {
sum += ABC(i);
printf("%d\n", sum);
}
system("pause");
return 0;
}
登入後即可作答並保存紀錄。
核心觀念
本題主要測驗考生對 C/C++ 語言中遞迴函式(Recursive Function)的運作機制、迴圈結構(for loop)的控制邏輯,以及數值累加與輸出格式的追蹤能力。
- 遞迴函式與終止條件(Base Case):
函式呼叫自身即為遞迴。在遞迴設計中,終止條件決定函式何時停止向下展開並開始回傳數值。函式
ABC(n)的數學定義為階乘(Factorial)運算: 特別注意:當 與 時,均滿足條件 ,因此 、。 - 迴圈計數與邊界控制:
迴圈條件為
for (i = 0; i < 8; i = i + 1),計數變數 的初值為 ,每次遞增 ,當 時條件不成立而終止。因此,迴圈本體共執行 次,對應 。 - 迴圈內部的即時輸出:
輸出指令
printf("%d\n", sum);置於for迴圈內部,代表每一次累加完成後,都會立即輸出當前累積的sum值並換行,共計輸出 行整數。
解題方法
本題屬於典型的「程式碼手動追蹤題(Trace Code)」,解題切入點分為「先確立遞迴函式值」與「建立迴圈歷程追蹤表」兩個步驟:
步驟一:計算各階層之 函數值
將 至 代入函式 :
- :滿足 ,直接回傳 。即 。
- :滿足 ,直接回傳 。即 。
- :。
- :。
- :。
- :。
- :。
- :。
步驟二:追蹤迴圈內部 sum 的累加與輸出
初值設定 sum = 0,每一輪執行 sum += ABC(i) 後隨即輸出:
第 二 題25 分
請依據下列 C++ 程式碼執行後,試問輸出結果為何?
#include <stdio.h> #include <stdlib.h>
void F(int* p, int n) { int i;
for (i = 0; i < n - 1; i = i + 1) {
int tmp = *(p + i + 1);
*(p + i + 1) = *(p + i);
*(p + i) = tmp;
}
}
int main() { int a[5] = { 7, 3, 6, 9, 5 };
F(a, 5);
for (int i = 0; i <= 4; i++) {
printf("%d\n", a[i]);
}
system("pause");
return 0;
}
登入後即可作答並保存紀錄。
核心觀念
本題評量 C/C++ 語言中指標與陣列的等價轉換、傳址呼叫(Call by Address / Pointer)以及迴圈追蹤與元素交換演算法。涉及的核心觀念如下:
- 陣列名稱與指標運算的等價性:
在 C/C++ 中,一維陣列名稱傳入函式時會衰退(decay)為指向其第一個元素的指標。指標加法代表記憶體位址的位移,透過反參考運算子(dereference operator,
*)可存取元素: - 傳址呼叫(Call by Address)之副作用:
main函式將陣列首位址a傳入函式F(int* p, int n),由於傳遞的是記憶體位址,函式F內部對*(p + i)的任何修改,都會直接反應並改變main函式中陣列a的內容。 - 無條件相鄰交換(Adjacent Swap):
迴圈內透過暫存變數
tmp實現經典的三步驟元素交換:
int tmp = *(p + i + 1);
*(p + i + 1) = *(p + i);
*(p + i) = tmp;
此段程式碼等同於 swap(p[i], p[i + 1])。由於缺少比較條件判斷(無 if 判斷式),此運作並非排序,而是將當前元素與下一位置元素強制對調。
解題方法
本題為追蹤執行題(Trace Analysis),解題切入點為分析函式 F 每一輪迴圈對陣列內容造成的狀態變化。
1. 參數與終止條件分析
- 呼叫
F(a, 5):傳入陣列首位址 ,陣列長度 。 - 迴圈終止條件:。
- 迴圈變數 的走訪範圍為:,共執行 4 次迭代。
2. 逐步追蹤(Trace Table)
-
初始狀態:
-
第 1 次迭代():
-
交換
*(p + 0)與*(p + 1),即交換 與 (數值 7 與 3 交換)。 -
陣列狀態:
-
第 2 次迭代():
-
交換
*(p + 1)與*(p + 2),即交換 與 (數值 7 與 6 交換)。
第 三 題25 分
在資料庫中,有一個名叫 Sale_Information 的表格。今天主管 David 想要依照營業額(Money)由高往低依序排列顯示,且算出所有地方營業額的平均值,請問工程師 Bob 要輸入哪兩個 MySQL 指令才能達成主管的要求?
Sale_Information 表格:
| Place | Money | Date |
|---|---|---|
| Japan | 3500 | 05-Dec-2017 |
| Taiwan | 2000 | 06-Dec-2017 |
| China | 2500 | 12-Dec-2017 |
| Los Angeles | 1200 | 26-Dec-2017 |
登入後即可作答並保存紀錄。
核心觀念
本題測驗關聯式資料庫(MySQL / SQL)的基本查詢語法,主要涵蓋兩個核心觀念:
- 資料排序(Sorting Data):使用
ORDER BY子句對查詢結果進行排序。排序方式分為升冪(ASC,預設由小到大)與降冪(DESC,由大到小)。 - 聚合函數(Aggregate Functions):使用 SQL 內建的統計函數
AVG計算特定數值欄位的平均值。
解題方法
題目要求達成主管 David 的兩項需求,分別需要撰寫一個獨立的 MySQL 查詢指令:
需求一:依照營業額(Money)由高往低依序排列顯示
- 目標欄位與資料表:欲查詢表格為
Sale_Information。題目要求顯示資料內容,可使用*查詢所有欄位(或選取Place, Money, Date)。 - 排序規則:依營業額
Money欄位進行「由高往低」(降冪)排序,必須在ORDER BY Money後方加上關鍵字DESC(Descending)。 - 對應指令:
SELECT * FROM Sale_Information ORDER BY Money DESC;
需求二:算出所有地方營業額的平均值
- 計算平均值:使用 SQL 聚合函數
AVG(Money),針對Sale_Information表格中所有紀錄的Money數值計算算術平均數。
- 計算過程:
- 對應指令:
SELECT AVG(Money) FROM Sale_Information;
(亦可加上欄位別名,如 SELECT AVG(Money) AS Average_Money FROM Sale_Information;)
指令與語法分析
第 四 題25 分
請試述下列名詞之意涵:
(一)object code
(二)preprocessor command
(三)data hiding
(四)local variable
(五)Overloading
登入後即可作答並保存紀錄。
核心觀念
本題考查程式語言與軟體開發流程的五個核心基本概念,涵蓋範圍包括:
- 編譯系統與建置流程:高階語言轉換至可執行檔之各階段產物(前置處理、編譯、鏈結)。
- 變數特性(Variable Attributes):變數的作用範圍(Scope)與生命週期(Lifetime)。
- 物件導向程式設計(OOP)機制:封裝(Encapsulation)衍生之資訊隱藏(Information Hiding)、多型(Polymorphism)架構下之編譯時期靜態繫結(Static Binding)。
解題方法
本題為經典的「名詞解釋」申論題型。作答時切忌僅以口語簡述,應採取「核心定義 運作機制與特徵 實例或語法佐證」之標準三段式結構切入,並列出評分關鍵字(如:機器語言、堆疊、存取修飾子、函式簽名等),以展現紮實之計算機科學理論背景。
各小題名詞意涵解析
(一)object code(目的碼/目標碼)
- 定義:指高階程式語言原始碼(Source Code)或組合語言原始碼,經由編譯器(Compiler)或組譯器(Assembler)轉譯後所產生的機器語言(Machine Language)或重定位機器碼(Relocatable Machine Code)。
- 特性與機制:
- 檔案格式通常為二進位形式(例如 Windows 的
.obj檔或 Linux 的.o檔)。 - 目的碼雖然已轉換為處理器可識別的指令,但尚未具備直接執行的能力;它通常包含未解析的外部符號參照(External References)。
- 必須進一步透過鏈結器(Linker)將多個目的檔與系統函式庫(Libraries)結合,解析位址參照後,才能生成最終的可執行檔(Executable Code,如
.exe)。 - 其流程為:
原始碼 (.c/.cpp) → [編譯器] → 目的碼 (.obj/.o) → [鏈結器] → 執行檔 (.exe)。
(二)preprocessor command(前置處理器指令)
- 定義:在編譯器正式將原始碼轉譯為目的碼之前,指示前置處理器(Preprocessor)優先執行的指示命令(Directives)。
- 特性與機制:
- 在 C/C++ 等語言中,此類指令均以
#符號開頭(如#include、#define、#ifdef),且行尾不加分號。 - 主要功能包括:
- 檔案包含(File Inclusion):將指定的標頭檔內容複製展開至程式碼中(例如
#include <stdio.h>)。 - 巨集代換(Macro Substitution):進行原始文字的代換或定義常數(例如
#define PI 3.14159)。 - 條件編譯(Conditional Compilation):依據設定條件決定特定區塊的程式碼是否納入編譯(例如
#ifndef HEADER_H、#endif),常用於避免標頭檔重複引入或進行跨平台除錯。
(三)data hiding(資料隱藏)
- 定義:物件導向程式設計(OOP)中封裝(Encapsulation)的核心原則,指刻意隔離物件內部的狀態資訊,禁止外部程式直接存取物件內部的私有資料成員(Data Members/Fields)。
- 特性與機制:
- 實作方式主要依賴存取修飾子(Access Specifiers),如將屬性設為
private,並僅提供公開的存取介面(Public Methods,即 Getter 與 Setter)。 - 其目的在於:
- 保護資料完整性:防止外部程式碼隨意賦予不合法的值。
- 降低耦合度(Coupling):隱藏內部實作細節,日後內部資料結構更動時,不影響外部呼叫者的使用介面。
(四)local variable(區域變數)
- 定義:宣告於特定程式區塊(Block,以
{}包覆之區域)、函式(Function)或方法(Method)內部的變數。 - 特性與機制: