循环语句的循环体中包含循环语句,称为“循环嵌套”,外层的叫外循环,在内层的叫内循环。在一个循环内包含一个循环语句的为双重循环,内循环体又可包含循环语句,构成多重循环。多重循环增加了计算处理的能力,能解决一些比较重杂的问题。
双重循环的结构为:
FOR 〈循环变量1〉=〈初值1〉 TO 〈终值1〉 [STEP 〈步长1〉]
FOR 〈循环变量2〉=〈初值2〉 TO 〈终值2〉 [STEP 〈步长2〉]
〈循环体〉
NEXT 〈循环变量2〉
NEXT 〈循环变量1〉
[例7-4] 打印九九乘法表。N-S图如图7-4。

图7-4 N-S图
源程序:
REN EXAMPLE 4
FOR A=1 TO 9
FOR B=1 TO A
PRINT USING "#";A;
PRINT "*"
PRINT USING "-#=##";B,A * B;
NEXT B
NEXT A
END
运行结果:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
…
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
(1)多重循环嵌套,一定是外循环套内循环,内外循环不能交叉,如例(a)是正确的,(b)是错误的。内外层的变量不能同名。
(2)在同一外循环体中,可以有并列的内循环出现。对于并列循环的变量名可以相同也可以不相同,如例(c)。
FOR X… FOR X… FOR X…
FOR Y FOR Y FOR Y
NEXT Y NEXT Y NEXT Y
NEXT X… NEXT Y… FOR Y
NEXT Y
NEXT X…
(a)正确的嵌套 (b)错误的嵌套 (c)内循环并列的情况
[例7-5] 用多项式计算自然数e的近似值,用公式
e=
算法1:
1.当N给定后,用内层循环计算每一项的分母的值;
2.用外层循环计算N项的和。
源程序:
REM EXAMPLE
S=1
INPUT "N=";N
FOR I=1 TO N
T=1
FOR J=1 TO I
T=T * J
NEXT J
S=S+1/T
NEXT I
PRINT "E=";S
END
算法2:
将多项式改写如下:
e=1+
由内向外不断计算(1+
源程序:
REM EXAMPLE 5B
INPUT "N=";N
S=1
FOR I=N TO 1 STEP -1
S=1+S/1
NEXT 1
PRINT "E=";S
END
[例7-6] 我国古代数学张邱建在《算经》里提出了一定方程问题。即“百鸡问题”:公鸡每只值5元,母鸡每只值3元,小鸡3只值1元,1百元钱买1百只鸡。问公鸡、母鸡、小鸡各可买多少?
算法:
设公鸡、母鸡、小鸡各为x、y、z,可得方程:

这个不定方程式有多个答案,我们用穷举法求解。
所谓穷举法,就是对所有可能的答案一一列举,从中判断哪些答案是符合题设条件的。分析一下X、Y、Z的可能取值范围:公鸡最少1只,最多只能买20只,故1<X<20;母鸡1<Y<33;只要X、Y值一确定,Z=100-X-Y。
在各种X、Y值的情况下,一一列举出X、Y所能取值的情况。因此用双层循环编写程序。外层循环控制X(即FOR X=1 TO 19),内层循环控制Y(即FOR Y=1 TO 33)。
源程序:
REM EXAMPLE 6
PRINT '"Cock","Hen","Chicken"
FOR X=1 TO 19
FOR Y=1 TO 33
Z=100-X-Y '满足百鸡条件
IF 5*X+3*Y+Z/3=100 THEN PRINT X,Y,Z '满足百鸡条件
NEXT Y
NEXT X
END
运算结果:
Cock Hen Chicken
4 18 78
8 11 81
12 4 84
[例7-7] 计算:

算法1:
上式可化为

因此可分别计算

分析上面两式,有共同的规律可循,即
(1)分子的指数和阶乘数相同;
(2)多项式各项指数的值是4的级差:y1的变化范围是(1~4n+1),y2的变化范围是(3~4n-1)。
这样,我们可以用双层循环:
(1)内层,计算每一项的分子分母;
(2)外层,计算各项之和;
(3)最后,sinX=y1-y2。
N-S图如图7-5所示。

图7-5 N-S图
源程序:
REM EXAMPLE
INPUT N,X
Y1=0:Y2=0
FOR I=1 TO 4*N+1 STEP 4
T=1:S=1
FOR I=1 TO 1
T=T * K:S=S * X
NEXT K
Y1=Y1+S/T
NEXT I
FOR I=3 TO 4*N-H STEP 4
M=1:P=1
FOR K=1 TO I
M=M * K:P=P * X
NEXT K
Y2=Y2+P/M
NEXT I
Y=Y1-Y2
PRINT "Y=";Y
END
运行结果:
?4,5
Y=-.9587822
?5,4
Y=-.7568007
算法2:
观察该多项式,我们会发现:①各项的符号,奇数项为正,偶数项为负;②分子的指数和阶乘数相同,各项指数之间,都相差为2。因此,可以把每项的计算用内层循环实现,各项求和用外层循环实现。求和时,每项乘一个符号系数S=(-1)*S,设初值S=1。这样,每执行一次,S的值就交替为-1和+1,从而把奇数项置成正,偶数项置成负。
源程序:
REM EXAMPLE 7B
INPUT "X,N=";X,N
Y=X;S=1
FOR I=2 TO N
P=1;K=1
FOR J=1 TO 2*I-1
P=P * J:K=K * K
NEXT J
S=(-1) * S
Y=Y+S * P/K
NEXT I
PRINT "sin(";X;")=";Y
END
DO循环可分为“当型循环”与“直到型循环”两种,而在当型和直到型中又可分为先进行条件判断再执行循环体和先执行循环体再进行条件判断两种类型。由此构成4种格式如下:
表7-1 循环类型
|
类 型 |
先判断后执行 |
先执行后判断 |
|
WHILE(当型) |
DO WHILE-LOOP |
DO-LOOP WHILE |
|
UNTIL(直到型) |
DO UNTILE-LOOP |
DO-LOP UNTIL |
格式1:
DO WHILE〈条件〉
〈循环体〉
LOOP
说明:当条件成立时,执行循环体;当条件不成立时,一次也不执行循环体。
格式2:
DO
〈循环体〉
LOOP WHILE〈条件〉
说明:首先执行循环体,再判断条件是否成立。如果条件成立,再执行循环体;如果条件不成立,就退出循环体。
格式3:
DO UNTIL〈条件〉
〈循环体〉
LOOP
说明:当条件不成立时,执行循环体,直到条件成立时,退出循环体。
格式4:
DO
〈循环体〉
LOOP UNTIL〈条件〉
说明:首先执行循环体,再判断条件是否成立。如果条件不成立,再执行循环体;如果条件成立,就退出循环体。
上述4种格式中的〈条件〉为关系表达式或逻辑表达式。
[例7-8] 求自然数的平方和S,S<N。
源程序1 源程序2
'EXAMPLE
INPUT N INPUT N
I=0 I=0
S=0 S=0
DO WHILE S<N DO
I=I+1 I=I+1
S=S+I*1 S=S+I*1
LOOP LOOP WHILE S<N
PRINT "S=";S PRINT "S=";S
END END
源程序3: 源程序4:
'EXAMPLE
INPUT N INPUT N
I=0 I=0
S=0 S=0
DO UNTIL S>=N DO
I=I+1 I=I+1
S=S+I * I S=S+I * I
LOOP LOOP UNTIL S>=N
PRNIT "S=";S PRINT "S=";S
END END