三、循环结构
循环是在指定的条件下多次重复执行一组语句。顺序结构和分支结构的程序执行时,每条语句只能执行一次,循环结构则可以使计算机在一定条件下反复多次执行同一段程序。Visual Basic.NET中提供了两种类型的循环语句:计数型循环语句和条件型循环语句。
1.For语句
For循环语句又称计数型循环语句,通常用于循环次数已知的程序结构中。
For语句的作用是:用循环计数器(循环变量)来控制循环体内的语句的执行次数。
For语句的一般形式为:
For <循环变量> = <初值> To <终值> [Step <步长>] <循环体> [Exit For] Next <循环变量>
其中:
循环变量:必须为数值型,用于控制循环是否执行。每执行一次循环体语句后,循环变量的值自动按指定的步长变化。
初值、终值、步长:数值型表达式。
步长:可正可负。若为正,循环变量从小到大变化(初值小于等于终值);若为负,循环变量从大到小变化(初值大于等于终值);缺省时步长为1。
循环体:可以是一句或多句语句,是被重复执行的部分。
Exit For:表示当遇到该语句时,提前结束循环,执行Next后的下一条语句,通常与条件判断语句(如IF)联合使用。
For循环流程图如图3-9所示,VB的执行过程如下。
图3-9 For循环语句的流程图
(1)计算初值、终值及步长表达式的值,并将初值赋给循环变量。
(2)判断循环变量的值是否在终值内,如果是,执行循环体;如果否,退出循环,执行Next的下一句语句。
(3)执行Next语句,循环变量增加一个步长。
(4)重复步骤(2)~(3),继续循环。
提示
① 步长为0时,必须有Exit For语句,否则会发生“死循环”。
② 循环变量被赋初值,它仅被赋值一次。
③ 循环变量的值是否在终值内:当步长为正时,若循环变量的值大于终值,则结束循环;当步长为负时,若循环变量的值小于终值,则结束循环。
④ 循环次数:n=Int((终值-初值)/步长+1)。
⑤ 在循环体内对循环控制变量可多次引用,但不要对其赋值,否则会影响原来的循环控制规律。
例如,求表达式s = 1!+ 2!+ 3!+ …+10!的和,程序界面如图3-10所示。
图3-10 求表达式之和的程序界面
程序代码如下。
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click Dim sum,i,n As Integer n = 1 For i = 1 To 9 n *= i sum += n Next i Label1.Text = "1!+2!+..+10!=" & sum End Sub Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button2.Click End End Sub End Class
2.Do语句
Do循环语句又称“循环条件”控制语句,通常用于循环次数未知的循环结构。此种语句有两类语法形式。
Do语句的一般形式如下。
格式一:
Do { While|Until }<循环条件> <循环体> [Exit Do] Loop
其中:循环条件是一个逻辑表达式;While是当条件为True时执行循环;Until是在条件变为True之前执行循环。
Do语句的作用:当指定的循环条件为True,或者直到指定的循环条件变为True之前重复执行一组语句(即循环体)。
Do While…Loop语句的执行过程如图3-11所示。
图3-11 Do While…Loop循环语句流程图
例如,求自然对数e的近似值,近似公式为:e = 1+1/1!+1/2!+…+1/n!+…,要求近似值与真值的误差小于0.000 01。程序界面如图3-12所示。
图3-12 求自然对数e的近似值程序界面
程序的代码如下。
Public Class Form1 Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button2.Click End End Sub Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click Dim i As Integer,n As Long,t,s As Single s = 0 : n = 1 i = 0 : t = 1 Do While t > 0.00001 s += t i += 1 n *= i t = 1 / n Loop Label1.Text = "计算了" & i & "项,他们的和e=" & s End Sub End Class
格式二:
Do <语句块> [Exit Do] <语句块> Loop { While|Until} <条件表达式>
Do…LoopUntil语句的执行过程如图3-13所示。
图3-13 Do…Loop Until语句流程图
Do…Loop Until语句首先执行一次循环体,然后判断循环条件,若其值为False,则返回循环开始处,否则跳出循环执行Loop后面的语句。相比Do…While Loop循环,Do…Loop Until循环无论条件表达式成不成立都先执行一次,希望读者注意。
3.循环的嵌套
在一个循环结构的循环体内含有另一个循环结构,这就构成了循环的嵌套,又称多重循环。循环嵌套对For循环语句和Do…Loop循环语句均适用。
提示
① 外层循环必须完全包含内层循环,循环体之间不能交叉。
② 对于For循环的嵌套,内循环变量与外循环变量不能同名。
比较下面两段程序。
程序一的代码:
Public Class Form1 Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button2.Click End End Sub Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click Dim i,j As Integer For i = 1 To 3 Label1.Text &= "i=" & i & " " & vbCrLf & " " For j = 1 To 3 Label1.Text &= "j=" & j & " " Next Label1.Text &= vbCrLf Next End Sub End Class
程序二的代码:
Public Class Form1 Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button2.Click End End Sub Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click Dim i,j As Integer For i = 1 To 3 For j = 1 To 3 Label1.Text &= "i=" & i Label1.Text &= " j=" & j & " " Next Label1.Text &= vbCrLf Next End Sub End Class
运行结果分别如图3-14和图3-15所示,程序一将"i="的语句放在了内层循环的外面,故"i="的语句只显示了3次,即外层循环的次数。而程序二将"i="放在了内层循环里面,故"i="要显示的次数为内层循环次数与外层循环次数的乘积,所以程序二中显示了9次。
图3-14 程序一运行界面
图3-15 程序二运行界面
4.GoTo语句
GoTo语句又称条件转移语句,它通过与语句标号的结合来控制程序的流程。
GoTo语句的一般形式为:
GoTo {标号|行号}
GoTo语句的作用:当程序执行该语句时,无条件地将程序转移到标号或行号所标识的语句行上,并从该行向下执行。
提示
① 标号是一个以冒号结束的标识符,用以标明GoTo语句转移的位置。
② GoTo语句可以改变程序的执行顺序,由它可以构成分支结构的循环结构。
③ 通常GoTo语句与If语句共同使用,否则会出现死循环。
④ 太多的GoTo语句会降低代码的可阅读性,建议尽量少用或者最好不用GoTo语句。