第五讲 循环结构

上传人:pu****.1 文档编号:507006955 上传时间:2023-05-24 格式:DOCX 页数:19 大小:32.64KB
返回 下载 相关 举报
第五讲 循环结构_第1页
第1页 / 共19页
第五讲 循环结构_第2页
第2页 / 共19页
第五讲 循环结构_第3页
第3页 / 共19页
第五讲 循环结构_第4页
第4页 / 共19页
第五讲 循环结构_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《第五讲 循环结构》由会员分享,可在线阅读,更多相关《第五讲 循环结构(19页珍藏版)》请在金锄头文库上搜索。

1、第四章第 3 节 循环结构的程序设计For 循环在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所 介绍的循环结构程序设计。在 Pascal 语言中,循环结构程序通常由三种的循环语 句来实现。它们分别为 FOR 循环、当循环和直到循环。通常将一组重复执行的 语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。因此,重复 语句是由循环体及重复终止条件两部分组成。一、计数循环(for/to/do)语句的一般格式for 控制变量:=表达式 1 to 表达式 2 do 语句;for 控制变量:=表达式 1 downto 表达式 2 do 语句;其中 for、to、downto

2、和 do 是 Pascal 保留字。表达式 1 与表达式 2 的值也 称为初值和终值。二、For 语句执行过程 先将初值赋给左边的变量(称为循环控制变量); 判断循环控制变量的值是否已超过终值,如已超过,则跳到步骤; 如果末超过终值,则执行do后面的那个语句(称为循环体); 循环变量递增(对to )或递减(对downt o) 1; 返回步骤;循环结束,执行for循环下面的一语句。三、说明 循环控制变量必须是顺序类型,初值和终值可以是常量、变量、表达式, 且与控制变量类型一致。例如,可以是整型、 布尔型、字符型等,但不能为实型。 循环控制变量的值递增或递减的规律是:选用to则为递增;选用down

3、to 则递减。 所谓循环控制变量的值超过终值,对递增型循环,“超过指大于,对递 减型循环, 超过指小于。 循环体可以是一个基本语句,也可以是一个复合语句。 循环控制变量的初值和终值一经确定,循环次数就确定了。但是在循环体 内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。建议不要在 循环体中随意修改控制变量的值。 初值与终值在开始重复之前计算,在重复执行过程中,其值不受影响;若 初值“超过”终值,不执行循环,循环的次数为 0。 循环次数等于丨终值初值丨+1或丨ord(初值)ord(终值)丨+1。四、应用举例例1计算 1+2+3+100 的值。分析:我们用累加方法,初值为1,终值为10

4、0,循环100次每次将循环控制变量i的值迭加加入一个变量S中,循环结束后此变量中就为所求值。程 序如下:program p4_22;var i,s:integer; begins:=0;for i:=1 to 100 dos=s+i;writeln(s);end.思考:s=2+4+6+100S=l+l/2+l/3+l/4+.+1/100S=12+22+32+.+1002例 2输入一个自然数 x ,求这个自然数的所有约数之和 S。分析 解决这一问题关键是找出所有约数,即x能被y整除,则有x mod y=0,然后从 1 至 x 进行循环判定。程序如下:program p4_23;varx,y,s

5、: integer;beginwrite(Enter x=);readln(x);s:=0;for y:=1 to x doif x mod y=0 then s:=s+y;writeln( x=,x, s=,s);end.例 3编程找出四位整数 abcd 中满足下述关系的数:( ab+cd) (ab+cd)=abcdProgram p4_24;Vari,m,n,k:integer;beginfor i:=1000 to 9999 dobegin m:=i div 100; n:=i mod 100; k:=(m+n)*(m+n); if k=i then writeln(i)end;end.

6、 以上方法叫“枚举法”,又称“穷举法”,它是计算机解题的一种常用方法。WHILE 循环一、WHILE 循环对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用 while 语句或 repeat 语句实现循环要更方便。while 语句的形式为:while 布尔表达式 do 语句; 其意义为:当布尔表达式的值为 true 时,执行 do 后面的语句。二、while 语句的执行过程为: 判断布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4; 执行循环体语句(do后面的语句); 返回步骤 1; 结束循环,执行while的下一语句。说明:这里while和do

7、为保留字,while语句的特点是先判断,后执行。当布尔表达式成立时,重复执行do后面的语句(循环体)。三、举例例1、求恰好使s=l+l/2+l/3+.+l/n的值大于10时n的值。分析:恰好使s的值大于10意思是当表达式s的前n-1项的和小于或等于 10,而加上了第n项后s的值大于10。从数学角度,我们很难计算这个n的值。 故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。当 s的值超过10时,最后一项的项数即为要求的n。程序如下:vars : real;n : integer; n 表示项数begins:=0.0;n:=0;while s=10 do 当 s 的值还未超过

8、10 时beginn:=n+1; 项数加 1 s:=s+1/n; 将下一项值累加到 send;writlen(n=,n); 输出结果end.例2、求两个正整数m和n的最大公约数。分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算 法:分别用m,n,r表示被除数、除数、余数。求 m/n 的余数 r. 若r=0,则n为最大公约数.若r*0,执行第步. 将n的值放在m中,将r的值放在n中. 返回重新执行第步。程序如下:program ex4_4; var m,n,a,b,r:integer;beginwrite(Input m,n:); readln(m,n);a:=m;b:=n;r

9、:=a mod b; while r0 do begina:=b;b:=r; r:=a mod b;end;writeln(The greatest common divide is:,b:8); end.例 3 求输入的一个整数的各位数之和。例 4 求两个自然数 m,n 的最小公倍数。REPEAT 循环一、直到循环(REPEAT -until语句)用 while 语句可以实现当型循环 ,用 repeat-until 语句可以实现直到型循环。repeat-until语句的含义是:重复执行循环,直到指定的条件为真时为止。直到循环语句的一般形式:Repeat语句 1;语句 n;until 布尔表达

10、式;其中 Repeat、until 是 Pascal 保留字, repeat 与 until 之间的所有语句称为循 环体。说明: repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一 次循环体。 repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是 一个语句, until 是另一个语句。 repeat语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若 干个语句,不需用begin和end把它们包起来,repeat和until已经起了 begin 和 end 的作用。 while 循环和 repeat 循环是可以相互转化的。对于例2中求两个

11、正整数的最大公约数,程序可用repeat-until循环实现如 下:varm,n,a,b,r : integer;beginwrite(Input m,n=);readln(m,n);a:=m;b:=n;repeatr:=a mod b;a:=b;b:=r;until r=0;writeln(The greatest common divide is,a);end.三种循环结构的比较:以上我们已介绍了三种循环语句。一般说来,用 for 循环比较简明,只要能 用 for 循环,就尽量作用 for 循环。只在无法使用 for 循环时才用 while 循环和 repeat-until循环,而且whi

12、le循环和repeat-until循环是可以互相替代的。for循 环在大多数场合也能用 while 和 repeat-until 循环来代替。一般 for 循环用于有确 定次数循环,而while和repeat-until循环用于未确定循环次数的循环。WHILE 语句 和 REPEAT 语句的区别:WHILE语句REPEAT语句先判断后后执行语句先择行语句,后判断条件指定语句只能是条语句或复合语句可以是多条语句,无需用begin和end当条件成立时重复执行当条件不成立时重复执行当条件开始就不成立时,则不执行循 环体无论条件是否成立,总要执行一次循环 体多重循环结构当一个循环的循环体中又包含循环结

13、构程序时,我们就称之为循环嵌套。一、循环结构程序设计例1求1!+2!+10!的值。分析:这个问题是求10自然数的阶乘之和,可以用for循环来实现。程序结构如下:for n:=1 to 10 dobegin N!的值t 累加N!的值tend显然,通过10次的循环可求出1!,2!,10!,并同时累加起来,可求得S的值。而求T=N!,又可以用一个for循环来实现:t=1;for j:=1 to n dot:=t*j;因此,整个程序为:program ex4_5;var t,s:real;i,j,n:integer;beginS:=0;for n:=1 to 10 do begint:=1;for j

14、:=1 to n dot:=t*j;S:=S+t;end;writeln(s=,s:0:0);end.以上的程序是一个二重的for循环嵌套。这是比较好想的方法,但实际上对 于求n!,我们可以根据求出的(n-1)!乘上n即可得到,而无需重新从1再累乘到 n。程序可改为:program ex4_5;var t,s:real;i,j,n:integer;beginS:=0;t:=1;for n:=1 to 10 dobegint:=t*n;S:=S+t;end;writeln(s=,s:0:0);end.显然第二个程序的效率要比第一个高得多。第一程序要进行1+2+.+10=55 次循环,而第二程序进行10次循环。如题目中求的是1 !+2 !+ 1000 !, 则两个程序的效率区别更明显。例2求100 999中的水仙花数,(若三位数abc , abc = a3+b3+c3 ,则称abc为水 仙花数。如153 ,13+53十33二1+125+27二153,则153是水仙花数)。根据题意采用三重循环求解,由于循环次数一定,用 for 循环最为简单。 program p4_31;vara,b,C:integer;beginfor a := 1 to 9 dofor b := 0 to 9 dofor c := 0 to 9 doif

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号