|
5-5 多重迴圈敘述
內容:
5-5-1 多重迴圈流程
多重迴圈表示迴圈內還有子迴圈,依此延伸下去。圖 5-8 是利用兩個 for 敘述構成了雙重迴圈,外迴圈利用變數 a 作為迴圈條件變數並由 1 到 10,迴圈執行一次,則累增加 1。內迴圈的條件變數是 b。也是迴圈執行一次,由 1 到 10 每次累增加 1。然而,外迴圈執行一次,則內迴圈必須由 1 到 10 執行 10 次迴圈實體。其運作情況如下:
圖 5-8 利用 for 敘述建構雙重迴圈
外迴圈執行順序 |
內迴圈執行順序 |
a = 1 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
a = 2 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
a = 3 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
a = 4 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
a = 5 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
a = 6 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
a = 7 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
a = 8 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
a = 9 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
a = 10 |
b= 1, 2, 3, 4, 5, 6, 7, 8, 9 10 |
由此範例可以看出,外迴圈實體需執行 10 次才結束,而相對的,內迴圈實體已執行了 100 次。同樣的結構敘述三重迴圈的話,最內層迴圈必須執行 1000 次、中層迴圈 100 次、而外層迴圈 10 次。利用 for 敘述建構雙重迴圈的語法與範例如下。
語法: |
範例: |
for (a=1; a<=10; a++) {
statement 1;
statement 2;
for( b=1; b<=10; b++) {
statement 3;
statement 4;
}
} |
for (j = 1; j <= 10;
j++) {
System.out.printf("
");
for (k = 1; k <=
10; k++) {
System.out.printf("*");
}
System.out.print("\n");
} |
5-5-2 範例研討:畫矩形圖程式
(A)程式功能:Ex5_8.java
請編寫一個利用星號(*)畫出矩形圖程式,使用者可以輸入選擇長與寬星號的數量,系統再畫出此大小的矩形圖;期望操作介面如下:
請輸入矩形參數:
請輸入矩形高度
=>5
請輸入矩形寬度
=>10
**********
**********
**********
**********
********** |
(B)製作技巧研討:
如果沒有透過特殊繪圖介面(如 Swing 或 Applet),利用文字終端機繪圖的話,僅能一行接一行,由左至右的繪製,就好像鍵盤輸入文字一樣。圖 5-9 為繪製本系統要求矩形的程序。首先採用兩變數作為高與寬的指標,又電腦是一行接一行繪出,因此外迴圈需利用矩形高的指標(int i);內迴圈利用寬的指標(int j)。每行開始繪製時,先畫出 4 個空格,接著再畫 8 個星號(輸入要求),完成之後,再輸出一個跳行的控制字元(\n);如此重複畫 5 行(輸入要求)。
圖 5-9 矩形繪製程序
(C)程式範例:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
//Ex5_7.java
import java.util.*;
public class Ex5_7 {
public static void main(String args[]) {
/*
宣告相關物件與變數
*/
Scanner keyin = new Scanner(System.in);
int height; //
矩形的高度
int wide; //
矩形的寬度
/*
要求輸入矩形高與寬
*/
System.out.printf("請輸入矩形高度
=>");
height = keyin.nextInt();
System.out.printf("請輸入矩形寬度
=>");
wide = keyin.nextInt();
/*
繪製矩形圖形
*/
for(int i=1; i<=height; i++) {
System.out.printf(" ");
for(int j=1; j<=wide; j++) {
System.out.printf("*");
}
System.out.printf("\n");
}
}
} |
(D) 程式重點分析:
(1)
第 20~26
行:『for(int i=1; i<=height, i++) { …}』。指定矩形高度的外迴圈,每執行一次迴圈,則繪出一行,共計執行 height(= 5)次。
(2)
第 21
行:『System.out.printf(" ");』。每行起頭繪出 4 個空格。
(3)
第 22~24
行:『for (int j=1; j<wide; j++){ ..};』。指定矩形寬度的內迴圈;每執行一次迴圈,畫出一個星號(*),共計執行 wide(= 8)次。
(4) 第 25
行:『System.out.printf("\n");』。一行畫製完成之後,送出一個跳行控制字元,準備畫製下一行。
5-5-3 自我挑戰:畫三角形程式
(A)程式功能:PM5_5.java
請製作畫右邊等齊的三角形,高度可以由使用者輸入指定,期望操作介面如下:
請輸入等邊三角形高度
=>10
*
**
***
****
*****
******
*******
********
*********
********** |
(B)製作技巧提示:
還是需要利用雙重迴圈來製作此程式,外迴圈決定三角形的高度,但需要兩個內迴圈來製作三角形的寬度,一則畫空白格;另一迴圈輸出星號,如圖 5-10 所示。虛擬碼提示如下:
圖 5-10 三角形繪製程序
…..
讀入使用者輸入高度(height);
for(int i=1; i<=height; i++) { //
外迴圈,指定高度
for(int j=1; j<=(height -i); j++) //
第
1 個內迴圈,輸出空格
System.out.printf(" ");
for(int k=1; k<=i; k++) //
第
2 個內迴圈,輸出星號
System.out.printf("*");
System.out.printf("\n"); //
換行
} |
5-5-4 自我挑戰:畫各種等邊三角形
(A)程式功能:PM5_6.java
請製作畫四種等邊三角形的圖型,高度可以由使用者輸入指定,期望操作介面如下:
請輸入等邊三角形高度
=>10
畫出左邊的等邊三角形高度:
*
**
***
****
*****
******
*******
********
*********
**********
畫出反向左邊的等邊三角形高度:
**********
*********
********
*******
******
*****
****
***
**
*
畫出右邊的等邊三角形高度:
*
**
***
****
*****
******
*******
********
*********
**********
畫出反向右邊的等邊三角形高度:
**********
*********
********
*******
******
*****
****
***
**
* |
(B)製作技巧提示:
01
02
03
04
05
06
07
08
09
10
11
12 |
….
System.out.printf("畫出反向左邊的等邊三角形高度:\n");
for(int
i=0;
i<height;
i++)
{
for(int
j=0;
j<i;
j++)
{
System.out.printf("
");
}
for(int
k=0;
k<(height-i);
k++)
{
System.out.printf("*");
}
System.out.printf("\n");
}
…. |
5-5-5 自我挑戰:畫菱形圖型
(A)程式功能:PM5_7.java
請製作畫菱形的圖型,高度可以由使用者輸入指定,期望操作介面如下:
請輸入等邊三角形高度
=>10
畫出左邊的等邊三角形高度:
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********** **********
********** **********
********* *********
******** ********
******* *******
***** *****
**** ****
*** ***
** **
* * |
(B)製作技巧提示:(請自行思考)
5-5-6 範例研討:for 列印九九乘法表
(A)程式功能:Ex5_9.java
請利用 for
雙重迴圈,製作九九乘法表,期望輸出格式如下:
2*1= 2 3*1= 3 4*1= 4 5*1= 5 6*1=
6 7*1= 7 8*1= 8 9*1= 9
2*2= 4 3*2= 6 4*2= 8 5*2=10 6*2=12
7*2=14 8*2=16 9*2=18
2*3= 6 3*3= 9 4*3=12 5*3=15 6*3=18
7*3=21 8*3=24 9*3=27
2*4= 8 3*4=12 4*4=16 5*4=20 6*4=24
7*4=28 8*4=32 9*4=36
2*5=10 3*5=15 4*5=20 5*5=25 6*5=30
7*5=35 8*5=40 9*5=45
2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
7*6=42 8*6=48 9*6=54
2*7=14 3*7=21 4*7=28 5*7=35 6*7=42
7*7=49 8*7=56 9*7=63
2*8=16 3*8=24 4*8=32 5*8=40 6*8=48
7*8=56 8*8=64 9*8=72
2*9=18 3*9=27 4*9=36 5*9=45 6*9=54
7*9=63 8*9=72 9*9=81 |
(B)製作技巧研討:
列印九九乘法表,最能表現出雙重迴圈的特性,幾乎所有初學者都必須學會此程式。
習慣上,九九乘法表大多是直列式排序,這剛好與電腦顯示方法相反。除非是繪圖程式,否則一般文字模式都是一行顯示完再接著顯示下一行,無法做到顯示下一行後再回到上一行。因此,列印九九乘法表時也須依照表內文字,一行接一行列印。
圖 5-11 為此程式的概要說明,每行由 2 到 9,共有 8 句文字,我們利用 i 做為指標變數(j = 2, 3, 4, …, 9);相對的,每列有 9 句文字,我們利用 j 做為指標變數(i = 1, 2, …, 9)。程式必須一行接一行列印,總共有 9 行,因此,必須外迴圈須以 i 做為指標;每行列印 8 句,因此內迴圈變數為 j;每句文字是 j * i = ij。
圖 5-11 九九乘法表製作技巧
(C)程式範例:
01
02
03
04
05
06
07
08
09
10
11 |
//Ex5_9.java
public class Ex5_9 {
public static void main(String args[]) {
for (int i=1; i<=9; i++) {
for (int j=2; j<=9; j++)
System.out.printf("%d*%d=%2d\t", j, i, i*j);
System.out.printf("\n");
}
}
} |
(D) 程式重點分析:
(1)
第 5~9
行:『for (i=1; i<=9; i++) { …}』。外迴圈指定九九乘法表的行數。
(2)
第 6~7
行:『for (j=2; j<=9; j++) System.out.printf( …)』。內迴圈。
(3) 第 7
行:『System.out.printf("%d*%d=%2d\t", j, i, i*j)』。製作九九乘法語句的格式,其中 %2d 表示利用兩個字元格式印出整數。
(4)
第 8
行:『System.out.printf(“\n”);』。每行最後加入跳行的控制字元。
5-5-7 自我挑戰:while 列印九九乘法表
(A)程式功能:PM5_8.java
請利用 while 敘述句製作列印九九乘法表程式。
(B)製作技巧提示:
無論採用何種敘述句(for、while、do/while)製作九九乘法表,技巧都是相同的,如圖 5-# 所示。利用 while 敘述句的提示如下:
int i = 1;
while (i <= 9) {
int j = 2;
while (j <= 9 ) {
System.out.printf("%d*%d=%2d\t", j, i, i*j);
j++;
}
i++;
System.out.printf("\n");
} |
(C)腦力激盪:
請利用 do/while 敘述句,製作列印九九乘法的程式。
|
翻轉工作室:粘添壽
Java 程式設計(一) 含程式邏輯
翻轉電子書系列:
|