iT邦幫忙

1

#C 輸出並列的樹

  • 分享至 

  • xImage

題目要求:

  1. 以輸出字串的方式繪出聖誕樹,樹葉及樹幹由 '*' 代表,背景由 '-' (減號)代表,樹幹位於樹的中央。
  2. 該輸入數字代表樹葉的高度(H),樹幹部分的長度為H/2的整數。樹的寬度為H2-1。
  3. 使用者需一次輸入 3 棵樹的高度。
  4. 當程式檢查到使用者所輸入的其中一個值為非數值或非 3~13 的奇數時,程式會要求使用者全部重新輸入。
  5. 程式並列印出使用者輸入的三個高度的聖誕樹樹,樹與樹之間需有空格。

感謝大家的回覆,後來做出來了,再改良過後的結果如下:
https://ithelp.ithome.com.tw/upload/images/20230403/20159122YTyIsUUmaX.jpg

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
alien663
iT邦研究生 3 級 ‧ 2023-03-28 09:10:39

注意他的輸入,範例是3 5 7,但實際上可能會是更多樣化的,不能直接固定抓三個變數,應該是要:

  1. 將輸入用字串抓取
  2. 用空白split
  3. 轉型態為int

然後抓輸入的最大值(計算總高n),以及計算每個輸入該有的寬度(m),並加總起來。
for loop跑n*m,*-的控制使用flag去判斷,例如:立旗時印*,其他狀況印-

/*
--*-- ----*---- ------*------ 
-***- ---***--- -----***----- 
***** --*****-- ----*****---- 
--*-- -*******- ---*******--- 
      ********* --*********-- 
      ----*---- -***********- 
      ----*---- ************* 
                ------*------ 
                ------*------ 
                ------*------ 
*/
zori_nana iT邦新手 5 級 ‧ 2023-03-29 00:42:14 檢舉

感謝解題思路!

3
wiseguy
iT邦超人 1 級 ‧ 2023-03-28 10:25:22

寫程式思維不是這樣頭痛醫頭、腳痛醫腳的。先思考:

  1. 你會畫一棵樹了嗎?先畫一棵試試。
  2. 會把樹 print 出來,那存到陣列OK嗎?
  3. 會存到陣列,那把陣列再印出來OK嗎?
  4. 既然一棵樹會畫了,那三棵樹不就畫三次?
  5. 既然會把陣列印出了,那並排印出有什麼難?巢狀迴圈多一層而已,這不就解題了嗎?

如果這樣還不過癮,那麼再繼續思考:

  1. 比對一下畫三棵樹的迴圈,如何合併可以在一圈內就完成三棵
  2. 如何在一個陣列裡存三棵樹?

寫程式要有解題邏輯,分解問題再一步一步解決問題,這叫 Divide and conquer。

zori_nana iT邦新手 5 級 ‧ 2023-03-29 00:43:10 檢舉

感謝解題方法,會再嘗試!

2
淺水員
iT邦大師 6 級 ‧ 2023-03-28 14:38:29

畫了一張圖,也許可以這樣想

https://ithelp.ithome.com.tw/upload/images/20230328/201129436XdC3iEaLe.png

#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;
}
zori_nana iT邦新手 5 級 ‧ 2023-03-29 00:44:46 檢舉

感謝解題!

0
wup926
iT邦新手 3 級 ‧ 2023-03-29 08:01:47

.

wup926 iT邦新手 3 級 ‧ 2023-03-29 08:06:23 檢舉

.

0
海綿寶寶
iT邦大神 1 級 ‧ 2023-03-30 00:21:53

原本的10列是
3+1+6
5+2+3
7+3
要先合併成 1..10 的迴圈
然後在裡面判斷目前是在那一部份
再印出對應的字元

結果如下圖
https://ithelp.ithome.com.tw/upload/images/20230330/20001787HB1cNk1sVi.png

zori_nana iT邦新手 5 級 ‧ 2023-03-31 13:50:00 檢舉

感謝!

我要發表回答

立即登入回答