您现在的位置:小学生自学网>> 信息>> pascal语言>> 基础教程

PASCAL第十二讲:FOR循环语句

作者: 来源: 发布时间:2009年05月12日 点击数:
 
前面所计的两个语句都是在未知循环次数的情况下而用的循环语句,但在程序中,如果我们已经知道循环的次数而来编程序的话,就可以使用 FOR循环语句,这也是 PASCAL及其它高级语言中用得最多的语句。其语法格式有两种,如下:

(1) 增量为 1:

for 变量名:=初值 to 终值 do begin
 语句序列(循环体);
end;

(2) 增量为 -1:

for 变量名:=初值 downto 终值 do begin
 语句序列(循环体);
end;

变量名的类型由程序头部中定义,而其初值、终值必须和它是同一类型。该变量的类型是能是有序数据类型。

上述两种格式都是用变量的初值与终值来规定循环的次数。如以下两个小程序:

Var I:integer;
Begin
For I:=1 to 5 do begin
 Write(I);
End;
End.
运行结果:
12345

Var I:integer;
Begin
For I:=5 downto 1 do begin
 Write(I);
End;
End.
运行结果:
54321

由上可以看出 FOR循环的作用。

[例 5、 5]:从键盘输入一个字符串,把它按正序及逆序分别输出:

uses crt;
var s:string;
l,I:integer;
begin
clrscr;
write(‘Please input the string:’);
readln(s);
l:=length(s);
for I:=1 to l do begin
 write(s[I]);
end;
writeln;
for I:=l downto 1 do begin
 write(s[I]);
end;
end.

[例 5、 6]计算

uses crt;
var s,a:integer;
begin
clrscr;
s:=0;
for a:=1 to 10 do begin
 s:=s+a*a;
end;
writeln(s);
end.

[例 5、 7]:计算: 1+3+5+7+…… 101的值:

uses crt;
var m,n:integer;
begin
clrscr;
m:=0;
for n:=0 to 50 do begin
 m:=m+(2*n+1);
end;
writeln(m);
end.

请大家注意上述程序中的几个小技巧,一个是 FOR N: =0 TO 50,共循环 51次;一个是 M: =M+( 2*N+1),其是的 2*N+1得到的是一序列的奇数。

多重循环语句

多重循环语句即循环嵌套,也就是一个循环语句的循环体中还有循环语句。

[例 5、 8]编程序打印九九乘法表:

uses crt;
var I,j:integer;
begin
clrscr;
for I:=1 to 9 do begin
 for j:=1 to 9 do begin
  write(j:1,’*’,i:1,’=’,I*j:2);
 end;
 writeln;
end;
end.

运行结果:

1*1= 1

2*1= 2

3*1= 3

4*1= 4

5*1= 5

6*1=6

7*1= 7

8*1= 8

9*1= 9

1*2=2

2*2= 4

3*2= 6

4*2= 8

5*2=10

6*2=12

7*2=14

8*2=16

9*2=18

1*3=3

2*3= 6

3*3= 9

4*3=12

5*3=15

6*3=18

7*3=21

8*3=24

9*3=27

1*4=4

2*4= 8

3*4=12

4*4=16

5*4=20

6*4=24

7*4=28

8*4=32

9*4=36

1*5=5

2*5=10

3*5=15

4*5=20

5*5=25

6*5=30

7*5=35

8*5=40

9*5=45

1*6=6

2*6=12

3*6=18

4*6=24

5*6=30

6*6=36

7*6=42

8*6=48

9*6=54

1*7=7

2*7=14

3*7=21

4*7=28

5*7=35

6*7=42

7*7=49

8*7=56

9*7=63

1*8=8

2*8=16

3*8=24

4*8=32

5*8=40

6*8=48

7*8=56

8*8=64

9*8=72

1*9=9

2*9=18

3*9=27

4*9=36

5*9=45

6*9=54

7*9=63

8*9=72

9*9=81

注意:循环有嵌套时,必须分清层次,切不可把循环进行交叉。

[例 5、 9]编程序分别打印以下三图:

(1)

Uses crt;
Var I,j:integer;
Begin
Clrscr;
For I:=1 to 5 do begin
For j:=1 to 5 do begin
Write(‘*’);
End;
Writeln;
End;
End.

(2)

Uses crt;
Var I,j:integer;
Begin
Clrscr;
For I:=1 to 5 do begin
Write(‘ ’:20+i);
For j:=1 to 5 do begin
Write(‘*’);
End;
Writeln;
End;
End.

(3)

Uses crt;
Var I,j:integer;
Begin
Clrscr;
For I:=1 to 5 do begin
Write(‘ ’:20-I);
For j:=1 to 5 do begin
Write(‘*’);
End;
Writeln;
End;
End.

请大家注意看清上述三个小程序,其功能是分别打印出上述三个由“ *”组成的小图形。三个图形的不同之处是:第一个直上直下,是个矩形;第二个是左斜的平行四边形;第三个是右斜的平行四边形。所以三个对应的程序也就有所不同,第( 2)、( 3)个程序比第( 1)个多了一句,即显示红色的那一句。这两句的作用是使每一行开头打印几个空格,即让图形左或右斜。 WRITELN的作用是打印完一行后换行。

[例 5、 10]编程打印下列图形:

Uses crt;
Var I,j:integer;
Begin
Clrscr;
For I:=1 to 5 do begin
 Write(‘ ’:20-I);
 For j:=1 to 2*I-1 do begin
  Write(I:1);
 End;
 Writeln;
End;
End.





清屏

打印每一行前的 20-I个空格,这样每行都比上一行左移

每一行打印 2*I-1列
打印该行行数

[例 5、 11]打印 1 — 100间的所有素数:

素数,即为除了 1和它本身外没有另外的因数的整数。所以我们判断一个数 N是否素数,可以用 2至 N-1所有数去除 N,如果没有一个数能被 N整除,则 N为素数。

当然,其实我们可以不用用 2至 N-1这第多的数去除,而只需用 2至不大于 N的平方根的整数去除 N即可(为什么)?

这里我们的程序就用 2至 TRUNC( SQRT( N))来判断,到后面我们还会谈到:如果要判断一个数是否素数,可只用小于 TRUNC( SQRT( N))的所有素数去除即可。

Var I,j:integer;
P:boolean;
Begin
For I:=2 to 100 do begin
 P:=true;
 For j:=2 to trunc(SQRT(I)) do   begin
   If I mod j=0 then p:=false;
  End;
 If p then write(I:5);
End;
End.





循环从 2至 100
再判断 I是否素数前,先把判断器 P的值设为 TRUE

用 2至 trunc(SQRT( I) )的数来除 I

如果 I能整除 J,则 P的值改为 FALSE

如果 P的值仍为 TRUE,则 I就是素数,打印出来

[例 5、 12]以下是 A, B, C三人说的话:

A:“ B在说谎”; B:“ C在说谎”; C:“ A、 B都在说谎”。现在问,到底谁说真话,谁说谎?

分析: A、 B、 C三人,要么说谎,要么说真话,即三个的状态要么为 FALSE,要么为 TRUE,所以,可让 A、 B、 C三个变量进行循环,循环初值为 TRUE,终值为 FALSE。而三个人所说的话即为三个逻辑表达式,其值也为 TRUE或 FALSE,并且与 A、 B、 C的值是有关系的。 A、 B、 C三个所说的话转化为逻辑表达式即为:

A: B=FLASE;

B: C=FALSE;

C:( A=FALSE) AND ( B=FALSE)

以上三个逻辑表达式的值中, TRUE的个数应该与 A、 B、 C三个变量中 TRUE的个数相同。并且,每一个变量的值应该与其对应的话的逻辑表达式的值相等。如: A应该等于( B=FALSE)这个逻辑表达式。程序如下:

Var a,b,c:boolean;
Begin
  For a:=false to true do begin
    For b:=false to true do begin
       For c:=false to true do begin
         If (a=(b=false)) and (b=(c=false)) and (c=((a=false) and (b=false))) 
         then Begin
           Writeln(a:10,b:10,c:10);
        End;
      End;
End;
  End;
      End.

练习

  1、计算下列式子的值:
   (1)1+2+……+100
   (2)1+3+5+……+97+99

  2、输入一个四位数,求它各位上数字的和。

   3、求水仙花数。所谓水仙花数,是指一个三位数abc,如果满足a^3+b^3+c^3=abc,则abc是水仙花数。

  4、宰相的麦子:相传古印度宰相达依尔,是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么。达依尔说:“只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:第一格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。”国王一想,这还不容易,刚想答应,如果你这时在国王旁边站着,你会不会劝国王别答应,为什么?