# [2019q3](http://wiki.csie.ncku.edu.tw/sysprog/schedule) 第 9 週測驗題 :::info 目的: 檢驗學員對 C 語言程式設計的認知 ::: --- ### 測驗 `1` 碎形是相當有趣的題材,參見影片 [隨機過程產生的完美圖騰](https://youtu.be/kfXl5fsVBVY) ![](https://i.imgur.com/IOPVxvB.png)。 考慮以下 [Sierpiński triangle](https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle) 的實作程式碼 (`tri.c`): ```cpp #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](https://www.asciiart.eu/),其中白色前景為 `!` (驚嘆號) 字元: ![](https://i.imgur.com/s8Gipvt.png) 請補完程式碼。 參考資料: 1. [碎形專題 一 從 Cantor 集到碎形](https://web.math.sinica.edu.tw/math_media/d251/25101.pdf) 2. [碎形之 Sierpinski 三角形](https://openhome.cc/Gossip/OpenSCAD/Fractal.html) 3. [遞迴、碎形與數學](https://www.ithome.com.tw/voice/110732) 4. [碎形影像壓縮](https://activity.ntsec.gov.tw/activity/race-1/38/pdf/38h/222.pdf) / [圖像處理: 碎形壓縮](https://www.twblogs.net/a/5c224b1dbd9eee16b4a776b4) > 人家高中就懂這麼多,我們繼續在學店有搞頭嗎? ==作答區== 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 :::success 延伸問題: 1. 解釋程式運作原理,指出原程式的缺失並強化; 2. 研讀 [碎形呈現演算法](http://rportal.lib.ntnu.edu.tw/bitstream/20.500.12235/93120/3/020903.pdf),嘗試透過 PNG 或 SVG 輸出 [Sierpiński triangle](https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle) 連續延伸的圖片; 3. 改寫上述程式碼為非遞迴,即 iterative 形式; ::: ---