前言
畫星星的問題在網路上真的是被問到爛掉,
最後寫了這篇主要教怎麼解星星的問題,
下面的例子是以等腰三角形為例,
如果整個分析流程都會的話,
接下來要畫什麼直角三角度、菱形都不是問題了
就是不要問我 C 語言能不能畫出林志玲出來
那也要我有繪畫的天份才行
我們分析的時候,以下面的圖形為例在做說明..
分析
以上面為例,假設要畫高度為 N 的等腰三角度,此處的 N 暫用 5 代替
1. 我們可以發現,它總共有 N 行,等於是換了 N 次行,於是我們可以寫下來了..
for(i=1; i<=N; i++){
// 總共 N 行
printf("\n");
}
2. 接著我們把注意力放在圖形左半邊紅色部份,
第 1 行 -> 4個空格
第 2 行 -> 3個空格
第 3 行 -> 2個空格
....
第 i 行 -> N - i 個空格
於是我們又可以再寫下來了..
for(i=1; i<=N; i++){
// 第 i 行印出第一個 * 前,
// 先印出 N-i 個空白
for(j=1; j<=N-i; j++) printf(" ");
.........
// 總共 N 行
printf("\n");
}
3. 接著我們把注意力放在圖形中間淡藍色部份,
第 1 行 -> 1個*
第 2 行 -> 3個*
第 3 行 -> 5個*
.....
第 i 行 -> 2i-1個 *
接著我們又可以繼續寫下來了
for(i=1; i<=N; i++){
// 第 i 行印出第一個 * 前,
// 先印出 N-i 個空白
for(j=1; j<=N-i; j++) printf(" ");
// 第 i 行有 2i-1 個 *
for(j=1; j<= 2*i-1 ; j++) printf("*");
// 總共 N 行
printf("\n");
}
打完收工。完整的 code 如下所示:
#include <stdio.h>
#define N 5
int main()
{
int i=0, j=0;
for(i=1; i<=N; i++){
// 第 i 行印出第一個 * 前,
// 先印出 N-i 個空白
for(j=1; j<=N-i; j++) printf(" ");
// 第 i 行有 2i-1 個 *
for(j=1; j<= 2*i-1 ; j++) printf("*");
// 總共 N 行
printf("\n");
}
return 0;
}
其實畫星星的問題都一樣,
"常見"的都是外層回圈包二個內層回圈
再加上 if-else 的判斷,幾乎什麼圖形都畫得出來了
外層回圈大多是換行,
第一個內層回圈大多是 "印出 *" 之前的空白數
第二個內層回圈大多是 "要印出幾個 *"
當然還有些圖型要加上 if-else 方式去完成,
但分析技巧都是由上面三個步驟下來的..
下面有四個圖形,就當作是自己另一個練習
個人覺得難度為 (圖2 = 圖3) > (圖1) > (圖4),
可以依序做練習,
如果下面圖畫不出來的話,
那請再好好參考上面整個分析的流程
加油!!!
