朱涛 · Kotlin 编程第一课
朱涛
Google 认证的 Kotlin、Android 开发者专家,博客“Kotlin Jetpack 实战”作者
6717 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
朱涛 · Kotlin 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

04 | 实战:构建一个Kotlin版本的四则运算计算器

你好,我是朱涛。
前面几节课,我们学了不少 Kotlin 的语法,也算是对 Kotlin 有了一个基本认识。不过,单纯只认识 Kotlin 是远远不够的,我们还要会用 Kotlin。当遇到一个具体问题的时候,我们得能用 Kotlin 来解决这个问题。换句话说,就是要实战。在实战的过程中,我们对 Kotlin 的理解也会进一步加深。
那么这节课,我们就把前面的知识点串联起来,一起做一个 Kotlin 版本的计算器。为了便于理解,我会以循序渐进的方式来编写这个计算器程序,由简单到复杂。你在这个由易到难的实操过程中,可以实际体会到 Kotlin 的代码实现思路以及编码方式的变化,进而也就能更好地掌握和运用前面所学的基础语法,以及与面向对象相关的知识点。
这个计算器程序大致会分为三个版本:
计算器 1.0,实现两个整数的“加减乘除”,对输入数据有严格要求。
计算器 2.0,对输入数据无严格要求,融入面向对象的编程思想。
计算器 3.0,支持“大数的加法”,增加单元测试。
现在,我们就开始实战吧。

创建 Kotlin 工程

如果你之前没有使用过 IntelliJ 或 Android Studio,你可能还不知道怎么创建一个工程。别担心,这个过程其实很简单,它分为以下几个步骤。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何使用Kotlin语言构建一个简单的四则运算计算器。作者首先介绍了创建Kotlin工程的步骤,然后详细讲解了计算器的三个版本,分别是计算器1.0、计算器2.0和计算器3.0。在2.0版本中,作者融入了面向对象的思想,将程序封装到一个类中,并且对输入格式进行了兼容处理。在3.0版本中,作者增加了单元测试,并支持了大数的加法。整个文章通过实际的代码演示,帮助读者了解了如何使用Kotlin语言构建一个简单的计算器,并且在实现过程中逐步优化代码,展示了Kotlin语言的特点和优势。 在第一阶段,文章介绍了如何在Kotlin中使用单元测试,并展示了测试代码的编写和运行过程。作者强调了单元测试的重要性,以及在实际开发中覆盖所有情况的必要性。 在第二阶段,文章详细讲解了如何实现大数加法功能,通过模拟手写加法竖式的方法,逐位计算并处理进位,最终实现了大数加法的功能。这一部分展示了作者对问题的分析和解决能力,同时也展现了Kotlin语言的灵活性和易用性。 最后,文章强调了单元测试的作用,不仅可以验证新功能,还可以保证旧功能不受影响,避免因为对一个功能的改动导致其他功能出现问题。同时,鼓励读者在实践中尝试实现其他大数运算功能,以加深对Kotlin语言的理解和应用。 总的来说,本文通过实际案例向读者展示了Kotlin语言的特点和优势,同时强调了在实际开发中的重要性和实用性。对于想要学习Kotlin语言并将其应用到实际项目中的读者来说,本文提供了很好的参考和指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱涛 · Kotlin 编程第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(23)

  • 最新
  • 精选
  • qinsi
    val left = exp.left val operator = exp.operator val right = exp.right 是不是可以写成 val (left, operator, right) = exp

    作者回复: 赞!

    2022-01-04
    5
    31
  • 王玉朋
    老师,135+99的加法竖式动画图是用什么做的?

    作者回复: 用PPT的动画一帧一帧做的。

    2022-01-04
    6
  • Geek_Adr
    V3实战 加 算法 !提高语言的手感? 坏学生偷懒 string.toBigInteger()

    作者回复: 嗯……实际工作中是更推荐的。

    2022-02-04
    3
  • 苍王
    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-30
    2
    2
  • JokerFake
    所以枚举那只能传ADD 不能传+ 这个bug是故意就给我们自己改的?

    作者回复: 嗯,这只是1.0理想的结构。也是因为枚举的valueOf有这个问题,所以在后面版本当中才会有其他的方式。

    2022-01-06
    2
  • JL
    您好,想问一个关于单元测试的问题: 我在工作中assertEquals 和 assertThat().equals() 两种都遇到过 但是有人说 第二种更好一点。 想听听您的意见和建议。 之前网上搜了一下 也没有看到过说哪个好哪个坏

    作者回复: 首先,Kotlin官方没有提供assertThat()这样的语法支持。在Junit当中,assertThat()的优势在于它更加灵活一些。至于哪个好哪个坏肯定是无法一概而论的,它们肯定都有各自适用的场景。 我个人的理解是: assertEquals适合简单场景,assertThat()适合灵活一些的场景。

    2022-01-05
    2
  • droidYu
    老师,V1版本的代码输入 3 + 4 会报错:No enum constant Operation.+;需要输入3 ADD 4才能正常运行,是您标的①处的代码的问题Operation.valueOf()方法抛错,为什么要故意写错,是有什么设计要讲解吗?

    作者回复: 这是一个常见的错误用法,后续版本的做法才是对的,我打算在加餐里详细解释的。

    2022-03-20
    2
    1
  • 爱学习的小羊
    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-23
    1
  • 故事与酒
    大数加和乘 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
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部