while循环和repeatuntil循环.ppt

上传人:牧羊曲112 文档编号:6523423 上传时间:2023-11-08 格式:PPT 页数:20 大小:332.49KB
返回 下载 相关 举报
while循环和repeatuntil循环.ppt_第1页
第1页 / 共20页
while循环和repeatuntil循环.ppt_第2页
第2页 / 共20页
while循环和repeatuntil循环.ppt_第3页
第3页 / 共20页
while循环和repeatuntil循环.ppt_第4页
第4页 / 共20页
while循环和repeatuntil循环.ppt_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《while循环和repeatuntil循环.ppt》由会员分享,可在线阅读,更多相关《while循环和repeatuntil循环.ppt(20页珍藏版)》请在三一办公上搜索。

1、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的下一个语句。,说明:

2、这里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+ii:=i+1;,真(非0),假(0),1.3 举例,下一条语句(循环语句结束),例2:求恰好使s=1+1/2+1/3+1/n的值大于10时n的值。,分析:恰好使s的值大于10意思是当表达式

3、s的前n-1项的和小于或等于10,而加上了第n项后s的值大于10。从数学角度,我们很难计算这个n的值。故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。当s的值超过10时,最后一项的项数即为要求的n。,program xy;vars:real;n:integer;n表示项数begins:=0.0;n:=0;while s=10 do当s的值还未超过10时beginn:=n+1;项数加1s:=s+1/n;将下一项值累加到send;writlen(n);输出结果end.,例3:求两个正整数m和n的最大公约数。,分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算法:

4、分别用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 dobegina:=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:利用格里高公式求。/

5、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.,运行程序会发现没有结果

6、,为什么?因为布尔表达式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;:;unt

7、il;,其中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

8、之间的语句构成循环。在它们之间可以有任意多个语句,这一点和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:=

9、i+1;until i100;writeln(sum);end.,i100,sum:=sum+ii:=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人,最后多

10、出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

11、 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);readlnend.,程序中对每个X值,都先给Yes 赋真值,只有在循环体中,各句对X进行判断时,都得到“通过”(此处不赋假值)才能保持真值。此处的yes相当于一个标志变量。,以上我们已介绍了三种循环语句。一般说来,用for 循环比较简明,只要能用for循环,就尽量作用for循环。只在无法使用for循环时才用while循环和r

12、epeat-until循环,而且 while 循环和repeat-until循环是可以互相转化的,具体用哪个,还要看个人喜好,但他们也存在细微区别,while语句的循环体有可能一次都不会被执行,而repeat语句中循环体至少执行一次。for 循环在大多数场合也能用while和repeat-until循环来代替。一般for循环用于有确定次数循环,而while和repeat-until循环用于未确定循环次数的循环。,当一个循环的循环体中又包含循环结构程序时,我们就称之为循环嵌套。内循环整个作为外循环的一条语句。,3.多重循环结构,3.1 举例,例8 求1!+2!+10!的值。,【分析】这个问题是求

13、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 dot:=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=

14、,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次循环

15、。如题目中求的是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

16、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;vari:integer;x:integer;beginfor i:=100 to 200 dobeginx:=2;while(x0)dobeginx:=x+1;end

17、;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/总共要输出8行内容 begin for j:=1 to 8-i do write();/控制每行空格数目,这个循环可以写成:for k:=2*i-1 downto 1 do write(#);/控制每行中的个数 writeln;end;end.,此程序的设计是由两个并列循环加一个嵌套循环构成的。各环的作用如下:(1)外层环控制打印的行数,此倒三角形共8行,故外环的设置为递减型循环。(2)嵌套在外环中的第一个并列循环为空格输出,根据图形变化控制输出不同数量的空格。(3)外环内第二个并列循环为控制三角形每行中#号的个数。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号