循环结构是计算机程序设计中一种重要的结构,应用广泛。
通过循环结构可以简化程序,节约内存,提高效率。
循环 : 是指在程序设计中 , 从某处开始有规律地执行某一程序块的现象。
重复执行的程序块称为 “ 循环体 ” 。
5.1 循环语句
VB 提供的设计循环结构的语句有 :
For…next
Do …loop
While…wend
For each…next
5.1.1 For...Next 循环语句
步长型循环结构流程图:
循环 循环变量 从初值 到 终值 { 循环控制器 }
|
|
循环体 { 循环体 }
|
语法格式:
For < 循环变量 >=< 初值 > To < 终值 > [Step < 步长 >]
[< 语句列 1>]
[Exit For]
[< 语句列 2> ]
Next [< 循环变量 >]
例 1 :显示 1000 以内所有被 37 整除的数。
程序代码:
Private Sub Command1_Click()
a = ""
For n = 1 To 1000
If n Mod 37 = 0 Then
a = a & Str(n) & vbCrLf
End If
Next
Text1.Text = a
End Sub
执行结果:

例 2 :求 1000 到 1100 之间的所有素数。
程序代码:
Private Sub Command1_Click()
a = ""
For n = 1001 To 1100 Step 2
s = 0
For i = 2 To Int(Sqr(n))
If n Mod i = 0 Then
s = 1
Exit For
End If
Next
If s = 0 Then a = a & Str(n) & vbCrLf
Next
Text1.Text = a
End Sub
执行结果:

5.1.2 DO...LOOP 循环语句
DO...LOOP 语句有两种语法形式 :
前测型循环结构与后测型循环结构
1. 前测型 DO...Loop 循环
前测型循环结构流程图:
当 | 直到 条件 { 条件成立或不成立时 }
|
|
循环体 { 循环体 }
|
语法格式:
Do [{while | until}< 条件 >]
[< 语句列 1>]
[Exit do]
[< 语句列 2>]
Loop
例 3: 求累加和 1+2+3…+100 。
程序代码:
Private Sub Command1_Click()
Dim s As Integer, n As Integer
s = 0: n = 1
Do While n <= 100
s = s + n
n = n + 1
Loop
Label2.Caption = "1+2+3+...+100=" & s
End Sub
执行结果:

例 4: 输入一个正整数,利用“当型”循环判断是否素数。
程序代码:
Private Sub Command1_Click()
Dim n As Long
Select Case Val(Text1.Text)
Case Is < 3
MsgBox " 请输入一个大于 2 的整数! ", vbInformation + vbOKOnly, " 注意 "
Case Is > 2147483647
MsgBox " 此数太大! ", vbInformation + vbOKOnly, " 注意 "
Case Else
n = Val(Text1.Text)
s = 0: i = 2
Do While i <= Sqr(n) And s = 0
If n Mod i = 0 Then
s = 1
Else
i = i + 1
End If
Loop
If s = 0 Then
a = " 是一个素数 "
Else
a = " 不是素数 "
End If
Label1.Caption = Str(n) & a
End Select
Text1.SetFocus
End Sub
Private Sub Text1_GotFocus()
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End Sub
执行结果:

2. 后测型 DO...Loop 循环
后测型循环结构流程图:
|
循环体 { 循环体 }
|
当 | 直到 条件 { 条件成立或不成立时 }
|
语法格式:
Do
[< 语句列 1>]
[Exit do]
[< 语句列 2> ]
Loop [{while | until}< 条件 >]
例 5: 计算圆周率的近似值。
程序代码:
Private Sub Command1_Click()
Dim m As Integer
m = Val(Text1.Text)
p = 0#: s = 2#: e = 0.1 ^ m
Do
t = s: p = Sqr(2 + p): s = s * 2 / p
Loop Until Abs(t - s) < 0.1 ^ m
f = String(m - 1, "#")
Text2.Text = Format(s, "0." & f)
Text1.SetFocus
End Sub
Private Sub Text1_GotFocus()
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End Sub
执行结果:

例 6: 求两个数的最大公约数。
程序代码:
Private Sub Command1_Click()
m = Val(Text1.Text)
n = Val(Text2.Text)
If n * m = 0 Then
MsgBox " 两数都不能为空 ", 48, " 提示! "
Exit Sub
End If
If m < n Then
t = m: m = n: n = t
End If
Do
r = m Mod n
m = n: n = r
Loop While r <> 0
Text3.Text = Str(m)
End Sub
执行结果:

总结:
前测型语句与后测型语句的区别:
前测型语句:
“Do While …… Loop” 语句 ,先判断 While 后面的条件是否为 “ 真 ” ,如果为 “ 真 ” 则执行循环体语句,否则终止循环。
后测型语句:
“Do …… Loop While 语句, ” 先执行循环体语句,然后判断 While 后面的条件是否为 “ 真 ” ,如果为 “ 真 ” 则执行循环体语句,否则终止循环。与前者的区别:不管条件的真假,都会至少执行循环体语句一次。 |