循环语句

Pascal 语言中的循环


其它编程语言中使用的循环语句,Pascal 语言中都有,它们包括 for、 while 和 repeat 语句。如果你用过其他编程语言,你会发现 Pascal 中的循环语句没什么特别的,因此这里我只作简要的说明。

For 循环

Pascal 中的 for 循环严格地建立在计数器基础上,循环每执行一次,计数器不是增加一个值就是减小一个值。下面是一个 for 语句的简例,用来将前十个数加起来:

Var
 K, I: Integer;
begin
 K := 0;
 for I := 1 to 10 do
   K := K + I;

同样的 for 语句可以用正好相反的计数器来写:

var
 K, I: Integer;
begin
 K := 0;
 for I := 10 downto 1 do
   K := K + I;

Pascal 中的 for 循环语句其灵活性比其他语言小(它不能指定 1 之外的步长),不过简单也容易理解。如果需判断的条件比较复杂,或想自定义计数器,你可以用 while 语句或 repeat 语句,而不是 for 循环语句。

注意:for 循环计数器不必非是数字,它可以是任何有序类型的值,例如一个字符或一个枚举类型值。

while 语句和 repeat 语句

while-do 循环语句和 repeat-until 语句的不同点在于 repeat 循环语句的代码至少要执行一次。从下面的简例很容易理解这一点:

while (I <= 100) and (J <= 100) do
begin
 // use I and J to compute something...
 I := I + 1;
 J := J + 1;
end;
repeat
 // use I and J to compute something...
 I := I + 1;
 J := J + 1;
until (I > 100) or (J > 100);

从上可见即使 I 或 J 的初始值大于 100,repeat-until 循环中的代码也仍会执行一次。

注意:两种循环另一个关键的不同点是,repeat-until 循环的条件是反向的条件,只要不满足这个条件,循环就执行;当条件满足时,循环终止。这正好与 while-do 循环相反,while-do 循环当条件是真值时才执行。为此,我不得不在上面代码中用反向条件来获得相同的结果。

一个循环语句例子

为了探究循环的细节,让我们看一个 Delphi 简例,这个循环例子表现了固定计数器循环和随机计数器循环之间的差别。建一个新的工程,在主窗体上放一个 listbox 和两个 button,通过设置 Object Inspector 中的 name 属性分别命名 button 为 BtnFor 和 BtnWhile。你还可以把 Caption 属性中的 Btn 去掉,或甚至加上 & ,让跟在 & 后面的字母成为快捷键。下面是该窗体文本描述:

object Form1: TForm1
 Caption = 'Loops'
 object ListBox1: TListBox ...
 object BtnFor: Tbutton
   Caption = '&For'
   OnClick = BtnForClick
 end

object BtnWhile: Tbutton
   Caption = '&While'
   OnClick = BtnWhileClick
 end
end

图 5.2: 单击 For 按钮后显示的结果

现在,我们分别给两个 button 添加 OnClick 事件代码。第一个 button 用一个简单的 for 循环来显示一列数字,结果如图 5.2。这个循环向 listbox 中的 Items 属性添加一系列字符串。在执行循环之前,需要清除 listbox 中的内容。程序如下:

procedure TForm1.BtnForClick(Sender: TObject);
var
 I: Integer;
begin
 ListBox1.Items.Clear;
 for I := 1 to 20 do
   Listbox1.Items.Add ('String ' + IntToStr (I));
end;

第二个 button 的事件代码稍微复杂点。本例中让 while 循环基于一个随机增长的计数器。为实现它,我调用了 Randomize 过程, 用它来重置随机数发生器,还调用了 Random 函数, 其取值范围为 100, 即函数返回 0 至 99 之间的随机数,随机数序列控制 while 循环的执行次数。

procedure TForm1.BtnWhileClick(Sender: TObject);
var
 I: Integer;
begin
 ListBox1.Items.Clear;
 Randomize;
 I := 0;
 while I < 1000 do
 begin
   I := I + Random (100);
   Listbox1.Items.Add ('Random Number: ' + IntToStr (I));
 end;
end;

每次点击 While 按钮,出现的数字都不同,因为这些数字取决于随机数发生器。图 5.3 显示了两次点击的结果,可看到不仅每次产生的数字不同,而且数据项数也不同。也就是说,这个 while 循环执行的次数是随机的。

图 5.3: 按 While 按钮后显示的结果

注意:用 Break 和 Continue 系统过程可以改变循环执行的标准流程。Break 中断循环;Continue 直接跳至循环测试句,或使计数器增加一个步长,然后继续循环(除非条件为空或计数器达到最大值)。还有两个系统过程 Exit 和 Halt,让你立即从函数或过程中返回,或者终止程序。


联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678