实作四则运算:条件式 when else

「学姐,我这样的进度真的赶得上期末考吗?」经过上午的事,诗忆一整天都有些焦虑不安,唯心刚进教室她就忍不住提出自己的担忧。

唯心侧头想了想。「这样好了,你先试着写出之前作业的四则运算程序,哪里卡住就问我。」

唯心提供一个几乎空白只保留学号类别和需求目标的档案。

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因为是剩下的条件,在两种条件式都会比'/'多上一秒钟。」


<<:  16. HTTP request methods ( 下 )--- PUT vs. PATCH

>>:  【Day01】React 简介

Day 08:八爪章鱼之 tmux 快捷键

今天的 Home 目录没有修改,https://github.com/simba-fs/2021-...

Day4|【Git】用户名称与信箱- Git的初始设定与 config

💡 开始使用 Git 之前,我们需要先设定使用者名称及电子邮件地址。 为什麽需要设定用户名称及 E-...

Day1: 开始学习演算法和资料结构的契机

近期面试掀起了一波考演算法的风气,就好像回到大学指考那样,老师说这题会考一定要记起来,因此掀起了一...

Day 23 - Android 程序实作:简单的使用者进入

Day 23 - Android 程序实作:简单的使用者进入 昨天我讲了我对Android的兴趣,今...

Day2: 什麽是演算法?— Algorithms

图片来源:*https://www.dcard.tw/f/funny/p/225385728 大家...