一、下面我们就来开发一个基于命令行的计算器
新建一个counter.kt文件
package net.println.kotlin.chapters
/** * @author:wangdong * @description:使用kotlin开发一个命令行计数器 */
fun main(args: Array<String>) {
while (true) {
try {
println("请输入算式,例如: 3 + 4,用空格隔开")
//从命令行读取,如果读到的null,直接break
val input = readLine() ?: break
//读取结果可能为空。所以要作非空校验
//用空格切割,trim去掉字符串首位的空白
val splits = input.trim().split(" ")
if (splits.size < 3){
throw IllegalArgumentException("参数格数不对")
}
//第一个参数
val arg1 = splits[0].toDouble()
//第二个参数
val op = splits[1]
//第三个参数
val arg2 = splits[2].toDouble()
//将结果打印出来
println("$arg1 $op $arg2 = ${Operator(op).apply(arg1, arg2)}")
}catch (e: NumberFormatException){
println("请按照正常的格式输入")
}catch (e: IllegalArgumentException){
println("您确定您的输入是用空格分割的吗?")
}catch (e: Exception){
println("您好,程序遇到了未知的错误,错误信息是${e.printStackTrace()}")
}
println("再来一次?[Y]")
val cmd = readLine()
if (cmd == null || cmd.toLowerCase() != "y") {
break
}
}
//用户退出后,需要感谢用户的使用
println("感谢您使用了熊本同学的计算器")
}
/**定义一个类*/
class Operator(op: String){
//定义一个opFun,使用lambda表达式
val opFun:(left: Double,right: Double) -> Double
init {
opFun = when(op){
"+" -> {l,r -> l + r}
"-" -> {l,r -> l - r}
"*" -> {l,r -> l * r}
"/" -> {l,r -> l / r}
"%" -> {l,r -> l % r}
else ->{
throw UnsupportedOperationException(op)
}
}
}
//定义一个方法
fun apply(left: Double, right: Double): Double{
return opFun(left,right)
}
}
输出的结果:
请输入算式,例如: 3 + 4,用空格隔开
4 + 4323
4.0 + 4323.0 = 4327.0
再来一次?[Y]
y
请输入算式,例如: 3 + 4,用空格隔开
431 * 323
431.0 * 323.0 = 139213.0
再来一次?[Y]
y
请输入算式,例如: 3 + 4,用空格隔开
41 +2
您确定您的输入是用空格分割的吗?
再来一次?[Y]
y
请输入算式,例如: 3 + 4,用空格隔开
7 ** 22
java.lang.UnsupportedOperationException: **
at net.println.kotlin.chapters.Operator.<init>(counter.kt:58)
at net.println.kotlin.chapters.CounterKt.main(counter.kt:28)
您好,程序遇到了未知的错误,错误信息是kotlin.Unit
再来一次?[Y]
n
感谢您使用了熊本同学的计算器
是不是很赞!