程序设计与实践(VB.NET)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

三、循环结构

循环是在指定的条件下多次重复执行一组语句。顺序结构和分支结构的程序执行时,每条语句只能执行一次,循环结构则可以使计算机在一定条件下反复多次执行同一段程序。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语句。