3.9 边界值控制的迭代
现在,对求班级平均分问题进行扩展。以下是需求声明:
开发一个计算班级平均分的程序,该程序每次执行时可以处理任意数量的成绩。
需求声明没有说明成绩是什么或者是多少,所以我们会让用户自行输入成绩。该程序要处理任意数量的成绩。用户每次输入一个成绩,直到输入所有成绩,然后输入边界值(也称为信号值、虚拟值或标记值)以表示不再需要输入成绩。
应用边界值控制的迭代
下面的脚本使用边界值控制的迭代解决求班级平均分问题。需要注意的是,脚本中应该包含测试是否除以零的语句。如果漏检,可能会出现致命的逻辑错误。在第9章中,我们编写了能够识别此类异常并采取适当措施的程序。
边界值控制的迭代的程序逻辑
在边界值控制的迭代中,程序在到达while
语句之前读取第一个值(第9行)。第9行输入的值确定程序的控制流程是否应该进入while
套件(第12~14行)。如果第11行中的条件为False
,表明用户直接输入了边界值(-1
)而没有输入任何grade
,因此套件不会被执行。如果条件为True
,则执行套件,将grade
加到total
中并使grade_counter
加1。
接下来,第14行从用户输入得到下一个grade
,并使用最新输入的grade
再次测试条件(第11行)。在程序测试while
条件之前,需要先输入grade
的值,因此可以先判定刚刚输入的值是否为边界值,然后再决定是否将该值作为成绩处理。
当输入边界值-1
时,循环终止,程序不会将-1
加到total
中。在上面的边界值控制的循环中,由于边界值由用户输入,因此每个提示信息(第9行和第14行)都应该提示用户边界值是多少。
使用两位小数格式化班级平均分
这个例子将班级平均分格式化为保留小数点后两位。在f
字符串中,可以选择在替换文本表达式之后跟一个冒号(:
)和一个格式说明符,用来描述如何格式化替换文本。格式说明符“.2f
”(第19行)将平均值格式化为浮点数(f
)、保留小数点后两位(.2
)。在这个例子中,成绩的总和是257,当除以3时,会得到85.666666666...。用“.2f
”格式化平均值会令其四舍五入到百分位,得到替换文本85.67。如果平均值的小数点的右侧只有一位小数,则会在末尾补0(例如,85.50)。第8章将会对字符串格式化的功能进行更加深入的讨论。