LV. 37
GP 3k

RE:【問題】資訊工程研究所畢業 問 都問

樓主 薯條控 BAHAMUT000
16 -

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

今天薯條老師來教印星星

首先
看清楚題目的輸入輸出

比方說今天題目長這樣

輸入
3
4
輸出
  *
 ***
*****
   *
  ***
 *****
*******

那就可以直接開始寫程式了
登愣~ https://ideone.com/rBD75v

沒 我是說
一開始先確認星星的高度跟輸入數字之間的關聯性
像是我輸入 3 所以星星總共有 3 層高度,輸入 4 有 4 層高度
輸入 n 有 n 層高度

那我為了要換行 n 次,於是可以先寫一個大的迴圈包在最外圍
讓他的目的用於換行

for (i = 0; i < n; i++) {

    printf("\n");
}

接著再觀察第一列,以輸入 3 為例子來看
"  *"  第一列的組成包含了空白和*部分

那我們從這邊就可以分成兩個部分去處理
第一個是空白部分,第二個是*部分

從空白部分來看,第一列印出2個空白,第二列印出 1 個空白,最後一列沒空白
那這樣的空白是不是會跟著每一列有某一種特定關係? 要怎麼樣找出每一列印多少空白?
先把每一列的狀況仔細寫下來

第 1 列 2 個空白: 1 (列) + 2 (空白) = 3 (高度)
第 2 列 1 個空白: 2 (列) + 1 (空白) = 3 (高度)
第 3 列 0 個空白: 3 (列) + 0 (空白) = 3 (高度)
第 i 列 j 個空白: i + j = n
可以看出有某種關係存在

接著把它移向 j = n - i 也就是要印的空白數量
不過因為 i 是從 0 開始,所以要另外再-1
變成每一次印出 n - i - 1 個空白數

那就可以再補上去印空白的部分

for (j = 0; j < (n - 1 - i) ; j++) {
    printf(" ");
}

空白完成後
剩下的就是星星的部分

星星的處理,其實思考滿直覺的
每一列印出星星的數量是 1, 3, 5, 7 這樣跳
也就是只要印出奇數數量這樣子

以前的等差公式教過我們 a_n = a_1 + (n - 1) * d
利用這則公式可以算出每一列要印出多少星星

把 a_1 = 1 (首項)
d = 2 (公差) 代入
會變成
a_n = 1 + (n - 1) * 2

實際用例子來代看看的話
n = 1, a_n = 1
n = 2, a_n = 3
n = 3, a_n = 5 ... 最後這邊的 a_n 就是我們要印出的星星數量
前面已經定義第幾列是用 i 來表示
符號換掉後會變成  a_n = 1 + (i - 1) * 2
又因為同樣的原因 i 是從第 0 列開始 所以要+1
變成 a_n = 1 + i * 2

那就可以寫下印出星星的迴圈部分

for (j = 0; j < (1 + i * 2) ; j++) {
    printf("*");
}

最後組合完的程式碼就長這樣

其他種星星變化題其實也類似
重點都在於看出規律這樣子~~
16
-
未登入的勇者,要加入討論嗎?
板務人員:

7572 筆精華,前天 更新
一個月內新增 17
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】