3.3 循环结构的语句实现
3.3.1 计数循环
For…Next语句构成的循环称为For循环,也称计数循环。
格式:
For <循环变量> = <初值> To <终值> [Step步长]
[循环体]
Next [循环变量]
说明:
⑴“循环变量”也称“循环控制变量”或“计数器”,“初值”、“终值”和“步长”可以是数值型的常量、变量或表达式。For和Next之间的循环体可以是一条或多条语句,Step步长和Next后的循环变量都是可以省略的,Step省略时,表示步长为1。
⑵For语句执行过程:先将循环的初值赋给循环变量,然后判断循环变量的值是否大于终值,如果大于终值,则退出循环,否则执行循环体。每一次执行循环体之后,循环变量的值会自动增加步长值,再将循环变量的新值与终值进行比较,重复上述过程。流程图如图1所示。
例如:
For i = 1 To 5
Print i,
Next i
程序运行时,i的初值为1,终值为5。由于初值小于终值,所以开始执行循环体Print i语句,输出1,此时完成第一次循环,循环变量i自动增加步长1,i的值变为2;下一次循环,由于i的值小于5,执行循环体,输出2,完成第二次循环,i的值再增加1;依此类推,直到i的值大于5时才终止循环,共循环5次,程序的运行结果是输出1 2 3 4 5。
⑶如果For语句中使用了关键字Step,那么循环变量的增加值是Step后面定义为步长的值,例如在以下的语句中,变量i每次增加的步长值为2。
For i = 1 To 10 Step 2
Print i
Next i
⑷VB遵循“先检查,后执行”的原则,即先检查循环变量是否大于终值,然后决定是否执行循环体。当步长为正,初值大于终值时,或步长为负,初值小于终值时,循环体将不执行。例如:
For i=9 to 0
Print i
Next i
该例中步长为1,且初值大于终值,所以不执行循环体。欲使其运行,需要将循环语句的步长设置为负值。改写为:
For i=9 to 0 Step -1
Print i
Next i
从此例中可以看出,如果初值大于终值,步长应为负数,循环才能正常执行。
【例1】求1到100之间自然数列之和。
Private Sub Form_Click()
Dim s As Integer, i As Integer
s = 0
For i = 1 To 100
s = s + i
Next i
Print "s="; s
End Sub
程序中,i为循环控制变量,s用来存储累加和,每次循环将变化后的i值加到s上,使s的值不断增加,程序执行的具体过程:
程序开始时: s=0
第1次循环: i=1 s=0+1=1
第2次循环: i=2 s=1+2=3
第3次循环: i=3 s=3+3=6
……
第100次循环:i=100 s=4950+100=5050
【例2】输入任意10个数,统计其中正数和负数的个数。
Private Sub Form_Click()
Dim num As Integer , i As Integer
Dim k1 As Integer, k2 As Integer
k1 = 0
k2 = 0
For i = 1 To 10
num = InputBox("请输入一个非零的数:")
Print num
If num > 0 Then
k1 = k1 + 1
ElseIf num < 0 Then
k2 = k2 + 1
End If
Next i
Print "正数的个数为:"; k1
Print "负数的个数为:"; k2
End Sub
程序中利用k1, k2分别作为统计正数、负数个数的变量。程序运行时,输入一个数,判断其正负性,如果大于0则变量k1加1,如果小于0则变量k2加1。
程序中i仅作为控制循环次数的变量,在循环体中并没有参与运算,而例1(求和程序)中i不仅控制循环次数,同时也参与运算。程序运行结果如图2所示。
【例3】将字符串“ABCDE”逆序输出。
Private Sub Form_Click()
x= "ABCDE"
k = Len(x)
s = ""
For i = k To 1 Step -1
j = Mid(x, i, 1)
s = s + j
Next i
Print s
End Sub
程序通过Len函数取得字符串的长度赋值给k(值为5);利用For循环中的循环变量i依次取得字符串中逆序字母的相应位置,并通过Mid函数截取相应的逆序字符,其执行过程如下:
i = 5 j = Mid( x, i, l ) = Mid("ABCDE ", 5,1) = "E" s = s + j = "E"
i = 4 j = Mid( x, i, l ) = Mid("ABCDE ", 4,1) = "D" s = s + j = "E" + "D" = "ED"
i = 3 j = Mid( x, i, l ) = Mid("ABCDE ", 3,1) = "C" s = s + j = "ED" + "C" = "EDC"
i = 2 j = Mid( x, i, l ) = Mid("ABCDE ", 2,1) = "B" s = s + j = "EDC" + "B" = "EDCB"
i =1 j = Mid( x, i, l ) = Mid("ABCDE ", 1, 1) = "A" s = s + j = "EDCB" + "A" = "EDCBA"
3.3.2 条件循环
Do…Loop语句构成的循环也称为Do循环,是一类有条件的循环,通过判断条件的值为真或假来控制循环的结束。Do循环的循环次数是不确定的,对于事先不知道循环要执行多少次的情况来说,Do循环十分方便。Do…Loop语句有灵活的构造形式。
格式:
Do While <条件>
[循环体]
Loop
说明:
⑴执行过程:首先测试条件表达式的值,如果值为真,则执行循环体中的语句块,完成一次循环,然后返回到Do While语句再测试条件,一旦条件值为假,就跳出循环,执行Loop下面的语句。如果条件一开始就为假则一次循环也不执行。流程图如图3所示。
【例4】从键盘输入字符并统计字符个数,当输入字符为“?”时,停止计数。
算法设计:由于不知道将输入多少个字符,所以无法确定具体的循环次数,这种情况适合使用Do循环语句设计循环,循环条件为:输入字符不为“?”。
程序代码:
Private Sub Form_Click()
Dim k As Integer
Dim ch As String
k = 0
ch = InputBox("输入一个字符,以'?'结束输入")
Do While ch <> "?"
Print ch
k = k + 1
ch = InputBox("输入一个字符,以'?'结束输入")
Loop
Print "字符个数为:", k
End Sub
程序运行结果如图4所示。
⑵用For...Next循环编写的程序都可以用Do循环实现,关键是要设计好控制循环的条件。
【例5】用Do语句编写程序,求1到100的累加和。
Private Sub Form_Click()
Dim s As Integer, i As Integer
s = 0
i = 1
Do While i <= 100
s = s + i
i = i + 1
Loop
Print "s="; s
End Sub
Do循环没有自动变化的循环控制变量,所以一定要有能够改变循环条件表达式值的语句,否则循环永远不会结束,这种永不结束的循环被称为死循环。例如上面例题中的i=i+1,可以改变i的值,当i变化到大于100时,逻辑表达式i <= 100的值为假,循环就会结束。
⑶Exit Do语句用于强制跳出循环,其功能与Exit For语句相似,恰当的使用Exit Do语句可以防止死循环。
⑷Do While...Loop语句的另一种形式是先执行循环体,在每次执行循环体后测试条件。
格式:
Do
[循环体]
Loop While <条件>
这种形式可以保证循环体至少执行一次。流程图如图5所示。
格式:
Do Until <条件>
[循环体]
Loop
说明:
⑴执行过程:首先测试条件表达式的值,当值为假时,执行循环体,完成一次循环,然后返回到条件表达式再测试条件,直到条件表达式值为真时,循环才终止。流程图如图6所示。

⑵另一种语句形式是把测试条件放在Loop语句中,这种形式可以保证循环至少执行一次。
格式:
Do
[循环体]
Loop Until <条件>
流程图如图7所示。
【例6】用Do Until…Loop语句改写例4。
Private Sub Form_Click()
Dim k As Integer
Dim ch As String
k = 0
ch = InputBox("输入一个字符,以'?'结束输入")
Do Until ch = "?"
Print ch
k = k + 1
ch = InputBox("输入一个字符,以'?'结束输入")
Loop
Print "字符个数为:", k
End Sub
程序运行时,首先判断表达式ch = "?"的值,若为假则进入循环,执行循环体,直到条件值为真时退出循环,输出字符个数。
3. While…Wend语句
由While…Wend语句构成的循环称为当循环或While循环。
格式:
While <条件>
[循环体]
Wend
While循环也是通过测试条件的值来控制循环的结束。当值为真时,执行循环体,然后返回到While语句再测试条件,一旦条件为假,就跳出循环。其功能与Do While…Loop语句相同。流程图如图8所示。
【例7】用While…Wend语句改写例2。
Private Sub Form_Click()
Dim k As Integer
Dim ch As String
k = 0
ch = InputBox("输入一个字符,以'?'结束输入")
While ch <> "?"
Print ch
k = k + 1
ch = InputBox("输入一个字符,以'?'结束输入")
Wend
Print "字符个数为:", k
End Sub
4.几种循环语句的比较
以求整数1到10的和为例,变量s用来存储和,变量i为循环控制变量,几种循环语句编写的代码如下:

以上6种语句均可计算出1到10的累加和,但语句格式不同,循环条件也不同,在使用循环语句时要根据实际情况选择恰当的语句。
=========================================================================================
=========================================================================================

