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
执行上述代码,所得之结果如下所示。当用户单击【计数】按钮时,程序会统计出指定单词在文段中出现的次数。应该注意到循环继续执行的条件是仍然可以找到新出现的指定单词,言下之意也就是如果指定单词已经找不到了就可以结束循环了。
以上是关于Visual Basic快捷教程——流程控制的主要内容,如果未能解决你的问题,请参考以下文章