Java-第5課-迴圈敘述
在前一單元,我們以吃早餐時不斷地看時間為例子來說明迴圈。在程式開發中,同樣也有需要讓某些流程重複執行的時候。
這一課會介紹如何使用「迴圈」敘述,讓想要或類似的動作能夠重複執行。
一、for 迴圈
還記得我的國小暑假作業有題是要計算「1+2+...+99+100」,當時我真的傻傻地一個一個加。那麼如果要寫一支程式來計算從1加到100的結果,可以這樣子寫。
for (迴圈變數初始化 ; 繼續循環的條件 ; 調整變數) {
要重複執行的動作
}for (int i = 1 ; i <= 100 ; i++) {
total = total + i;
}
「for」是這種迴圈敘述的關鍵字。而旁邊的小括號中要定義三項東西:迴圈變數、循環條件、調整變數。
迴圈開始後,左邊會先初始化變數,再看中間的條件判斷是否成立,若成立就進行大括號內的動作,否則離開這個迴圈敘述。
完成一次循環,會根據右邊的定義,進行變數的調整。此處的「i++」相當於「i = i + 1」,也就是將i加1的意思。
調整完後,再回到中間的條件判斷,如果還是成立,就會持續循環,直到i被遞增至101,條件不成立為止。下面用程式碼實作看看。
首先宣告變數total,用來存放加總結果。接著執行迴圈敘述,i從1開始計算,每次循環都會將上一次total的值再加i,模擬「0+1=1」→「1+2=3」→「3+3=6」→「6+4=10」...的過程。每一次的循環,total的值都在改變當中,直到i遞增至101,就會因條件判斷為false而離開迴圈。
另外,由於這個變數i是在迴圈敘述內透過int宣告的,因此只能在它的大括號內存取。附帶一提,選擇敘述也是如此,在大括號內宣告的變數,只可在該區塊(scope)使用。
二、while 迴圈
前面的for迴圈,有變數i扮演類似「計數器」的角色,我們對於迴圈應該循環幾次,是比較能掌握的。而這一節要介紹的「while迴圈」,可以用在循環次數不確定的情形。
何謂次數不確定?舉個例子:年貨大街的攤販批發了幾桶開心果,要分裝成小袋販售。假設老闆決定將開心果鏟三次的量裝成一袋,那麼把袋子包裝起來這個動作的執行次數也就不確定了(因為不知道要鏟幾次才會分裝完)!
while迴圈的語法看起來比for迴圈相對簡單。
while (繼續循環的條件) {
要重複執行的動作
}while (剩下的開心果還能再裝下一袋) {
分裝一袋;
}
while迴圈的組成只有一個條件判斷式,只要判斷為true,就會繼續循環,否則便離開迴圈。下面用程式碼實作看看。
宣告變數nutAmount,表示開心果數量(以「鏟」為單位),但老闆本身不知道採購量可以鏟幾次(買的是桶裝)。再宣告bagAmount,表示包裝的次數。接著使用迴圈敘述,定義繼續分裝的條件為:還能再裝下一袋,也就是剩餘超過3鏟。
每次的循環,會使開心果減少3鏟的量,並增加1袋的包裝,顯示在螢幕上。此處的「bagAmount++」同樣是將變數遞增的意思,可以單獨使用。
使用迴圈時要注意,在重複執行的動作,要有機會使得條件判斷為false,這樣才能離開迴圈。就像開心果必定會有分裝完的時候。如果無限循環下去,這種狀況稱為「無窮迴圈」,程式流程永遠無法往下進行,被困在迴圈裡。
四、do while 迴圈
程式在執行到while迴圈時,就會馬上做條件判斷,判斷為true才進入迴圈內部。然而還有一種是無論如何都先執行一次內部的程式,之後才判斷是否繼續循環,那就是「do while迴圈」。
用一個情境來舉例:有個抽數字遊戲,可以不斷地抽1~10的數字,規定抽到1的話就停止,最後計算抽取的次數。用程式實作,可以寫成這個樣子。
do {
要重複執行的動作
} while (繼續循環的條件);do {
隨機抽取一個號碼;
將號碼顯示在螢幕上;
更新抽取次數;
} while (剛剛抽到的數字不是1);
do while與while的差別,很明顯在於條件判斷的位置是在下方。而上面的「do」關鍵字,代表進入迴圈後直接先執行一次,到下面才進行判斷。值得注意的是,這種迴圈要在最後加上分號。接著用程式碼來實作這個情境。
宣告變數times與number,分別存放次數與抽到的數字。接著利用Java提供的一個方法:Math.ramdom,來產生隨機數字,這個方法會在第六節介紹。在do while迴圈內隨機產生1~10的數字,隨即顯示在螢幕上。接著判斷抽到的數字如果不是1,就繼續抽取。否則離開迴圈,顯示抽取次數。
五、強制離開迴圈
在上一課介紹選擇敘述「switch case」時,有使用「break」來離開敘述。在迴圈同樣也可以使用這個指令。讓我們將抽數字遊戲的情境,改成規定最多只能抽5次,並用for迴圈改寫。
在範例中可以觀察到,前面由於在第三次循環時抽到數字1,因此執行了break,使得迴圈提前結束。接著再次執行,一直都沒抽到數字1,在只能抽五次的規定下,最後也離開了迴圈。
六、產生隨機數字
當我們想產生隨機數字時,可以使用「Random」函數。上一節使用的是「Math類別」所提供的方法,它能產生大於等於0且小於1的double型態數值。因此該方法產生的數字若為x,則x * 10的範圍為:0≤x<10的浮點數。
接著透過「強制轉型」的技巧,將範圍較大的數值型態轉為相對小的。此處把double轉型成int數值。因此「(int) (Math.random() * 10)」的範圍為:0≤n<9的整數,最後再加1,即可讓變數number隨機得到1≤n<10的整數。
另外還有一種方式也能產生隨機數字,是藉由一個叫「Random」的物件。
Random rad = new Random();
number = rad.nextInt(參數);
目前還沒介紹到物件導向的觀念,對初學者而言可能看不懂,總而言之,先宣告一個資料型態為Random的「物件」,再使用它提供的「nextInt」方法即可。這個方法需要一個int參數(假設稱為i),藉此產生範圍為0≤n<i-1的int數值。
因此,若要將上一節的範例用Random物件改寫,會變成像這樣。
在撰寫程式輸入「Random」到一半時,如果出現選單可以選擇Random,按下Enter選擇即可。讓開發工具幫我們「匯入套件」,如此才能使用Random這個類別。這就像讀書時,如果課本的題目不夠練習,就會到書店買參考書一樣。匯入套件相當於題目不敷使用(程式碼不夠)時,就去買參考書(匯入套件)。
改寫完後,看起來比用Math.random簡潔了一點。