2019q3 第 9 週測驗題

目的: 檢驗學員對 C 語言程式設計的認知


測驗 1

碎形是相當有趣的題材,參見影片 隨機過程產生的完美圖騰

考慮以下 Sierpiński triangle 的實作程式碼 (tri.c):

#include <stdio.h>
#define S 78
#define SPACE (char) 32

static int out[S][S] = {0};
int triangle(int i) {
    static int j = 0;
    out[0][S/2] = KK1;
    for (; i < S; i++)
        out[j + KK2][i + KK3] = putchar(SPACE | (out[j][i + KK4] ^ out[j][i]));
    if (++j < 31)
        return triangle(puts(""));
    return 0;
}

int main() {
    return triangle(1);
}

假設終端機至少寬 81 個字元,高 44 個字元,且字型都為等寬等高,上述程式碼在執行時期可輸出下方的 ASCII Art,其中白色前景為 ! (驚嘆號) 字元:

請補完程式碼。

參考資料:

  1. 碎形專題 一 從 Cantor 集到碎形
  2. 碎形之 Sierpinski 三角形
  3. 遞迴、碎形與數學
  4. 碎形影像壓縮 / 圖像處理: 碎形壓縮

人家高中就懂這麼多,我們繼續在學店有搞頭嗎?

作答區

KK1 = ?

  • (a) (-2)
  • (b) (-1)
  • (c) 0
  • (d) 1
  • (e) 2

KK2 = ?

  • (a) (-2)
  • (b) (-1)
  • (c) 0
  • (d) 1
  • (e) 2

KK3 = ?

  • (a) (-2)
  • (b) (-1)
  • (c) 0
  • (d) 1
  • (e) 2

KK4 = ?

  • (a) (-2)
  • (b) (-1)
  • (c) 0
  • (d) 1
  • (e) 2

延伸問題:

  1. 解釋程式運作原理,指出原程式的缺失並強化;
  2. 研讀 碎形呈現演算法,嘗試透過 PNG 或 SVG 輸出 Sierpiński triangle 連續延伸的圖片;
  3. 改寫上述程式碼為非遞迴,即 iterative 形式;