Kotlin Tutorial(5)決策與判斷 << 前情
Kotlin提供跟一般程式設計語言類似的迴圈,包含while和do-while兩種迴圈,用來執行重複的工作,例如處理多筆資料。Kotlin改良一般程式設計語言也都有的for迴圈,搭配「範圍運算式、Range expresssions」,讓for迴圈更簡單、好用。
while迴圈
while迴圈使用boolean運算式控制迴圈執行的次數,依照應用程式的需求,控制迴圈執行的次數。這是while迴圈的語法:
while (<boolean運算式>) {
迴圈執行的工作
}
如果迴圈執行的工作只有一行敘述的時候,可以省略左、右大括號({、}):
while (<boolean運算式>)
迴圈執行的工作(只有一行敘述)
如果應用程式需要執行特定次數的工作,可以使用下面範例程式的作法,
/* net.macdidi5.kotlin.tutorial.ch06.HelloWhile01.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
// 宣告迴圈執行次數用的變數
var i = 0
// 使用boolean運算式控制迴圈執行的次數
while (i < 5) {
print(i)
// 每執行一次迴圈,變數就加一
i++
}
// 顯示:01234
}
使用while迴圈可以執行合計這類工作:
/* net.macdidi5.kotlin.tutorial.ch06.HelloWhile02.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
var i = 1
// 宣告加總用的變數
var total = 0
// 執行一加到十的迴圈
while (i <= 10) {
total += i
i++
}
println("Total: $total")
// 顯示:Total: 55
}
do while迴圈
do while與while非常類似,下面是它的語法:
do {
迴圈執行的工作
} while (<boolean運算式>)
如果迴圈執行的工作只有一行敘述的時候,可以省略左、右大括號({、}):
do
迴圈執行的工作(只有一行敘述)
while (<boolean運算式>)
while迴圈根據資料與條件的判斷,在執行後會執行零到多次。do while迴圈把條件的判斷放在最後,所以它一定會執行一次。一般迴圈的應用,可以使用while或do while迴圈,例如下面這個基本的範例程式:
/* net.macdidi5.kotlin.tutorial.ch06.HelloDoWhile01.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
var i = 0
do {
print(i)
i++
} while (i < 5)
// 顯示:01234
}
使用do while迴圈可以執行合計這類工作:
/* net.macdidi5.kotlin.tutorial.ch06.HelloDoWhile02.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
var i = 1
var total = 0
do {
total += i
i++
} while (i <= 10)
println("Total: $total")
// 顯示:Total: 55
}
for迴圈與範圍
一般程式設計語言提供的for迴圈,在使用上與while、do while迴圈類似,同樣需要自己宣告變數與設定條件。Kotlin把for迴圈設計的比較簡單一些,搭配使用範圍運算式(range expression),可以更方便完成其它迴圈執行的工作。for迴圈還可以來處理陣列與集合資料,目前先瞭解一般迴圈的應用,下面是for迴圈搭配範圍運算式的語法:
for (變數名稱 in 起始值..終止值) {
迴圈執行的工作
}
如果迴圈執行的工作只有一行敘述的時候,可以省略左、右大括號({、}):
for (變數名稱 in 起始值..終止值)
迴圈執行的工作(只有一行敘述)
使用for迴圈執行固定次數的工作,可以使用範圍運算式設定迴圈執行的次數,例如下面執行五次的for迴圈範例:
/* net.macdidi5.kotlin.tutorial.ch06.HelloFor01.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
for (i in 0..4) {
print(i)
}
// 顯示:01234
println()
for (c in 'A'..'E')
print(c)
// 顯示:ABCDE
}
依照迴圈執行的工作,可以設定需要的範圍運算式,例如下面執行合計的範例程式:
/* net.macdidi5.kotlin.tutorial.ch06.HelloFor02.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
var total = 0
for (i in 1..10) {
total += i
}
println("Total: $total")
// 顯示:Total: 55
}
範圍運算式設計的非常靈活,你可以依照應用程式的需求,使用下面的法法:
// 從n(最小值)到m(最大值)
變數名稱 in <n>..<m>
// 從n(最小值)到m(最大值),每次增加x
變數名稱 in <n>..<m> step <x>
// 從n(最小值)到m-1(最大值)
變數名稱 in <n> until <m>
// 從n(最小值)到m-1(最大值),每次增加x
變數名稱 in <n> until <m> step <x>
// 從n(最大值)到m(最小值)
變數名稱 in <n> downTo <m>
// 從n(最大值)到m(最小值),每次減少x
變數名稱 in <n> downTo <m> step <x>
下面的範例程式示範各種範圍運算式的效果:
/* net.macdidi5.kotlin.tutorial.ch06.HelloFor03.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
for (i in 1..5) {
print(i) // 顯示:12345
}
println()
for (i in 1..5 step 2) {
print(i) // 顯示:135
}
println()
for (i in 1 until 5) {
print(i) // 顯示:1234
}
println()
for (i in 5..1) { // 迴圈不會執行
print(i)
}
println()
for (i in 5 downTo 1) {
print(i) // 顯示:54321
}
println()
for (i in 5 downTo 1 step 2) {
print(i) // 顯示:531
}
}
break與continue
依照應用程式的需求,使用迴圈的設定可以完成一般的工作。如果需要在迴圈運作的過程執行特別的流程控制,可以在三種迴圈裡面使用break離開迴圈:

下面的範例程式示範break在while迴圈的效果,其它兩種迴圈同樣適用:
/* net.macdidi5.kotlin.tutorial.ch06.HelloBreak01.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
var i = 0
while (true) {
print(i)
i++
if (i == 5) {
break
}
}
// 顯示:01234
}
continue可以在三種迴圈裡面執行特別的流程控制:

下面的範例程式示範continue在for迴圈的效果,其它兩種迴圈同樣適用:
/* net.macdidi5.kotlin.tutorial.ch06.HelloContinue01.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
for (i in 1..50) {
// Math.random()產生一個隨機數字
val temp = (Math.random() * 36).toInt()
if (temp < 30) {
continue
}
println("Temperature[$i]: $temp")
}
}
Label
有時候應用程式需要使用多層的迴圈執行比較複雜的工作,通常會稱為巢狀迴圈。如果在巢狀迴圈需要執行特別的流程控制,可以先使用標籤(Label)幫迴圈命名,再使用下面的語法:

下面的範例程式示範break與標籤在for迴圈的效果,其它兩種迴圈同樣適用:
/* net.macdidi5.kotlin.tutorial.ch06.HelloBreakLabel01.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
outer@ for (x in 1..5) {
for (y in 1..5) {
println("X:$x - Y:$y")
if (y == 3) {
break@outer
}
}
}
// 顯示:
// X:1 - Y:1
// X:1 - Y:2
// X:1 - Y:3
}
continue與標籤可以在三種迴圈裡面執行特別的流程控制:

下面的範例程式示範continue與標籤在for迴圈的效果,其它兩種迴圈同樣適用:
/* net.macdidi5.kotlin.tutorial.ch06.HelloContinueLabel01.kt */
package net.macdidi5.kotlin.tutorial.ch06
fun main(args: Array<String>) {
outer@ for (x in 1..5) {
for (y in 1..5) {
if (y > 3) {
continue@outer
}
print(y)
}
println("=>X:$x")
}
// 顯示: 123123123123123
}
下一步
現在已經認識Kotlin程式設計語言基本的架構、變數、型態與流程控制,這些也是所有程式設計語言最基礎的部份。接下來準備認識在應用程式經常使用的「陣列」,搭配for迴圈用來處理比較大量的資料。
相關的檔案都可以在GitHub瀏覽與下載。
http://github.com/macdidi5/Kotlin-Tutorial
後續 >> Kotlin Tutorial(7)陣列
|