現我們嘗試利用 for 迴圈來寫一個可印出金字塔三角圖形,如我們要印出有六層金字塔三角圖形,則如下:
|
|
|
|
|
* |
|
|
|
|
|
|
|
|
|
* |
* |
* |
|
|
|
|
|
|
|
* |
* |
* |
* |
* |
|
|
|
|
|
* |
* |
* |
* |
* |
* |
* |
|
|
|
* |
* |
* |
* |
* |
* |
* |
* |
* |
|
* |
* |
* |
* |
* |
* |
* |
* |
* |
* |
* |
方法一:
首先,我們來分析一下該圖的邏輯特性,由圖我們可知道 * 是由三角形中軸線向左右二邊逐一擴展,第一層只有一個 *,而每增加一層,就向左右再各加一個 *,至最底層時左邊和右邊各增加了 (層數-1) 個 *,所以最底層的總 * 數為 ((總層數-1)X2-1) 個,亦即為 (總層數X2-1) 個,在此,我們可把整張圖看作橫向有(總層數X2-1)個格子,縱向有(總層數)個格子。中軸線位置即是在第(總層數)格子。
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
|
層 |
* |
開始 |
結束 |
|
|
|
|
|
* |
|
|
|
|
|
|
1 |
1 |
6 |
6 |
|
|
|
|
* |
* |
* |
|
|
|
|
|
2 |
3 |
5 |
7 |
|
|
|
* |
* |
* |
* |
* |
|
|
|
|
3 |
5 |
4 |
8 |
|
|
* |
* |
* |
* |
* |
* |
* |
|
|
|
4 |
7 |
3 |
9 |
|
* |
* |
* |
* |
* |
* |
* |
* |
* |
|
|
5 |
9 |
2 |
10 |
* |
* |
* |
* |
* |
* |
* |
* |
* |
* |
* |
|
6 |
11 |
1 |
11 |
|
|
|
|
中軸 |
|
|
L:總層數 |
i |
iX2-1 |
L-i+1 |
L+i-1 |
由上分析,這是一個2D的圖形,要產生這圖形必須有二個迴圈,第一個迴圈控制層數,第二個迴圈則控制每一層的點輸出,並判斷在那一格子該印出空白,那一格子該印出 * 。假設總層數為 L,則第一層印出 * 的格子位置即第 L 格,第二層印出 * 的格子位置即第則由 L-1 到 L+1 的格,第三層印出 * 的格子位置即第則由 L-2 到 L+2 的格,餘類推。現我們再把印到第幾層以 i 來表示那一層,放入要印出 * 的格子位置的判斷中,在第二層 (i=2) 原向左邊擴展的起始格子為L-1,加入 i 層的考量時可修改為 L-i+1,原向右邊擴展的結束格子為L+1,加入 i 層的考量時可修改為 L+i-1。
各層 * 格數 = (i X 2) - 1
各層 * 開始位置 = L - i + 1
各層 * 結束位置 = L + i - 1
依此我們即可撰寫如下程式,執行結果會如我們的需求。
/* For 迴圈練習 * 利用 for 迴圈來寫一個可印出金字塔三角形圖形 */ import java.util.Scanner;
public class For01 { public static void main(String[] args) { System.out.println("請輸入一正整數"); Scanner scan = new Scanner(System.in); int level = scan.nextInt(); String str; if (level < 0) { System.err.println("輸入的數值必須大於 0"); System.exit(1); } for (int i=1; i<=level; i++) // 層數,縱向掃描 { for (int j=1; j<=level*2-1; j++) // 橫向掃描 { // level-i+1 為印 * 左向的起始點 // level+i-1 為印 * 右向的結束點 if ((j >= level-i+1) & (j <= level+i-1)) str = "*"; else str = " "; System.out.print(str); } System.out.println(); } } } |
方法二:
|
|
|
|
|
|
|
|
|
|
|
|
層 |
空白 |
* |
總格數 |
|
|
|
|
|
* |
|
|
|
|
|
|
1 |
5 |
1 |
6 |
|
|
|
|
* |
* |
* |
|
|
|
|
|
2 |
4 |
3 |
7 |
|
|
|
* |
* |
* |
* |
* |
|
|
|
|
3 |
3 |
5 |
8 |
|
|
* |
* |
* |
* |
* |
* |
* |
|
|
|
4 |
4 |
7 |
9 |
|
* |
* |
* |
* |
* |
* |
* |
* |
* |
|
|
5 |
1 |
9 |
10 |
* |
* |
* |
* |
* |
* |
* |
* |
* |
* |
* |
|
6 |
0 |
11 |
11 |
由上圖及表格的分析,我們可得知,若為一個六層的三角圖形,用格子數來表示,由左邊到有*的最右邊的格數關係為,第一層會有5個空白格再加1個 * 總格數有6格,第二層會有4個空白格再加3個 * 總格數有7格,第三層會有3個空白格再加5個 * 總格數有8格,以此規則可得知,若總層數為 L,第幾層以i表示,則各層總格數、各層空白格數和各層 * 格數的關係,可用如下數學式表示:
各層總格數 = L + i - 1
各層空白格數 = L - i
各層 * 格數 = (i X 2) - 1
我們用此方法的主要程式如下:
static void method02(int level)
{
for (int i=1; i<=level; i++)
{
System.out.print(repeatStr(' ', level - i)); // 印空白
System.out.print(repeatStr('*', i * 2 - 1)); // 印 *
System.out.println();
}
}
static String repeatStr(char c, int n)
{
String s = "";
for (int i=0; i<n; i++)
s = s + c;
return s;
}