Ch.7 迴圈控制

7-1 使用 while 與 do while 迴圈

程式中常會有一些必須重複執行的指令或動作,例如輸入一串文字,讓程式在文字中尋找符合的字元,此時程式必須對輸入的文字依字元重複進行比對的動作,直到找到符合的字元後結束這個重複性的動作,在 Java 中,您可以使用 while 迴圈或是 do while 迴圈來為您完成重複性的動作。

• while 迴圈

先來看看 while 迴圈的語法:

while (boolean_expression) {
    code_block;
} // while 結尾
}
// 程式從這裡繼續
                            

所有的迴圈是由下面的部分所構成的:

  • boolean_expression 是會產生 true 或 false 的運算式。在每一次執行迴圈之前都必須先判斷此運算式所產生的布林值。
  • 假如 boolean_expression 判斷出值是 true,則會重複執行程式碼區塊(code_block)。

由於進入 while 結構時,一開始就會先進行運算式的判斷,以決定要不要執行迴圈本體(Body),所以 while 迴圈又稱為前測式迴圈,來看個實際的例子,程式碼 7-1 可以讓您輸入一個整數值,程式會依您輸入的值來輸出對應次數的"Hello!World!"。

public class WhileDemo{
    public static void main(String[] args){
        java.util.Scanner scanner =
                new java.util.Scanner(System.in);

        System.out.print("輸入執行次數:");
        int input = scanner.nextInt();

        int count = 0; // 計數用
        while (count < input){ // 判斷次數
            System.out.println("Hello!World!");
            count++; // 每次執行後遞增
        }
    }
}
                            
程式碼 7-1 WhileDemo.java

當計數器 count 的值小於 input 的值時,while 迴圈的本體才會執行,每次執行完迴圈前都會遞增 count,直到 count 的值大於 input 的值,此時 count < input 的運算結果為 false,程式離開迴圈。

圖7-1 while 迴圈會先判斷是否執行迴圈本體

程式碼 7-1 的執行範例如下所示:

圖7-2 程式碼 7-1 的執行結果

• 巢狀 while 迴圈

思考如果想要畫一個如下的矩形,並且一次畫一個字元,則該如何實現:

@@@@@@@@@@
@@@@@@@@@@
@@@@@@@@@@
                            

您可以利用 while 圈畫出矩形的一行。然後,將迴圈放至於另外一個迴圈內連續畫出三行。這樣的迴圈結構稱為巢狀 while 迴圈( Nested while loop )

程式碼 7-2 讓您可以輸入兩個整數,之後根據這兩個數值為長寬,並利用@符號印出矩形:

public class NestedWhileDemo{
    public static void main(String[] args){
        java.util.Scanner scanner =
                new java.util.Scanner(System.in);

        System.out.print("輸入長:");
        int length = scanner.nextInt();

        System.out.print("輸入寬:");
        int width = scanner.nextInt();

        int widthCount = 0;
        while (widthCount < width){
            int lengthCount = 0;
            while (lengthCount < length){
                System.out.print("@");
                lengthCount++;
            }

            System.out.println(); // 換行
            widthCount++;
        }
    }
}
                            
程式碼 7-2 NestedWhileDemo.java

在進入外層迴圈之後,會再遇到內層迴圈,內層迴圈會一直執行到 lengthCount < length 為 false 後離開迴圈,並繼續完成外層迴圈的本體,之後外層迴圈的 widthCount < width 若還是為 true,就會再進行相同的流程,直到外層迴圈的widthCount < width 為 false 而離開迴圈,執行的範例結果如下所示:

圖7-3 程式碼 7-2 的執行結果

• do while 迴圈

來考慮一個問題,在每次執行迴圈之前,您會想要請使用者輸入一些資訊,之後再根據使用者輸入的資訊來執行迴圈,並依據執行結果來判斷是否該離開迴圈。像這種先執行、後判斷的迴圈,您可以使用 do while 迴圈來完成,它的語法結構如下所示:

do {
    code_block;
} while (boolean_expression);
                            

其中:

  • 若 boolean_expression 的陳述句為 true 時 , 則code_block 就會被再次執行。
  • boolean_expression 是會產生 true 或 false 的運算式。在執行 do 後而每一次重新執行迴圈之前都必須先判斷此運算式的執行結果。

圖7-4 do while 會先執行迴圈本體

boolean_expression 之後的分號是必要的。因為這boolean_expression 是在這迴圈末端。相反地,在 while 迴圈中並不在結尾加上分號,因為 while 迴圈是在一開始就決定是否要進入 code_block。

由於先執行,後判斷,所以 do while 又稱之為後測式迴圈。程式碼 7-3 使用 do while 迴圈設計一個簡單的猜數字程式,do 區塊中每次會先請使用者輸入一數字,遇到 while 時再依使用者的輸入判斷是否要執行下一次迴圈。

public class DoWhileDemo{
    public static void main(String[] args){
        java.util.Scanner scanner =
                new java.util.Scanner(System.in);

        int input = 0;
        do{
            System.out.print("輸入數字:");
            input = scanner.nextInt();
        } while (input != 30);

        System.out.println("恭喜您!猜對了!");
    }
}
                            
程式碼 7-3 DoWhileDemo.java

程式的執行結果如下所示:

圖7-5程式碼 7-3 的執行結果

do while 迴圈同樣也可以像 while 迴圈一樣形式巢狀結構,也就是 do while 中再撰寫 do while 迴圈。