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,條件不成立為止。下面用程式碼實作看看。

用for迴圈計算

首先宣告變數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,就會繼續循環,否則便離開迴圈。下面用程式碼實作看看。

使用while迴圈顯示不確定次數的文字

宣告變數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」關鍵字,代表進入迴圈後直接先執行一次,到下面才進行判斷。值得注意的是,這種迴圈要在最後加上分號。接著用程式碼來實作這個情境。

使用do while迴圈連續產生隨機數字

宣告變數times與number,分別存放次數與抽到的數字。接著利用Java提供的一個方法:Math.ramdom,來產生隨機數字,這個方法會在第六節介紹。在do while迴圈內隨機產生1~10的數字,隨即顯示在螢幕上。接著判斷抽到的數字如果不是1,就繼續抽取。否則離開迴圈,顯示抽取次數。

五、強制離開迴圈

在上一課介紹選擇敘述「switch case」時,有使用「break」來離開敘述。在迴圈同樣也可以使用這個指令。讓我們將抽數字遊戲的情境,改成規定最多只能抽5次,並用for迴圈改寫。

使用for迴圈循環第3次時執行了break
使用for迴圈循環5次都沒有執行break

在範例中可以觀察到,前面由於在第三次循環時抽到數字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簡潔了一點。

--

--

Vincent Zheng
新手工程師的程式教室

我是Vincent,是個來自資管系的後端軟體工程師。當初因為學校作業,才踏出寫部落格的第一步。這裡提供程式教學文章,包含自學和工作上用到的經驗,希望能讓讀者學到東西。我的部落已搬家至 https://chikuwa-tech-study.blogspot.com/