FreePascal3.2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二节repeat 循环
Repeat循环是直到型循环。
试将上一节的例3.1(打印出1~20的平方数表)程序改为repeat 循环:
Program Exam31_1;
Var a: byte;
Begin
a:=1;writeln ( ' a ' : 8 , ' a*a ' : 8 ) ;
repeat
writeln ( a :8,a*a : 8);
inc(a);{改变a的值}
Until a>20;
Readln
Emd.
程序中的Repeat循环格式为:
repeat
循环体语句;
until 条件表达式;{直到条件为真}
Repeat循环首先执行由Repeat和Until括起来的循环体语句,然后检查Until后面的条件表达式:如果表达式结果为假,则继续执行循环体,接着继续检查Until后面的条件表达式,如此反复执行直到这个表达式结果为真时结束循环。Repeat循环体语句必须有能改变Until后面条件表达式值的语句,并最终使这个条件表达式的值为真,使循环自动结束。
程序中inc (a) 指令相当于a : =a+1,常用的同类指令格式如下:
(1) inc(x) 等同x:=x+1;
(2) inc(x, n) 等同x:=x+n;
(3) dec(x) 等同x:=x—1;
(4) dec(x,n) 等同x:=x—n;
[例3.10]求两个自然数M和N的最大公约数。
解:若自然数a既是M和约数,又是N的约数,则称a为M和N的公约数,其中最大的称为最大公约数。为了求得最大公约数,可以从最大可能的数(如M或N)向下寻找,找到的第一个公约数即是最大公约数。
Pascal程序:
Program ex310;
Begin
a := N+1;
Repeat
a := a-1;
Until (M mod a=0) and (N mod a=0);
writeln(a);
Readln;
End.
[例3.11]校体操队到操场集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分别按每行排4,5,6人,都多出1人;当排成每行7人时,正好不多。求校体操队至少是多少人?
解:①设校体操队为X人,根据题意X应是7的倍数,因此X的初值为7,以后用inc(x,7)改变X值;
②为了控制循环, 用逻辑变量yes为真(True) 使循环结束;
③如果诸条件中有一个不满足, yes 的值就会为假(false),就继续循环。
Pascal程序:
program Exam311;
var x: word; 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进行判断时,都得到“通过”(此处不赋假值)才能保持真值。
[例3.12]从键盘输入一个整数X(X不超过10000),若X的各位数字之和为7的倍数,则打印“Yes”,否则中打印“No”。
解:本题考察的是数字分离的方法,由于X的位数不定,所以以往的解法不能奏效,这是介绍一种取余求商法。
(1)用X mod 10分离出X的个位数字;
(2)用X div 10将刚分离的个数数字删除,并将结果送回给X;
(3)重复(1)(2)直到X=0。
Pascal程序:
Program ex12;
var x,a,s : integer;
begin
s := 0;
repeat
a := x mod 10;
x := x div 10;
s := s+a;
until x=0;
if s mod 7=0 then writeln(‘Yes’)
else writeln(‘No’);
Readln;
end;
[例3.13]求1992个1992的乘积的末两位数是多少?
解:积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求1992个92相乘,而且本次的乘积主下一次相乘的被乘数,因此也只需取末两位参与运算就可以了。
Pascal程序:
Program ex313;
var a,t : integer;
Begin
a := 1;
t := 0;
repeat
t := t+1;
a := (a*92) mod 100;
until t=1992;
writeln(a);
Readln;
End.
[例3.14]尼科彻斯定理:将任何一个正整数的立方写成一组相邻奇数之和。
如: 33=7+9+11=27 43=13+15+17+19=64
解:从举例中发现:
(1) n3正好等于n个奇数之和;
(2) n个奇数中的最小奇数是从1开始的奇数序列中的第m个奇数,与n 的关系为:m=n (n —1) / 2+1。
(3) 奇数序列中第m个奇数的值为x,且x= 2m—1,比如: n=3时,m=3(3-1)/2+1=4,即3个奇数中最小的奇数是奇数序列中的第4个,它的值为x=(2m-1)=7,所以:33=7+9+11。
(4) 从最小的奇数值x开始,逐个递增2,连续n个,用t从1开始计数,直到t=n为止。
Pascal程序:
Program Exam35;
Var n,m,x,t,s : integer;
Begin
write(’input n:’);readln(n);{输入N }
m:=(n*(n-1) div 2)+1; {找到第m个奇数}
x:=2*m-1;t:=1;{算出第m个奇数的值x,是所求的第一个}
write(n’*’,n,’*’,n,’=’,x);{输出第一个}
s:=x; {用S计算和}
if n>1 then
Repeat
inc(x,2);{ 计算下一个奇数}