iT邦幫忙

2021 iThome 鐵人賽

DAY 12
1
Software Development

溫柔學姐的Kotlin補課/教學系列 第 12

實作四則運算:條件式 when else

  • 分享至 

  • xImage
  •  

「學姐,我這樣的進度真的趕得上期末考嗎?」經過上午的事,詩憶一整天都有些焦慮不安,唯心剛進教室她就忍不住提出自己的擔憂。

唯心側頭想了想。「這樣好了,妳先試著寫出之前作業的四則運算程式,哪裡卡住就問我。」

唯心提供一個幾乎空白只保留學號類別和需求目標的檔案。

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條件式在可能性相似的時候處理效率比較高?」

唯心笑了笑:「還記得基礎型態裡的布林值嗎?其實條件式裡的條件,都是布林值型態。布林值只有兩種值truefalse。」

唯心順手寫了個列印布林值的程式碼。

fun main() {
    val char = '+'
    val isPlus = char == '+'
    println(isPlus)
}

「像這樣符合的情形,就會印出true,反之就是false。」唯心說完,切換回四則運算的程式碼繼續說。「if條件式是按照優先順序,只要前面的條件符合就不計算後面條件的布林值。但是when會把所有條件的布林值都同時算好,再選擇第一個true執行。以參數符合的是第四個條件的'/'為例,假設每次計算條件需要一秒鐘,if要花上四秒鐘,才能抵達除法那行,而when只要兩秒鐘。而else因為是剩下的條件,在兩種條件式都會比'/'多上一秒鐘。」


上一篇
結識班代:四則運算子函式多載 Arithmetic Operators Function Overloading
下一篇
危險氣息的研究室:尾遞迴 Tail Calls
系列文
溫柔學姐的Kotlin補課/教學31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言