资源描述
单击此处编辑母版标题样式,单击此处编辑母版副标题样式,while,循环和,repeat-until,循环,1.while,循环,2.repeat-until,循环,3.,多重循环结构,对于,for,循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用,while,语句或,repeat,语句实现循环要更方便。,1.while,循环,1.1while,语句的形式为:,while do,;,其意义为:当布尔表达式的值为,true,时,执行,do,后面的语句。,1.2 while,语句的执行过程为:判断布尔表达式的值,如果其值为真,执行步骤,2,否则执行步骤,4;,执行循环体语句,(do,后面的语句,);,返回步骤,1;,结束循环,执行,while,的下一个语句。,说明:这里,while,和,do,为保留字,,while,语句的特点是先判断,后执,行。当布尔表达式成立时,重复执行,do,后面的语句,(,循环体,),。,例,1,:求,s=1+2+99+100.,program xy;,var,i,sum:interger;,begin,i,:,=1,;,sum:=0;,while i=100 do,begin,sum:=sum+i;,i:=i+1;,end;,writeln(sum);,end.,i=100,sum:=sum+i,i:=i+1;,真(非,0,),假(,0,),1.3,举例,下一条语句,(循环语句结束),例,2:,求恰好使,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,。,program xy;,var,s:real;,n:integer;,n,表示项数,begin,s:=0.0;n:=0;,while sn),。求,m/n,的余数,r.,若,r=0,则,n,为最大公约数,.,若,r0,执行第步,.,将,n,的值放在,m,中,将,r,的值放在,n,中,.,返回重新执行第步。,a,b,r,6,4,2,4,2,0,program xy;var m,n,a,b,r:integer;begin,readln(m,n);,a:=m;b:=n;r:=a mod b;,while r0 do,begin,a:=b;b:=r;,r:=a mod b;,end;,writeln(b:8);end.,求两个正整数,m,和,n,的最小公 倍数,可以用,m*n div(m,和,n,的 最大公约数,).,例如:,6,和,4,的最小公倍数,可以用,6*4 div 2=12.,例,4:,利用格里高公式求,。,/4=1-1/3+1/5-1/7+,,直到最后一项的值小于,10-6,为止。,【,分析,】,解本题的关键就是求右边数值序列的和,序列有明显的特点:分母是从,1,开始的奇数,加、减号轮流出现,因此,我们可以用,n=n+2,表示序列数值的变化,用,f=-f,来设置它们知项的符号位。,program xy;,var n,f:integer;,t,pai:real;,begin,pai:=0;t:=1;n:=1;f:=1;,while abs(t)=1e-6 do,begin,pai:=pai+t;n:=n+2;f:=-f;t:=f/n;,end;,pai:=pai*4;,writeln(pai:10:8);,end.,运行程序会发现没有结果,为什么?因为布尔表达式,abs(t)=1e-6,,即,1/n=1e-6,,而程序的说明部分,n,是整型数,它的范围是,-32768,32767,,条件永远成立,所以形成死循环,从而没有运行结果。,while,循环不需要用顺序型数据来控制循环的次数,改程序的说明部分中的,n,为实型数或说明为长整型即可,请同学们自己修正,以后要对变量的取值范围引起重视。,2.repeat-until,循环,用,while,语句可以实现,当型循环,,用,repeat-until,语句可以实现,直到型循环,。,repeat-until,语句的含义是:,重复执行循环,直到指定的条件为真时为止,。,2.1 repeat-until,语句一般格式,repeat,;,:,;until;,其中,repeat,、,until,是,Pascal,保留字,,repeat,与,until,之间的所有语句称,为循环体。,2.2,说明,(,1,),repeat,语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。(,2,),repeat-until,是一个整体,它是一个(构造型)语句,不要误认为,repeat,是一个语句,,until,是另一个语句。(,3,),repeat,语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用,begin,和,end,把它们包起来,,repeat,和,until,已经起了,begin,和,end,的作用。,while,循环和,repeat,循环是可以相互转化的。,(,4,)在,repeat,和,until,之间的语句构成循环。在它们之间可以有任意多个语句,这一点和,for,,,while,循环不同,,for,,,while,循环体在语法上只允许一条语句。要想循环多条语句必须用复合语句。,2.3repeat-until,语句的执行过程,(1),遇到,repeat,语句后,即进入循环体,顺序执行循环体内的语句。,(2),遇到,until,语句后,求布尔表达式的值。若值为假,则返回步,骤,1,;若为“真”,执行步骤,3(3),循环结束,执行,until,后面的下一条语句。,例,5,:求,s=1+2+99+100.,program xy;,var,i,sum:interger;,begin,i,:,=1,;,sum:=0;,repeat,sum:=sum+i;,i:=i+1;,until i100;,writeln(sum);,end.,i100,sum:=sum+i,i:=i+1;,假(,false,),真(,true,),2.4,举例,下一条语句,(循环语句结束),例,6,求两个正整数,m,和,n,的最大公约数。,程序采用,repeat-until,循环实现。,program xy;,var m,n,r :integer;,begin,readln(m,n);,repeat /,辗转相除法,r:=m mod n;,m:=n;,n:=r;,until r=0;,writeln(m);,end.,为什么用,while,语句结果是,n,repeat until,语句结果是,m?,例,7,校体操队到操场集合,排成每行,2,人,最后多出,1,人,;,排成每行,3,人,也多出,1,人,;,分别按每行排,4,5,6,人,都多出,1,人,;,当排成每行,7,人时,正好不多。求校体操队至少是多少人,?,【,分析,】,设校体操队为,X,人,根据题意,X,应是,7,的倍数,因此,X,的初值为,7,以后用,inc(x,7),改变,X,值;为了控制循环,用逻辑变量,yes,为真,(True),使循环结束;,如果诸条件中有一个不满足,yes,的值就会为假,(false),,就继续循环。,program xy;,var x:integer;yes:boolean;,begin,x:=0;,repeat,yes :=true;inc(x,7);,if x mod 2 1 then yes:=false;,if x mod 3 1 then yes:=false;,if x mod 4 1 then yes:=false;,if x mod 5 1 then yes:=false;,if x mod 6 1 then yes:=false;,until yes;/,直到,yes,的值为真,writeln(All=,x);readln,end.,程序中对每个,X,值,都先给,Yes,赋真值,只有在循环体中,各句对,X,进行判断时,都得到“通过”(此处不赋假值)才能保持真值。此处的,yes,相当于一个标志变量。,以上我们已介绍了三种循环语句。一般说来,用,for,循环比较简明,只要能用,for,循环,就尽量作用,for,循环。只在无法使用,for,循环时才用,while,循环和,repeat-until,循环,而且,while,循环和,repeat-until,循环是可以互相转化的,具体用哪个,还要看个人喜好,但他们也存在细微区别,,while,语句的循环体有可能一次都不会被执行,而,repeat,语句中循环体至少执行一次。,for,循环在大多数场合也能用,while,和,repeat-until,循环来代替。,一般,for,循环用于有确定次数循环,而,while,和,repeat-until,循环用于未确定循环次数的循环。,当一个循环的循环体中又包含循环结构程序时,我们就称之为循环嵌套。内循环整个作为外循环的一条语句。,3.,多重循环结构,3.1,举例,例,8,求,1!+2!+10!,的值。,【,分析,】,这个问题是求,10,自然数的阶乘之和,可以用,for,循环来实现。程序结构如下:,for n:=1 to 10 do,begin,N!,的值,t,累加,N!,的值,s,end,显然,通过,10,次的循环可求出,1!,2!,10!,并同时累加起来,可求得,S,的值。而求,T=N!,又可以用一个,for,循环来实现,:,t=1;,for j:=1 to n do,t:=t*j;,整个程序为,:,Program xy;,var t,s:longint;,i,j,n:integer;,begin,s:=0;,for n:=1 to 10 do,begin,t=1;,for j:=1 to n do /,求,n!,t:=t*j;,s:=s+t;/,累加,n!,end;,writeln(s=,s:0:0);,end.,以上的程序是一个二重的,for,循环嵌套。这是比较好想的方法,但实际上对于求,n!,,我们可以根据求出的,(n-1)!,乘上,n,即可得到,而无需重新从,1,再累乘到,n,。,程序可改为:,program ex4_17;,var t,s:longint;,i,j,n:integer;,begin,s:=0;t:=1;,for n:=1 to 10 do,begin,t:=t*n;/t,为上一个数,n-1,的阶乘值,再乘以,n,即为,n!,s:=s+t;/,累加,n!,end;,writeln(s=,s:0:0);,end.,显然第二个程序的效率要比第一个,高得多。第一程序要进行,1+2+,10=55,次循环,而第二程序进行,10,次,循环。如题目中求的是,1,!,2,!,1000,!,则两个程序的效率区,别更明显。,例,9,一个炊事员上街采购,用,500,元钱买了,90,只鸡,其中母鸡一只,15,元,公鸡一只,10,元,小鸡一只,5,元,正好把钱买完。问母鸡、公鸡、小鸡各买多少只?,分析:设母鸡,I,只,公鸡,J,只,这里,I,的值可以是,0,到,33,,,J,的值可以,0,到,50,则小鸡为,90-I-J,只,则,15*I+10*J+(90-I-J)*5=500,显然一个方程求两个未知数是不能直接求解。必须组合出所有可能的,i,j,值,看是否满足条件。,programr xy;,var i,j,k:integer;,begin,for i:=0 to 33 do /,枚举母鸡的数量,for j:=0 to 50 do /,枚举公鸡的数量,begin,k:=90-i-j;,if 15*i+10*j+5*k=500 then writeln(i:5,j:5,
展开阅读全文