Visual Basic快捷教程——流程控制

Posted 白马负金羁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Visual Basic快捷教程——流程控制相关的知识,希望对你有一定的参考价值。

美籍匈牙利数学家冯·诺依曼于1946年提出“程序存储,顺序执行”的观念,为现代计算机奠定了重要基础。这一观点认为:应该把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。电子计算机的数制宜采用二进制;计算机应该按照程序顺序执行。所以现在开发人员在编写的程序代码时,其实都隐含地认为计算机将来会一行一行按顺序来执行这些指令。但是在顺序执行的过程中,有时我们希望计算机根据条件判断来选择性地执行(或者不执行)一些代码——这时就需要用到选择结构(或称分支结构)。另外一些时候,我们希望计算机能够(有条件地)重复地执行某一段代码——这时就需要用到循环结构。


这里所说的顺序执行、选择结构,以及循环结构统称为程序的流程控制。本文主要介绍在Visual Basic中与流程控制有关的一些语法规则。顺序执行是程序执行的默认规则,本文对此将不多赘述。


一、选择结构


Visual Basic中用来实现选择结构的方式包括:If、Select/Case、Switch、Choose等4这种。


1. If 语句

基于 If 语句实现的选择结构主要有三种形式:

  • If ... Then ...
  • If ... Then ... Else ...
  • If ... ElseIf ... Else ...

下面我们逐个详解。

1)If ... Then ... 是属于单向选择结构,它会判断条件表达式(condition)是否为真,若条件表达式为真,则会执行该分支的语句块(statements);否则,就不执行任何操作。Visual Basic中If ... Then ...的语法规则如下:

If 条件表达式 Then
    语句块
End If
下面通过一个判定用户是否要退出程序的例子来演示 If ... Then ... 在实际中的使用。

Public Class Form1

    Private Sub Button_Exit_Click(sender As Object, e As EventArgs) Handles Button_Exit.Click

        Dim Result As MsgBoxResult
        Result = Interaction.MsgBox("您确定要退出本程序吗?", vbOKCancel+vbQuestion, "提示")

        If Result = vbOK Then
            End
        End If

    End Sub

End Class
执行上述代码,所得之结果如下所示。当用户单击【退出程序】按钮时,程序会弹出一个消息对话框询问用户是否真的要退出程序。如果用户选择【确定】,那么程序将随机退出。如果用户选择【取消】,程序将继续执行。

2)If ... Then ... Else 是一种双向选择结构,它会判断条件表达式是否为真,如果条件表达式为真,则程序会执行为真的分支语句块。否则若条件表达式为假,那么程序便会执行为假的分支语句块。Visual Basic中If ... Then ... Else 的语法规则如下:

If 条件表达式 Then
    条件表达式为真的语句块
Else
    条件表达式为假的语句块
End If
下面通过一个判定用户输入的年份是否为闰年的示例程序来演示 If ... Then ... Else 在实际中的使用。

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        If TextBox_Year.Text Mod 4 = 0 Then
            MsgBox("公元" + TextBox_Year.Text + "年是闰年。",
                   MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "判定结果")
        Else
            MsgBox("公元" + TextBox_Year.Text + "年不是闰年。",
                   MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "判定结果")
        End If

    End Sub
End Class
执行上述代码,所得之结果如下所示。如果用户输入的年份确实为闰年,那么随后弹出的消息对话框就会反馈说这一年确实是闰年。

否则如果用户输入的年份不是闰年,那么随后弹出的消息对话框就会反馈说这一年并非是闰年。

3)If ... ElseIf ... Else 是一种多重嵌套选择结构,当紧跟在 If 后面的判断条件为假时,程序再多做一次判定,即执行ElseIf后面的判定。而且ElseIf后面还可以嵌套多层ElseIf判断。如果所有的判断条件都为假时,那么程序才会执行Else后面的分支语句块。Visual Basic中If ... ElseIf ... Else 的(多重嵌套判断)语法规则如下:

If 第1次条件判断表达式 Then
    第1次条件判断表达式为真的语句块
ElseIf 第2次条件判断表达式 Then
    第2次条件判断表达式为真的语句块

... ...

ElseIf 第n次条件判断表达式 Then
    第n次条件判断表达式为真的语句块
Else
    当前n次判断条件表达式都为假时所执行的语句块
End If

下面通过一个多项选择题小测验程序的例子来演示基于ElseIf ... Else 多重嵌套选择结构在实际中的使用。

Public Class Form1

    Private Sub Button_Submit_Click(sender As Object, e As EventArgs) Handles Button_Submit.Click

        If CheckBox_A.Checked Then
            MsgBox("很遗憾!答错了。", MsgBoxStyle.Critical, "判定结果")
        ElseIf CheckBox_B.Checked Xor CheckBox_C.Checked Then
            MsgBox("还差一点!加油。", MsgBoxStyle.Critical, "判定结果")
        ElseIf CheckBox_B.Checked And CheckBox_C.Checked Then
            MsgBox("恭喜你!答对了。", MsgBoxStyle.Information, "判定结果")
        Else
            MsgBox("你还没有做出选择哦~", MsgBoxStyle.Exclamation, "提示")
        End If

    End Sub
End Class
执行上述代码,所得之结果如下所示。只有当用户给出正确的选择答案时,程序才会判定回答正确。其他执行结果请自行测试,此处略去。


4) 最后我们还要补充一种基于 IIf 函数的双向选择结构。这其实非常类似C语言中的三元运算符“: ?”。IIf 函数选择结构的语法规则如下:

IIf(Expression, TruePart, FalsePart)
其中表达式(Expression)最终的结果为布尔型,TruePart 与 FalsePart 均为对象类型。其规则如下:

  • 假如表达式为真,则返回真时的对象。
  • 假如表达式为假,则返回假时的对象。

可见基于IIf 函数选择结构会判断表达式是否为真,并据此选择要返回的对象。而且因为其返回类型是对象,所以返回值可以包含各种数据类型,如数字,字符串或布尔类型等等。

下面我们用基于IIf 函数选择结构来重写前面的用于判断年份是否为闰年的程序,代码如下:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        MsgBox(IIf(TextBox_Year.Text Mod 4 = 0,
                   "公元" + TextBox_Year.Text + "年是闰年。", "公元" + TextBox_Year.Text + "年不是闰年。"),
               MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "判定结果")

    End Sub
End Class
执行上述程序将会得到与之前一样的结果,这里不再赘述。

此外,如果在IIf 的函数中又包含有IIf 函数,便可以形成嵌套的选择结构,从而实现更加复杂的分支判断条件。例如下面这个示例程序。

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        MsgBox("您要的是一杯" +
            IIf(RButton_Milk_Y.Checked, IIf(RButton_Suger_Y.Checked, "加奶加糖", "加奶不加糖"),
                IIf(RButton_Suger_N.Checked, "不加奶不加糖", "不加奶加糖")) + "的咖啡。",
            vbInformation, "您的选择")

    End Sub
End Class
执行上述代码,所得之结果如下所示。其他执行结果请自行测试,此处略去。


2. Select... Case语句

Select ... Case 是仍然是属于多重选择的结构。Select后面跟着的一个选择条件,不同的Case后面跟的是选择条件可能满足的取值。当某个Case后面跟的可能取值刚好满足选择条件时,就执行对应的语句块。Select ... Case 与If ... Then... Else的作用很相似,但是当判断条件超多3个时,通常使用Select ... Case会比较方便。


基于Select ... Case的选择结构一般采用如下语法形式:

Select 
    Case 条件1
        语句块1
    Case 条件2
        语句块2
... ...

    Case 条件n
        语句块n
    Case Else 
        当Case Else之前的Case条件都不成立时所执行的语句块
End Select
其中Case Else部分也可以省略,但为了程序的鲁棒性,通常会设置一个缺省条件。

下面这个程序演示了使用Select ... Case 的一般方法。

Public Class Form1

    Dim pic_Aston As Image = Image.FromFile(Application.StartupPath & "\\pic\\Aston.jpg")
    Dim pic_Holden As Image = Image.FromFile(Application.StartupPath & "\\pic\\Holden.jpg")
    Dim pic_Jeep As Image = Image.FromFile(Application.StartupPath & "\\pic\\Jeep.jpg")
    Dim pic_Hyundai As Image = Image.FromFile(Application.StartupPath & "\\pic\\Hyundai.jpg")
    Dim pic_Lucid As Image = Image.FromFile(Application.StartupPath & "\\pic\\Lucid.jpg")

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Select Case ComboBox1.Text
            Case "Aston Martin Vanquish S"
                PictureBox_Car.Image = pic_Aston
            Case "Holden Commodore"
                PictureBox_Car.Image = pic_Holden
            Case "Jeep Grand Cherokee"
                PictureBox_Car.Image = pic_Jeep
            Case "Hyundai Santa Fe"
                PictureBox_Car.Image = pic_Hyundai
            Case "Lucid Air"
                PictureBox_Car.Image = pic_Lucid
        End Select

    End Sub
End Class
执行上述代码,所得之结果如下所示。当用户选择不同的车型时,右侧的图像框就会展示对应的图片。上面的程序中我们并没有设置缺省选项,读者可以试着加上一个缺省选项。



这里需要提醒读者注意的是,Select ... Case本质上是等同于If ... Then... Else的一种分支结构。既然是分支结构,我们就应该保证各个分支条件之间不能相互包含。因为在Select ... Case的结构中,如果分支选择被多个Case后面带的条件所满足,它也仅会执行第一次满足条件的Case对应的语句块。例如下面这个例子:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim value As Double
        value = TextBox1.Text

        Select Case value
            Case Is > 1000
                MsgBox("您输入的数大于1000.")
            Case Is > 100
                MsgBox("您输入的数大于100.")
            Case Is > 0
                MsgBox("您输入的数大于0.")
            Case Else
                MsgBox("您输入的是一个负数.")
        End Select

    End Sub
End Class
显然一个大于1000的数也必然会大于100和0,但是你执行程序并在文本框中输入1999时,也只会得出下图所示之结果。因为当第一个Case使得分支条件得以满足时,后续若干Case所带的判断就都不会被执行。


3. Switch语句


Switch(在Visual Basic中使用时应该写为Microsoft.VisualBasic.Switch)属于多重选择结构。它的作用与Select ... Case非常类似,但是代码会更为精简。其语法规则如下:

Microsoft.VisualBasic.Switch(表达式1, 结果1, _
    表达式2, 结果2, _
    ... ...
    表达式n, 结果n)
若表达式1判断为真,则返回结果1;若表达式2判断为真,则返回结果2;以此类推,表达式n判断为真,则返回结果n。其返回结果的类型为对象,所以返回值可以包含各种数据类型,例如数值、字符或布尔类型等等。

下面这个例子演示了用Switch语句重写上面的汽车图库小程序,注意其中略去了定义及载入图片文件的部分代码(因为这部分代码与之前用到过的并无差别)。可见,利用Switch语句,我们的代码得以更加精简。

Public Class Form1

    '此处代码有省略,可参考之前用于载入图像的代码

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        PictureBox_Car.Image = Microsoft.VisualBasic.Switch(
            ComboBox1.Text = "Aston Martin Vanquish S", pic_Aston, _
            ComboBox1.Text = "Holden Commodore", pic_Holden, _
            ComboBox1.Text = "Jeep Grand Cherokee", pic_Jeep, _
            ComboBox1.Text = "Hyundai Santa Fe", pic_Hyundai, _
            ComboBox1.Text = "Lucid Air", pic_Lucid)

    End Sub
End Class
上述代码的执行结果与前图所示一致,这里不再赘述。

4. Choose语句


Choose(在Visual Basic中使用时应该写为Microsoft.VisualBasic.Choose)属于多重选择结构。它主要根据索引值(Index)来选择并返回从参数列表中的对象。它的语法规则如下:

Microsoft.VisualBasic.Choose(Index, 对象1, 对象2, ..., 对象n)
Choose 函数将从对象参数列表“对象1, 对象2, ..., 对象n”中,根据Index 的,返回列表中的指定成员。 选择列表的第一个成员时 Index 为 1。 如果 Index 超出这些限制 Choose 返回 Nothing。如果 Index 不是整数,它将被舍入为最接近的整数作为索引。


下面这个例子演示里用Choose语句重写上面的汽车图库小程序,注意其中略去了定义及载入图片文件的部分代码(因为这部分代码与之前用到过的并无差别)。可见,利用Choose语句,与之前的代码相比,现在的版本变得更加精简。

Public Class Form1

    '此处代码有省略,可参考之前用于载入图像的代码

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        PictureBox_Car.Image = Microsoft.VisualBasic.Choose(ComboBox1.SelectedIndex + 1,
                                     pic_Aston, pic_Holden, pic_Jeep, pic_Hyundai, pic_Lucid)

    End Sub
End Class
上述代码的执行结果与前图所示一致,这里不再赘述。

二、循环结构


Visual Basic中用于实现循环结构的方式主要有For、While、Loop等3种此外本部分内容还涉及一些用于跳槽循环的关键字。


一、For语句

For 循环结构主要形式有以下两种:

  • For ... Next
  • For Each ... Next

下面我们逐个详解。

1)For ... Next 是最常用的一般循环语句。它主要通过设计计数器(Counter)的起始值、终止值和递增值三个部分,来决定循环执行的规则与次数。在正常的执行的情况下,只有当计数器的值等于“终止值”时,才会跳出循环。

For ... Next的语法规则如下:

For 计数器变量(counter)As 数据类型 = 起始值 To 终止值 Step 递增值
    语句块(statements)
Next i

下面这个示例程序演示了使用
For ... Next 循环结构的基本方法。这个程序实现了一个简单的幻灯片放映 功能。

Public Class Form1

    '此处代码有省略,可参考之前用于载入图像的代码

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim index As Integer
        Static start As Single
        Button1.Enabled = False

        For index = 1 To 5 Step 1
            PictureBox_Car.Image = Microsoft.VisualBasic.Choose(index,
                                             pic_Aston, pic_Holden, pic_Jeep, pic_Hyundai, pic_Lucid)

            start = Microsoft.VisualBasic.Timer()
            Do While Microsoft.VisualBasic.Timer() < start + 2
                System.Windows.Forms.Application.DoEvents()
            Loop
        Next

        Button1.Enabled = True

    End Sub
End Class
执行上述代码,所得之结果如下所示。当用户单击【放映幻灯片】按钮后,图像对话框中将以2秒为间隔的速度逐个播放图库中的图片。


2)For Each ... Next 是在一个集合中针对其中的每一个元素逐个执行的循环结构。这种语法在Python中也有类似的实现。它的处理对象通常是数组、对象集合等,通过For Each来取出集合中的单个元素(或对象)。在正常情况下,当集合中每一个对象都被取出时,才会跳出循环。其语法规则如下:

For Each 对象变量 As 数据类型 In 集合数组
    语句块(statements)
Next 对象变量

下面这个例子演示了用For Each ... Next 语句重写上面的幻灯片放映小程序,注意其中略去了定义及载入图片文件的部分代码(因为这部分代码与之前用到过的并无差别)。

Public Class Form1

     '此处代码有省略,可参考之前用于载入图像的代码

    Dim pics() As Image = {pic_Aston, pic_Holden, pic_Jeep, pic_Hyundai, pic_Lucid}

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Static start As Single
        Button1.Enabled = False

        For Each pic As Image In pics

            PictureBox_Car.Image = pic

            start = Microsoft.VisualBasic.Timer()
            Do While Microsoft.VisualBasic.Timer() < start + 2
                System.Windows.Forms.Application.DoEvents()
            Loop
        Next

        Button1.Enabled = True

    End Sub
End Class
上述代码的执行结果与前图所示一致,这里不再赘述。


二、While语句

以While为基础的循环结构,主要根据条件表达式(condition)的值来判断是否跳出循环,若条件表达式为真,则会继续执行循环体中的语句段,否则若条件表达式为假,则跳出循环。与For结构不同,While结构不需要确定循环所需执行的次数,只要知道结束条件即可。While结构的基本语法规则如下:

While 条件表达式(condition)
    语句块(statements)
End While
下面这个例子演示了While结构的基本使用方法。该示例程序的作用是统计某段文本中特定单词出现的次数。

Public Class Form1

    Dim str As String = "Pick up one basketball from the basket which contains basketballs."
    Dim subStr As String = "basket"

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim counter As Integer
        Dim pos As Integer = str.IndexOf(subStr)
        counter = 0

        While pos > 0
            counter += 1
            pos = str.IndexOf(subStr, pos + 1)
        End While

        MsgBox("The word '" & subStr & "' is found " & counter.ToString & " times.")

    End Sub
End Class
执行上述代码,所得之结果如下所示。当用户单击【计数】按钮时,程序会统计出指定单词在文段中出现的次数。应该注意到循环继续执行的条件是仍然可以找到新出现的指定单词,言下之意也就是如果指定单词已经找不到了就可以结束循环了。