題目要求:
感謝大家的回覆,後來做出來了,再改良過後的結果如下:
注意他的輸入,範例是3 5 7,但實際上可能會是更多樣化的,不能直接固定抓三個變數,應該是要:
然後抓輸入的最大值(計算總高n),以及計算每個輸入該有的寬度(m),並加總起來。
for loop跑n*m,*和-的控制使用flag去判斷,例如:立旗時印*,其他狀況印-。
/*
--*-- ----*---- ------*------ 
-***- ---***--- -----***----- 
***** --*****-- ----*****---- 
--*-- -*******- ---*******--- 
      ********* --*********-- 
      ----*---- -***********- 
      ----*---- ************* 
                ------*------ 
                ------*------ 
                ------*------ 
*/
寫程式思維不是這樣頭痛醫頭、腳痛醫腳的。先思考:
如果這樣還不過癮,那麼再繼續思考:
寫程式要有解題邏輯,分解問題再一步一步解決問題,這叫 Divide and conquer。
畫了一張圖,也許可以這樣想

#include <stdio.h>
void printPart(int radius, int row)
{
    int i;
    if (row < radius) {
        // 畫樹葉
        for (i = 1 - radius; i < radius; ++i) {
            putchar(-row <= i && i <= row ? '*' : '-');
        }
    } else if (row < radius + radius / 2) {
        // 畫樹幹
        for (i = 1 - radius; i < radius; ++i) {
            putchar(i == 0 ? '*' : '-');
        }
    } else {
        // 留空白
        for (i = 1 - radius; i < radius; ++i) {
            putchar(' ');
        }
    }
}
int main()
{
    int radiusArray[] = { 3, 5, 7 };
    int arraySize, maxRadius, nRows;
    int rowIdx, treeIdx, i;
    // 取得陣列大小
    arraySize = sizeof(radiusArray) / sizeof(*radiusArray);
    // 取得最大半徑
    for (i = maxRadius = 0; i < arraySize; ++i) {
        if(maxRadius < radiusArray[i]) {
            maxRadius = radiusArray[i];
        }
    }
    // 計算共需要幾列
    nRows = maxRadius + maxRadius / 2;
    // 開始印樹
    for (rowIdx = 0; rowIdx < nRows; ++rowIdx) {
        for (treeIdx = 0; treeIdx < arraySize; ++treeIdx) {
            if (treeIdx > 0) {
                putchar(' ');
            }
            // printPart 會根據 rowIdx 判斷要畫什麼
            printPart(radiusArray[treeIdx], rowIdx);
        }
        putchar('\n');
    }
    return 0;
}
原本的10列是
3+1+6
5+2+3
7+3
要先合併成 1..10 的迴圈
然後在裡面判斷目前是在那一部份
再印出對應的字元
結果如下圖