第 5章 循环结构在前面,我们学习了顺序结构和分支结构,本章我们将要介绍结构化程序 3种基本结构的最后一种 ——
循环结构 。
退出
5.1 循环概述
5.2 For循环
5.3 While循环
5.4 Do循环
5.5 循环的嵌套
5.6 循环的退出
5.1 循环概述在实际工作中,常遇到一些操作过程不太复杂,
但又需要反复进行相同处理的问题,比如,统计本单位所有人员的工资,求全班同学各科的平均成绩等等 。
这些问题的解决逻辑上并不复杂,但如果单纯用顺序结构来处理,那将得到一个非常乏味且冗长的程序 。
例如,计算 1~ 100所有奇数的平方和,如果用顺序结构来解决这个问题,我们就会给出下面的程序:
Private Sub Form_Click( )
Dim s&,x%
s = 0
x = 1
s = s + x ^2
x = x + 2
s = s + x ^2
x = x + 2
s = s + x ^2
……
x = x +2 'x的值累加到 99
s = s + x ^2
Print "1~ 100之间所有奇数的平方和 ="; s
End Sub
由上面的例子不难看出,程序的绝大部分是在反复执行两条语句 x=x+2和 s=s+x^2,不同的是 x的值在变化 。 程序当然非常简单易懂,但缺乏最基本的编程技巧 。 要想方便地解决这类问题,最好的办法就是用循环语句 。
所谓循环就是重复地执行一组语句 。
我们用循环语句解决上面的问题,程序非常简短:
Private Sub Form_Click()
Dim s&,x%
s = 0
For x = 1 To 99 Step 2
s = s + x ^2
Next x
Print "1~ 100所有奇数的平方和 ="; s
End Sub
在此程序中,第 4,5,6条语句构成了一个循环,
在循环过程中第 5句被反复执行了 50次,从而计算出了
1~ 100所有奇数的平方和。
通过上面的对比可知,循环结构非常适合于解决处理的过程相同、处理的数据相关,但处理的具体值不同的问题。我们把能够处理这类问题的语句称为循环语句。
VB提供了三种不同风格的循环语句,它们分别是:
( 1) For…Next 语句;
( 2) While…Wend 语句;
( 3) Do…Loop 语句。
我们将对这 3种循环语句逐一介绍。
5.2 For循环
For循环的一般格式如下:
For 循环变量 =初值 To 终值 [Step 步长 ]
[循环体 ]
Next [循环变量 ]
说明:
1.格式中各项的说明
循环变量:亦称为循环控制变量,必须为数值型。
初值、终值:都是数值型,可以是数值表达式。
步长:循环变量的增量,是一个数值表达式。一般来说,其值为正,初值应小于终值;若为负,初值应大于终值。但步长不能是 0。如果步长是 1,Step 1可略去不写。
循环体:在 For语句和 Next语句之间的语句序列。
Next后面的循环变量与 For语句中的循环变量必须相同。
2.执行过程
For循环语句的执行过程如下:
( 1)系统将初值赋给循环变量,并自动记下终值和步长。
( 2)检查循环变量的值是否超过终值。如果超过就结束循环,执行 Next后面的语句;否则,执行一次循环体。
( 3)执行 Next语句,将循环变量增加一个步长值再赋给循环变量,转到( 2)继续执行。
以上执行过程用流程图描述,如图 5-1所示。
这里所说的,超过,有两种含义,即大于或小于 。
当步长为正值时,循环变量大于终值为,超过,;当步长为负值时,循环变量小于终值为,超过,。
我们通过分析下面的程序来进一步理解 For语句的执行过程 。
For n=1 To 10 Step 3
Print n,
Next n
具体执行情况如下:
第几次循环 n 与终值比较 执行循环体否
1 1 <10 执行
2 4 <10 执行
3 7 <10 执行
4 10 =10 执行
5 13 >10 停止执行上面程序的执行结果为:
1 4 7 10
3.注意事项
For语句和 Next语句必须成对出现,缺一不可,且
For语句必须在 Next语句之前 。
循环次数由初值,终值和步长确定,计算公式为:
循环次数 =Int(( 终值-初值 ) /步长 ) +1
【 例 5.1】 求 N! ( N为自然数 ) 。
分析:由阶乘的定义,我们可以得出 N! =1*2*… *
( N-2) *( N-1) *N=( N-1) ! *N,也就是说,一个自然数的阶乘,等于该自然数与前一个自然数阶乘的乘积 。
程序如下:
Private Sub Form_Click()
Dim I%,f&,n%
n= InputBox( "输入一个自然数,","输入提示
","10")
f = 1
For I = 1 To n
f = f * I
Next I
Print n; "!="; f
End Sub
程序的执行过程如图 5-2所示。
程序如下:
Private Sub Form_Click( )
Dim I%,n%,p#
n = InputBox( "请输入 n的值 ( 1-32767) ")
p = 1
For I = 1 To n
p = p *( 4 * I * I) /(( 2 * I - 1) *( 2 * I +
1))
Next I
p = 2 * p
Print "n="; n; "时 ","π="; p
End Sub
5.3 While循环前面我们介绍了 For…Next 循环,它适合于解决循环次数事先能够确定的问题。对于只知道控制条件,
但不能预先确定需要执行多少次循环体的情况,我们可以使用 While循环。
While语句格式如下:
While 条件
[循环体 ]
Wend
1,While语句说明
“条件”可以是关系表达式或逻辑表达式。 While
循环就是当给定的“条件”为 True时,执行循环体,
为 False时不执行循环体。因此 While循环也叫当型循环。
2.执行过程
While循环的执行过程(如图 5-5所示):
( 1)执行 While语句,判断条件是否成立。
( 2)如果条件成立,就执行循环体;否则,转到
( 4)执行。
( 3)执行 Wend语句,转到( 1)执行。
( 4)执行 Wend语句下面的语句。
结合下面的程序段,我们做进一步的说明:
x=1
While x<5
Print x,
x=x+1
Wend
该程序段的执行结果是:
1 2 3 4
3,While循环的几点说明
( 1) While 循环语句本身不能修改循环条件,所以必须在 While… Wend语句的循环体内设置相应语句,
使得整个循环趋于结束,以避免死循环 。
( 2) While循环语句先对条件进行判断,然后才决定是否执行循环体 。 如果开始条件就不成立,则循环体一次也不执行 。
( 3) 凡是用 For… Next循环编写的程序,我们都可以用 While… Wend语句实现 。 反之,则不然 。
【 例 5.5】 假设我国现有人口 12亿,若年增长率为
1.5%,试计算多少年后我国人口增加到或超过 20亿 。
人口计算公式为,p=y( 1+r) n
y为人口初值,r为年增长率,n为年数 。
程序如下:
Private Sub Form_Click( )
Dim p!,r!,I%
p = 12
r = 0.015
I = 0
While p < 20
p = p *( 1 + r)
I = I + 1
Wend
Print I; "年后,我国人口将达到 "; p; "亿 "
End Sub
单击窗体,程序运行结果如图 5-7所示。
5.4 Do循环与前面介绍的 While循环相比,Do循环具有更强的灵活性,它可以根据需要决定是条件满足时执行循环体,还是一直执行循环体直到条件满足 。 Do循环有两种语句格式 。
格式 1:
Do {while|until} <条件 >
[<循环体 >]
Loop
格式 2:
Do
[<循环体 >]
Loop {while|until} <条件 >
【 例 5.7】 求两自然数 m,n的最大公约数 。
设计思想,( 1) m除以 n得到余数 r;
( 2) 若 r=0,则 n为要求的最大公约数,算法结束;
否则执行 ( 3) ;
( 3) n→ m,r→ n,再转到 ( 1) 执行 。
程序如下:
Private Sub command1_Click( )
Dim m%,n%,r%
m = Val( Text1.Text)
n = Val( Text2.Text)
r = m Mod n
Do Until r = 0
m = n
n = r
r = m Mod n
Loop
Print " 它们的最大公约数是 "; n
End Sub
程序运行结果如图 5-12所示。
5.5 循环的嵌套在一个循环体内又包含了一个完整的循环,这样的结构称为多重循环或循环的嵌套 。 在程序设计时,
许多问题要用二重或多重循环才能解决 。 我们前面学过的 For循环,While循环,Do循环都可以互相嵌套,
如在 For… Next的循环体中可以使用 While循环,而在
While… Wend的循环体中也可以出现 For循环等 。
二重循环的执行过程是外循环执行一次,内循环执行一遍,在内循环结束后,再进行下一次外循环,
如此反复,直到外循环结束 。
【 例 5.8】 打印九九乘法表。
分析:打印九九乘法表,只要利用循环变量作为乘数和被乘数就可以方便的解决。
程序如下:
Private Sub Form_Click()
Dim i%,j%,str$
Print Tab( 35); "九九乘法表 "
For i = 1 To 9
For j = 1 To 9
str = i & "× " & j & "=" & i * j
Print Tab(( j - 1) * 9 + 1); str;
Next j
Print
Next i
End Sub
程序运行结果如图 5-13所示。
对于循环的嵌套,要注意以下事项:
( 1) 在多重循环中,各层循环的循环控制变量不能同名 。 但并列循环的循环控制变量名可以相同,也可以不同 。
( 2) 外循环必须完全包含内循环,不能交叉 。
【 例 5.10】 求分析:观察多项式就会发现,奇数项为正,偶数项为负,各项分子的指数与分母的阶乘数相同,各相邻项指数相差为 2。 因此,可以设计一个二重循环,内层循环实现每项的计算,外层循环完成对各项的求和 。
)!12(
)1(
!9!7!5!3
s i n
12
1
9753
n
xxxxxxx nn
程序如下:
Private Sub command1_Click()
Dim x#,n&,s#,i%,j%,k#,p#,f%
x = Val( Text1.Text)
n = Val( Text2.Text)
s = 0,f = -1
For i = 1 To n
p = 1,k = 1
For j = 1 To 2 * i - 1
p = p * j
k = k * x
Next j
f = f *( -1)
s = s + f * k / p
Next i
Print "sin( "; x; ") ="; s
End Sub
运行结果如图 5-16所示。
5.6 循环的退出前面讲述的循环,都是在执行结束时正常的退出 。
但在某些情况下,为了减少循环次数或便于程序调试,
可能需要提前强制退出循环 。 VB为 For… Next 和
Do… Loop循环语句提供了相应的强制退出循环的语句,
现介绍如下 。
1,Exit For
该语句用于 For…Next 循环,在循环体中可以出现一次或多次。当系统执行到该语句时,就强制退出当前循环。常见的使用格式是:
If 条件 Then Exit For
即当循环执行过程中满足某个条件时,就执行循环退出语句结束循环。
2,Exit Do
该语句用于 Do… Loop循环,具体用法同 Exit For
一样 。
循环结构 。
退出
5.1 循环概述
5.2 For循环
5.3 While循环
5.4 Do循环
5.5 循环的嵌套
5.6 循环的退出
5.1 循环概述在实际工作中,常遇到一些操作过程不太复杂,
但又需要反复进行相同处理的问题,比如,统计本单位所有人员的工资,求全班同学各科的平均成绩等等 。
这些问题的解决逻辑上并不复杂,但如果单纯用顺序结构来处理,那将得到一个非常乏味且冗长的程序 。
例如,计算 1~ 100所有奇数的平方和,如果用顺序结构来解决这个问题,我们就会给出下面的程序:
Private Sub Form_Click( )
Dim s&,x%
s = 0
x = 1
s = s + x ^2
x = x + 2
s = s + x ^2
x = x + 2
s = s + x ^2
……
x = x +2 'x的值累加到 99
s = s + x ^2
Print "1~ 100之间所有奇数的平方和 ="; s
End Sub
由上面的例子不难看出,程序的绝大部分是在反复执行两条语句 x=x+2和 s=s+x^2,不同的是 x的值在变化 。 程序当然非常简单易懂,但缺乏最基本的编程技巧 。 要想方便地解决这类问题,最好的办法就是用循环语句 。
所谓循环就是重复地执行一组语句 。
我们用循环语句解决上面的问题,程序非常简短:
Private Sub Form_Click()
Dim s&,x%
s = 0
For x = 1 To 99 Step 2
s = s + x ^2
Next x
Print "1~ 100所有奇数的平方和 ="; s
End Sub
在此程序中,第 4,5,6条语句构成了一个循环,
在循环过程中第 5句被反复执行了 50次,从而计算出了
1~ 100所有奇数的平方和。
通过上面的对比可知,循环结构非常适合于解决处理的过程相同、处理的数据相关,但处理的具体值不同的问题。我们把能够处理这类问题的语句称为循环语句。
VB提供了三种不同风格的循环语句,它们分别是:
( 1) For…Next 语句;
( 2) While…Wend 语句;
( 3) Do…Loop 语句。
我们将对这 3种循环语句逐一介绍。
5.2 For循环
For循环的一般格式如下:
For 循环变量 =初值 To 终值 [Step 步长 ]
[循环体 ]
Next [循环变量 ]
说明:
1.格式中各项的说明
循环变量:亦称为循环控制变量,必须为数值型。
初值、终值:都是数值型,可以是数值表达式。
步长:循环变量的增量,是一个数值表达式。一般来说,其值为正,初值应小于终值;若为负,初值应大于终值。但步长不能是 0。如果步长是 1,Step 1可略去不写。
循环体:在 For语句和 Next语句之间的语句序列。
Next后面的循环变量与 For语句中的循环变量必须相同。
2.执行过程
For循环语句的执行过程如下:
( 1)系统将初值赋给循环变量,并自动记下终值和步长。
( 2)检查循环变量的值是否超过终值。如果超过就结束循环,执行 Next后面的语句;否则,执行一次循环体。
( 3)执行 Next语句,将循环变量增加一个步长值再赋给循环变量,转到( 2)继续执行。
以上执行过程用流程图描述,如图 5-1所示。
这里所说的,超过,有两种含义,即大于或小于 。
当步长为正值时,循环变量大于终值为,超过,;当步长为负值时,循环变量小于终值为,超过,。
我们通过分析下面的程序来进一步理解 For语句的执行过程 。
For n=1 To 10 Step 3
Print n,
Next n
具体执行情况如下:
第几次循环 n 与终值比较 执行循环体否
1 1 <10 执行
2 4 <10 执行
3 7 <10 执行
4 10 =10 执行
5 13 >10 停止执行上面程序的执行结果为:
1 4 7 10
3.注意事项
For语句和 Next语句必须成对出现,缺一不可,且
For语句必须在 Next语句之前 。
循环次数由初值,终值和步长确定,计算公式为:
循环次数 =Int(( 终值-初值 ) /步长 ) +1
【 例 5.1】 求 N! ( N为自然数 ) 。
分析:由阶乘的定义,我们可以得出 N! =1*2*… *
( N-2) *( N-1) *N=( N-1) ! *N,也就是说,一个自然数的阶乘,等于该自然数与前一个自然数阶乘的乘积 。
程序如下:
Private Sub Form_Click()
Dim I%,f&,n%
n= InputBox( "输入一个自然数,","输入提示
","10")
f = 1
For I = 1 To n
f = f * I
Next I
Print n; "!="; f
End Sub
程序的执行过程如图 5-2所示。
程序如下:
Private Sub Form_Click( )
Dim I%,n%,p#
n = InputBox( "请输入 n的值 ( 1-32767) ")
p = 1
For I = 1 To n
p = p *( 4 * I * I) /(( 2 * I - 1) *( 2 * I +
1))
Next I
p = 2 * p
Print "n="; n; "时 ","π="; p
End Sub
5.3 While循环前面我们介绍了 For…Next 循环,它适合于解决循环次数事先能够确定的问题。对于只知道控制条件,
但不能预先确定需要执行多少次循环体的情况,我们可以使用 While循环。
While语句格式如下:
While 条件
[循环体 ]
Wend
1,While语句说明
“条件”可以是关系表达式或逻辑表达式。 While
循环就是当给定的“条件”为 True时,执行循环体,
为 False时不执行循环体。因此 While循环也叫当型循环。
2.执行过程
While循环的执行过程(如图 5-5所示):
( 1)执行 While语句,判断条件是否成立。
( 2)如果条件成立,就执行循环体;否则,转到
( 4)执行。
( 3)执行 Wend语句,转到( 1)执行。
( 4)执行 Wend语句下面的语句。
结合下面的程序段,我们做进一步的说明:
x=1
While x<5
Print x,
x=x+1
Wend
该程序段的执行结果是:
1 2 3 4
3,While循环的几点说明
( 1) While 循环语句本身不能修改循环条件,所以必须在 While… Wend语句的循环体内设置相应语句,
使得整个循环趋于结束,以避免死循环 。
( 2) While循环语句先对条件进行判断,然后才决定是否执行循环体 。 如果开始条件就不成立,则循环体一次也不执行 。
( 3) 凡是用 For… Next循环编写的程序,我们都可以用 While… Wend语句实现 。 反之,则不然 。
【 例 5.5】 假设我国现有人口 12亿,若年增长率为
1.5%,试计算多少年后我国人口增加到或超过 20亿 。
人口计算公式为,p=y( 1+r) n
y为人口初值,r为年增长率,n为年数 。
程序如下:
Private Sub Form_Click( )
Dim p!,r!,I%
p = 12
r = 0.015
I = 0
While p < 20
p = p *( 1 + r)
I = I + 1
Wend
Print I; "年后,我国人口将达到 "; p; "亿 "
End Sub
单击窗体,程序运行结果如图 5-7所示。
5.4 Do循环与前面介绍的 While循环相比,Do循环具有更强的灵活性,它可以根据需要决定是条件满足时执行循环体,还是一直执行循环体直到条件满足 。 Do循环有两种语句格式 。
格式 1:
Do {while|until} <条件 >
[<循环体 >]
Loop
格式 2:
Do
[<循环体 >]
Loop {while|until} <条件 >
【 例 5.7】 求两自然数 m,n的最大公约数 。
设计思想,( 1) m除以 n得到余数 r;
( 2) 若 r=0,则 n为要求的最大公约数,算法结束;
否则执行 ( 3) ;
( 3) n→ m,r→ n,再转到 ( 1) 执行 。
程序如下:
Private Sub command1_Click( )
Dim m%,n%,r%
m = Val( Text1.Text)
n = Val( Text2.Text)
r = m Mod n
Do Until r = 0
m = n
n = r
r = m Mod n
Loop
Print " 它们的最大公约数是 "; n
End Sub
程序运行结果如图 5-12所示。
5.5 循环的嵌套在一个循环体内又包含了一个完整的循环,这样的结构称为多重循环或循环的嵌套 。 在程序设计时,
许多问题要用二重或多重循环才能解决 。 我们前面学过的 For循环,While循环,Do循环都可以互相嵌套,
如在 For… Next的循环体中可以使用 While循环,而在
While… Wend的循环体中也可以出现 For循环等 。
二重循环的执行过程是外循环执行一次,内循环执行一遍,在内循环结束后,再进行下一次外循环,
如此反复,直到外循环结束 。
【 例 5.8】 打印九九乘法表。
分析:打印九九乘法表,只要利用循环变量作为乘数和被乘数就可以方便的解决。
程序如下:
Private Sub Form_Click()
Dim i%,j%,str$
Print Tab( 35); "九九乘法表 "
For i = 1 To 9
For j = 1 To 9
str = i & "× " & j & "=" & i * j
Print Tab(( j - 1) * 9 + 1); str;
Next j
Next i
End Sub
程序运行结果如图 5-13所示。
对于循环的嵌套,要注意以下事项:
( 1) 在多重循环中,各层循环的循环控制变量不能同名 。 但并列循环的循环控制变量名可以相同,也可以不同 。
( 2) 外循环必须完全包含内循环,不能交叉 。
【 例 5.10】 求分析:观察多项式就会发现,奇数项为正,偶数项为负,各项分子的指数与分母的阶乘数相同,各相邻项指数相差为 2。 因此,可以设计一个二重循环,内层循环实现每项的计算,外层循环完成对各项的求和 。
)!12(
)1(
!9!7!5!3
s i n
12
1
9753
n
xxxxxxx nn
程序如下:
Private Sub command1_Click()
Dim x#,n&,s#,i%,j%,k#,p#,f%
x = Val( Text1.Text)
n = Val( Text2.Text)
s = 0,f = -1
For i = 1 To n
p = 1,k = 1
For j = 1 To 2 * i - 1
p = p * j
k = k * x
Next j
f = f *( -1)
s = s + f * k / p
Next i
Print "sin( "; x; ") ="; s
End Sub
运行结果如图 5-16所示。
5.6 循环的退出前面讲述的循环,都是在执行结束时正常的退出 。
但在某些情况下,为了减少循环次数或便于程序调试,
可能需要提前强制退出循环 。 VB为 For… Next 和
Do… Loop循环语句提供了相应的强制退出循环的语句,
现介绍如下 。
1,Exit For
该语句用于 For…Next 循环,在循环体中可以出现一次或多次。当系统执行到该语句时,就强制退出当前循环。常见的使用格式是:
If 条件 Then Exit For
即当循环执行过程中满足某个条件时,就执行循环退出语句结束循环。
2,Exit Do
该语句用于 Do… Loop循环,具体用法同 Exit For
一样 。