程序流程的控制之循环(Delphi)
循环式编程语言中给一个共同的元素,它可以用来重复执行某个动作,知道某个特定的条件。
所有循环都有以下的元素:
-
起点
-
主体
-
结束点
-
循环结束的条件
-
辅助的Break和Continue过程
循环的开始点是Object Pascal循环语句之一(for、while和repeat),每次循环迭代时,主体包含的语句都要执行一次,主体包含任何有效的Object Pascal代码,它可以是单行代码,也可以使多行代码。若主体包含的是多行代码,其代码必须用begin和end语句分块(只有repeat循环例外)。循环的结束点要么是关键字end(在for循环和while循环情况下),要么是关键字until(在repeat循环情况下)。当一个循环主体是单行代码时,就不需要用关键字begin和end。
大部分循环都是这样操作的:进入循环并检验条件,若检验结果为False,则执行循环主体,当程序执行到循环体底部时,它将跳回循环顶部,并再一次检验条件,如果检验结果仍然是False,则重复整个以上过程,若检验结果是True,则程序将立刻跳到紧跟在循环代码块后面的代码行。(这些描述对于repeat循环是个例外,它是在循环底部检验条件,而不是在循环顶部。)
Caution
偶尔很容易把循环检验条件写成永远的False,其结果就会使程序锁死或者挂起,不停地循环,这种情况下只能在Windows任务管理器里面来终止该进程。
Tip
在Delphi中,可用工具栏中的Run按钮或者按F9来运行一个程序,若要杀死一个在IDE中运行的程序,可在主菜单上选择Run | Program Reset或者按Ctrl + F2。
在Delphi中可以使用for to/down to do、while…do和repeat…until三种方式来实现循环控制。
var I: Integer; X: Integer; begin X := 10; for I := 0 to 9 do { I从0递增变化到9,依次执行10次DoSomething} begin { DoSomething} end; for I := 0 to Pred(X) do { Pred(X)返回X的前一个值,即9} begin { DoSomething} end; for I := 9 downto 0 do { I从9递减变化到0,依次执行10次DoSomething} begin { DoSomething} end; X := 8; { I从9递减到0,循环10次} for I := Succ(X) downto 0 do begin { Succ函数返回指定值的后一个} { DoSomething} end; I := 0; while I <= 10 do { 和for I := 0 to 10 do的功能是一样的} begin ShowMessage(IntToStr(I)); Inc(I); { while的特点就是可以自己控制循环因子} end; I := 0; repeat { 和while I <= 10 do 功能相同} ShowMessage(IntToStr(I)); Inc(I); until I = 10; I := 0; { Inc以指定的值递增,Dec以指定的值递减} Inc(I); { I = 1} Inc(I, 2);{ I = 3} Dec(I, 2);{ I = 1} Dec(I); { I = 0} ShowMessage(IntToStr(I)); end;
Caution
使用for方式要注意,循环变量的步长是固定为1的,不能再循环体中用代码进行修改。
while的特点就是可以自行控制循环变量的变化,灵活性比for更大。
repeat是从while演化过来的。while首先要判断条件是否成立再执行,而repeat是首先执行,再判断条件是否成立。
Note
上面代码中对于I变量名的使用起源于FORTRAN语言,而这也是for循环的习惯用法。
Continue和Break过程
Continue过程,用来强制程序执行到循环底部并进入一个循环,而跳过Continue后面的所有语句。如果位于try…finally块中则会先执行finally..end块再进入下一个循环。
var I:Integer; begin for I := 0 to 2 do begin try if I < 1 then Continue; ShowMessage(IntToStr(I)); finally ShowMessage('finally..end'); end; end; end;
运行结果依次如下(图示中0,1,2分别代表循环变量I变化时的显示结果):
Break过程,用来循环正常结束之前终止循环。如果位于try…finally块中,则finally…end块也会得到执行,例如下面代码:
var I:Integer; begin for I := 0 to 2 do begin try if I > 1 then Break; ShowMessage(IntToStr(I)); finally ShowMessage('finally..end'); end; end; end;
运行结果依次如下(图示中0,1,2分别代表循环变量I变化时的显示结果):
Continue和Break只能用在for、while和repeat循环中,如果在循环外部用这两个过程将会产生编译器错误。
以上代码均在Delphi7中测试通过。
posted on 2011-12-17 14:36 pchmonster 阅读(16134) 评论(0) 编辑 收藏 举报