创建一个简单的消费计算程序。该程序应该提示用户输入账单金额和小费比例,该程序必须计算出小费,并显示小费和总金额

理解问题

要想知道应该做什么,最好的一个方法是把它写下来

先考虑一些可以向我提出的问题,以便通过这些问题更好地理解我想要的是什么。

将较大的程序分解成更容易管理的、较小的特性。这么做的话,因为每个特性可以具体化,所以成功的概率更大。已有的大部分复杂应用都是由很多较小的、一起工作的程序组成的。Linux上的命令行工具就是这么工作的;一个程序的输出可以作为另一个程序的输入。

发现输入、处理和输出

大型应用就是由一系列较小的、相互通信的程序组成的。其中,一个程序的输出会成为另一个程序的输入

不管程序是大是小,如果能花点时间清晰地阐明输入、处理和输出各是什么,就能确保其工作地很好。如果有比较清晰的问题描述,则有个简单的方法,就是看一下问题描述中的名词动词。名词最终会成为输入和输出,动词会成为处理。

创建一个简单的小费计算程序。该程序应该提示用户输入账单金额和小费比例。该程序必须计算出小费,并显示小费和总金额。

  • 输入:账单金额,小费比例
  • 处理:计算小费
  • 输出:小费、总金额

用测试驱动设计

设计和开发软件的最佳方式之一,是从一开始就思考想要的结果。

测试驱动开发(Test-Driven Development,TDD)你会编写很多代码测试程序的输出,或者是测试组成大型程序的单个程序的输出。随着开发的进行,这个测试过程会指导你走向好的设计,并帮助你思考程序可能存在的问题。

列出程序的输入,然后写出应该得到的输出。运行程序,比较预期结果与程序给出的实际结果

输入:
  账单金额:11.25
  小费比例:15
预期结果:
  小费:$1.6875
  总金额:$12.94

程序需要对答案中的分做向上取整

为每个程序设计至少4个测试计划,并尝试尽可能多地考虑别人可能会使程序出错的场景。随着接触更复杂的问题,你可能需要更多的测试计划

用伪代码编写算法

TipCalculator
  Initialize billAmount to 0
  Initialize tip to 0
  Initialize tipRate to 0
  Initialize total to 0

  Prompt for billAmount with "What is the bill amount?"
  Prompt for tipRate with "What is the tip rate?"

  convert billAmount to a number
  convert tipRate to a number

  tip = billAmount * (tipRate / 100)
  round tip up to nearest cent
  total = billAmount + tip

  Display "Tip: $" + tip
  Display "Total: $" + total
End

编写代码

约束
  • 小费比例应输入百分比的数字部分。比如,15%的小费比例,应该输入15,而不是0.15。应该由程序来处理除法
  • 不足一分的,向上取整

挑战

  • 对于账单金额和小费比例,确保用户只能输入数值。如果用户输入的不是数值,则显示相应的提示信息并退出程序

    输入:
        账单金额:abcd
        小费比例:15
    预期结果:请输入一个合法的账单金额数值。
    
  • 不再是显示错误消息并退出,而是在用户输入合法的值之前,一直提示输入。

  • 不允许用户输入负数。

  • 将程序分解为做计算的函数。

  • 使用图形用户界面(GUI)实现这个程序,当有任何值改变时,自动在界面中更新这些值。

  • 不再是让用户以百分比形式输入小费比例,而是让用户通过拖动一个滑动条表示对服务员的满意度,区间是5%~20%。

code

fun main(args: Array<String>) {
    println("请输入消费金额:")
    var total = getInput()
    while (total == null || total <= 0) {
        println("请输入正确的金额:")
        total = getInput()
    }
    println("请输入小费比例:")
    var percentage = getInput()
    while (percentage == null||percentage<1||percentage>100) {
        println("请输入正确的小费比例,15%的小费比例,应该输入15")
        percentage = getInput()
    }
    val tip = if (percentage <= 0.0) {
        0.0
    } else {
        total * percentage / 100.0
    }
    println("小费:$${String.format("%.2f",tip)}")
    println("总消费:$${String.format("%.2f",total+tip)}")

}

fun getInput(): Double? {
    val inputS = readLine()!!
    return inputS.toDoubleOrNull();
}