04 | 实战:构建一个Kotlin版本的四则运算计算器
创建 Kotlin 工程
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何使用Kotlin语言构建一个简单的四则运算计算器。作者首先介绍了创建Kotlin工程的步骤,然后详细讲解了计算器的三个版本,分别是计算器1.0、计算器2.0和计算器3.0。在2.0版本中,作者融入了面向对象的思想,将程序封装到一个类中,并且对输入格式进行了兼容处理。在3.0版本中,作者增加了单元测试,并支持了大数的加法。整个文章通过实际的代码演示,帮助读者了解了如何使用Kotlin语言构建一个简单的计算器,并且在实现过程中逐步优化代码,展示了Kotlin语言的特点和优势。 在第一阶段,文章介绍了如何在Kotlin中使用单元测试,并展示了测试代码的编写和运行过程。作者强调了单元测试的重要性,以及在实际开发中覆盖所有情况的必要性。 在第二阶段,文章详细讲解了如何实现大数加法功能,通过模拟手写加法竖式的方法,逐位计算并处理进位,最终实现了大数加法的功能。这一部分展示了作者对问题的分析和解决能力,同时也展现了Kotlin语言的灵活性和易用性。 最后,文章强调了单元测试的作用,不仅可以验证新功能,还可以保证旧功能不受影响,避免因为对一个功能的改动导致其他功能出现问题。同时,鼓励读者在实践中尝试实现其他大数运算功能,以加深对Kotlin语言的理解和应用。 总的来说,本文通过实际案例向读者展示了Kotlin语言的特点和优势,同时强调了在实际开发中的重要性和实用性。对于想要学习Kotlin语言并将其应用到实际项目中的读者来说,本文提供了很好的参考和指导。
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
全部留言(23)
- 最新
- 精选
- qinsival left = exp.left val operator = exp.operator val right = exp.right 是不是可以写成 val (left, operator, right) = exp
作者回复: 赞!
2022-01-04531 - 王玉朋老师,135+99的加法竖式动画图是用什么做的?
作者回复: 用PPT的动画一帧一帧做的。
2022-01-046 - Geek_AdrV3实战 加 算法 !提高语言的手感? 坏学生偷懒 string.toBigInteger()
作者回复: 嗯……实际工作中是更推荐的。
2022-02-043 - 苍王private fun minusString(left: String, right: String): String { val result = StringBuilder() //判断是否结果位负数 val isMinus = (left.length < right.length || left.length == right.length && left[0] < right[0]) var leftIndex = left.length - 1 var rightIndex = right.length - 1 var _left = left var _right = right if (isMinus) { _left = right _right = left leftIndex = _left.length - 1 rightIndex = _right.length - 1 } var carry = 0 while (leftIndex >= 0 || rightIndex >= 0) { val leftVal = if (leftIndex >= 0) _left[leftIndex].digitToInt() else 0 val rightVal = if (rightIndex >= 0) _right[rightIndex].digitToInt() else 0 var sum: Int if (leftVal - rightVal < 0) { sum = leftVal - rightVal + 10 + carry carry = -1 } else { sum = leftVal - rightVal + carry carry = 0 } result.append(sum) leftIndex-- rightIndex-- } if (isMinus) { result.append("-") } return result.reverse().toString() } @Test fun testCalculateMinus1() { val calculatorV = CalculatorV3() val result = calculatorV.calculate("90-1") assertEquals("89", result) } @Test fun testCalculateMinus2() { val calculatorV = CalculatorV3() val result = calculatorV.calculate("1-9") assertEquals("-8", result) } @Test fun testCalculateMinus3() { val calculatorV = CalculatorV3() val result = calculatorV.calculate("233333333333333333333-1") assertEquals("233333333333333333332", result) }
作者回复: 代码写的很不错,思路也比较清晰,只是还有一些边界条件没注意好。 能提供单元测试的代码也很不错,不过测试的case覆盖的不是很全面,比如说:"91-98"的情况,就会测试失败。
2022-01-3022 - JokerFake所以枚举那只能传ADD 不能传+ 这个bug是故意就给我们自己改的?
作者回复: 嗯,这只是1.0理想的结构。也是因为枚举的valueOf有这个问题,所以在后面版本当中才会有其他的方式。
2022-01-062 - JL您好,想问一个关于单元测试的问题: 我在工作中assertEquals 和 assertThat().equals() 两种都遇到过 但是有人说 第二种更好一点。 想听听您的意见和建议。 之前网上搜了一下 也没有看到过说哪个好哪个坏
作者回复: 首先,Kotlin官方没有提供assertThat()这样的语法支持。在Junit当中,assertThat()的优势在于它更加灵活一些。至于哪个好哪个坏肯定是无法一概而论的,它们肯定都有各自适用的场景。 我个人的理解是: assertEquals适合简单场景,assertThat()适合灵活一些的场景。
2022-01-052 - droidYu老师,V1版本的代码输入 3 + 4 会报错:No enum constant Operation.+;需要输入3 ADD 4才能正常运行,是您标的①处的代码的问题Operation.valueOf()方法抛错,为什么要故意写错,是有什么设计要讲解吗?
作者回复: 这是一个常见的错误用法,后续版本的做法才是对的,我打算在加餐里详细解释的。
2022-03-2021 - 爱学习的小羊private fun minus(left: String, right: String): String { var maxNumber = String() var mainNumber = String() var resultMean = String() val data = left.length - right.length if (data > 0){ maxNumber = left mainNumber = right resultMean = "" }else if (data < 0){ maxNumber = right mainNumber = left resultMean = "-" }else{ var position = 0 while (left.get(position).digitToInt() == right.get(position).digitToInt()){ position++ } if (left.get(position).digitToInt() - right.get(position).digitToInt() > 0){ maxNumber = left mainNumber = right resultMean = "" }else{ maxNumber = right mainNumber = left resultMean = "-" } } val result = StringBuilder() var maxIndex = maxNumber.length - 1 var mainIndex = mainNumber.length - 1 var carry = 0 while (maxIndex >= 0 || mainIndex >= 0) { var leftVal = if (maxIndex >= 0) maxNumber.get(maxIndex).digitToInt() else 0 var rightVal = if (mainIndex >= 0) mainNumber.get(mainIndex).digitToInt() else 0 leftVal -= carry while (leftVal + carry * 10 < rightVal) { carry++ } val sum = leftVal + carry * 10 - rightVal if (sum in 1..9) { result.append(sum) } maxIndex-- mainIndex-- } return result.append(resultMean).reverse().toString() } 大佬这样写可吗
作者回复: 总体思路是不错的,但没考虑到一种边界情况:“-91-90”。 这题最难的就是判断边界了,你可以基于“-91-90”的情况再分析下。
2022-02-231 - 故事与酒大数加和乘 fun minusString(left:String,right:String):String{ val result = StringBuilder() var _left = left var _right = right var borrowNum = 0 //是否向前借位 var leftIndex = left.length -1 var rightIndex = right.length - 1 //判断是否是小-大 val isRightBig = left.length<right.length || left.length == right.length && left[0] < right[0] if (isRightBig){ _left = right _right = left leftIndex = _left.length - 1 rightIndex = _right.length - 1 } while(leftIndex >=0 || rightIndex >= 0){ val leftVal = if (leftIndex >= 0) _left.get(leftIndex).digitToInt() else 0 val rightVal = if (rightIndex >= 0) _right.get(rightIndex).digitToInt() else 0 val digitResult = leftVal - rightVal - borrow
作者回复: 哎呀,是代码太长截断了吗?我这边看到的代码不完整。
2022-02-14 - 剑来讲一个不是很关键的东西,通过你这个方式拉取代码后,一般刚下来本地是没有start分支的,需要通过origin/start这个远程分支去checkout。
作者回复: 感谢补充。 PS:不熟悉Git操作的小伙伴,可以看看这里。
2022-01-24