学习目标
本章介绍了VB编程中最重要的部分——程序结构设计。在前面的知识中,编写的程序主要是依照从上到下,从左到右的顺序执行,称这种结构为顺序结构。而在实际的应用中,经常需要用到选择结构和循环结构来改变程序的执行方向。本章介绍了If选择结构、Select…Case选择结构、For…Next循环结构、While…Wend循环结构和Do…Loop循环结构。另外,还详细讲解VB中重要的数据结构类型——数组的概念及应用。本章列举了大量的实例,旨在加深对程序结构设计的理解,其中包括32个实例和1个项目。
实训项目
1.项目题目
设计程序:工资钱款分离器。
2.项目要求
编写一个发工资的程序,它可以根据键盘输入的职工总数和每个职工的实发工资数,计算出人民币各面额所需的张数,以达到人民币张数的最少选择方案,并将各面额人民币张数显示在各自相应的文本框中。
3.项目界面及其要求
(1)程序启动后界面如图4-1所示,打开一个输入框,在其中输入要发工资的总人数。

图4-1 输入职工人数
(2)单击【确定】按钮后,打开【工资钱款分离器】主窗口,如图4-2所示。在【员工总人数】框中显示出刚才输入的员工人数,并在下面显示【输入第1个人的工资】,其后面的文本框具有输入焦点,等待用户输入数据。

图4-2 【工资钱款分离器】主窗口
(3)在文本框中输入工资后,按一下回车键,数据存入【总金额】文本框中,而【输入第1个人的工资】自动变为【输入第2个人的工资】,继续在其后的文本框中输入工资,输入完后按回车键,则将第2个人的工资和前1个人的工资相加,显示在【总金额】文本框中,如图4-3所示。

图4-3 叠加总金额并继续输入员工工资
(4)依此类推,直到输完全部员工的工资,然后单击【统计】按钮,可在最下面的表示各面额的文本框中显示所需数量,如图4-4所示。

图4-4 计算各面额人民币的张数
在VB应用程序中,代码被组织成一个个的过程。当一个过程被激活时,通过过程中的代码,计算机将知道要做什么(处理对象)和怎么做(操作步骤)。因此,在具体解决问题时,应学会分析是针对哪个对象,响应了什么事件过程,完成什么具体操作。
VB虽然采用事件驱动方式调用相对划分得比较小的子过程,但是对于具体的过程本身,仍然要用到结构化程序的设计方法,用控制结构控制程序执行的流程。有些简单的程序可以用顺序流程来编写,但是为了处理复杂问题,则就要通过选择和循环结构来改变程序的执行顺序。依照结构化的算法编写的程序或程序单元(如过程),其结构清晰、易于理解、易于验证其正确性,也易于查错和排错。
结构化程序设计有顺序结构、选择结构和循环结构三种。在前面几章所涉及到的程序都属于顺序结构,本章主要介绍选择结构和循环结构。另外,还讲解了编程中经常用到的数据结构——数组的概念和应用。
选择结构是一种常用的主要基本结构,在日常生活和工作中,经常会根据实际情况的不同而选择对事情不同的处理方法。在设计程序时,也存在同样的问题,即根据不同的条件,来选择不同的程序处理方式。
选择结构的特点是:根据所给的条件的成立与否,决定从不同的分支中执行某一分支的相应操作。VB提供了多种形式的条件语句来实现选择结构,即对条件进行判断,并根据判断结果选择执行不同的分支。
单行条件语句比较简单,流程图如图4-5所示,其语法格式为:
If 条件 Then 语句组1 [Else 语句组2]
说明:
(1)条件表达式一般是关系表达式、逻辑表达式,也可以是算术表达式,表达式的值按非零和零转换成True或False。
(2)单行条件语句的执行过程为:判断(条件),若为真,则执行语句组1;否则执行Else后面的语句组2。
(3)如果没有Else语句,则语句组1为必要条件,在条件为真时执行;条件为假时,什么都不做,执行If语句下面的语句。

图4-5 单行结构If语句流程
【实例4.1】 任意输入一个数,判断其奇偶性。
新建一个窗体,在其中添加一个文本框、两个标签、两个命令按钮,各控件属性如图4-6所示。
打开代码编辑窗口,在其中输入如下代码:
Private Sub Command1_Click()
Dim n As Integer
n = Val(Text1.Text)
Label2.FontSize = 30 '设置判断结果中显示的字体大小为30
If n Mod 2 = 0 Then Label2.Caption = "偶数" Else Label2.Caption = "奇数"
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
程序运行后,在文本框中任意输入一个数,然后单击【判断】按钮,将显示该数的奇偶性,如图4-7所示。

图4-7 程序运行结果
【实例4.2】 输入一个数,并将其赋给变量n,当该数大于或等于零时,显示【整数或零】;当该数小于零时,则显示【负数】。
打开代码编辑窗口,在其中输入如下代码:
Private Sub Form_Click()
Dim n As Integer
n = Val(InputBox("请任意输入一个数", "测试数字", 0))
If n >= 0 Then Print "大于或等于零" Else Print "小于零"
End Sub
程序运行后,弹出输入框,输入一个数,根据判断条件,将结果显示在窗体上,如图4-8所示。

图4-8 程序运行结果
使用单行If语句,可以满足一些选择结构程序设计的需要,但是当Then或Else部分包含的内容较多时,在一行中就很难写下所有命令。这时,可以使用VB的块结构If语句,将一个选择结构分多行来写,流程如图4-9所示。

图4-9 块结构If语句流程
格式:
If 条件 Then
语句组1
Else
语句组2
End If
说明:
(1)在块结构中,If语句必须是第一行语句。If块必须以一个End If语句结束。
(2)当程序运行到If块时,首先对条件进行测试,如果为真,则执行Then之后的语句;如果为假,且有Else子句,则执行Else之后的语句。执行完后从End If之后的语句继续执行。
(3)Else子句是可选择的。
【实例4.3】 判断文本框中输入的是否是数值型数据。
新建一个窗体,在其中添加一个标签、一个文本框和两个命令按钮,界面如图4-10所示。
打开代码编辑窗口,在其中输入如下代码:
Private Sub command1_Click()
If IsNumeric(Text1) Then
MsgBox "是数字"
Else
MsgBox "不是数字"
End If
End Sub
程序运行后,在文本框中输入任意字符,然后单击【判断】按钮,将弹出消息框并显示判断结果,如图4-11所示。

图4-10 程序运行界面 图4-11 程序运行结果
【实例4.4】 已知两个数x和y,设计程序,比较它们的大小,并输出较大数。
新建一个窗体,界面如图4-12所示。打开代码编辑窗口,在其中输入如下代码:
Private Sub Command1_Click()
Dim x As Single, y As Single, t As Single
x = Val(Text1.Text)
y = Val(Text2.Text)
If x < y Then
t = x
x = y
y = t
End If
Label4.Caption = Str(x)
End Sub
程序运行后,分别输入x和y的值,单击【比较】按钮,则输出较大的数,如图4-13所示。

图4-12 程序设计界面 图4-13 程序运行界面
无论是单行还是块结构的If语句,都只有一个条件表达式,只能根据一个条件来判断程序执行的方向,最多只能有两个分支结构。如果程序稍复杂一些,需要有多个条件进行判断,那么这两种If语句结构就显得力不从心了。而VB提供了多分支的选择结构语句:If…Then…ElseIf和Select…Case语句,使用多分支结构语句可以满足多重条件判断的程序。
1.If…Then…ElseIf语句
If…Then…ElseIf的流程如图4-14所示。

图4-14 多分支结构If语句流程
格式:
If <条件1> Then
语句组1
ElseIf <条件2> Then
语句组2
……
[Else
语句组n+1]
End If
说明:
该语句的功能是根据各个表达式的值判断执行哪个语句块,判断的顺序为表达式1、表达式2……,即只有当表达式1为False时才判断表达式2,当表达式1和表达式2都为False时,才判断表达式3,这样,程序执行语句体n+1的条件为前n个表达式均为False。如果所有条件都不是True,则执行Else后面的语句。