VB 是面向对象的程序设计语言,尽管采用了事件驱动的机制,但在设计过程的程序代码 时,仍需要对过程的流程进行控制,即采用结构化程序设计的方法完成过程代码设计。
结构化程序设计方法把程序的结构分为顺序、选择和循环三种基本结构。程序设计的基 本原则是尽量避免语句之间的跳转,自顶向下、逐步求精、模块化设计等。目的是在团队开发 大型软件时,实现高效率、高可靠性。
2.4.1 顺序结构
顺序结构是程序设计中最简单、最常用的基本结构。该结构中,各语句的执行按照语句 的书写次序逐条顺序执行,是任何程序的基本结构。
例 223 一个最简单的顺序结构程序。
【程序代码】
Private Sub Command1_Click() Dim x As Integer
Dim y As Integer x = 10
y = 20
MsgBox "x+y=" & x + y End Sub
【代码说明】
单击命令按钮 Command1 时,将逐条执行 Click 事件内的语句。
2.4.2 分支结构
通常,计算机按语句在程序中书写的顺序执行语句。但在许多情况下,语句执行的顺序 依赖于输入数据或中间运算结果。在这种情况下,必须根据某个变量或表达式的值作出判定,
以决定执行哪些语句和跳过哪些语句不执行。VB 应用程序中,可以通过分支结构实现这种功 能。分支结构又称条件结构。
VB 提供三种分支语句,即:
(1)If…Then 语句
(2)If…Then…Else 语句
(3)Select Case 语句 1.If…Then 语句
格式 1:If 条件 Then 语句 格式 2:If 条件 Then
语句块 End If
功能:如果条件成立(为真),则执行 Then 后面的语句或语
句块。否则,执行 If 语句的下一条语句。流程图如图 224 所示。 图 224 If…Then 语句流程图 语句块
条件 N Y
说明:
(1)条件一般为关系表达式、逻辑表达式。
(2)格式 1 中的语句只能是一个语句或写在一行上用“: ”分隔的多个语句。
(3)语句块指一行或多行语句。
例 224 比较 x、y 中的数,将大数放在 x 中,小数放在 y 中。
【程序代码】
用格式 1:
If x<y Then w=x:x=y:y=w '引入中间变量 w,使 x、y 中的值进行交换 用格式 2:
If x<y Then w=x x=y y=w End If
例 225 已知 x、y、z 三个数,要求按从小到大的顺序进行排列。
【程序代码】
Private Sub Command1_Click()
X = 8: y = 9: z = 3 '设定 x、y、z 的初值 If x > y Then w = x: x = y: y = w '将 x、y 中的小数存放于 x 中
If x > z Then w = x: x = z: z = w 'x 中存放 x、z 中的小数,此时 x 为三个数中的最小数 If y > z Then w = y: y = z: z = w 'y 中总是存放 y、z 中的小数
MsgBox x & "," & y & "," & z End Sub
程序运行时,单击 Command1 按钮,将弹出按从小到大的顺序显示 x、y、z 值的对话框。
2.If…Then…Else 语句
格式 1:If 条件 Then 语句 1 Else 语句 2 格式 2:If 条件 Then
语句块 1 Else
语句块 2 End If
格式 3:If 条件 1 Then 语句块 1 ElseIf 条件 2 Then
语句块 2 Else
语句块 3 End If End If
功能:如果条件成立(为真),则执行 Then 后面的语句 1(或语句块 1);否则,执行 Else 后面的语句 2(或语句块 2)。流程图如图 225 所示。
说明:
(1)格式 3 构成了条件语句的嵌套,若条件 1 不成立,则判断条件 2 是否成立。
(2)ElseIf 不能写成 Else If。在 Else 语句中又出现 If 语句,称为 If 语句的嵌套。使用 If 的嵌套结构时,若 If 语句不写在一行上,则必须与 End If 配对。多个 If 嵌套时,End If 与其 最接近的 If 配对。
例 226 在火车站托运行李时,需要根据行李的重量按不同标准收费。若重量不超过 50kg,按每公斤 0.3 元收费;若重量超过 50kg,其中 50kg 按每公斤 0.3 元收费,超出 50kg 部 分按每公斤 0.6 元收费。要求设计程序,根据输入的托运行李重量计算并输出托运费。
图 225 If…Then…Else 语句流程图
【分析】
设托运行李重量为 weight,托运费为 pay,计算公式如下:
pay=weight*0.3 当 weight≤50 pay=50*0.3+(weight50)*0.6 当 weight>50
程序运行时,单击窗体,利用 inputBox 函数接收输入的行李重量;计算后,在窗体上显 示行李托运费。
【程序代码】
Private Sub Command1_Click() Dim weight, pay
weight = InputBox("请输入行李的重量") If weight < 50 Then
pay = weight * 0.3 Else
pay = 50 * 0.3 + (weight 50) * 0.6 End If
MsgBox "行李托运费为:" & pay & "元"
End Sub
【运行结果】
如图 226 所示。
图 226 例 226 程序运行界面 N Y 条件
语句块 2 语句块 1
例 227 以下程序段将学生成绩的百分制转换成 A、B、C、D、E 等级制。
【程序代码】
Private Sub Command1_Click()
score = Val(InputBox("请输入分数值:")) If score > 90 Then
grade = "A"
ElseIf score >= 80 Then grade = "B"
ElseIf score >= 70 Then grade = "C"
ElseIf score >= 60 Then grade = "D"
Else
grade = "E"
End If
MsgBox "分数等级为:" & grade End Sub
3.Select Case 语句
Select Case 语句也可以实现选择,有时比 If 语句还简单、直观。
格式:Select Case 表达式 Case 表达式列表 1
语句块 1
Case 表达式列表 2 语句块 2
… [Case Else
语句块 n+1]
End Select
功能:根据测试表达式的值,选择执行不同的语句。若表达式的结果与 Case 子句中表达 式列表 i 的值相等,则执行语句块 i。
说明:表达式列表与表达式的类型必须一致。
表达式列表可以是下列形式之一:
(1)一个具体的值,如 5。
(2)用逗号分隔的一组数据,如 1,3,4,6。
(3)用 To 表示的一个区间,如 3 To 9。
(4)用 Is 代表测试值,后带关系运算符和比较值,如 Is>7。
例 228 将例 227 中用 If 嵌套结构实现的功能改用 Select Case 语句实现。
【程序代码】
Select Case score Case is>=90
Grade="A"
Case 80 to 89
Grade="B"
Case 70 to 79 Grade="C"
Case 60 to 69 Grade="D"
Case Else Grade="E"
Case Select 2.4.3 循环结构
程序设计中,常常会遇到一些计算不复杂但需要反复多次计算的问题,如显示九九乘法 表等。这种问题可用循环结构来实现。
循环结构程序设计实际上是一种特殊结构的选择结构,程序根据循环条件的判断结 果决定是否执行循环体语句。循环体语句是循环结构中的处理语句块,用来执行重复的 任务。
循环结构有多种形式,可以根据需要选择。无论采用何种类型的循环结构,循环体的执 行次数必须视其循环类型与条件而定,且必须确保循环的重复执行能在适当的时候得以终止
(即非死循环)。此外,循环结构还能嵌套使用。
VB 的循环语句有以下四种形式。
(1)For ... Next
(2)For Each ... Next
(3)Do…Loop
(4)While…Wend 1.For ... Next 结构
格式:For 循环变量 [As 类型]=初始值 To 终止值 [Step 步长]
语句块 [Exit For]
Next
功能: For 循环语句是一种定次循环语句, 即在设计程序时已经可以确定需要循环的次数。
执行 For 语句时,首先判断循环变量当前值是否大于终值,若不是,则进入循环执行循环体语 句。执行到 Next 语句时,将循环变量的值加上步长值,返回到 For 语句(循环开始处);否则,
退出循环执行 Next 语句之后的语句。
说明:
l 循环变量:整型变量,用于记录循环次数的数值型变量。
l 类型:说明循环变量的类型。
l 初始值:循环变量的起点值。
l 终止值:决定何时退出循环。
l 步长值:数值类型。步长值决定每执行一次循环,循环变量的增量。每次循环后,循 环变量的增量(默认)增 1,可以是正数或负数。
l Exit For:控制转移到 For 循环外,即退出循环。
l 初始值、终止值和步长变量在循环前必须赋值,且为整数。
例 229 从 1 累加到 100,显示累加结果。
【程序代码】
Private Sub Command1_Click() Dim sum As Integer
sum = 0
For i = 1 To 100 sum = sum + i Next
MsgBox ("计算结果为:" & sum) End Sub
【运行结果】
如图 227 所示。
例 230 显示九九乘法表。
For 循环语句可以嵌套使用。本例中,被乘数从 1 变化到 9,乘数也从 1 变化到 9,采用 两层循环嵌套。
【程序代码】
Private Sub Command1_Click()
Dim i As Integer, j As Integer Dim s As String
For i = 1 To 9 For j = 1 To i
s = s & i & "*" & j & "=" & i * j & " "
Next
s = s & vbCrLf Next
MsgBox (s) End Sub
【运行结果】
如图 228 所示。
图 228 九九乘法表 2.For Each... Next 结构
For Each...Next 循环与 For...Next 循环类似。该语句对数组或对象集合中的每一个元素重 复一组语句,而不是重复语句一定的次数。在不知道一个集合有多少元素的场合,For Each...Next 循环非常有用。
格式:For Each element In 对象或集合、数组
图 227 运行结果
语句块 [Exit For]
Next
功能:可以列出数组中的每一个元素,或一个集合中的每一个元素。
其中:
l 对集合,element 只能是 Variant 类型变量,或一般的 Object 类型变量,或“对象浏览 器”中列出的对象。
l 对数组,element 只能是 Variant 类型变量。
例 231 用 For Each 结构显示数组中每一个元素。
【程序代码】
Private Sub Command1_Click() Dim arr(9) As Integer Dim s As String '为了测试,先对数组赋值 For i = 0 To UBound(arr)
arr(i) = i + 1 Next
'使用 For Each 结构列举出数组的每一个元素 For Each a In arr
s = s & a & " "
Next
MsgBox "数组元素如下:" & s End Sub
【运行结果】
如图 229 所示。
例 232 用 For Each 结构显示窗体上所有控件对象的信息。
【建立工程】
新建工程,按默认名称保存工程为“工程 1” ,窗体名称保存为 Form1。
界面布局如图 230 所示。
图 230 界面布局
【程序代码】
Private Sub Command1_Click() For Each c In Me.Controls
Label1
Label2
Command1 Text1 Text2
图 229 运行结果
s = s & "控件名称是:" & c.Name & _
" 控件类型是:" & TypeName(c) & vbCrLf Next
MsgBox "窗体包含以下控件:" & s End Sub
【代码说明】
TypeName 函数求取变量的类型名。
【运行结果】
如图 231 所示。
图 231 运行结果 3.While 结构
While 循环结构有几种形式,如表 26 所示。
表 26 While 循环结构的形式
While 结构 1 While 结构 2 While 结构 3
While <条件>
语句块 Wend
Do While<条件>
语句块 [Exit Do]
Loop
Do 语句块 [Exit Do]
Loop While <条件>
表中 While 结构 1 和 While 结构 2 实现相同的功能, 只是写法不同, 这种结构称为 “当型”
循环结构。即当满足条件时,执行循环体(语句块)。
While 结构 3 是“直到型”循环结构,无论是否满足条件,至少执行循环体(语句块)一 次,直到不满足条件才退出循环。
注意:While…Wend 没有 Exit While 的语句,Do...Loop 语句提供了一种结构化与适应性 更强的方法来执行循环。
例 233 求从 1 累加到 100 的过程中,结果超过 1000 的数是多少。
【程序代码】
Private Sub Command1_Click() Dim i As Integer
Dim sum As Integer
Do While 1 '形式上是无限循环,在循环体中必须有退出的判断 sum = sum + i
If sum > 1000 Then Exit Do '当满足条件时,退出循环 i = i + 1
Loop
MsgBox ("当结果超过时,该数为:" & i) End Sub