第五讲循环结构(for、while与repeat语句)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章第3节循环结构的程序设计
For循环
在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所介绍的循环结构程序设计。在Pascal语言中,循环结构程序通常由三种的循环语句来实现。它们分别为FOR循环、当循环和直到循环。通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。因此,重复语句是由循环体及重复终止条件两部分组成。
一、计数循环(for/to/do)语句的一般格式
for <控制变量>:=<表达式1> to <表达式2> do <语句>;
for <控制变量>:=<表达式1> downto <表达式2> do <语句>;
其中for、to、downto和do是Pascal保留字。表达式1 与表达式2的值也称为初值和终值。
二、For语句执行过程
①先将初值赋给左边的变量(称为循环控制变量);
②判断循环控制变量的值是否已"超过"终值,如已超过,则跳到步骤⑥;
③如果末超过终值,则执行do后面的那个语句(称为循环体);
④循环变量递增(对to)或递减(对downt o)1;
⑤返回步骤②;
⑥循环结束,执行for 循环下面的一个语句。
三、说明
①循环控制变量必须是顺序类型,初值和终值可以是常量、变量、表达式,且与控制变量类型一致。例如,可以是整型、布尔型、字符型等,但不能为实型。
②循环控制变量的值递增或递减的规律是:选用to则为递增;选用downto则递减。
③所谓循环控制变量的值"超过"终值,对递增型循环,"超过"指大于,对递减型循环,"超过"指小于。
④循环体可以是一个基本语句,也可以是一个复合语句。
⑤循环控制变量的初值和终值一经确定,循环次数就确定了。但是在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。建议不要在循环体中随意修改控制变量的值。
⑥初值与终值在开始重复之前计算,在重复执行过程中,其值不受影响;若初值“超过”终值,不执行循环,循环的次数为0。
⑦循环次数等于│终值-初值│+1或│ord(初值)-ord(终值)│+1。
四、应用举例
例1.计算1+2+3+…+100的值。
分析:我们用累加方法,初值为1,终值为100,循环100次每次将循环控制变量i的值迭加加入一个变量S中,循环结束后此变量中就为所求值。程序如下:
program p4_22;
var i,s:integer;
begin
s:=0;
for i:=1 to 100 do
s=s+i;
writeln(s);
end.
思考:s=2+4+6+…+100
S=1+1/2+1/3+1/4+…+1/100
S=12+22+32+…+1002
例2.输入一个自然数x,求这个自然数的所有约数之和S。
分析:解决这一问题关键是找出所有约数,即x能被y整除,则有x mod y=0,然后从1至x进行循环判定。
程序如下:
program p4_23;
var
x,y,s : integer;
begin
write('Enter x=');readln(x);
s:=0;
for y:=1 to x do
if x mod y=0 then s:=s+y;
writeln( ‘x=’,x, ‘s=’,s);
end.
例3 编程找出四位整数abcd中满足下述关系的数:(ab+cd)(ab+cd)=abcd
Program p4_24;
Var
i,m,n,k:integer;
begin
for i:=1000 to 9999 do
begin
m:=i div 100;
n:=i mod 100;
k:=(m+n)*(m+n);
if k=i then writeln(i)
end;
end.
以上方法叫“枚举法”,又称“穷举法”,它是计算机解题的一种常用方法。
WHILE循环
一、WHILE循环
对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句或repeat语句实现循环要更方便。
while语句的形式为:
while <布尔表达式> do <语句>;
其意义为:当布尔表达式的值为true时,执行do后面的语句。
二、while语句的执行过程为:
①判断布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4;
②执行循环体语句(do后面的语句);
③返回步骤1;
④结束循环,执行while的下一个语句。
说明:这里while和do为保留字,while语句的特点是先判断,后执行。当布尔表达式成立时,重复执行do后面的语句(循环体)。
三、举例
例1 、求恰好使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。
程序如下:
var
s : real;
n : integer;{n表示项数}
begin
s:=;n:=0;
while s<=10 do{当s的值还未超过10时}
begin
n:=n+1;{项数加1}
s:=s+1/n;{将下一项值累加到s}
end;
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;