114 地方特考四等 資訊處理類科 程式設計概要 考古題詳解

114 年・地方特考・四等・資訊處理類科
試題代碼 程式設計概要

第 一 題20 分

給定 n×mn\times m(nn 行 mm 列)影像的各像素灰度值,灰度值為 00 至 255255 之間的整數(包含 00 和 $255)。像素的相鄰性是指當前像素與周邊像素的鄰接性質。

八鄰域(eight neighbors)包括對應當前像素位置的上、下、左、右、左上、右上、左下、右下像素位置。換言之,為原像素及其上下左右與對角線相鄰的八個像素位置,如下圖所示:

🖼️【此處有附圖,請對照原卷】

當對此影像進行降低雜訊的模糊化處理時:

  1. 影像四周最外側的像素灰度值不變。
  2. 影像中間各像素的新灰度值,由原像素及其八鄰域像素原灰度值的平均值(捨入到最接近的整數)取代原像素值。

輸入資料第一行包含兩個整數 nn 和 mm,表示影像中像素點的行數和列數,1≤n≤1001\le n\le 100,1≤m≤1001\le m\le 100。接下來輸入 nn 行,每行 mm 個整數,表示影像中每個像素的灰度值。相鄰兩個整數之間用單個空格隔開,每個元素均在 0∼2550\sim255 之間。

例如,一個 5×65\times6 影像及其各像素灰度值如下:

1000120050705011020000180705010012020001501205050100101011005012030\begin{matrix} 100 & 0 & 120 & 0 & 50 & 70\\ 50 & 110 & 200 & 0 & 0 & 180\\ 70 & 50 & 100 & 120 & 200 & 0\\ 150 & 120 & 50 & 50 & 100 & 10\\ 10 & 110 & 0 & 50 & 120 & 30 \end{matrix}

請使用 Java 或 C++ 實作一完整程式,讀入一個影像行數、列數和像素灰度值,並使用八鄰域像素灰度值對影像進行降低雜訊的模糊化處理,再輸出模糊化後影像。

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

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

這一題的完整詳解

核心觀念

本題考「二維陣列」與「影像平滑化」。對每個非邊界像素,取它所在位置周圍 3×33\times3 區域的灰度值,也就是中心像素加上八個鄰近像素,共九個值,計算平均後四捨五入為整數。

邊界像素維持原值,不參與更新。計算新值時必須使用原始影像資料,避免前面更新過的像素影響後續平均。

解題方法

先將輸入影像存入二維陣列 a,再將 a 複製到結果陣列 b。逐一處理非邊界位置 (i, j):

  1. 累加 a[i-1..i+1][j-1..j+1] 的九個灰度值。
  2. 將平均值四捨五入後存入 b[i][j]。
  3. 輸出 b。

九個整數的總和為 sum,平均值為 sum9\frac{sum}{9}。四捨五入可用整數運算:

⌊sum+49⌋\left\lfloor\frac{sum+4}{9}\right\rfloor

因為除數為 99,整數總和除以 99 不會剛好得到以 0.50.5 結尾的平均值,所以此式能正確完成四捨五入。

C++ 程式

🔒

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

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

免費註冊

第 二 題20 分

請問以 a(7,20)a(7,20) 呼叫下列 a()a() 函式,函式執行完後其回傳值為何?並需詳述執行過程。

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;
    }
}

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

這一題的完整詳解

核心觀念

本題考遞迴函式的執行與回傳值。每次呼叫函式時,會依照參數 nn、mm 的條件選擇分支;遇到 return 遞迴呼叫結果加上某個值時,必須先完成該遞迴呼叫,再將結果逐層加回。

解題方法

先追蹤遞迴呼叫的參數變化,直到遇到不再遞迴的基底情況,再由最深層逐層回傳。

起始呼叫為 a(7,20)a(7,20):

  1. 當 n<10n<10 時,執行 return a(n + 1, m) + n,因此 nn 逐次增加,並累加原本的 nn:
a(7,20)=a(8,20)+7=a(9,20)+8+7=a(10,20)+9+8+7\begin{aligned} a(7,20) &= a(8,20)+7\\ &= a(9,20)+8+7\\ &= a(10,20)+9+8+7 \end{aligned}
  1. 當 n=10n=10 時,因為 m=20≥16m=20\ge16,執行 return a(n, m - 2) + m。此分支維持 n=10n=10,每次將 mm 減少 22,並累加原本的 mm:
🔒

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

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

免費註冊

第 三 題20 分

若以 f(30)f(30) 呼叫下列 f()f() 函式,會列印出那些數字?

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 等於 11 時,迴圈結束。

解題方法

從初始值 n=30n=30 開始,逐次計算 n % 3,依條件更新:

  • 餘數為 11:令 n=n+2n=n+2。
  • 餘數為 22:令 n=n+1n=n+1。
  • 餘數為 00:令 n=n/3n=n/3。

每次更新後都會立刻列印新值。過程如下:

目前的 nnn%3n \% 3更新方式更新後的 nn
30030/330/310
10110+210+212
12012/312/34
🔒

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

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

免費註冊

第 四 題20 分

給定下列程式,其中 tt 被宣告為全域變數,請問程式執行後輸出為何?

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。

解題方法

依程式執行順序追蹤輸出:

  1. main 先輸出全域變數 t,因此輸出 10,。
  2. 呼叫 sum(t),所以 a 初值為 10,函式內區域變數 t 初值為 20。
  3. 迴圈每次執行前檢查 a >= 0,每輪結束時令 a = a - 5。
🔒

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

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

免費註冊

第 五 題20 分

單鏈結串列(Singly Linked List)的特點是鏈結串列的連結方向為單向,對單鏈結串列的訪問要通過從頭部開始,依序往下讀取。每個節點(node)包含兩部分:存儲數據的資料(data)和指向下一個節點的指標(pointer)。

節點定義如下:

struct Node {
    int data;
    struct Node *next;
};

單鏈結串列中的所有節點通過指標串聯,最後一個節點的指標指向空值(null),表示單鏈結串列結尾。

請使用 Java 或 C++ 實作一完整程式,通過從頭部(head)開始,依序往下讀取,訪問一單鏈結串列操作,輸出單鏈結串列中節點個數。若單鏈結串列中不存在任何節點,為一個空鏈結串列,則輸出 −1-1。

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

這一題的完整詳解

核心觀念

單鏈結串列的每個節點包含資料欄位 data 與指向下一個節點的指標 next。head 指向第一個節點;最後一個節點的 next 為空值 nullptr。從 head 開始沿著 next 逐節點走訪,即可計算節點數量。

解題方法

使用計數器 count 記錄已走訪的節點數。每走到一個節點,就將 count 加一,再把目前指標移至下一個節點;直到指標為空值,代表已走訪完整個串列。

空串列的 head 一開始就是空值,節點數為 00;依題意,此時輸出 −1-1。若串列非空,則輸出實際計數。

C++ 完整程式

🔒

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

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

免費註冊

其他考古題