资源预览内容
第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
第9页 / 共20页
第10页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
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; begini:=1;sum:=0;while in)。求m/n的余数r.若r=0,则n为最大公约数.若r0,执行第步.将n的值放在m中,将r的值放在n中.返回重新执行第步。abr642420program xy; var m,n,a,b,r:integer; beginreadln(m,n);a:=m;b:=n;r:=a mod b;while r=1e-6 dobeginpai : =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; begini:=1;sum:=0;repeat sum:=sum+i;i:=i+1;until i100;writeln(sum); end.i100sum:=sum+i i:=i+1;假(false )真(true)2.4举例下一条语句 (循环语句结束)例6 求两个正整数m和n的最大公约数。 程序采用repeat-until循环实现。program xy; var m,n,r : integer; beginreadln(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; beginx:=0;repeatyes :=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 dobeginN!的值t累加N!的值send 显然,通过10次的循环可求出1!,2!,10!,并同时累加起来, 可求得S的值。而求 T=N!,又可以用一个for循环来实现:t=1;for j:=1 to n dot:=t*j;整个程序为: Program xy; var t,s:longint; i,j,n:integer; begins:=0;for n:=1 to 10 dobegint=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; begins:=0;t:=1;for n:=1 to 10 dobegint:=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; beginfor i:=0 to 33 do /枚举母鸡的数量for j:=0 to 50 do /枚举公鸡的数量begink:=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; vari : integer;x : integer; beginfor i:=100 to 200 dobeginx:=2;while (x0)dobeginx:=x+1;end;if xtrunc(sqrt(i) then write(i:8);end; end.例11 试编写能够打印输出如下图形的程序: # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #program xy; var i,j,k : integer; beginfor i : =8 downto 1 do /总共要输出8行内容beginfor j : =1 to 8-i do write ( ); /控制每行空格数目,这个循环可以写成 : for k : =2*i-1 downto 1 do write(#); /控制每行中的个数writeln;end; end.此程序的设计是由两个并列循环加一个嵌套循环构成的 。各环的作用如下: (1)外层环控制打印的行数,此倒三角形共8行,故外 环的设置为递减型循环。 (2)嵌套在外环中的第一个并列循环为空格输出,根 据图形变化控制输出不同数量的空格。 (3)外环内第二个并列循环为控制三角形每行中“#“号 的个数。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号