107 鐵路特考員級 資訊處理 程式設計概要 考古題詳解

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)​的控制邏輯,以及數值累加與輸出格式的追蹤能力。

  1. 遞迴函式與終止條件(Base Case): 函式呼叫自身即為遞迴。在遞迴設計中,終止條件決定函式何時停止向下展開並開始回傳數值。函式 ABC(n) 的數學定義為階乘(Factorial)運算: ABC(n)={1if n≤1n×ABC(n−1)if n>1ABC(n) = \begin{cases} 1 & \text{if } n \le 1 \\ n \times ABC(n - 1) & \text{if } n > 1 \end{cases} 特別注意:當 n=0n = 0 與 n=1n = 1 時,均滿足條件 n≤1n \le 1,因此 ABC(0)=1ABC(0) = 1、ABC(1)=1ABC(1) = 1。
  2. 迴圈計數與邊界控制: 迴圈條件為 for (i = 0; i < 8; i = i + 1),計數變數 ii 的初值為 00,每次遞增 11,當 i=8i = 8 時條件不成立而終止。因此,迴圈本體共執行 88 次,對應 i=0,1,2,3,4,5,6,7i = 0, 1, 2, 3, 4, 5, 6, 7。
  3. 迴圈內部的即時輸出: 輸出指令 printf("%d\n", sum); 置於 for 迴圈內部,代表每一次累加完成後,都會立即輸出當前累積的 sum 值並換行,共計輸出 88 行整數。

解題方法

本題屬於典型的「程式碼手動追蹤題(Trace Code)」,解題切入點分為「先確立遞迴函式值」與「建立迴圈歷程追蹤表」兩個步驟:

步驟一:計算各階層之 ABC(i)ABC(i) 函數值

將 i=0i = 0 至 77 代入函式 ABC(i)ABC(i):

  • i=0i = 0:滿足 0≤10 \le 1,直接回傳 11。即 ABC(0)=1ABC(0) = 1。
  • i=1i = 1:滿足 1≤11 \le 1,直接回傳 11。即 ABC(1)=1ABC(1) = 1。
  • i=2i = 2:2×ABC(1)=2×1=22 \times ABC(1) = 2 \times 1 = 2。
  • i=3i = 3:3×ABC(2)=3×2=63 \times ABC(2) = 3 \times 2 = 6。
  • i=4i = 4:4×ABC(3)=4×6=244 \times ABC(3) = 4 \times 6 = 24。
  • i=5i = 5:5×ABC(4)=5×24=1205 \times ABC(4) = 5 \times 24 = 120。
  • i=6i = 6:6×ABC(5)=6×120=7206 \times ABC(5) = 6 \times 120 = 720。
  • i=7i = 7:7×ABC(6)=7×720=50407 \times ABC(6) = 7 \times 720 = 5040。

步驟二:追蹤迴圈內部 sum 的累加與輸出

初值設定 sum = 0,每一輪執行 sum += ABC(i) 後隨即輸出:

🔒

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

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

免費註冊

第 二 題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)​以及迴圈追蹤與元素交換演算法。涉及的核心觀念如下:

  1. 陣列名稱與指標運算的等價性: 在 C/C++ 中,一維陣列名稱傳入函式時會衰退(decay)為指向其第一個元素的指標。指標加法代表記憶體位址的位移,透過反參考運算子(dereference operator, *)可存取元素: ∗(p+i)  ⟺  p[i]*(p + i) \iff p[i] ∗(p+i+1)  ⟺  p[i+1]*(p + i + 1) \iff p[i + 1]
  2. 傳址呼叫(Call by Address)之副作用: main 函式將陣列首位址 a 傳入函式 F(int* p, int n),由於傳遞的是記憶體位址,函式 F 內部對 *(p + i) 的任何修改,都會直接反應並改變 main 函式中陣列 a 的內容。
  3. 無條件相鄰交換(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):傳入陣列首位址 p=&a[0]p = \&a[0],陣列長度 n=5n = 5。
  • 迴圈終止條件:i<n−1  ⟹  i<4i < n - 1 \implies i < 4。
  • 迴圈變數 ii 的走訪範圍為:i=0,1,2,3i = 0, 1, 2, 3,共執行 4 次迭代。

2. 逐步追蹤(Trace Table)

  • 初始狀態: a=[7,3,6,9,5]a = [7, 3, 6, 9, 5]

  • 第 1 次迭代(i=0i = 0):

  • 交換 *(p + 0) 與 *(p + 1),即交換 a[0]a[0] 與 a[1]a[1](數值 7 與 3 交換)。

  • 陣列狀態:[3,7,6,9,5][3, \mathbf{7}, 6, 9, 5]

  • 第 2 次迭代(i=1i = 1):

  • 交換 *(p + 1) 與 *(p + 2),即交換 a[1]a[1] 與 a[2]a[2](數值 7 與 6 交換)。

🔒

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

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

免費註冊

第 三 題25 分

在資料庫中,有一個名叫 Sale_Information 的表格。今天主管 David 想要依照營業額(Money)由高往低依序排列顯示,且算出所有地方營業額的平均值,請問工程師 Bob 要輸入哪兩個 MySQL 指令才能達成主管的要求?

Sale_Information 表格:

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

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

這一題的完整詳解

核心觀念

本題測驗關聯式資料庫(MySQL / SQL)的基本查詢語法,主要涵蓋兩個核心觀念:

  1. 資料排序(Sorting Data):使用 ORDER BY 子句對查詢結果進行排序。排序方式分為升冪(ASC,預設由小到大)與降冪(DESC,由大到小)。
  2. 聚合函數(Aggregate Functions):使用 SQL 內建的統計函數 AVG 計算特定數值欄位的平均值。

解題方法

題目要求達成主管 David 的兩項需求,分別需要撰寫一個獨立的 MySQL 查詢指令:

需求一:依照營業額(Money)由高往低依序排列顯示

  1. 目標欄位與資料表:欲查詢表格為 Sale_Information。題目要求顯示資料內容,可使用 * 查詢所有欄位(或選取 Place, Money, Date)。
  2. 排序規則:依營業額 Money 欄位進行「由高往低」(降冪)排序,必須在 ORDER BY Money 後方加上關鍵字 DESC(Descending)。
  3. 對應指令:
SELECT * FROM Sale_Information ORDER BY Money DESC;

需求二:算出所有地方營業額的平均值

  1. 計算平均值:使用 SQL 聚合函數 AVG(Money),針對 Sale_Information 表格中所有紀錄的 Money 數值計算算術平均數。
  • 計算過程: 平均值=3500+2000+2500+12004=92004=2300\text{平均值} = \frac{3500 + 2000 + 2500 + 1200}{4} = \frac{9200}{4} = 2300
  1. 對應指令:
SELECT AVG(Money) FROM Sale_Information;

(亦可加上欄位別名,如 SELECT AVG(Money) AS Average_Money FROM Sale_Information;)


指令與語法分析

🔒

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

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

免費註冊

第 四 題25 分

請試述下列名詞之意涵:

(一)object code

(二)preprocessor command

(三)data hiding

(四)local variable

(五)Overloading

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

這一題的完整詳解

核心觀念

本題考查程式語言與軟體開發流程的五個核心基本概念,涵蓋範圍包括:

  1. 編譯系統與建置流程:高階語言轉換至可執行檔之各階段產物(前置處理、編譯、鏈結)。
  2. 變數特性(Variable Attributes):變數的作用範圍(Scope)與生命週期(Lifetime)。
  3. 物件導向程式設計(OOP)機制:封裝(Encapsulation)衍生之資訊隱藏(Information Hiding)、多型(Polymorphism)架構下之編譯時期靜態繫結(Static Binding)。

解題方法

本題為經典的「名詞解釋」申論題型。作答時切忌僅以口語簡述,應採取「核心定義 →\rightarrow 運作機制與特徵 →\rightarrow 實例或語法佐證」之標準三段式結構切入,並列出評分關鍵字(如:機器語言、堆疊、存取修飾子、函式簽名等),以展現紮實之計算機科學理論背景。


各小題名詞意涵解析

(一)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),且行尾不加分號。
  • 主要功能包括:
  1. 檔案包含(File Inclusion):將指定的標頭檔內容複製展開至程式碼中(例如 #include <stdio.h>)。
  2. 巨集代換(Macro Substitution):進行原始文字的代換或定義常數(例如 #define PI 3.14159)。
  3. 條件編譯(Conditional Compilation):依據設定條件決定特定區塊的程式碼是否納入編譯(例如 #ifndef HEADER_H、#endif),常用於避免標頭檔重複引入或進行跨平台除錯。

(三)data hiding(資料隱藏)

  • 定義:物件導向程式設計(OOP)中封裝(Encapsulation)的核心原則,指刻意隔離物件內部的狀態資訊,禁止外部程式直接存取物件內部的私有資料成員(Data Members/Fields)。
  • 特性與機制:
  • 實作方式主要依賴存取修飾子(Access Specifiers),如將屬性設為 private,並僅提供公開的存取介面(Public Methods,即 Getter 與 Setter)。
  • 其目的在於:
  1. 保護資料完整性:防止外部程式碼隨意賦予不合法的值。
  2. 降低耦合度(Coupling):隱藏內部實作細節,日後內部資料結構更動時,不影響外部呼叫者的使用介面。

(四)local variable(區域變數)

  • 定義:宣告於特定程式區塊(Block,以 {} 包覆之區域)、函式(Function)或方法(Method)內部的變數。
  • 特性與機制:
🔒

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

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

免費註冊

其他考古題