五、循环结构2——while和repeat语句
2014-10-30 11:04阅读:
对于for循环,一般在循环次数已知的情况下使用。但当循环次数未知,而只能根据某一条件来决定是否进行循环时,用while
语句或repeat语句实现循环更方便。
while语句
while语句用于“当满足某一条件时进行循环”的情况。
while语句的语法格式:
while <</span>布尔表达式> do
语句;
其意义为:当布尔表达式的值为true时,执行do后面的语句,重复执行。
while语句的执行过程为:
①求布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4
②执行循环体语句(do后面的语句)
③返回步骤1
④结束循环,执行while的下一个语句。
关键字do后面的“语句”只能是一条语句,称为“循环体”;如果循环体
中需要包含多个语句则应该采用复合语句。
例如:
var
k:integer;
begin
k:=10;
while k>0 do begin
writeln(k);
k:=k-1;
end;
end.
说明:这里while和do为保留字,while语句的特点是先判断,后执行。
当布尔表达式成立时,重复执行do后面的语句(循环体)。循环结束条件在进入循环体之前测试,若最初的测试值为false,则根本不进入循环体,也就是说while循环是是属于当型循环。为了能使while重复能终止,循环体中一定要有影响布尔表达式的操作,否则该循环就是一个死循环。
例、计算从0到n之间所有奇数的和。
var
n,i,sum:integer;
begin
readln(n);
i:=1;
sum:=0;
while i<=n do begin
sum:=sum+i;
i:=i+2;
end;
writeln(sum);
end.
例、求恰好使s=1+1/2+1/3+…+1/n的值大于10时最小n的值。
分析:“恰好使s的值大于10”意思是当表达式s的前n-1项的和小于或等于10,而加上了第n项后s的值大于10。从数学角度,我们很难计算这个n的值。故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。当s的值超过10时,最后一项的项数即为要求的n。
程序如下:
var
s:real;
i:integer;{n表示项数}
begin
s:=0.0; i:=0;
while s<=10
do{当s的值还未超过10时}
begin
i:=i+1;{项数加1}
s:=s+1/i;{将下一项值累加到s}
end;
writlen('n=',i);{输出结果}
end.
课本的例题5-9、5-10、5-11。
例、求两个正整数m和n的最大公约数。
分析:求两个正整数的最大公约数采用的辗转相除法求解,辗转相除法依据的是公式gcd(a,b)=gcd(b,a
mod b)。以下是辗转相除法的算法:
①当b<>0时,执行步骤2;否则执行步骤3。
②把原先b的值赋给a,把原先a mod
b的值赋给b,返回步骤1。
③当前变量a中的值就是最初输入时的a和b的最大公约数。
程序如下:
var
a,b,r:longint;
begin
readln(a,b);
while b<>0 do begin
r:=a mod
b;
a:=b;
b:=r;
end;
writeln(a);
end.
课本的例题5-13、5-15。
repeat语句
repeat
语句用于“重复执行循环体,一直到指定的条件为真时停止”。repeat与until之间的所有语句称为循环体。
repeat 语句语法格式
repeat
语句1;
……
语句n;
until
<</span>布尔表达式>;
循环的执行功能
(1)遇到repeat语句后,即进入循环体,顺序执行循环体内的语句。
(2)遇到until语句后,求布尔表达式的值。若值为假,则返回步骤1;若为“真”,执行步骤3。
(3)循环结束,执行until后面的下一条语句。
repeat循环基本上有和while循环一样的描述循环的能力。但有一些不同:
1、
在repeat语句的结构中,布尔表达式求值是在循环体执行之后;而在while语句中,布尔表达式求值是在循环体执行之前,也就是说repeat至少执行一次循环体。当描述由计算操作后的情况确定重复是否继续进行的计算时,通常用repeat语句描述。
2、
while语句的成分语句只能是一个语句。因此,当重复动作包含多个语句时,要用begin和end,使它变成一个复合语句。而repeat语句的保留字repeat和until已经起语句括号作用,可以包含多个语句而无须begin和end。
3、
repeat-until是一个整体,它是一个语句,不要误认为repeat是一个语句,until是另一个语句。
4、
repeat语句中,当布尔表达式为true时结束循环;而while语句中,是当表达式为false时才结束循环。
5、
while循环和repeat循环是可以相互转化的。
例、以下循环求n=1+2+3+……+100
var
i,sum:integer;
begin
sum:=0;
i:=0;
repeat
i:=i+1;
sum:=sum+i;
until i=100;
writeln(sum);
end.
例、求两个正整数的最大公约数,程序用repeat-until循环实现。
var
a,b,r:integer;
begin
readln(a,b);
repeat
r:=a mod
b;
a:=b;
b:=r;
until b=0;
writeln(a);
end.