107 身心障礙特考四等 資訊處理 程式設計概要 考古題詳解

107 年・身心障礙特考・四等・資訊處理
試題代碼 程式設計概要

第 一 題25 分

假設已經將變數 int nMonthint\ nMonth 的值設定成介於 1∼121\sim12 間的整數,用來代表 2018 年的某一月份,亦即 nMonthnMonth 為 1 時代表一月、nMonthnMonth 為 2 時代表二月,依此類推。請依下列各子題要求,分別撰寫出程式片段,在變數 int nDaysint\ nDays 中計算出 nMonthnMonth 月的天數。

例如 nMonthnMonth 是 1 時,nDaysnDays 應該是 31;nMonthnMonth 是 2 時,nDaysnDays 應該是 28。作答時可以使用 C/C++、Java 或 C# 任一種語言作答,但必須註明所採用的語言。

(一) 使用 if…else if…else…。

(二) 使用陣列(array),且不使用 if…else if…else…或 switch。

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

這一題的完整詳解

核心觀念

本題為公職資訊處理類科《程式設計概要》的經典控制結構與資料結構基礎題,主要測驗以下三大核心概念:

  1. 條件分支與布林邏輯化簡(if...else if...else):測驗考生能否利用邏輯運算子 ||(邏輯或,Logical OR)將具有相同輸出特徵(大月、小月)的多個離散值進行有效分組,而非冗長地撰寫 12 個分支。
  2. 查表法(Lookup Table)與陣列隨機存取:測驗考生在禁止使用任何條件判斷(if、switch)時,能否利用陣列以 O(1)O(1) 的時間複雜度,將輸入值(月份)映射至對應的陣列元素(天數)。
  3. 曆法常識與邊界值處理:題目指定為西元 2018 年。由於 2018÷4=504…22018 \div 4 = 504 \dots 2(無法被 4 整除),2018 年為平年,故二月天數固定為 28 天;國曆大月(31 天)為 1、3、5、7、8、10、12 月,小月(30 天)為 4、6、9、11 月。

解題方法

本題作答語言選用 C/C++(語法核心結構完全通用於 Java 與 C#):

(一) 使用 if...else if...else...

  • 切入點:將 12 個月份依「天數」分類為三大集合:
  • 大月集合:{1,3,5,7,8,10,12}\{1, 3, 5, 7, 8, 10, 12\},天數為 31 天。
  • 小月集合:{4,6,9,11}\{4, 6, 9, 11\},天數為 30 天。
  • 特殊月份:{2}\{2\},2018 年為平年,天數為 28 天。
  • 實作設計: 在 if 中以條件式 nMonth == 1 || nMonth == 3 || ... 判定大月並賦值 nDays = 31;接著於 else if 中判定小月並賦值 nDays = 30;最後以 else 涵蓋二月(因為題目已明確保證 1≤nMonth≤121 \le nMonth \le 12),賦值 nDays = 28。

(二) 使用陣列(array)且不用 if 或 switch

  • 切入點:建立一個常數整數陣列(Lookup Table),陣列內容依序存入各月份之天數。
  • 索引映射設計:
  • 最佳解法(長度 13 陣列):宣告長度為 13 的陣列,索引 0 放置無效值 0,索引 1∼121 \sim 12 依序放置 1 月至 12 月的天數。此作法之優點在於「月份數字即為陣列註標(Index)」,完全不需要運算,直接以 days[nMonth] 取值,能徹底避免陣列越界與減 1 計算錯誤。
  • 標準解法(長度 12 陣列):宣告長度為 12 的陣列,因多數程式語言為 0-based 索引,1 月對應索引 0、12 月對應索引 11,存取時必須使用 days[nMonth - 1]。

子題深度分析

  • 第 (一) 子題評析: 國考閱卷時,若考生寫出 12 個獨立的 else if 分別判斷 nMonth == 1、nMonth == 2 ... 雖然語法無誤,但程式設
🔒

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

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

免費註冊

第 二 題25 分

如果 AA、BB 都是大小為 M×NM\times N 的二維陣列,其元素資料型態均為 double,且假設陣列 AA 已經有完整的資料。今欲依據 AA 求得 BB,使得 B[i][j]B[i][j] 成為在陣列 AA 中以 A[i][j]A[i][j] 為中心的 3×33\times3 個數的平均值。

當 B[i][j]B[i][j] 位於邊界時,仍是以 A[i][j]A[i][j] 為中心的 3×33\times3 個數的平均值,惟超出陣列的部分皆以 0 取代,即 B[0][0]B[0][0]、B[0][N−1]B[0][N-1]、B[M−1][0]B[M-1][0]、B[M−1][N−1]B[M-1][N-1] 是 2×22\times2 個數的平均值;B[0][j]B[0][j]、B[M−1][j]B[M-1][j] 是 2×32\times3 個數的平均值,0<j<N−10<j<N-1;B[i][0]B[i][0]、B[i][N−1]B[i][N-1] 是 3×23\times2 個數的平均值,0<i<M−10<i<M-1。

無論採用 C/C++ 或 Java 撰寫程式,都可以用下列程式片段達成任務。請為每一空白處填入一運算式(Expression)完成該程式片段。作答時須完整寫出此程式片段,並於填空處加底線標示,且不能更改此程式片段。

B[0][0]=____;B[0][0]=\_\_\_\_; B[0][N−1]=____;B[0][N-1]=\_\_\_\_; B[M−1][0]=____;B[M-1][0]=\_\_\_\_; B[M−1][N−1]=____;B[M-1][N-1]=\_\_\_\_; for (int j=1; ____; j++)\text{for }(int\ j=1;\ \_\_\_\_;\ j++)

{

\_\_\_\_;

$B[0][j]=\_\_\_\_;$

$B[M-1][j]=\_\_\_\_;$

}

for (int i=1; ____; i++)\text{for }(int\ i=1;\ \_\_\_\_;\ i++)

{

$B[i][0]=\_\_\_\_;$

$B[i][N-1]=\_\_\_\_;$

}

for (int i=1; ____; i++)\text{for }(int\ i=1;\ \_\_\_\_; \ i++) for (int j=1; ____; j++)\qquad\text{for }(int\ j=1;\ \_\_\_\_; \ j++) B[i][j]=____;\qquad\qquad B[i][j]=\_\_\_\_;

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

這一題的完整詳解

核心觀念

本題考查公職考試《程式設計概要》中極為經典的二維陣列(2D Array)索引操作與影像處理/數值分析中的均值濾波(Mean Filter / Moving Average)邊界處理,主要核心觀念涵蓋:

  1. 二維陣列的空間劃分與邊界條件(Boundary Conditions): 在 M×NM \times N 的二維陣列中(列索引 0≤i≤M−10 \le i \le M-1、行索引 0≤j≤N−10 \le j \le N-1),以某一元素為中心的 3×33 \times 3 區域會因為該元素所在位置而產生不同的有效相鄰元素數量。整個陣列需精準劃分為三種類型的幾何區域:
  • 四個頂角(Corners):(0,0)(0,0)、(0,N−1)(0,N-1)、(M−1,0)(M-1,0)、(M−1,N−1)(M-1,N-1),各自僅有 2×2=42 \times 2 = 4 個有效鄰居。
  • 四條外邊(Boundaries / Edges,不含頂角):上邊界與下邊界(0<j<N−10 < j < N-1)各包含 2×3=62 \times 3 = 6 個有效鄰居;左邊界與右邊界(0<i<M−10 < i < M-1)各包含 3×2=63 \times 2 = 6 個有效鄰居。
  • 內部核心(Interior Core):1≤i≤M−21 \le i \le M-2 且 1≤j≤N−21 \le j \le N-2,擁有完整的 3×3=93 \times 3 = 9 個元素。
  1. C/C++ 與 Java 語法規範相容性:
  • 迴圈終止條件:陣列大小為 M×NM \times N,內部索引有效範圍為 11 到 M−2M-2 與 11 到 N−2N-2,迴圈條件式應寫為 i<M−1i < M - 1(或 i≤M−2i \le M - 2)及 j<N−1j < N - 1(或 j≤N−2j \le N - 2)。
  • 陳述式運算式(Statement Expression)規範:題目明定「無論採用 C/C++ 或 Java 撰寫程式皆可達成」。在 C/C++ 中,任意運算式加上分號皆可構成合法陳述(如 0;);但在 Java 語言規範(JLS §14.8)中,只有賦值(Assignment)、遞增/遞減、方法調用與物件建立運算式才可作為獨立陳述。因此,若有獨立陳述空白,必須填入兩者語法皆兼容的無副作用運算式(如自體賦值 j = j 或預先賦值 B[0][j] = 0.0),或留空成為空陳述(Empty Statement ;)。
  • 浮點數除法精度:因陣列 AA 元素型態均為 double,相加後的累加和自動為 double,除數採用 4.0、6.0、9.0(或整數 4、6、9)皆會執行精準的浮點數除法,無整數除法截斷(Truncation)之虞。

解題方法

題目要求將陣列 AA 中以 A[i][j]A[i][j] 為中心的相鄰元素求平均並存入 B[i][j]B[i][j]。解題切入點為依照「頂角 →\to 上下邊界 →\to 左右邊界 →\to 內部核心」依序推導各元素的相鄰座標與除數:

1. 四個頂點角落(各 2×2=42 \times 2 = 4 個數之平均)

  • 左上角 B[0][0]B[0][0]:中心為 A[0][0]A[0][0],內部元素涵蓋列 0,10, 1 與行 0,10, 1,共計 4 個元素: B[0][0]=A[0][0]+A[0][1]+A[1][0]+A[1][1]4.0B[0][0] = \frac{A[0][0] + A[0][1] + A[1][0] + A[1][1]}{4.0}
  • 右上角 B[0][N−1]B[0][N-1]:中心為 A[0][N−1]A[0][N-1],涵蓋列 0,10, 1 與行 N−2,N−1N-2, N-1: B[0][N−1]=A[0][N−2]+A[0][N−1]+A[1][N−2]+A[1][N−1]4.0B[0][N-1] = \frac{A[0][N-2] + A[0][N-1] + A[1][N-2] + A[1][N-1]}{4.0}
  • 左下角 B[M−1][0]B[M-1][0]:中心為 A[M−1][0]A[M-1][0],涵蓋列 M−2,M−1M-2, M-1 與行 0,10, 1: B[M−1][0]=A[M−2][0]+A[M−2][1]+A[M−1][0]+A[M−1][1]4.0B[M-1][0] = \frac{A[M-2][0] + A[M-2][1] + A[M-1][0] + A[M-1][1]}{4.0}
  • 右下角 B[M−1][N−1]B[M-1][N-1]:中心為 A[M−1][N−1]A[M-1][N-1],涵蓋列 M−2,M−1M-2, M-1 與行 N−2,N−1N-2, N-1: B[M−1][N−1]=A[M−2][N−2]+A[M−2][N−1]+A[M−1][N−2]+A[M−1][N−1]4.0B[M-1][N-1] = \frac{A[M-2][N-2] + A[M-2][N-1] + A[M-1][N-2] + A[M-1][N-1]}{4.0}

2. 上下邊界(各 2×3=62 \times 3 = 6 個數之平均,迴圈遍歷行 jj)

行索引 jj 不含兩端頂點,範圍為 1≤j≤N−21 \le j \le N-2,因此迴圈條件為 j<N−1j < N - 1:

  • 上邊界 B[0][j]B[0][j]:涵蓋列 0,10, 1 與行 j−1,j,j+1j-1, j, j+1: B[0][j]=A[0][j−1]+A[0][j]+A[0][j+1]+A[1][j−1]+A[1][j]+A[1][j+1]6.0B[0][j] = \frac{A[0][j-1] + A[0][j] + A[0][j+1] + A[1][j-1] + A[1][j] + A[1][j+1]}{6.0}
  • 下邊界 B[M−1][j]B[M-1][j]:涵蓋列 M−2,M−1M-2, M-1 與行 j−1,j,j+1j-1, j, j+1: B[M−1][j]=A[M−2][j−1]+A[M−2][j]+A[M−2][j+1]+A[M−1][j−1]+A[M−1][j]+A[M−1][j+1]6.0B[M-1][j] = \frac{A[M-2][j-1] + A[M-2][j] + A[M-2][j+1] + A[M-1][j-1] + A[M-1][j] + A[M-1][j+1]}{6.0}

3. 左右邊界(各 3×2=63 \times 2 = 6 個數之平均,迴圈遍歷列 ii)

列索引 ii 不含兩端頂點,範圍為 1≤i≤M−21 \le i \le M-2,因此迴圈條件為 i<M−1i < M - 1:

  • 左邊界 B[i][0]B[i][0]:涵蓋列 i−1,i,i+1i-1, i, i+1 與行 0,10, 1: B[i][0]=A[i−1][0]+A[i−1][1]+A[i][0]+A[i][1]+A[i+1][0]+A[i+1][1]6.0B[i][0] = \frac{A[i-1][0] + A[i-1][1] + A[i][0] + A[i][1] + A[i+1][0] + A[i+1][1]}{6.0}
  • 右邊界 B[i][N−1]B[i][N-1]:涵蓋列 i−1,i,i+1i-1, i, i+1 與行 N−2,N−1N-2, N-1: B[i][N−1]=A[i−1][N−2]+A[i−1][N−1]+A[i][N−2]+A[i][N−1]+A[i+1][N−2]+A[i+1][N−1]6.0B[i][N-1] = \frac{A[i-1][N-2] + A[i-1][N-1] + A[i][N-2] + A[i][N-1] + A[i+1][N-2] + A[i+1][N-1]}{6.0}
🔒

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

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

免費註冊

第 三 題25 分

假設已經將某位考生的單一科目分數輸入到變數 int nScoreint\ nScore 中,並確定其值介於 0∼1000\sim100 之間。請依下列各子題要求,分別撰寫出程式片段,將該分數轉換為等級 char Gradechar\ Grade,使得 GradeGrade 與 nScorenScore 的對應如下:

AA:90~100

BB:80~89

CC:70~79

DD:60~69

EE:0~59

作答時可以使用 C/C++、Java 或 C# 任一種語言作答,但必須註明所採用的語言。

(一) 使用 if…else if…else if…。

(二) 使用 switch,且 case 標籤(label)須盡量精簡。

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

這一題的完整詳解

核心觀念

本題旨在評量結構化程式設計中條件分支控制結構的掌握度與程式碼精簡能力,核心考點包含:

  1. 多向條件分支(Multi-way Selection):熟練運用 if...else if...else 語法,並掌握條件式由上而下循序評估、互斥執行的特性。
  2. switch 語句與標籤精簡(Label Minimization):理解 switch 只能針對整數或字元型別之特定離散常數進行比對。面對連續區間時,必須運用「整數除法(截斷小數)」將連續分數降維映射為離散的級距商數(0∼100 \sim 10)。
  3. 貫穿特性(Fall-through)與預設分支(default):在 switch 語句中利用無 break 的連續標籤合併輸出,並藉由題目「確定分數介於 0∼1000 \sim 100」的前提,利用 default 統整其餘區間。

解題方法

本題選用國家考試最常見且通用的 C/C++ 語言作答(其邏輯與語法亦完全通用於 Java 與 C#)。

(一) if...else if...else 之解題思維

條件判斷採取「單向降序評估」策略:

  1. 分數由高至低依序比對門檻值(90,80,70,6090, 80, 70, 60)。
  2. 當前述條件不成立進入下一個 else if 時,語意上已隱含「nScore<前一門檻nScore < \text{前一門檻}」的先決條件。因此,後續分支僅需檢查下限(如 nScore >= 80),無須撰寫冗餘的上限條件(如 nScore <= 89),使程式碼簡潔高效。
  3. 未達 6060 分之情況(即 0∼590 \sim 59 分),直接落入最後的 else 分支處理。

(二) switch 標籤極簡化之解題思維

若直接以 nScorenScore 作為 switch 的判斷運算式,需要羅列 101 個 case 標籤(0∼1000 \sim 100),嚴重違反題意「case 標籤須盡量精簡」之要求。

  1. 整數除法映射:利用整數除法截斷個位數的特性,以 nScore / 10 作為 switch 判斷運算式:
  • 100/10=10100 / 10 = 10
  • 90∼99/10=990 \sim 99 / 10 = 9
  • 80∼89/10=880 \sim 89 / 10 = 8
  • 70∼79/10=770 \sim 79 / 10 = 7
  • 60∼69/10=660 \sim 69 / 10 = 6
  • 0∼59/10=0∼50 \sim 59 / 10 = 0 \sim 5
  1. 標籤合併與預設值:
  • 90∼10090 \sim 100 分對應商數 1010 與 99,利用 case 10: 貫穿(fall-through)至 case 9: 合併指派 Grade = 'A'。
  • 80∼89,70∼79,60∼6980 \sim 89, 70 \sim 79, 60 \sim 69 分別對應 case 8:, case 7:, case 6:,執行完指派後加上 break; 跳出。
  • 因題目已保證 nScorenScore 落在 0∼1000 \sim 100 之間,商數為 0∼50 \sim 5 的所有情況直接由 default: 統一收尾指派 Grade = 'E',省去逐一列出 case 0 至 case 5,達成標籤最大化精簡。

評析與常見寫法檢驗

🔒

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

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

免費註冊

第 四 題25 分

假設已經將一個班級 50 位同學的程式設計概要成績記錄在有 50 個元素的 int 陣列 nScoresnScores 中,且確定每個元素的值均介於 0∼1000\sim100 之間。

當要找出全班最高分(儲存於 nMaxnMax)及其在陣列的註標(index)(儲存於 iMaxiMax)、全班最低分(儲存於 nMinnMin)及其在陣列的註標(儲存於 iMiniMin)(有多個最高分或最低分時,找出第一個即可);並計算全班的總平均於 AvgAvg 時,無論使用 C/C++、Java 或 C# 撰寫程式,都可以用下列程式片段達成任務。

請為每一空白處填入一運算式(Expression)完成該程式片段。作答時須完整寫出此程式片段,並於填空處加底線標示,且不能更改此程式片段。

int nMax=____;int\ nMax=\_\_\_\_; int iMax=____;int\ iMax=\_\_\_\_; int nMin=____;int\ nMin=\_\_\_\_; int iMin=____;int\ iMin=\_\_\_\_; int nSum=____;int\ nSum=\_\_\_\_; double Avg;double\ Avg; for (int i=0; ____; i++)\text{for }(int\ i=0;\ \_\_\_\_;\ i++)

{

\_\_\_\_;

\text{if }(\_\_\_\_)
{
    \_\_\_\_;

    \_\_\_\_;

    $nMax=\_\_\_\_;$

    $iMax=\_\_\_\_;$
}

\text{if }(\_\_\_\_)
{
    \_\_\_\_;

    $nMin=\_\_\_\_;$

    $iMin=\_\_\_\_;$
}

$nSum+=\_\_\_\_;$

}

Avg=____;Avg=\_\_\_\_;

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

這一題的完整詳解

核心觀念

本題評量陣列單迴圈尋訪(Linear Scan / Traversal)於多種 C-family 語言(C/C++、Java、C#)中的共通實作能力,核心觀念包含:

  1. 極值演算法與邊界哨兵值(Sentinel Value):在單次尋訪中同步維護最大值與最小值及其註標(Index),初始值必須依據題意數值範圍設定極端哨兵值,或以陣列首項作為初始基準。
  2. 關係運算子(Relational Operators)與重複值取捨:依題意「有多個最高分或最低分時,找出第一個即可」,判斷條件必須使用嚴格不等號(> 與 <),不得使用包含等於的運算子(>= 與 <=)。
  3. 型態轉換與整數除法截斷(Integer Division Truncation):總分 nSum 與人數 50 皆為 int,若直接相除會無條件捨去小數點以下數值;欲賦值給 double Avg,必須進行顯式型態轉換(Explicit Type Casting)或使用浮點數除數,使運算式提升(Type Promotion)為浮點數除法。
  4. 空敘述(Empty Statement)之語言相容性:在 C/C++、Java、C# 語法中,單一分號 ; 代表合法的空敘述,不執行任何運算。

解題方法

1. 變數初始值設定

題目已知 50 位同學成績儲存於 nScores[0] 至 nScores[49],且成績均介於 0∼1000 \sim 100 之間:

  • 最高分 nMax 與註標 iMax:
  • 初始值設為比可能範圍下限更小的值(哨兵值法):nMax=−1nMax = -1(或 00),iMax=−1iMax = -1(或 00)。當掃描到任何介於 0∼1000 \sim 100 的有效成績時,皆能正確觸發更新。
  • 或取陣列第 0 個元素為基準(首項基準法):nMax=nScores[0]nMax = nScores[0],iMax=0iMax = 0。
  • 最低分 nMin 與註標 iMin:
  • 初始值設為比可能範圍上限更大的值(哨兵值法):nMin=101nMin = 101(或 100100),iMin=−1iMin = -1(或 00)。任何有效成績皆小於 101101,確保能觸發更新。
  • 或取陣列第 0 個元素為基準(首項基準法):nMin=nScores[0]nMin = nScores[0],iMin=0iMin = 0。
  • 累加器 nSum:加法的單位元素(Identity Element)為 0,故初始值必須設為 00。

2. 迴圈終止條件

陣列大小為 50,註標由 00 起算至 4949。迴圈計數器為 int i = 0,條件應填入 i < 50(或 i <= 49)。

3. 極值與註標更新條件

  • 最高分:nScores[i] > nMax
  • 使用嚴格大於 >。當後續出現同分時,條件不成立,不會覆蓋原先已記錄的第一個註標,滿足「取第一個最高分」的要求。
  • 成立時更新:nMax=nScores[i]nMax = nScores[i];iMax=iiMax = i。
  • 最低分:nScores[i] < nMin
  • 使用嚴格小於 <。同理,後續若有相同最低分,不會覆蓋前值,滿足「取第一個最低分」的要求。
  • 成立時更新:nMin=nScores[i]nMin = nScores[i];iMin=iiMin = i。

4. 總分累加

每次迴圈將當前學生成績累計至總分:nSum += nScores[i];。

5. 全班總平均計算

全班人數為 50,總平均計算公式為: Avg=nSum50Avg = \frac{nSum}{50} 由於 nSum 與 50 均為 int,若寫 nSum / 50 會觸發整數除法而遺失小數。跨語言相容之標準寫法為:

  • (double)nSum / 50
  • 或 (double)nSum / 50.0
  • 或 nSum / 50.0

6. 骨架中獨立空白行 ____; 的處理說明

本題給定骨架於迴圈本體及條件敘述內留有若干 ____; 行。在 C/C++、Java、C# 規格中,獨立分號 ; 本身即為合法的「空敘述」(Empty Statement),不執行任何操作。在此處留空(僅保留分號)或填入無副作用的合法運算式,均不影響程式邏輯與執行結果。


填空考點與語法分析

填空位置填入運算式(推薦解答)考點解析與評分依據
🔒

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

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

免費註冊

其他考古題