while循环和repeat-until循环.ppt_第1页
while循环和repeat-until循环.ppt_第2页
while循环和repeat-until循环.ppt_第3页
while循环和repeat-until循环.ppt_第4页
while循环和repeat-until循环.ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 s=10 do当s的值还未超过10时 begin n:=n+1;项数加1 s:=s+1/n;将下一项值累加到s end; writlen(n);输出结果 end.,例3:求两个正整数m和n的最大公约数。,分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算法: 分别用m,n,r表示被除数、除数、余数(一般mn)。 求m/n的余数r. 若r=0,则n为最大公约数.若r0,执行第步. 将n的值放在m中,将r的值放在n中. 返回重新执行第步。,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是整型数,它的范围是-3276832767,条件永远成立,所以形成死循环,从而没有运行结果。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,k:5); end; end.,例10 求100200之间的所有素数。,分析:我们可对100200之间的每一整数进行判断,判断它是否为素数,是则输出。而对于任意整数i,根据素数定义,我们从2开始,到 ,找i的第一个约数。若找到第一个约数,则i必然不是素数。否则i为素数。,program xy; var i : integer; x : integer; begin for i:=100 to 200 do begin x:=2; while (x0)do begin x:=x+1; end; if xtrunc(sqrt(i) then write(i:8); end; end.,例11 试编写能够打印输出如下图形的程序: # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #,program xy; var i,j,k : integer; begin for i : =8 downto 1 do /

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论