分解任务的做法是:列出任务包含的各项独立工作,给每一项一个清楚的单一目的,再排成每一项都能拿到所需内容的顺序。以”设计一个算法……”开头的题目,在伪代码出现之前就已经在考察这个习惯。
这是算法设计的第一步,下一课定义输入、输出和限制条件会让每一部分更精确。
怎样把任务拆成几部分?
读题,给每个动词画线:收集、相加、比较、输出。每个动词通常对应一个子问题。然后对每一部分问三个问题。
- 它开始之前需要什么?
- 它交给下一部分什么?
- 我能单独测试它吗?
如果你答不出第三个问题,说明这一部分太大或太模糊。
例题
老师输入五个测验分数,每个满分 20。如果平均分至少为 10,程序输出 PASS,否则输出 FAIL。
**第 1 步,给任务画线:**收集五个分数,相加,求平均,与 10 比较,输出一个词。
第 2 步,为每个子问题写出输入和输出:
| 子问题 | 需要 | 产生 |
|---|---|---|
| 收集并相加分数 | 五个分数 | Total |
| 求平均分 | Total | Average |
| 判断通过或不通过 | Average | 单词 PASS 或 FAIL |
| 输出 | 该单词 | 屏幕上的文字 |
**第 3 步,排序。**每一行都需要上一行的结果,所以顺序是固定的。
第 4 步,把每一部分写成伪代码:
Total ← 0
FOR Count ← 1 TO 5
INPUT Mark
Total ← Total + Mark
NEXT Count
Average ← Total / 5
IF Average >= 10 THEN
OUTPUT "PASS"
ELSE
OUTPUT "FAIL"
ENDIF
**第 5 步,用分数 12、15、9、18、16 测试。**每输入一个分数后的 Total:12、27、36、54、70。Average = 70 / 5 = 14。因为 14 >= 10,输出 PASS。手动再加一遍也得 70,两者吻合。
要小心的错误
一个常见的失误,是子问题只是把任务重述一遍。
**错误的计划:**1. 取得分数。2. 算出结果。3. 输出。
“算出结果”把总分、平均和比较都藏起来了,所以没有任何东西可以测试。
改正的方法是一直拆,直到每一行都有清楚的输入和输出,就像上面的表格。另一个失误是把 Total ← 0 放进循环里。这样每个分数都会让总分重新开始,最后的平均分只用到最后一个分数。
自我检测
1. 图书馆程序要读取一本书逾期的天数,并按每天 RM0.20 输出罚款。列出子问题。
Show answer
读取逾期天数。乘以 0.20 得到罚款。输出罚款。逾期 15 天时,罚款是 15 × 0.20 = RM3.00。
2. 下面的计划顺序乱了,请改正:输出平均值、把数字相加、用总和除以个数、输入数字。
Show answer
输入数字,把数字相加,用总和除以个数,输出平均值。每一步都需要上一步的结果。
3. 在测验例题中,如果 Total ← 0 放在循环内,分数为 12、15、9、18、16,平均分会是多少?
Show answer
每个分数都会重置总分,所以最后一个分数之后 Total = 16。平均分是 16 / 5 = 3.2,错误地得到 FAIL。
接下来学什么
下一步,为每个部分定义输入、输出和限制条件。伪代码追踪训练器可以让你逐步运行这样的算法。
如果拆解任务正是你卡住的地方,我们的老师可以在一对一线上计算机科学补习中和你一起解决,练习题也提供更多可拆分的任务。