零基礎學Java(6)控制流程

2022-07-15 18:04:49

控制流程

與任何程式設計語言一樣,Java使用條件語句和迴圈結構確定控制流程。
 

塊作用域

我們首先要了解塊(block)的概念。
塊是指由若干條Java語句組成的語句,並用一對大括號括起來。塊確定了變數的作用域。一個塊可以巢狀在另一個快中。下面就是巢狀在main方法塊中的一個塊。

public static void main(String[] args) {
        int n = 1;
        {
            int k = 3;
            System.out.println(k); // success
        }  // k只在這個塊中被定義
        System.out.println(k);  // error
    }

但是,不能在巢狀的兩個塊中宣告同名的變數,否則就會有錯誤,無法通過編譯:

public static void main(String[] args) {
        int n = 1;
        {
            int k = 3;
            int n = 2;
        }
    }

這裡已經在外面定義了n,就不能再巢狀的塊中再定義n了。
 

條件語句

在Java中,條件語句的形式為

if (condition) statement

這裡的條件必須用小括號括起來。剩下的跟其他語言語法幾乎一直,直接看以下例子

import java.util.Scanner;


public class SecondSample {
    public static void main(String[] args) {
        /*
        * 根據銷售額來評價你的表現,獎勵你不同的金額
        * */
        // 建立輸入物件
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入你的銷售額");
        // 在控制檯輸入你的銷售額
        int yourSales = in.nextInt();
        // 定義一個目標
        int target = 1000;
        // 初始化表現
        String performance;
        // 初始化獎金
        int bonus;
        if (yourSales >= 2 * target) {
            performance = "優秀";
            bonus = 1000;
            System.out.printf("你的表現為%s,獎勵你%d元%n", performance, bonus);
        } else if (yourSales >= 1.5 * target) {
            performance = "良好";
            bonus = 500;
            System.out.printf("你的表現為%s,獎勵你%d元", performance, bonus);
        } else if (yourSales >= target) {
            performance = "及格";
            bonus = 100;
            System.out.printf("你的表現為%s,獎勵你%d元", performance, bonus);
        } else {
            System.out.println("You 're fired");
        }
    }
}

 

while迴圈

當條件為true時,while迴圈執行下一條語句。一般形式如下:

while (condition) statement

我們設定一個程式,計算需要多長時間才能夠儲存一定數量的退休金,假定每年存入相同數量的金額,而且利率是固定的。

import java.util.Scanner;

public class ThirdSample {
    public static void main(String[] args) {
        /*
        * 計算需要多長時間才能夠儲存一定數量的退休金
        * */
        Scanner in = new Scanner(System.in);

        System.out.println("你需要多少退休金?");
        double goal = in.nextDouble();

        System.out.println("你每年將增加多少錢?");
        double payment = in.nextDouble();

        System.out.println("利率是多少:");
        double interestRate = in.nextDouble();

        double balance = 0;
        int years = 0;

        // 未達到目標時更新帳戶餘額
        while (balance < goal) {
            // 加上今年的付款和利息
            balance += payment;
            double interest = balance * interestRate / 100;
            balance += interest;
            years++;
        }
        System.out.printf("你可以在%d年內退休", years);
    }
}

while迴圈是先判斷後執行,如果條件不滿足則永遠是false,那麼可能永遠不會執行,如果我們想無論條件是否為true,我們都要先執行一條語句,那麼在Java中提供了do..while...這種迴圈形式。

do statement while (condition)

下面的例子中,首先計算退休賬戶中的新的餘額,然後再詢問是否打算退休:

public class ThirdSample {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.println("你每年將增加多少錢?");
        double payment = in.nextDouble();

        System.out.println("利率是多少?");
        double interestRate = in.nextDouble();

        double balance = 0;
        int year = 0;
        String input;
        do {
            balance += payment;
            double interest = balance * interestRate / 100;
            balance += interest;
            year++;
            System.out.printf("%d年後,你的餘額為%,.2f%n", year, balance);
            System.out.println("準備退休?(Y/N)");
            input = in.next();
        }
        while (input.equals("N"));
    }
}

 

for確定迴圈

  for迴圈語句是支援迭代的一種通用結構,由一個計數器或類似的變數控制迭代次數,每次迭代後這個變數將會更新。

for (int i=1; i<=10; i++){
    System.out.println(i);
}

  for語句的第1部分通常是對計數器初始化;第2部分給出每次新一輪迴圈執行前要檢測的迴圈條件;第3部分指定如何更新計數器。
與C++一樣,儘管Java允許在for迴圈的各個部分放置任何表示式,但有一條不成文的規則:for語句的3個部分應該對同一個計數器變數進行初始化、檢測和更新。若不遵守這一規則,編寫的迴圈常常晦澀難懂。
 

注意:在迴圈中,檢測兩個浮點數是否相等需要格外小心。for (double x=0;x!=10;x+=0.1),這條語句永遠不會結束。由於舍入的誤差,永遠達不到精確的最終值。因為0.1無法精確地用二進位制表示,所以,x將從9.999 999 999 999 98跳到10.099 999 999 999 98。
 

多重選擇:switch語句

在處理多個選項時,使用if/else語句就顯得有些笨拙。Java有一個與C/C++完全一樣的switch語句。例如,下面包含4個選項的選單系統

public class FifthSample {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Select an option (1, 2, 3, 4)");
        int choice =  in.nextInt();
        switch (choice)
        {
            case 1:
                System.out.println("我選擇了1");
                break;
            case 2:
                System.out.println("我選擇了2");
                break;
            case 3:
                System.out.println("我選擇了3");
                break;
            case 4:
                System.out.println("我選擇了4");
                break;
            default:
                System.out.println("預設選擇");
                break;
        }
    }
}

switch語句將從與選項值相匹配的case標籤開始執行,直到遇到break語句,或者執行到switch語句的結束處為止。如果沒有相匹配的case標籤,而有default子句,就執行這個子句。
注意:強烈不建議使用switch語句,最好永遠不要使用,因為如果在case分支語句的末尾沒有break語句,那麼就會接著執行下一個case分支語句。這種情況跟相當危險,常常會引發錯誤。
 
case的標籤可以是:

  • 型別為char、byte、short或int常數表示式
  • 列舉常數
  • 從Java7開始,case標籤還可以是字串字面量