6.3.5 重新开始
现在再看一下问题,不要急于得出不完善的解决方案。必须注意,如果这个程序(计算器)运行后只计算一个表达式的值就结束,显然是不满足要求的。我们希望程序的一次执行能够对若干表达式进行计算,因此改进伪代码如下:
很明显程序变得复杂了,但想想我们使用计算器的情景,你就会意识到一次做多个运算是很平常的事情。难道我们让用户做一次运算就启动一次程序吗?可以,但是在很多现代操作系统上启动程序的过程比较慢,因此最好不要这样做。
当我们审视上面的伪代码、最初的解决方案以及设计的使用实例,就产生如下几个问题(其中某些给出了初步答案):
1.如果输入表达式45+5/7,那么如何找出其中的个体元素:45、+、5、/和7?(单词化!)
2.如何标识表达式的结束?当然是用换行符!(要始终保持对“当然”的怀疑:“当然”不是一个有力的理由。)
3.如何将表达式45+5/7作为数据存储以便于计算?在计算加法之前必须先将字符4和5转换为整数45,即4*10+5。(因此单词化是解决方案的一部分。)
4.如何保证表达式45+5/7的计算顺序为45+(5/7)而不是(45+5)/7?
5.表达式5/7的值是多少?大约是0.71,但这不是一个整数。根据对计算器的使用经验可知,用户往往会期望得到一个浮点计算结果。我们应该允许输入表达式中出现浮点数吗?当然!
6.可以使用变量吗?例如,我们能否使用下面的表达式:
好主意,不过先放一放,我们还是先实现计算器的基本功能。
如何回答问题6可能是求解方案中最重要的抉择。在7.8节,你会看到,如果我们决定实现变量功能,程序代码量将会是原来的两倍。让最初版本正常运行起来所花费的时间,也将是原来的两倍。以我们的估计,如果你是一个新手,将会付出四倍的工作量,因而很可能最终放弃。在程序设计早期避免“功能蔓延”是很重要的,应该保证先构建一个简单的版本,只实现最基本的功能。一旦程序能够运转,你可以有更大的野心继续完善程序。分阶段实现一个程序比一次完成要简单得多。如果一开始就实现变量功能还有一个负面影响:很难抵挡进一步添加“漂亮特性”的诱惑。加上常用的数学函数如何?再加上循环功能怎么样?一旦开始便很难停下来。 ...
