新浪博客

五、循环结构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.
说明:这里whiledo为保留字,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-95-105-11

、求两个正整数mn的最大公约数。
  分析:求两个正整数的最大公约数采用的辗转相除法求解,辗转相除法依据的是公式gcd(a,b)=gcd(b,a mod b)。以下是辗转相除法的算法:
  ①当b<>0时,执行步骤2;否则执行步骤3
  ②把原先b的值赋给a,把原先a mod b的值赋给b,返回步骤1
  ③当前变量a中的值就是最初输入时的ab的最大公约数。
  程序如下:
  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-135-15

repeat语句

repeat 语句用于重复执行循环体,一直到指定的条件为真时停止repeatuntil之间的所有语句称为循环体。

repeat 语句语法格式
repeat
语句1;
……
语句n;
until <</span>布尔表达式>;


循环的执行功能
(1)遇到repeat语句后,即进入循环体,顺序执行循环体内的语句。
(2)遇到until语句后,求布尔表达式的值。若值为假,则返回步骤1;若为,执行步骤3
(3)循环结束,执行until后面的下一条语句。

repeat循环基本上有和while循环一样的描述循环的能力。但有一些不同:
1、 repeat语句的结构中,布尔表达式求值是在循环体执行之后;而在while语句中,布尔表达式求值是在循环体执行之前,也就是说repeat至少执行一次循环体。当描述由计算操作后的情况确定重复是否继续进行的计算时,通常用repeat语句描述。
2、 while语句的成分语句只能是一个语句。因此,当重复动作包含多个语句时,要用beginend,使它变成一个复合语句。而repeat语句的保留字repeatuntil已经起语句括号作用,可以包含多个语句而无须beginend
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.

我的更多文章

下载客户端阅读体验更佳

APP专享