1、第五章 重复结构,河师大附中信息技术,重复控制结构为计算机程序描述重复计算所提供的控制手段。一个重复控制结构需指明以下三件事情:1被重复执行的语句;2是否重复的条件;3具体的重复方式。在PASCAL语言,用for,while和repeat三种语句描述重复控制结构。,第一节 FOR语句,for语句用来描述已知重复次数的重复结构。FOR语句有二种格式: 1.for 控制变量:=初值 to 终值 do 语句;2.for 控制变量:=初值 downto 终值 do 语句;,为了正确使用for语句,需遵守以下几点约定:1for语句的控制变量、初值、终值的数据类型应一致,且限于整型、布尔型和字符型等对函数
2、ord 有意义的数据类型,即序数类型;2初值与终值一经确定,重复次数就确定不变了。3控制变量在重复语句内不能施加任何赋值操作;4for语句正常结束后,控制变量值无意义。,例5-1 打印输出大写英文字符A到Z,以及对应的ASCII的序号。Program example5_1;vari : char;beginfor i := A to Z do write(i:4,ord(i):4);readln;end.,例5-2 由键盘输入N(N = 12),打印输出 N! 的值。,Program example5_2;Varn,i,s : longint;beginwrite(Input N = );re
3、adln(n);s := 1;for i := n downto 1 do s := s*i;writeln(n, ! = ,s);end.,例5-3 计算公式 h(n)=1+1/2+1/3+1/n前n项的和。,program example5_3;var i,n:integer;h:real;beginwrite(Input N = );readln(n);h := 0;for i := 1 to n do h := h+1/i;writeln(h = ,h);end.,例5-4 有一个四位的正整数,它的前两位数和后两位数之和的平方,等于其本身。打印输出满足以上条件的所有正整数。,Progr
4、am example5_4; vari,m,n : integer; beginfor i := 1000 to 9999 do beginm := i div 100;n := i mod 100;if (m+n)*(m+n) = i then writeln(i);end; end.,例5-5 在8*8的国际象棋的棋盘上,第一格放一粒米,第二格放两粒米,第三格放四粒米,第四格放八粒米,以此类推,后一格是前一格的两倍。问共需多少粒米?,Program example5_5; vari : byte;t,s : real; begint := 1;s := 1;for i := 2 to 64
5、 do begint := t*2;s := s+t;end;writeln(Total : ,s:0:0); end.,1、编写一个评分程序,接受用户输入1个选手的10个得分(0-10分),然后去掉一个最高分和一个最低分,求出某选手的最后得分。(平均分)VAR a,max,min,i:integer; s:real; begin readln(a); max:=a; min:=a; s:=a;,for i:=2 to 10 do begin readln(a); s:=s+a; if amax then max:=a; if amin then min:=a; end; s:=(s-min-
6、max)/8; writeln(s:5:3); readln; end.,循环的嵌套:在一个循环体内,还包含有另一个循环的形式,称之为循环的嵌套或多重循环。按照循环嵌套的重数,分别叫做二重循环、三重循环、四重循环等等。,例5-6 打印输出九九乘法表,按以下的格式输出。 * 1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 6 6 12 18 24 30 36
7、42 48 54 7 7 14 21 28 35 42 47 56 63 8 8 16 24 32 40 48 56 64 72 9 9 18 27 36 45 54 63 72 81,Program example5_6; vari,j : integer;beginwrite(*);for i := 1 to 9 do write(i:5);writeln;for i := 1 to 9 do beginwrite(i);for j := 1 to 9 do write(i*j:5);writeln;end;end.,在上述程序的执行部分中,一至三行为打印输出 * 和1至9数字。以下是一个
8、二重循环,其中i 做的是外循环,表示打印输出的行数;j 做的是内循环,表示一行内打印输出数的个数。 例5-7 百钱买百鸡:用一百钱买一百只鸡,公鸡五钱一只,母鸡三钱一只,小鸡一钱买三只,每种鸡至少买一只,编程打印输出共有多少种不同的买法?,Program example5_7; vari,j,k : integer;beginfor i := 1 to 19 do for j := 1 to (100-i*5) div 3 do begink := (100-5*I-3*j)*3;if i+j+k = 100 then writeln(i:10,j:10,k:10);end; end.,在上面
9、的程序中,我们采用的是“枚举法”。它是计算机解题的一种常用的方法。它的基本思路是:一一枚举各种可能的情况,并判断那一种可能是符合要求的解。在程序中变量i代表公鸡的只数,它从1变化到19,因为公鸡最多只能买19只;变量j代表母鸡的只数,它从1变化到(100-i*5) div 3;变量k代表小鸡的只数,如果公鸡的只数i和母鸡的只数j确定以后,小鸡的只数k可以直接求出来。如果符合百钱买百鸡,就打印输出。,例5-8 打印“*”字三角形:从键盘输入一个自然数N(1N9),根据N的值,打印输出对应的“*”字三角形,例如: N = 4 输出:* * * * * * * * * * * * * *,Progr
10、am example5_8; vari,j,n : integer;beginwrite(N = );readln(n);for i := 1 to n do beginwrite(:40-i*2);for j := 1 to i do write(*:2);for j := i-1 downto 1 do write(*:2);writeln;end; end.,第二节 while语句,while语句用于“当满足某一条件时进行循环”的情况。语句格式: while 布尔表达式 do 语句;使用while语句要注意:1循环结束条件在进入循环体之前测试,若最初的测试值为false,则根本不进入循环
11、体;2为了能使while重复能终止,循环体中一定要有影响布尔表达式的操作,否则该循环就是死循环。,例5-9 有一张纸,其厚度为0.1毫米,将它对折多少次,其厚度将超过珠穆朗玛峰的高度。Program example5_9; vari : byte;r : real; begini := 0;r := 0.0001;while r 8848 do beginr := r*2;i := i+1;end;writeln(i, times); end.,例5-10 输入一个正整数,求这个正整数的各位数字之和。,Program example5_10; vari,n,s : longint; begin
12、write(Input N : );readln(n);s := 0;while n 0 do begins := s+n mod 10;n := n div 10;end;writeln(S = ,s); end.,例5-11 输入一个正整数,将这个正整数的各位数倒过来,并打印输出。Program example5_11; vari,n,s : longint; beginwrite(Input N : );readln(n);s := 0;while n 0 do begins := s*10 + n mod 10;n := n div 10;end;writeln(S = ,s); en
13、d.,例5-12 输入两个正整数,求这两个正整数的最大公约数。算法:采用辗转相除法求m和n的最大公约数。即:设m = n+r (0rn),则m和n的最大公约数与n和r的最大公约数相同。当r等于0,这时的n就是m和n的最大公约数。若r不等于0,再对n和r重复上面过程,直到r = 0为止。例如求231和63的最大公约数231 mod 63 = 4263 mod 42 = 2142 mod 21 = 0所以42和21的最大公约数为21,由此得出231和63的最大公约数也为21。,Program example5_12; vara,b,c : longint; beginwrite(A = ); re
14、adln(a);write(B = ); readln(b);while b 0 do beginc := a mod b;a := b;b := c;end;writeln(The greatest common divisor is ,a); end.,例5-13 输入两个正整数,求这两个正整数的最小公倍数。Program example5_13; vara,b,c,d : longint; beginwrite(A = ); readln(a);write(B = );readln(b);d := a*b;while b 0 do beginc := a mod b;a := b;b :
15、= c;end;writeln(The lease common multiple is ,d div a); end.While 语句也可相嵌套,形成多重循环。,例5-14 输入一个大于1的自然数N,将N分解成质因数的乘积。例如:,N = 120 120 = 2*2*2*3*5Program example5_14; vari,n : longint;f : boolean;beginwrite(N = );readln(n);write(n, = );f := false;i := 2 ;while n = i do beginwhile n mod i = 0 do beginif f
16、then write(*) else f := true;write(i);n := n div i;end;i := i+1;end;end.,例5-15 打印输出一百到一亿之间的,既是完全平方数又是回文数的所有的正整数(完全平方数是一个正整数的平方数,回文数即为左右对称的正整数)。例如121,它是11的平方,也是左右对称的自然数。Program example5_15; vari,j,m : longint;begini := 10;while i 0 do beginm := m*10+j mod 10;j := j div 10;end;if m = i*i then writeln(
17、i,*,i,=,i*i);i := i+1;end;end.,例5-16 求2到1000之间的素数。一行打印十个素数。Program example5_16;var i,k,n : integer;prime : boolean;beginfor i := 2 to 1000 do beginprime := true;n := trunc(sqrt(i);k := 2;while (k = n) and prime do beginif i mod k = 0 then prime := false;k := k+1;end;if prime then write(i:8);end;end.
18、程序中1trunc(x)是截尾函数,将实数x的小数部分截去,只取其整数部分,返回值为整型。 2sqrt(i)是平方根函数,返回i的平方根值,返回值为实型,第三节 repeat语句,repeat语句用于“重复执行循环体,直到指定的条件为真时为止”。语句格式:repeat语句1;语句2; 语句n;until 布尔表达式;,repeat重复基本上有与while重复一样的描述循环计算的能力,但有三点不同:1在repeat重复结构中,布尔表达式求值在计算操作之后,而在while重复结构中,布尔表达式求值在计算操作之前。2while语句的成分语句只能是一个语句。因此,当重复动作包含几个语句时,需用begi
19、n 和end,使它们变成一个复合语句。而repeat语句的保留字repeat和until已起语句括号作用,可以包含多个语句而无需begin和end。3repeat重复结构中,仅当布尔表达式值为true时结束重复,而while重复结构中,是当布尔表达式值为false时才结束重复。,一般地说;“repeat 语句 until 布尔表达式;”能用while重复结构表示: “while NOT (布尔表达式) DO 语句;” 在上述等价表示中,同样的计算操作出现两次。因此,当描述由计算操作后的情况确定重复是否继续进行的计算时,通常用repeat结构描述。,例5-17 有一大堆核桃,两个两个拿,余下一个
20、;三个三个拿,余下两个;四个四个拿,余下三个;以此类推,直至九个九个拿,余下八个。问这一大堆核桃最少是几个?Program example5_17; vari :word; begini := 10;repeati := i+1;until (i mod 2 = 1) and (i mod 3 = 2) and (i mod 4 = 3) and (i mod 5 = 4) and (i mod 6 = 5) and (i mod 7 = 6) and (i mod 8 = 7) and (i mod 9 = 8);writeln(i); end.,例5-18 有四个自然数,它们的和为45,而
21、第一个数加上2,等于第二个数减去2,同时等于第三个数乘以2,也等于第四个数除以2,以次打印输出这四个数。,Program example5_18;vari : byte;begini := 0;repeati := i+2;until (i-2)+(i+2)+(i div 2)+(i*2) = 45;writeln(i-2:5,i+2:5,i div 2:5,i*2:5);end.,例5-19 求由键盘输入的正整数N的所有约数的和。Program example5_19; varn,i,s: integer;beginwrite(Input N : );readln(n);s := 0; i
22、:= 0;repeati := i+1;if n mod i = 0 then s := s+i;until i = n;writeln(S = ,s);end.,例5-20 利用格里高利公式:/4 = 1-1/3+1/5-1/7+1/9-1/11 可以求出的值。要求精确到数点后的第六位。,Program example5_20;var n,s : longint;t,pi : real;beginpi := 0;t := 1;n := 1;s := 1;repeatpi := pi+t;n := n+2;s := -s;t := s/nuntil abs(t) 0.000001; pi :=
23、 pi*4;writeln(Pi = , pi:0:6)end.运行结果:pi = 3.141596,例5-21 A、B两地相距200公里,在一次军事行动中,A、B两支军队作相向运动。A军每小时行军5公里,B军每小时行军8公里。有一个骑着摩托车的通讯兵,与A军同时出发,其行驶的速度为每小时45公里,为行进中的两军传递信息。他碰到B军后,算跑了一趟,然后折回驶向A军;碰到A军后,也算跑了一趟,再折回驶向B军。如此来来回回,直至A、B两军之间的距离小于0.1公里为止,问通讯兵共行驶多少趟?,Program example5_21; vars,v,t :real;n : byte; beginn :
24、= 0;s := 200;v := 8;repeatt := s/(45+v);s := s-(8+5)*t;n := n+1;v := 13-v;until s 0.1;writeln(n, Times);end.,例5-22 寻找怪数:有一种奇怪的自然数,它的比其小的所有因子之和等于它本身,例如:6 = 1+2+3,其中1、2、3都是6的因子,编程找出10000之内的所有怪数。,Program example5_22;vari,j,s : integer;beginfor i := 2 to 10000 do begins := 1;for j := 2 to i div 2 doif i
25、 mod j = 0 then s := s+j;if s = i then writeln(i);end;end.,例5-23 设有一个NM方格的棋盘(1N100,1M100)。求出该棋盘中包含有多少个正方形、多少个长方形(长方形不包括正方形)。 例如:当N = 2,M = 3时: 正方形的个数有8个:即边长为1的正方形有6个;边长为2的正方形有2个。长方形的个数有10个:21的长方形有4个:12的长方形有3个:31的长方形有2 个: 32的长方形有1个:输入输出示例:N = 2M = 3ZFX = 8CFX = 10,Program example5_23;vari,j,m,n : wor
26、d;zf,cf : longint;beginrepeatwrite(N = ); readln(n);write(M = ); readln(m);until (n = 100) and (m = 100);zf := 0; cf := 0;for i := 1 to n dofor j := 1 to m doif i = jthen zf := zf+(m+1-j)*(n+1-i)else cf := cf+(m+1-j)*(n+1-i);writeln(zfx = ,zf);writeln(cfx = ,cf);end.,例5-24 在如图所示的方格中,不重复地填入数字1、2、3、4、
27、5、6。 要求右边的数字比左边的数字大,下边的数字比上边的数字大,编程 打印输出各种填写方法。,Program example5_24;vara,b,c,d : byte;beginfor a := 2 to 3 dofor b := a+1 to 5 dofor d := a+1 to 5 doif b d then beginc := 14-a-b-d;if c d then beginwriteln(1:2,a:2,b:2);writeln(c:2,d:2,6:2);writeln(_);end;end;end.,例5-25 有一个自然数,它的各位数字的和,能被17整除。这个数的后继数(
28、即这个数加1)的各位数字的和,也能被17整除。求具有这种特性的最小的那个自然数。,Program example5_25;varf : boolean;i,s,m,t : integer;beginf := false;i := 1;repeati := i+1;s := 0;m := i;while m 0 do begins := s+ m mod 10;m := m div 10;end;if s mod 17 = 0 then begins := 0;m := i+1;while m 0 do begins := s+ m mod 10;m := m div 10;end;if s m
29、od 17 = 0 then f := true;end;until f;writeln(i);end.,例5-26 哥德巴赫猜想指出:任何一个大于6的偶数,都可以表示成两个素数的和。例如:8 = 3+5,44 = 13+31 等。试编程在6至100范围内验证哥德巴赫猜想。,Program example5_26;vari,j,k,m,n : integer;f,b : boolean;begini := 6;repeatj := 3; f := true;while (j 100;end.,例5-27 在如图所示的圆圈中,不重复地填入数字1、2、3、4、5、6。要求每条边上三个数之和都相同,
30、编程打印输出各种填法。,Program example5_27; vars,n,a,b,c,d,e,f : integer; beginn := 0;for a := 1 to 6 dofor b := 1 to 6 doif b a thenfor c := 1 to 6 doif (c a) and (c b) thenfor d := 1 to 6 doif (d a) and (d b) and (d c) thenfor e := 1 to 6 doif (e a) and (e b) and (e c) and (e d) thenbeginf := 21-a-b-c-d-e;s
31、:= a+b+c;if (c+d+e = s) and (a+f+e = s) then beginn := n+1;writeln(No.,n:2, : ,a:4);writeln(b:10,f:4);writeln(c:8,d:4,e:4);readln;end;end; end.,例5-28 下面的地图共有12个区域,用四种不同的颜色去着色,要求相邻区域的颜色不可相同,编程打印输出各种不同的着色方案。,Program example5_28; varn,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12 : byte; beginn := 0;for a1 :=
32、 1 to 4 dofor a2 := 1 to 4 doif a1a2 thenfor a3 := 1 to 4 doif (a3a1) and (a3a2) thenfor a4 := 1 to 4 doif (a4a1) and (a4a3) thenfor a5 := 1 to 4 doif (a5a4) and (a5a1) thenfor a6 := 1 to 4 doif (a6a1) and (a6a5) and (a6a2) thenfor a7 := 1 to 4 doif (a7a2) and (a7a6) thenfor a8 := 1 to 4 doif (a8a2)
33、 and (a8a3) and (a8a7) thenfor a9 := 1 to 4 doif (a9a3) and (a9a4) and (a9a8) thenfor a10 := 1 to 4 doif (a10a9) and (a10a4) and (a10a5)thenfor a11 := 1 to 4 doif (a11a7) and (a11a10) and (a11a6) and (a11a5)thenfor a12 := 1 to 4 doif (a12a11) and (a12a10) and (a12a9) and (a12a8) and (a12a7) then beg
34、in,n := n+1;write(No.,n:3, : );write(1:,a1,);write(2:,a2,);write(3:,a3,);write(4:,a4,);write(5:,a5,);write(6:,a6,);write(7:,a7,);write(8:,a8,);write(9:,a9,);write(10:,a10,);write(11:,a11,);write(12:,a12,);writeln;if n mod 24 = 0 then readln;end;readln; end.,第五节 关于goto语句goto语句是一种无条件转向语句,它可控制直接从程序的一条语
35、句转向该程序的另一条语句上。goto语句的形式为:goto 标号;其中标号由不超过四位数的正整数或标识符组成,但标号必须在说明语句中先预以说明,中间以冒号隔开。,例5-29 一个用goto语句的例子-累加器,以负数结束累加。program example5_29;label l1,l2;var x,sum: integer;beginsum:=0;l1: write(Please input a number (0): );readln(x);if x0 then goto l2;sum:=sum+x;goto l1;l2: writeln(sum=,sum)end.需要说明的是程序中随意使用goto语句会使程序出现一种称为“乱面条“的结构.Pascal语言尽管提供了goto语句,但我们建议对于初学者尽量不用goto语句.譬如例5-29完全可以用其他的语句结构代替goto语句,这就留给读者去修改。,