将问题变成代码
创建一个简单的消费计算程序。该程序应该提示用户输入账单金额和小费比例,该程序必须计算出小费,并显示小费和总金额
理解问题
要想知道应该做什么,最好的一个方法是把它写下来
先考虑一些可以向我提出的问题,以便通过这些问题更好地理解我想要的是什么。
将较大的程序分解成更容易管理的、较小的特性。这么做的话,因为每个特性可以具体化,所以成功的概率更大。已有的大部分复杂应用都是由很多较小的、一起工作的程序组成的。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();
}