三种执行结构
在前面的代码中,我们的程序会一行一行的往下执行,但在实际工作中,可能会根据不同的条件执行不同的工作,这就要求我们在程序中也能实现这样的操作,于是,通过多年的开发、研究,现在无论哪种语言,都会有三种基本的执行结构,即我们常说的:
l 顺序结构
l 条件结构
l 循环结构
下面我将会使用顺序和循环这两种结构来完成同一种工作。就是计算从1到100累加的和。
1 顺序结构
当没有条件转移时,程序会按顺序一行一行执行代码,如果通过通过这个结构来计算1到100的累加,我们当然不能用1+2+3……这种方法,于是我们只有使用小高斯的计算方法了,代码如下(您可以新建一个按钮Command2来执行此项计算):
Private Sub Command2_Click()
Dim iFrom As Long
Dim iTo As Long
Dim sum As Long
iFrom = 1
iTo = 100
sum = (iFrom + iTo) * (iTo / 2)
MsgBox CStr(sum)
End Sub
我们分别三个整型变量来指定开始数、结束数以及计算结果,计算完成后,使用MsgBox函数将结果显示出来,其中还使用了CStr函数来将结果转成字符串形式。
其实这种方法可以说是毫无意义,在这里,我们只是要显示一下代码的执行顺序,而此类问题最好的也是最明了的解决方案就是使用循环结构。
2 循环结构
下面的代码使用循环结构计算1到100的累加,先看一下代码:
Private Sub Command3_Click()
Dim i As Long
Dim sum As Long
sum = 0
For i = 1 To 100 Step 1
sum = sum + i
Next
MsgBox CStr(sum)
End Sub
下面解释一下代码。
在代码中,我们看到了新的语句:
For 循环控制变量=初值 To 结束值 Step 步长
循环体代码
Next
其中,For、To、Step和Next为VB6的关键字,这个循环结构的含义就是,使用“循环控制变量”来控制循环的次数(代码中是从1到100共100次),当这个控制变量的值超过结束值时则跳出这个循环而继续执行Next关键字后面的代码;其中“步长”决定每次循环控制变量的变化值,如在代码中我们使用的是1,在VB6中,1是步长的默认值,所以这里我们还可以省略步长,如For语句行我们可以简写成“For i = 1 To 100”。
“循环体代码”是在每次循环中都要执行一遍的一条或多条语句(如果没有语句也可以,但有什么意义呢),在本例中,它将会执行100次,即每次循环时都将已计算的值和当前循环到的i的值相加并保存在变量sum中。
循环完毕后,我们同样将结果转换成字符串并使用MsgBox函数显示出来。
在VB6中,除了For…Next循环语句以外,还有一种比较常用的循环语句就Do…Loop语句,下面我将显示使用这个语句是如何完成1到100的累加,你可以将代码放到一个新的按钮响应代码中:
Private Sub Command4_Click()
Dim i As Long
Dim sum As Long
sum = 0
i = 1
Do Until i > 100
sum = sum + i
i = i + 1
Loop
MsgBox CStr(sum)
End Sub
代码中,Do、Until、Loop是VB6中的关键字。我们可以看到在Until后面就是控制循环的条件,在这里我们可以理解为“直到i大于100后,循环将不再执行”,在循环体代码中,我们同样使用sum变量来累积计算相加的结果,而在每次循环后i都要增加1,这样就确保了循环在计算到100后就会停止,而继续执行Loop语句后面的代码。
在控制循环的条件时,我们使用了关键字Until,而在Do…Loop语句中还有一个关键字可以用来控制条件,那就是While,我们可以理解成是当这个条件满足时将执行循环体代码,如上例中的Do语句行可以写成“Do While i<=100”,即是当i小于或等100时将执行循环体内的代码。
另外,关于Until和While关键字,它们不但可以放到Do关键字的后面,而且还可以放在Loop关键字的后面,但这样会出现一点小小的不同,它的区别是:
当放在Do关键字后面时,程序会先进行条件的判断,如果满足则执行循环体代码,而如果在一开始条件就不满足,则循环体内的代码一次也不会执行;
当放在Loop关键字后面时,程序会在执行循环体代码后再进行条件的判断,也就是说循环体代码会最少执行一次。
对于Until和While关键字,在开发中可以根据实际需要灵活使用。
在VB6中,还有一个循环语句,就是While…Wend,它的格式就是:
While 条件
循环体代码
Wend
它的含义就是当条件满足时,则执行循环体代码,如计算1到100累加使用这个语句就可以写成:
Dim i As Long
Dim sum As Long
sum = 0
i = 1
While i <= 100
sum = sum + i
i = i + 1
Wend
MsgBox CStr(sum)
由于这个语句的功能完成可以使用Do…Loop语句来完成,所以在后面我们将只使用For…Next和Do…Loop两种循环结构的语句。
3 条件结构
为了演示条件结构的使用方法,我们将在Form1窗体上添加四个单选控件(OptionButton),分别为Option1、Option2、Option3和Option4,然后分别将它的Caption属性依次设为“加”、“减”、“乘”和“除”。
界面设计完成后,我们将Command1的原响应代码变为注释,然后编写如下代码(这里我只列出新的代码,在后面示例中所列出的代码也都采取此原则):
Private Sub Command1_Click()
Dim n1 As Currency
Dim n2 As Currency
Dim result As Currency
n1 = CCur(Text1.Text)
n2 = CCur(Text2.Text)
If Option1.Value = True Then
result = n1 + n2
ElseIf Option2.Value = True Then
result = n1 - n2
ElseIf Option3.Value = True Then
result = n1 * n2
ElseIf Option4.Value = True Then
result = n1 / n2
Else
MsgBox "没有选择计算方法!"
Exit Sub
End If
Text3.Text = CStr(result)
End Sub
运行程序,在Text1和Text2中分别输入数值,然后单击Command1看看有什么结果?
如果你没有选择运行方法,会出现一个提示;如果你选择了任一一个运行方法,在Text3中则会显示计算结果,在这里暂时请大家输入正确的数值,并且不在在Text2中输入“0”,因为当选择除法时,除数是不能为0的。
下面我们来看看代码中都有哪些新的知识。
首先,在代码中我们又看到了几个新的关键字,它们是If、Then、ElseIf和End If,这几个关键字就是这里的主角——条件结构语句的关键字。它的基本格式是:
If 条件1 Then
代码块1
[ElseIf 条件2 Then]
[代码块2]
……
[Else]
[代码块n]
End If
其中,使用中括号的部分为可选项,也就是在实际使用时可能没有的部分。If语句的含义就是,当条件1满足时将执行代码块1,完成后继续执行End If后面的代码;否则判断条件2(如果没当然就不同判断了),满足时执行代码块2,完成后执行End If后面的代码;依此类推,当判断完所有的ElseIf语句并且没有满足的条件时,程序会执行代码块n(没有则不执行),然后会继续执行End If语句后面的代码。
在上例的代码中,当没有选择运算符时,程序会给出提示后终止事件代码的执行并退出事件响应,这里使用了“Exit Sub”语句来退出所在的响应事件的子程序。关于这个子程序和事件之间的联系在这里就不详细说明了,在后面的学习中我们会慢慢了解这种机制。
这里使用的MsgBox函数,没有带一个变量或函数返回值做为参数,而是直接跟了一个字符串,我们可以看到,在VB6中字符串是要使用双引号包含起来的。
一个最简单的If语句会是以下形式:
If 条件 Then
[代码块]
End If
即,当条件满足时执行代码块。
在VB6中,还有一种条件语句,有时我们称其选择语句,它就是Select…Case语句,为了测试它,请在Form1窗口中添加一新的文本框Text4,然后在Command1的响应事件中编写如下代码:
Private Sub Command1_Click()
Dim n1 As Currency
Dim n2 As Currency
Dim result As Currency
n1 = CCur(Text1.Text)
n2 = CCur(Text2.Text)
Select Case Text4.Text
Case "+"
result = n1 + n2
Case "-"
result = n1 - n2
Case "*"
result = n1 * n2
Case "/"
result = n1 / n2
Case Else
MsgBox "没有输入正确的运行符!"
Text4.SetFocus
Exit Sub
End Select
Text3.Text = CStr(result)
End Sub
运行程序,然后不要忘了在Text1和Text2中分别输入一个数值,这时你可以在Text4中输入“+”、“-”、“*”、“/”或是其它字符,当然也可以空着,这时可以单击Command1按钮,看看运行的结果如何,和If语句相似,如果您输入的不是四则运算中的一个,则给出相应的提示,并使用Text4的SetFocus方法将输入的焦点设置到自己上面,然后退出所在的事件响应子程序。
从代码中,我们可以看到Select…Case语句的基本格式就是:
Select 变量
Case 值1
代码块1
[Case 值2]
[代码块2]
……
[Case Else]
[代码块n]
End Select
在这里,中括号中的内容也是可以省略的,其中Select、Case、Case Else、End Select为关键字,用于表示这种语句的结构。“变量”则为要判断值的变量标识符或一个表达式,然后每一个Case语句后面都是一个可能的值(这里是字符串,所以使用双引号包含起来,如果是数值则不需要双引号),当“变量”的值与Case后面的值相同时,则执行相应的代码块,然后继续执行End Select语句后面的代码;如果没有匹配的值,则执行Case Else后面的代码块n,如果没有则不执行,然后继续执行End Select后面的代码。
在实际应用中,Select…Case和If…Then…End If语句还是有区别的:
判断一个变量的多个值时,一般使用Select…Case语句;
要判断多个变量的值时,一般采用If…Then…End If语句。
下一章,我们将学习如何创建自己方法(自定义子程序和函数)。