4.1.1 循环基本概念

所有程序设计语言都提供创建循环的语句。循环是重复结构的基本成分,这个结构包含一块在某些条件下将会重复执行的代码。在本节中,我们将会介绍这些结构的一些基本概念。首先,我们使用伪代码简单说明一个循环,如例4.1所示。

图4-1 描述循环结构的最通用流程图

例4.1 周而复始 一个循环的一般形式如下:

·开始循环。

·测试看看是否满足某个条件。

·如果满足这个条件:

·{在花括号之间只包括当满足这个条件时要执行的操作

·做一些事情。

·做一些改变测试状态的事情。

·返回第二行并且再次开始。

·}

·如果条件不再满足,执行下一行。

图4-1展示重复结构的流程图表示。这是最通用的一类循环,我们将会在后面的章节中讨论其他类型的循环。

4.1.1.1 迭代

前面说过循环是重复结构的基本成分。虽然任务的重复次数总是任何重复结构的重要部分,但是程序员必须知道循环将会重复多少次以确保这个循环正确执行任务。在计算机术语中,对循环的单次遍历称为一次循环迭代,因此一个执行3次的循环执行3次迭代。例4.2使用伪代码说明一个产生3次迭代的循环。

例4.2 循环三次

程序第一次到达第3行时,因为变量等于1满足小于4,所以这个测试条件是true,因此执行第5~9行。第7行将变量的值改变为2,但是因为2仍然是小于4,所以循环将进入另外一次迭代(第二次迭代)。当它第二次到达第7行时,变量将会再次加1,使之等于3。当程序返回第3行时,这个条件仍然是true(3小于4)。从而循环开始它的第三次迭代,现在第7行把变量的值增加到4。当程序再次返回第3行时,因为4不小于4,所以这个条件不再是true。然后,执行跳至第10行之后的语句。因此,这个程序将执行循环内的语句3次。

4.1.1.2 编写测试条件

所有程序设计语言都支持创建包含一块代码的循环语句,在某些条件下这些语句将会重复执行。有很多方法编写必须满足的条件,不过我们也需要考虑一些基本的概念。通常,考虑不周或错误编写的测试条件将造成不想要的结果(最好)或损失惨重的结果(最坏)。

4.1.1.3 小心无限循环

如果一个测试条件不能被循环中发生的任何事满足,那么循环将会无限期地继续。这称为一个无限循环,这种情况可能导致灾难。例4.3是将引起一个无限循环的伪代码例子。

例4.3 危险的无限循环 在这个例子中,测试条件不可能满足。

在进入循环之后,要求用户在第4行上录入一个数字,并且存储在变量num1中。第5行设定num2等于num1的值加1。第6行显示字Hello。在这个例子中,条件是在循环(第8行)的末端测试。测试说:循环应该一次又一次地重复,直至num1大于num2。然而,因为不管用户在每次迭代时为num1录入什么值,第5行总是设定num2等于这个值加1,从而使循环将会永远地继续重复,所以永远不能满足这个条件。那么,这个程序什么时候结束呢?答案是:永不结束。单词“The End”永远不会显示,但是“Hello!”将会不断地在屏幕上重复显示。

4.1.1.4 不要让用户在循环中陷入困境

如果在循环中需要用户输入,那么要确保用户知道如何离开循环。例如,如果希望当用户录入一个特定的数字或者单词时就结束循环,那么就一定要清楚地告知用户。例4.4的伪代码示范了一个循环如何可能永远地困住用户,以及如何简单地避免这种情形。

例4.4 陷入循环 在这个例子中,如果你知道它是什么,那么测试条件很容易满足!

除非用户碰巧有一位朋友的名字叫done,否则这个循环将会永远地困住用户。每次,他录入一个朋友名字时,将会显示这个名字并且提示用户输入另一个名字。使用这个程序将令人非常沮丧!

当然,这很容易通过简单地告诉用户该如何离开循环来修改这个程序。做法是将第5行修改成:

在例4.3和例4.4使用的这类循环中,循环一直继续,直至用户结束它,而其他类型的循环结束不需要用户输入。不管哪一种类型的循环,你总是要避免循环不能结束的可能性。因此,你一定要确保测试条件能被满足。并且如果结束循环要求用户必须录入一些特别的东西,那么就一定要清楚地告知用户。

4.1节检查点

4.1 重复结构的基本成分是什么?

4.2 定义术语迭代

4.3 定义术语测试条件

4.4 下列伪代码有什么逻辑错误?

4.5 下列伪代码有什么逻辑错误?

4.6 无限循环和例4.5展示的在循环内困住用户的循环之间有什么不同?