114 地方特考四等 資訊處理類科 程式設計概要 考古題詳解
第 一 題20 分
給定 ( 行 列)影像的各像素灰度值,灰度值為 至 之間的整數(包含 和 $255)。像素的相鄰性是指當前像素與周邊像素的鄰接性質。
八鄰域(eight neighbors)包括對應當前像素位置的上、下、左、右、左上、右上、左下、右下像素位置。換言之,為原像素及其上下左右與對角線相鄰的八個像素位置,如下圖所示:
🖼️【此處有附圖,請對照原卷】
當對此影像進行降低雜訊的模糊化處理時:
- 影像四周最外側的像素灰度值不變。
- 影像中間各像素的新灰度值,由原像素及其八鄰域像素原灰度值的平均值(捨入到最接近的整數)取代原像素值。
輸入資料第一行包含兩個整數 和 ,表示影像中像素點的行數和列數,,。接下來輸入 行,每行 個整數,表示影像中每個像素的灰度值。相鄰兩個整數之間用單個空格隔開,每個元素均在 之間。
例如,一個 影像及其各像素灰度值如下:
請使用 Java 或 C++ 實作一完整程式,讀入一個影像行數、列數和像素灰度值,並使用八鄰域像素灰度值對影像進行降低雜訊的模糊化處理,再輸出模糊化後影像。
登入後即可作答並保存紀錄。
核心觀念
本題考「二維陣列」與「影像平滑化」。對每個非邊界像素,取它所在位置周圍 區域的灰度值,也就是中心像素加上八個鄰近像素,共九個值,計算平均後四捨五入為整數。
邊界像素維持原值,不參與更新。計算新值時必須使用原始影像資料,避免前面更新過的像素影響後續平均。
解題方法
先將輸入影像存入二維陣列 a,再將 a 複製到結果陣列 b。逐一處理非邊界位置 (i, j):
- 累加
a[i-1..i+1][j-1..j+1]的九個灰度值。 - 將平均值四捨五入後存入
b[i][j]。 - 輸出
b。
九個整數的總和為 sum,平均值為 。四捨五入可用整數運算:
因為除數為 ,整數總和除以 不會剛好得到以 結尾的平均值,所以此式能正確完成四捨五入。
C++ 程式
第 二 題20 分
請問以 呼叫下列 函式,函式執行完後其回傳值為何?並需詳述執行過程。
int a(int n, int m) {
if (n >= 10) {
if (m < 16) {
return n + m;
}
else {
return a(n, m - 2) + m;
}
}
else {
return a(n + 1, m) + n;
}
}
登入後即可作答並保存紀錄。
核心觀念
本題考遞迴函式的執行與回傳值。每次呼叫函式時,會依照參數 、 的條件選擇分支;遇到 return 遞迴呼叫結果加上某個值時,必須先完成該遞迴呼叫,再將結果逐層加回。
解題方法
先追蹤遞迴呼叫的參數變化,直到遇到不再遞迴的基底情況,再由最深層逐層回傳。
起始呼叫為 :
- 當 時,執行
return a(n + 1, m) + n,因此 逐次增加,並累加原本的 :
- 當 時,因為 ,執行
return a(n, m - 2) + m。此分支維持 ,每次將 減少 ,並累加原本的 :
第 三 題20 分
若以 呼叫下列 函式,會列印出那些數字?
void f(int n) {
printf("%d\n", n);
while (n != 1) {
if ((n % 3) == 1) {
n = n + 2;
}
else if ((n % 3) == 2) {
n = n + 1;
}
else {
n = n / 3;
}
printf("%d\n", n);
}
}
登入後即可作答並保存紀錄。
核心觀念
本題考查 while 迴圈的執行順序、if-else 條件判斷,以及整數除法與餘數運算。程式先印出目前的 n,再依照 n % 3 的結果更新 n,接著印出更新後的數字;當 n 等於 時,迴圈結束。
解題方法
從初始值 開始,逐次計算 n % 3,依條件更新:
- 餘數為 :令 。
- 餘數為 :令 。
- 餘數為 :令 。
每次更新後都會立刻列印新值。過程如下:
| 目前的 | 更新方式 | 更新後的 | |
|---|---|---|---|
| 30 | 0 | 10 | |
| 10 | 1 | 12 | |
| 12 | 0 | 4 |
第 四 題20 分
給定下列程式,其中 被宣告為全域變數,請問程式執行後輸出為何?
int t = 10; // 全域變數
void sum(int a) {
int t = 20;
for (; a >= 0; a = a - 5) {
printf("%d,", t);
t = t + a;
printf("%d,", t);
}
}
int main() {
printf("%d,", t);
sum(t);
printf("%d,", t);
t = 15;
printf("%d", t);
return 0;
}
登入後即可作答並保存紀錄。
核心觀念
本題考查 區域變數遮蔽全域變數,以及函式呼叫時引數傳值的效果。
全域變數 t 初值為 10。sum 函式內也宣告了一個區域變數 t,初值為 20;在 sum 函式範圍內,名稱 t 指的是這個區域變數,因此不會改變全域變數。
呼叫 sum(t) 時,傳入的是全域變數當下的值 10,並複製給參數 a。函式中修改 a 不會改變全域變數 t。
解題方法
依程式執行順序追蹤輸出:
main先輸出全域變數t,因此輸出10,。- 呼叫
sum(t),所以a初值為10,函式內區域變數t初值為20。 - 迴圈每次執行前檢查
a >= 0,每輪結束時令a = a - 5。
第 五 題20 分
單鏈結串列(Singly Linked List)的特點是鏈結串列的連結方向為單向,對單鏈結串列的訪問要通過從頭部開始,依序往下讀取。每個節點(node)包含兩部分:存儲數據的資料(data)和指向下一個節點的指標(pointer)。
節點定義如下:
struct Node {
int data;
struct Node *next;
};
單鏈結串列中的所有節點通過指標串聯,最後一個節點的指標指向空值(null),表示單鏈結串列結尾。
請使用 Java 或 C++ 實作一完整程式,通過從頭部(head)開始,依序往下讀取,訪問一單鏈結串列操作,輸出單鏈結串列中節點個數。若單鏈結串列中不存在任何節點,為一個空鏈結串列,則輸出 。
登入後即可作答並保存紀錄。
核心觀念
單鏈結串列的每個節點包含資料欄位 data 與指向下一個節點的指標 next。head 指向第一個節點;最後一個節點的 next 為空值 nullptr。從 head 開始沿著 next 逐節點走訪,即可計算節點數量。
解題方法
使用計數器 count 記錄已走訪的節點數。每走到一個節點,就將 count 加一,再把目前指標移至下一個節點;直到指標為空值,代表已走訪完整個串列。
空串列的 head 一開始就是空值,節點數為 ;依題意,此時輸出 。若串列非空,則輸出實際計數。
C++ 完整程式