当前位置:文档之家› FreePascal3.2

FreePascal3.2

FreePascal3.2
FreePascal3.2

第二节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);{ 计算下一个奇数}

write (’+ ’,x) ;{加上下一个奇数}

inc (t );inc (s,x);{ 计个数并累加和}

Until t=n;{直到n个}

Writeln (’= ’,s ) ;

Readln

End.

[例3.15]猜价格:中央电视台的“幸运52”栏目深受观众喜爱,其中的“猜商品价格”的节目更是脍炙人口,现在请你编一个程序模拟这一游戏:由计算机随机产生200至5000之间的一个整数,作为某件商品的价格,然后由你去猜是多少,若你猜的数大了,则计算机输出提示“Gao”,若你猜的数小了,则计算机输出提示“Di”,然后你根据提示继续猜,直到你猜对了,计算机会提示“Ok”,并统计你猜的总次数。

解:本题的游戏规则大家都清楚,要完成程序,必须把处理步骤理清:

(1)用随机函数Random产生200至5000之间的一个整数X;

(2)你猜一个数A;

(3)若A>X,则输出“Gao”;

(4)若A<X,则输出“Di”;

(5)若A=X则输出“Ok”;

(6)重复(2)(3)(4)(5)直到A=X。

Pascal程序:

Program ex315;

Var t,X,a : integer;

Begin

Randomize;

X := Random(4800)+200;

t := 0;

Repeat

t := t+1;

write(‘[‘,t,’] Qing cai yi ge zheng shu : ‘);

readln(a);

if a>x then writeln(‘Gao’);

if a

if a=x then writeln(‘Ok’);

Until A=X;

Readln;

End.

习题3.2

1.求两个自然数M和N的最小公倍数。(如果求三个或更多个数的最小公倍数呢?应如何解决)

2.小会议室里有几条相同的长凳,有若干人参加开会。如果每条凳子坐6人,结果有一条凳子只坐有3人;如果每条凳子坐5人,就有4人不得不站着。求会议室里有多少人开会,有多少条长凳?

3.某动物饲养中心用1700元专款购买小狗(每只31元)和小猫(每只21元)两种小动物。要求专款专用,正好用完, 应当如何购买?请输出所有方案。

4.某整数X加上100就成为一个完全平方数,如果让X加上168 就成为另一个完全平方数。求X?

5.某次同学聚会,老同学见面个个喜气洋洋,互相握手问好。参加此次聚会者每人都与老同学握了一次手,共握903次,试求参加聚会的人数?

6.用自然数300,262,205,167分别除以某整数A,所得到的余数均相同。求出整数A以及相除的余数?

7.1600年前我国的一部经典数学著作中有题:“今有物,不知其数,三三数之,剩二;五五数之,剩三;七七数之,剩二,问物几何。”求最小解。

8.编程求出所有不超过1000的数中,含有数字3的自然数,并统计总数。

9.阿姆斯特朗数:如果一个正整数等于其各个数字的立方和,则该数称为阿姆斯特朗数(也称自恋数),如407=43+03+73,试编程求出1000以内的所有阿姆斯特朗数。

相关主题
文本预览
相关文档 最新文档