迴圈控制(二)


1 while loop

可以想像成把for loop ( )內的三個判斷式,分別拆開來使用

只要記住下方三個步驟

  • 變數初始值設定
  • 條件式
  • 變數遞增

此處一樣用列出小於10的偶數這題做例題,請一定要滑上去對照看看while迴圈與for迴圈的差異性

1-1 while loop
while( BooleanStatement ){
    ....
    //通常此處會放有 變數遞增程式碼
}
//PURPOSE:列出小於10的偶數
int i=1;//請一定要給變數一個初始值,才可以進行i++
while(i<=10){//繼續執行的條件式
    if(i%2==0){
        System.out.println(i);
    }
    i++;//變數遞增
}
System.out.println("i最後的值="+i);
----------------------
2
4
6
8
10
i最後的值=11

比較需要注意的是,許多人認為 i 最後的值應該會是10,但執行順序是

( i=10 ) => (進行i++ ) =>( i=11 ) => (判斷符不符合i<=10條件,發現不符合於是跳出迴圈 )

所以 i 最後的值會是11

1-2 do while
do{
    ...
}while( BooleanStatement );

do while與while do最不一樣的地方,就在於do while至少會執行一次

請注意最後一定要加 ;

//PURPOSE:列出小於10的偶數
int i=1;
do{
    if(i%2==0){
        System.out.println(i);
    }
    i++;
}while(i<=10);
System.out.println("i最後的值="+i);
------------------------
2
4
6
8
10
i最後的值=11
1-3 巢狀while
變數1 初始設定
while( 判斷式1 ){
    變數2 初始設定
    while( 判斷式2 ){
        變數2++;
    }
    變數1++;
}
//PURPOSE:99乘法表
int i=1,j=1;
while(i<=9){
    j=1; //此行非常的重要!請一定要記得,內層迴圈重新跑過之後,還是要給他一個初值,可以試試看沒有它結果會變成如何
    while(j<=9){
        System.out.println(i+"X"+j+"="+i*j);
        j++;
    }
    System.out.println("");
    i++;
}
----------------------------------------
1X1=1
1X2=2
1X3=3
1X4=4
1X5=5
1X6=6
1X7=7
1X8=8
1X9=9

2X1=2
2X2=4
......以下省略
1-4 常用簡略的while寫法 ( 將 增值 與 判斷式 寫在一起 )
//PURPOSE:列出小於10的偶數
int i=0; 
while((i++)<=9){
    if(i%2==0){
        System.out.println(i);
    }            
}
------------------
2
4
6
8
10
i最後的值=11

2 break與continue

2-1 break

break執行時,最靠近break的迴圈將會終止運作,跳到迴圈下一行程式

Scanner scanner =new Scanner(System.in);
int score;
while(true){ 
    System.out.print("請輸入程式設計成績(輸入-1結束):");
    score=scanner.nextInt();
    if(score==-1){
        break;         }
    else if(score>=90){
        System.out.println("甲");
    }
    else if(score>=80){
        System.out.println("乙");
    }else if(score>=70){
        System.out.println("丙");
    }else{
        System.out.println("丁");
    }
}
--------------------------------------
請輸入程式設計成績(輸入-1結束):100
甲
請輸入程式設計成績(輸入-1結束):80
乙
請輸入程式設計成績(輸入-1結束):50
丁
請輸入程式設計成績(輸入-1結束):-1

如果有思考過就可以發現,這一題還可以不要使用break來寫,可以直接用while裡面的判斷式來控制,但這題為什麼要選擇前者而不是後者呢?希望學生可以思考看看

2-2 continue

最靠近continue的迴圈會立刻跳至迴圈最開始處,continue下方程式碼將不會被執行到

迴圈依舊在進行中沒有被終結,只是某一圈continue以下的程式碼被跳掉了

//PURPOSE:列出小於10的偶數
for(int i=1;i<=10;i++){
    if(i%2!=0){
        continue;
    }
    System.out.println(i);
}
-------------------------
2
4
6
8
10

我們介紹了很多不同的寫法來列出小於10的偶數,你認為哪種寫法最好呢?請提出原因

2-3 搭配label來使用break與continue

break與continue執行的範圍將不再是最靠近牠們的迴圈,而是被label 包起來的所有程式碼

LabelName : {
    ....
    continue LabelName;
    break LabelName;
}
label:{
    for(int i=1;i<=10;i++){
        if(i==3){
            break label;
        }
        System.out.println(i);
    }
    System.out.println("for迴圈結束了"); //如果上面只有break;的話,這行會被列印出來
    }
}
----------------------------------
1
2

2-4 for loop與while loop應該如何取捨?

  • 重複次數明確 選用for
    • 例如從1執行到100
  • 重複次數不明確 選用while
    • 例如輸入-1就終結,預先無法知道他可能會跑幾圈

一般情況下,當使用for或while迴圈不會有太大差異時,建議初學者選擇使用for迴圈,for迴圈主要設定都被縮減在一行內,比較不會因為漏寫而造成無窮迴圈的情況。

results matching ""

    No results matching ""