[程式設計][C_OT43-易] 繪製菱形

簡介

題目來源:e-tutor 平台

繪製菱形這題只要會迴圈指令,就可以解出。但因為邏輯上較為複雜,許多初學者會在這題卡住很久。

這篇文章分析了這題的寫法,但請注意,這篇有提示的程式碼,但沒有「完整」的程式碼。不過若是看了整篇的文章,應該是可以組合出完整的程式碼才對。

話不多說,來看看題目

輸入一個整數 H,印出對應的菱形。

例如 H=2時,菱形如下圖:

H=3 時,菱形如下圖:

分析題目

對於初學者而言,寫程式第一個要學的,就是「分解題目」,將大問題,分解成小問題。

這題可以拆成兩個子問題。

(1) 輸入 H,印出上半的三角形,以及 
(2) 輸入 H,印出下半的三角形 (如下圖)

請注意,H 代表的是菱形每邊的「星號」個數,不是三角形的高度喔!


接著就一個一個來分析吧!

問題一

問題一一樣可以「拆成子問題」。
如何印出第1列?
如何印出第2列?
如何印出第3列?…依此類推 (見下圖)




底下我們用 「變數 i」 來代表第 i 列。


每一列的工作

每一列可以再「拆成子問題」
(1) 印「空白」
(2) 印「星號」

再一個一個來看吧!

印空白

這兒的思考方式是,先列出幾個案例,例如例出 H = 2 時的狀況,H = 3 時的狀況,以及 H = 4 時的狀況,都畫在紙上,然後看看能不能找出規則

以 H = 3 為列,請見下圖:

思考點是:「空白」的個數,和變數 H 以及 i 有關嗎?


如果仔細分析了數個狀況後,大約可以得到底下的結論:


底下是對應的程式碼


印星號

一樣,也是先畫出幾個 cases,然後由其中找出對應的規則。以H = 3 為例,請見下圖。



同樣的,我們也是要推導出變數群和「星號個數」的規則。

這裏的重點是要多分析幾個案例,由案例中就可以導出規則了。

我們可以看出來,星號的個數每一次遞增兩個,第一項是 1 個。所以應該是一個等差數列。

於是我們可以導出底下的公式:


底下是對應的程式碼:


組合起來

接著我們就可以把前述的程式碼組合起來。底下的程式碼便可以印出上半部的三角形。



問題二

基本上也是依循問題一的思考方式,先拆解成「如何印每一列」的資料,然後再分解成「如何印空白」,「如何印星號」這類的子問題。




在這兒強調一下,解出問題的寫法有很多種,這兒只是其中一種寫法。

眼尖的同學可以看到,i 的值是「逆」過來的。是由2到數回1。為什麼?

簡單的說明是這樣的,因為三角形是「逆」過來,所以數字就要逆過來。

但前面的說法是胡扯!實際上是先分析了多個案例,找到規則後,發現逆過來比較容易寫。
就才是實情囉!總之這部分要花時間下去了!

印空白

一樣要分析多個案例,由其中找出規則!



應該可以分析出來,印空白的公式如下:


由於公式和「問題1」是一樣的,所以程式碼也是一樣,因此就不秀了。

印星號

也是一樣,分析多個案例,找出規則!


再次分析,一樣是可以找到底下的公式:



程式碼一樣參考「問題1」。


組合起來

底下是對應的程式碼:


結論

寫程式的幾個重點:

  • 想法子分解問題
  • 找出問題間的「規律」
  • 同樣規律的子問題便思考如何以迴圈來完成它
  • 要花時間,下苦功夫


留言

張貼留言

這個網誌中的熱門文章

由 Pandas 的 DataFrame 中取得資料

[程式設計] C++ 的字串切割

[C++]在 cin 後呼叫 getline 所遇到的問題