「學姐,我這樣的進度真的趕得上期末考嗎?」經過上午的事,詩憶一整天都有些焦慮不安,唯心剛進教室她就忍不住提出自己的擔憂。
唯心側頭想了想。「這樣好了,妳先試著寫出之前作業的四則運算程式,哪裡卡住就問我。」
唯心提供一個幾乎空白只保留學號
類別和需求目標的檔案。
class 學號 {
//需求目標:四則運算函式,參數有三個,第一個是數字,第二個是加減乘除字元,第三個是數字。
//減法或除法,是第一個數字減去或除去第三個數字。
}
詩憶先加了函式的外殼和加法的部分。
class 學號 {
fun 四則運算(number1: Int, char: Char, number2: Int): Int {
return number1 + number2
}
}
⋯⋯然後就卡住了。
「呃,學姐,妳好像忘記教我怎麼比對了。」詩憶尷尬的說。
「咦?沒說過嗎?」唯心努力回憶。「我記得飲料比較價格那邊有說過呀,大概是說得比較模糊,我再說一次吧。」
唯心抽出一張紙,在上面依序畫上比對的符號。
「大於和小於是>
和<
,後面加個等號就是大於等於和小於等於的>=
和<=
。不等於是兩個符號組成!=
,與之對應的等於自然也是兩個符號的組合==
。」
class 學號 {
fun 四則運算(number1: Int, char: Char, number2: Int): Int {
if (char == '+') {
return number1 + number2
}
if (char == '-') {
return number1 + number2
}
if (char == '*') {
return number1 + number2
}
if (char == '/') {
return number1 + number2
}
}
}
學會比對後詩憶寫出了第一個版本,但是出師不利,程式跑不起來。
唯心一眼就看出錯誤原因。「還記得之前我寫的測試案例嗎?字元不只這四種符號,所以需要例外處理throw IllegalArgumentException()
。」
class 學號 {
fun 四則運算(number1: Int, char: Char, number2: Int): Int {
if (char == '+') {
return number1 + number2
}
if (char == '-') {
return number1 - number2
}
if (char == '*') {
return number1 * number2
}
if (char == '/') {
return number1 / number2
}
throw IllegalArgumentException()
}
}
詩憶依言補上例外處理,程式順利跑起來。
唯心滿意地看著通過測試的程式。「很好,這樣就可以了。妳這樣的寫法和else if
的寫法處理邏輯相似呢。」
「else if
是什麼?」詩憶確定今天又聽到一個新詞。
「else
指的是條件以外的情形,else if
就是在條件以外再加上一個新的條件,相對於每個獨自if
的寫法,else if
讓條件式保有連續性判斷,可以把共有的return
提出來唷。」唯心沒有動詩憶的程式碼,而是另外寫一個四則運算elseif
版本。
fun 四則運算elseif(number1: Int, char: Char, number2: Int): Int {
return if (char == '+') {
number1 + number2
} else if (char == '-') {
number1 - number2
} else if (char == '*') {
number1 * number2
} else if (char == '/') {
number1 / number2
} else {
throw IllegalArgumentException()
}
}
「不過,也因為if
條件式比對條件有優先順序,所以如果遇到每個條件發生的可能性一樣的時候,為求處理效率會改用when
條件式。」唯心說著又補上了另一個四則運算when
版本。
fun 四則運算when(number1: Int, char: Char, number2: Int): Int {
return when (char) {
'+' -> number1 + number2
'-' -> number1 - number2
'*' -> number1 * number2
'/' -> number1 / number2
else -> throw IllegalArgumentException()
}
}
詩憶疑惑地發問:「為什麼when
條件式在可能性相似的時候處理效率比較高?」
唯心笑了笑:「還記得基礎型態裡的布林值嗎?其實條件式裡的條件,都是布林值型態。布林值只有兩種值true
和false
。」
唯心順手寫了個列印布林值的程式碼。
fun main() {
val char = '+'
val isPlus = char == '+'
println(isPlus)
}
「像這樣符合的情形,就會印出true
,反之就是false
。」唯心說完,切換回四則運算
的程式碼繼續說。「if
條件式是按照優先順序,只要前面的條件符合就不計算後面條件的布林值。但是when
會把所有條件的布林值都同時算好,再選擇第一個true
執行。以參數符合的是第四個條件的'/'
為例,假設每次計算條件需要一秒鐘,if
要花上四秒鐘,才能抵達除法那行,而when
只要兩秒鐘。而else
因為是剩下的條件,在兩種條件式都會比'/'
多上一秒鐘。」