循环结构是指在执行程序语句时,需要对其中的某些语句重复执行多次,被重复执行的 程序段称为循环体。使用循环结构可以简化程序,提高程序执行效率。
Visual Basic 提供的循环结构语句有 For … Next、 Do … Loop、 For Each … Next 和 While … Wend 等。其中最常用的是 For … Next 和 Do … Loop 语句,本节主要讲解这两个循环语句的 用法。
3.3.1 Do…Loop 语句
Do … Loop 语句是通过检测循环条件决定循环的语句,Do … Loop 语句具有很强的灵活 性, 它既可以构成先判断条件再决定是否执行循环体的形式, 也可以构成先执行循环体后判断 条件的形式。
1.先判断条件形式的 Do…Loop 语句 语句格式为:
Do [While|Until <条件>]
[循环体]
Loop 说明:
(1)Do While … Loop 是“当型循环”形式,即<条件>为真(True)时,执行循环体;
条件为假(False)时,终止循环。
(2)Do Until … Loop 是“直到型循环”形式,即<条件>为假(False)时,执行循环;
直到条件为真(True)时,终止循环。
(3)<条件>即循环条件,是一个关系表达式或逻辑表达式,其值为 True 或 False。
(4)在 Do … Loop 中,可以在循环体的适当位置使用 Exit Do 语句,以便随时退出。当 有多个循环嵌套使用时,Exit Do 语句只能跳出当前的 Do … Loop 循环。
【例 316】计算 1+2+3+…+100。
分析:采用累加求和的方法,用变量 s 存放累加和,s 的初值为 0。用变量 n 计数,n 从 1 开始变化到 100。
(1)用当型循环语句 Do While … Loop,程序如下:
Private Sub Form_Load() End Sub
(2)用直到型循环语句 Do Until … Loop,程序如下:
Private Sub Form_Load() End Sub
(3)Do…Loop 循环语句也可以省略 While/Until,将循环结束条件写在循环体内,用 Exit Do 语句退出循环。程序如下:
Loop
Print "1+2+3+…100="; s End Sub
【例 317】若我国现有人口 13 亿,按人口年增长 0.8%计算,多少年后我国人口翻番。
分析:当前人口 13 亿,多少年后人口达 26 亿,即人口翻番。利用循环语句,可求得逐 年增长的人口数量,当达到 26 亿时,停止循环。
程序如下:
Private Sub Form_Click()
x = 13 ' 当年的人数
n = 0
Do While x < 26 '当人数还未达到 26 亿 x = x + (x * 0.008) '根据增长率计算当年的人数
n = n + 1 ' 年份加 1
Loop
Print "求得的年数为:"; n
Print "人数为:"; Round(x, 3) '保留 3 位小数 End Sub
2.后判断条件形式的 Do … Loop 语句 语句格式为:
Do
[循环体]
Loop [While|Until <条件>]
后判断条件形式的 Do…Loop 语句与先判断条件形式的区别是:首先执行循环体,然后判断 条件的真假,决定是否继续循环。所以,后判断条件形式的 Do…Loop 语句至少执行一次循环体。
在例 316 中我们编写了求 1~100 累加和的程序,现将该程序改写成后判断条件形式的 Do…Loop 语句。
Private Sub Form_Load()
Dim s As Integer, n As Integer Show
s = 0: n = 1 Do
s = s + n n = n + 1
Loop While n <= 100 Print "1+2+3+…100="; s End Sub
也可以改成使用直到型的后判断形式的 Do…Loop 语句,即 Do...Loop Until n>100,请读 者自行改写程序。
3.3.2 For … Next 语句
For … Next 循环结构是实现循环的又一种形式,它属于计数型循环,通常用于循环次数 已知的程序结构中。语法格式如下:
For <循环变量> =<初值> To <终值> [Step <步长>]
[<循环体>]
Next [<循环变量>]
说明:
(1)< 循环变量>是一个数值型变量,用作循环计数器控制循环次数。
(2)<初值>为循环变量的初始取值,<终值>为循环变量的最后取值,它们均可以是数值 型的常量、变量或表达式,它们的值可以是整数和实数。
(3)<步长>用于决定循环变量每次增加的数值,即变量在变化时的增值,也可为数值型 的常量、变量或表达式。步长的取值可以根据初值和终值的关系分为正数和负数两种,若初值 大于终值,则必须将步长设为负数;若初值小于终值,则必须将步长设为正数,才有可能执行 内部循环体。当步长为 1 时,可以省略 Step 1,步长可以为实数。
(4)可以在循环体中的适当位置放置 Exit For 语句,以便随时退出循环。
(5)For 语句的执行过程是:首先把初值赋给循环变量,接着检查循环变量是否超过终 值,如果超过,就停止执行循环体跳出循环,执行 Next 后面的语句;否则执行一次循环体,
然后把“循环变量+步长”的值再赋给循环变量,重复上述过程。For 语句的流程图如图 316 所示。
图 316 or 语句执行流程图
从流程图可以看到,For 语句是先判断条件的循环,如果把 For 语句的“初值”设定为超 过“终值” ,则不执行循环体,而直接执行 Next 后面的语句。例如:
For I=5 To 1
<循环体>
Next I
这是一个没有意义的语句。这里所说的“超过”有两种含义,即大于或小于。当步长为 整数时,检查循环变量是否大于终值;当步长为负数时,判断循环变量是否小于终值。
(6)循环的次数由初值、终值和步长三个因素决定,计算公式为:
循环次数=Int((终值-初值)/步长+1)
【例 318】求 n!(n 为自然数) 。
由阶乘的定义可知:n!=1×2×3×…×(n-2)×(n-1)×n =(n-1)!×n
也就是说,一个自然数的阶乘等于该自然数与前一个数的阶乘的乘积,即从 1 开始连续 地与下一个自然数相乘,直到 n 为止。
程序界面和属性设置请读者自行设计,编写窗体的激活事件,利用输入框由用户输入 n 循环变量←初值
循环体
循环变量←循环变量+步长
Next 下一个语句
循环变量>终值 Yes No
的值,循环变量为 i,用 k 存储阶乘值,将结果显示在窗体上。程序代码如下:
Private Sub Form_Activate() Dim n As Integer, i As Integer
Dim k As Long '防止乘积结果溢出,将 k 定义为长整型或实型 n = InputBox("请输入 n", "求 n!")
k = 1
For i = 1 To n k = k * i Next i
Print n; "!="; k End Sub
其中 For 循环语句也可以写成:
For i=n To 1 Step –1 k=k+1
Next i
【例 319】求 1 1 1 1 e ...
1! 2! 3! n!
= + + + + ,直到第 50 项。
Private Sub Form_Click()
Dim i As Integer, t As Double, s As Single t = 1: e = 0
For i = 1 To 50 t = t * i e = e + 1 / t Next i
Print "e="; e End Sub
说明:为防止乘积结果数据溢出,将变量 t 定义为 Double 型。
【例 320】使用随机函数产生 10 个在指定范围内的随机数,随机数的范围在文本框内输 入确定。
分析:在第 2 章中介绍的随机函数 Rnd()可以产生一个[0,1)区间内的随机小数,那么,
Rnd*a 可以产生[0,a)区间中的随机实数。若 n 和 m 均为整数,则表达式 Int((m+1-n)*Rnd)
+n 的值是闭区间[n,m]中的一个随机整数。
窗体的设计及对象属性如图 317(a)所示,在本例中使用了框架对象,框架作为容器在 其中添加了两个标签 Label1 和 Label2、两个文本框 Text1 和 Text2。将产生的随机数显示在 Label3 中。有关框架控件的详细内容将在第 4 章中介绍。
(a) (b)
图 317 产生 10 个随机数
程序代码如下:
Private Sub Command1_Click() Dim n As Integer, m As Integer
Randomize '产生随机数种子
n = Val(Text1.Text) m = Val(Text2.Text) For i = 1 To 10
p = p & Int((m + 1 - n)* Rnd)+ n & " "
Next i
Label3.Caption = p End Sub
Private Sub Command2_Click()
Text1.SetFocus ' Text1 获得焦点
Text1.SelStart = 0 ' 将光标置于 Text1 的起始位置
Text1.SelLength = Len(Text1.Text) ' 将 Text1 中的内容全部选中 Text2.Text = ""
Label3.Caption = ""
End Sub
3.3.3 多重循环
在循环体内可以包含 Visual Basic 的任何语句,当在循环体内包含另外一个循环语句时就 形成了循环嵌套,又叫多重循环。
下面用一个简单的例子来分析多重循环的执行情况。
【例 321】双重循环举例。
编写窗体的激活事件,程序如下:
Private Sub Form_Activate() Dim i As Integer, j As Integer For i = 1 To 3
For j = 4 To 5 Print i, j Next j Next i End Sub
程序的执行结果如图 318 所示。从图中可以看出,当外循环变量 i 每取一个值,其内循 环将循环一个周期,即 j 将从 4 变化到 5。当 i=1 时,j 分别取 4 和 5;当 i=2 时,j 又分别取 4 和 5,依此类推。
图 318 双重循环
i= 时 1 j 4
Print Tab((j - 1)* 8); i & "*" & j & "=" & i * j;
Next j
Print ' 每行之后产生一个换行 Next i
End Sub
在窗体的任意位置单击鼠标会得到如图 319 所示的结果。
图 319 乘法九九表
【例 323】在窗体上输出如图 320 所示的图形。
图 320 输出三角形