天天看點

Java核心卷 卷一 自我筆記 3.5Java的基本程式設計結構---控制流程

條件語句

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

if(condition)statement

這裡的條件必須用括号括起來。與絕大多數程式設計語言一樣,Java常常希望在某個條件為真時執行多條語句。在這樣的情況下,應該使用塊語句,例如:

if(a>=b){
            System.out.println(a);
        }
           

另外,我們需要介紹一下代碼塊。什麼是代碼塊?

塊,是指由一對大括号括起來的若幹條簡單的java語句。塊确定了變量的作用域。一個塊可以嵌套到另一個塊中。需要注意的是,不能在嵌套的兩個塊中聲明同名的變量。

在Java中,if經常和else搭配。例如:

if(a>=b){
            System.out.println(a);
        }else{
            System.out.println(b);
        }
           

其中else部分是可選的。else子句與最鄰近的if構成一組。

重複出現if…else…是一個很正常的情況。需要注意的是,else是與哪一個if配對。

多重選擇

在處理多個選項時,使用if/else結構顯得有些笨重。Java中用一個與C語言完全一樣的switch語句。

例如,我們建立一個包含4個選項的菜單系統。

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("select an option on (1,2,3,4)");
        int i = in.nextInt();
        switch (i){
            case 1:
                System.out.println(i);
                break;
            case 2:
                System.out.println(i);
                break;
            case 3:
                System.out.println(i);
                break;
            case 4:
                System.out.println(i);
                break;
            default:
                System.out.println("無");
                break;
        }
    }
           

switc語句将從與選項值相比對的case标簽處開始執行直到遇到break語句,或者執行到switch語句的結束處為止。如果沒有比對的case标簽,那麼,執行default子句。

需要我們注意的是,我們在程式設計式的時候,可能會觸發多個case分支。如果在case分支語句的末尾沒有break語句,那就會接着執行下一個case分支語句。這種情況相當危險,常常引發錯誤。是以,我們在程式中盡量少用switch語句。

case的标簽可以是:

  • 類型為char、byte、short或int的常量表達式。
  • 枚舉常量(當在switch語句中使用枚舉常量時,不必再每個标簽中指明枚舉名,可以有switch的表達式值确定)
  • 從Java se 7開始,case标簽還可以是字元串字面量

循環

1. while循環

當條件為真(true)時,while循環執行一條語句(也可以是一個語句塊)。格式為:

while(condition)statement

如果開始條件為flase,那麼一次也不執行。

我們以一個例子來說明,該程式是計算需要多長時間才能存夠一定的終身俸。

public class RetirementTest {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("how much money do you need to retire?");
        double v = in.nextDouble();
        System.out.println("how much money will you contribute every year?");
        double v1 = in.nextDouble();
        System.out.println("interest rate in %:");
        double v2 = in.nextDouble();
        double balance=0;
        int years=0;
        while (balance<v){
            balance+=v1;
            double interest= balance*(v2/100);
            balance+=interest;
            System.out.println(balance);
            years++;
        }
        System.out.println("you can retire in"+years+" years.");
    }
}
           

在這個例子中,我們的循環是一個計數器,在循環體中更新目前累積的數量,直到條件為false為止。

while (balance<v){
            balance+=v1;
            double interest= balance*(v2/100);
            balance+=interest;
            System.out.println(balance);
            years++;
        }
           

while循環語句首先檢測循環條件。是以,循環體中的代碼有可能不被執行。如果希望循環體至少執行一次,那麼,應該将檢測條件放到最後。使用do while循環。

2. do while循環

文法格式為:

do statement while (condition)

這種循環先執行語句(通常是一個語句塊),再檢測循環條件;然後重複語句,依次類推。例如:

do {
            balance+=v1;
            double interest= balance*(v2/100);
            balance+=interest;
            System.out.println(balance);
            years++;
        }
        while (balance < v);
           

3. for 循環

for循環是支援疊代的一種通用結構,利用每次疊代之後更新的計數器或類似的變量來控制疊代次數。

下面的程式将0~9輸出到螢幕上:

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

for循環的第一部分通常用于對計數器進行初始化;第二部分給出新一輪循環執行前要檢測的循環條件;第三部分訓示如何更新計數器。我們需要知道的是Java允許在for循環的各個部分放置任何表達式,但有一條不成文的規則:for語句的3個部分應該對同一個變量進行初始化、檢測和更新。

我們要注意的是,在循環中檢測兩個浮點數是否相等需要格外小心。如下面的for循環

for (double x = 0; x !=10 ; x+=0.1) {
            System.out.println(x);
        }
           

永遠不會結束。由于舍入的誤差,最終可能得不到精确值。例如,在上面的循環中,因為0.1無法精确用二進制表示,是以x将從9.99999999998跳到10.0999999998.

我們在for語句的第一部分中聲明了一個變量之後,這個變量的作用域就為for循環的這個循環體。

特别需要指出的是,如果在for語句内部定義一個變量,這個變量就不能在循環體之外使用。是以,如果希望在for循環體之外使用循環計數器的最終值,就要確定這個變量在for循環外聲明。

int x;
        for (x = 0; x !=10 ; x+=0.1) {
            System.out.println(x);
        }
           

另一方面,我們可以在各自獨立的不同for循環中定義同名的變量。即,不同的for循環計數器的命名可以相同。

除此之外,for循環語句隻不過是while循環的一種簡化形式。

我們以下面的程式作為應用for循環的一個例子。

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("how many number do you need to draw?");
        int i = in.nextInt();
        System.out.println("what is the highest number you can draw?");
        int i1 = in.nextInt();
        int c=1;
        for (int j = 1; j <= i; j++) {
            c=c*(i1-j+1)/j;
            System.out.println("your odds are 1 in "+c+" . good luck!");
        }
    }
           

這個程式是用來計算抽獎機率。

在Java中有一種功能很強的循環結構,可以用來依次處理數組中的每一個元素而不必為指定下标值而分心。這種增強的for循環的語句格式為:

for(vatiable :collection)statement

定義一個變量用于暫存集合中的每一個元素,并執行相應的語句。

例如:

for(int element:a)
	sout(element);
           

列印數組a中的每一個元素,一個元素占一行。當然,傳統的for循環也可以實作。但是,for each循環語句顯得更加簡潔、不易出錯。

4. 中斷控制流程

break分為兩種,一種帶标簽,一種不帶标簽。

我們首先來看一下不帶标簽的break語句。與用于退出的switch語句的break語句一樣,它也可以用于退出循環語句。例如:

while (years<=100){
            balance+=payment;
            double interest=balance*interestRate/100;
            balance+=interest;
            if(balance>=goal){
                break;
            }
            years++;
        }
           

在循環開始時,如果years>100,或者在循環體中balance>=goal,則退出循環語句。

下面,我們來看一下帶标簽的break語句,用于跳出多重嵌套的循環語句。這裡用個示例說明了break的工作狀态。需要注意的是,标簽必須放在希望跳出的最外層循環之前,并且必須跟緊一個冒号。

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n;
        read_data:
        while (...){
            ...
            for(...){
                System.out.println("enter a number >=0:");
                n = in.nextInt();
                if(n>0){
                    break read_data;
                    ....
                }
            }
        }
    }
           

如果輸入有誤,通過執行帶标簽的break跳轉到帶标簽的語句塊末尾。對于任何使用break語句 代碼都需要檢測循環是否正常結束,還是由break跳出。

事實上,可以将标簽應用到任何語句中,甚至可以應用于if語句或者塊語句中,如下所示:

label:{
              ...
              if(condition)
                  break label;
              ...
            }    
           

另外,需要注意的是,隻能跳出語句塊,不能跳入語句塊。

除break語句之外,還有一個continue語句。與break語句一樣,它将中斷正常的控制流程。continue語句将控制轉移到最内層循環的首部。例如:

Scanner in = new Scanner(System.in);
        while (sum<goal) {
            System.out.println("enter a number: ");
            int i = in.nextInt();
            if (i < 0) {
                continue;
            }
            sum+=n;
        }
           

如果n<0,則continue語句越過了目前循環體的剩餘部分,立即跳到循環首部。

如果将continue用于for循環,就可以跳到for循環的“更新”部分。

還有一種帶标簽的continue語句,将跳到與标簽比對的循環首部。這裡,不做示範。