題目要求:
感謝大家的回覆,後來做出來了,再改良過後的結果如下:
注意他的輸入,範例是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 的迴圈
然後在裡面判斷目前是在那一部份
再印出對應的字元
結果如下圖