旗標知識網 Banner Advertisement
     
 
最新 Java 2 程式語言 第 2 版
最新 Java 2 程式語言 第 2 版

作者:施威銘研究室著
書號:FS720
附件:附1片光碟片
定價:650 元
 
 
 
 
 
 
 
While 迴圈、do/while 迴圈與巢狀迴圈

While 迴圈、do/while 迴圈與巢狀迴圈

while 迴圈

while 迴圈的結構和 if 條件判斷式看起來很類似, 兩者都有個用括號括住的條件運算式, 加上一組由大括號括住的的動作敘述。但兩者的差異在於: while 迴圈每次在執行完大括號中的動作敘述後, 會跳回 while 的條件運算式再次檢查, 如此反覆執行, 直到條件運算式為 false 時才停止執行迴圈的動作。

語法

while 迴圈有別於 for 迴圈的地方在於, while 迴圈不需要初始算值及控制運算式, 只需要條件運算式即可。如下述:

while (條件運算式) {
動作敘述
}

while:『當..』 的意思。會根據條件式的真假, 來決定是否執行迴圈內的動作。也就是說 『當條件式結果為真』 , 就執行迴圈內的動作的意思。若為假, 則不予執行 (跳出迴圈)。

條件運算式:可以是任何結果為布林值的運算式或布林變數。

執行流程

看完上述的流程圖, 應該不難發現, 其實 while 迴圈的執行與 for 迴圈十分類似。我們以上述計算奇數和的例子為藍圖, 用 while 迴圈來改寫, 並將奇數和改為偶數和, 結果如下:

 Count_even.java 利用 while 迴圈計算某範圍內的偶數和
01 import java.io.*;
02
03 public class Count_even {
04
05   public static void main(String args[]) throws IOException {
06
07     // 宣告累加值 sum 及計算範圍 range
08     int sum = 0, range;
09
10 System.out.println("請輸入欲計算的偶數和範圍(結尾數值)");
11 System.out.print("→");
12
13     BufferedReader br =
14       new BufferedReader(new InputStreamReader(System.in));
15
16     String str = br.readLine();
17     range = Integer.parseInt(str);
18
19     int i=0;            // 宣告迴圈變數 i
20     while (i<=range) {  // 當 i 值大於 range 即停止執行的 while 迴圈
21       sum += i;    // 每次進入迴圈時, 將 sum 的值加上 i
22       i+=2;           // 每次都將 i 值加 2
23     }
24     System.out.println("1 到 "+range+" 的所有偶數和為 "+sum);
25   }
26 }

執行結果
請輸入欲計算的偶數和範圍(結尾數值)
→ 10
1 到 10 的所有偶數和為 30

其中第 22 行的 i+=2; 有點類似 for 迴圈的控制運算式, 讓 while 迴圈的條件運算式有可能產生 false 的結果。如果把這行敘述拿掉, while 迴圈內的條件運算式狀況將不會有所改變 (永遠是 true), 此時程式就會一直重複執行迴圈的敘述, 而不會停下來, 這種情況稱之為無窮迴圈。

假設我們要設計一個程式, 計算 1 到任意數值間, 所有整數的和, 而且在畫面上顯示從 1 開始加的時候, 每一次累加的和。如果使用 while 卻沒有敘述去改變條件運算式中用到的數值, 就會發生計算結果不正確的情況:

 Count1_X.java 使用 while 迴圈處理 1 加到指定數值的過程
01 import java.io.*;
02
03 public class Count1_X {
04
05   public static void main(String args[]) throws IOException {
06
07     // 宣告累加值 sum 及計算範圍 range
08 int sum = 0, range;
09
10 System.out.println("請輸入指定數值範圍");
11 System.out.print("→");
12
13     BufferedReader br =
14       new BufferedReader(new InputStreamReader(System.in));
15
16     String str = br.readLine();
17     range = Integer.parseInt(str);
18
19     int i=1;           // 宣告迴圈變數 i
20     while (i<=range) { // 若 i 小於 range, 則執行迴圈內的動作
21 sum += i;
22 System.out.println((sum-i) + "+" + i + "=" +sum);
23 // 正確寫法應在此處加上 i++; 的敘述
24     }
25   }
26 }

執行結果
請輸入指定數值範圍
→ 10
0+1=1
1+1=2
2+1=3
3+1=4
4+1=5
5+1=6
6+1=7
.
.
.
(按 Ctrl + C 可中斷程式執行)

我們可以發現這個程式有 2 個問題:首先, 我們希望程式算的是 0+1、再加 2、再加 3 的情形, 但上列程式卻不是這樣加;其次, 這個迴圈會不停執行下去, 因為 i 值恆等於 1, 自然永遠都小於使用者輸入的 range 指定數值, 所以不會停止。我們必須在程式第 24 行加入 "i++;" 或 "i+=1;" 的敘述:

 while (i<=range) { // 若 i 小於 range, 則執行迴圈內的動作
   sum += i;
   System.out.println((sum-i) + "+" + i + "=" +sum);
   i++;   // 用 i+=1; 也可以
 }

加到後面, i 值就會以累加 1 的方式不斷變動, 最後當 i 值大於 range 指定變數時就會停止迴圈。而且這樣一來, 程式顯示的執行結果也會變得正確:

請輸入指定數值範圍
→ 8
0+1=1
1+2=3
3+3=6
6+4=10
10+5=15
15+6=21
21+7=28
28+8=36

do/while 迴圈

在三種迴圈方式裡, do/while 迴圈算是 while 的一種變型, 但它和 while 及 for 迴圈的執行流程上也有一些差異。前面介紹的 for 及 while 迴圈通常被稱為 『預先條件運算式』 迴圈。也就是說在執行迴圈之前, 會預先檢查條件式是否為真, 是的話才執行迴圈內的動作敘述。do/while 迴圈則不同, 在第一次進入迴圈時, 不會先做任何檢查, 而是先執行完迴圈內的動作敘述後, 再檢查條件式是否成立, 所以 do/while 迴圈的特點就是:不論條件式為何, 迴圈敘述至少都會執行一次。

語法

do/while 迴圈的結構像是個倒過來的 while 迴圈, 也就是把 "while (條件運算式)" 這一段內容移到迴圈的最後面:
do {
動作敘述
} while (條件運算式)

執行流程

正如前面所提及的, do/while 是一個先執行迴圈內的敘述再進行條件運算式判斷的迴圈敘述, 因此其執行流程也稍稍有所不同, 如下:

我們以一個實際的例子來測試, 就可以清楚的觀察到相同的程式因為執行流程上的不同, 所產生的結果也會不同的情況, 我們先用 while 迴圈來設計, 如下:

Counting_while.java 用 while 測試迴圈執行的次數
01 public class Counting_while {
02
03   public static void main(String args[]) {
04
05 int i=0;          // 宣告用來記錄迴圈執行次數的變數 i
06 while (i++<3)
07       System.out.println("這是第" + i + "次執行迴圈");
08   }
09 }

執行結果
這是第1次執行迴圈
這是第2次執行迴圈
這是第3次執行迴圈

此範例程式的 while 迴圈會在每次做完條件檢查時, 將 i 的值加 1, 結果使迴圈的敘述會執行 3 次。接著用 do/while 來改寫同一個程式, 如下:

Counting_dowhile.java 用 do/while 測試迴圈執行的次數
01 public class Counting_dowhile {
02
03   public static void main(String args[]) {
04
05 int i=0;          // 宣告用來記錄迴圈執行次數的變數 i
06 do {
07       System.out.println("這是第" + i + "次執行迴圈");
08     } while (i++<3);
09   }
10 }

執行結果
這是第0次執行迴圈
這是第1次執行迴圈
這是第2次執行迴圈
這是第3次執行迴圈

如上, 由於 i 是從 0 開始, 且 do/while 會先執行完一次迴圈內的動作後, 才進行檢查, 使得這次迴圈的動作比前一個範例多執行 1 次。讀者在設計程式時, 可依程式的特性選用適當的迴圈迴圈敘述。 巢狀迴圈

在上述的迴圈範例中, 我們都是以一維的方式去思考, 比如說 1 加到 100 此類一個累加變數就能解決的問題。但是如果我們想要解決一個像九九乘法表這種二維的問題 (x,y 兩累加變數相乘的情況)。就必須將使用迴圈的方式做一些變化, 也就是使用巢狀迴圈 (nested loops)。

簡單的說. 巢狀迴圈就是迴圈的大括號之中, 還有其它迴圈。例如 for 迴圈中還有 for 迴圈, 或是 while 迴圈等。以下就用實例來說明巢狀迴圈的應用:

Count9x9.java 利用巢狀迴圈輸出九九乘法表
01 public class Count9x9 {
02
03   public static void main(String args[]) {04
05     // 宣告九九乘法表的 (x*y) 變數 x 及 y
06     int x, y;
07
08     // 從 x=1 開始執行的 for 迴圈
09     for (x=1;x<=9;x++) {
10       // 從 y=1 開始執行的 for 迴圈
11       for (y=1;y<=9;y++)
12         System.out.print( x + "*" + y + "=" + x*y + "\t");
13       System.out.println();
14     }
15   }
16 }

執行結果
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

在上述的例子中, 我們利用兩個迴圈分別來處理九九乘法表的 (x, y) 變數的累加相乘動作。當 x 等於 1 時, 必須分別乘以 1 到 9 的 y;當 x 等於 2 時, 又是分別乘上 1 到 9 的 y..., 也就是在外部的 for 迴圈每執行一輪時, 內迴圈就會執行 9 次, 以此類推。執行流程如下圖:

  內迴圈控制橫向的數字增加
外迴圈

制縱向的數字增加
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

 
Down Logo 旗 標 出 版 股 份 有 限 公 司   100 台北市中正區杭州南路一段15-1號19樓 TEL: 02-2396-3257
Copyright © 2005 Flag Publishing Co.,Ltd. All Rights Reserved    版權所有聯絡我們合作提案隱私權政策
 
現在購買《DSLR 完全探索》《數位相片編修聖經》《數位列印/輸出聖經》《數位相機Raw檔聖經》四書,超值優惠2299元 下載訂購單