选择结构是通过判断给定的条件,根据判断结果执行不同任务的一种程序结构。在实际的程序开发中,读者经常会遇到需要根据不同的条件进行不同处理的问题。这时就需要用选择结构进行程序结构设计来求解问题。例如,如果通过计算机来评定学生成绩是否优秀、良好、及格或不及格时,就必须将学生成绩与给定的评定标准进行对比,如果符合相应的标准则输出对应的等级评定,如图 3.4 所示。
图 3.4 学生成绩评定
Visual Basic 6.0 中提供了很丰富的选择结构语句,可以根据实际需要来选择不同的选择结构。本节主要介绍几种不同的选择结构语句。
If...Then语句根据表达式的值,当满足条件时执行包含的一组语句。If...Then语句的流程如图 3.5 所示,其语法有如下两种形式。语法 1 形式如下。
语法 2 形式如下。
If<表达式>Then[语句组 1]
参数说明如下所示。
●表达式:必需。表达式运算结果是进行条件判断的依据。如果表达式的结果为True,则执行语句组;如果表达式的结果为False,则不执行。
●语句组:可选。由一条或多条语句组成。
图 3.5 表示了If...Then语句的工作流程,程序首先通过菱形图框中的“条件”进行判断,如果符合条件则执行矩形框中的“语句组”,然后继续往下执行;如果不符合条件,说明输入的数据不符合条件,则直接往下执行。
图 3.5 If...Then语句流程
【范例 3-2】 用If...Then语句比较变量A与 100 大小,如果A小于 100 则输出“A小于100”,否则程序结束,代码如示例代码 3-2 所示。
示例代码 3-2
【运行结果】按下“F5”键运行程序,结果如图 3.6 所示。
图 3.6 运行结果
【代码解析】在该段代码中由于A的值为 99,在执行If语句时,通过表达式“A<100”进行判断,表达式的结果为True。所以执行包含的语句,在窗体上打印“A小于 100”。
提示
在刚开始使用If...Then语句时,大多数读者总是忘记在语句的结尾书写“EndIf”,这是一个初学者常犯的错误。读者可以在书写完If语句后,立刻书写EndIf语句。然后编写中间的语句块代码,这样可以有效地减少类似的错误发生。
If...Then…Else语句根据表达式的值,当满足条件时执行包含的一组语句,不满足条件时执行另外一组语句。If...Then…Else语句的流程如图 3.7 所示。
图 3.7 If...Then…Else语句流程
其语法有如下两种形式。语法 1 形式如下。
语法 2 形式如下。
If<表达式>Then[语句组 1]Else[语句组 2]
参数含义和If...Then语句的含义相同。
【范例 3-3】 用If…Then…Else语句进行变量A和B的大小比较,并输出比较结果,代码如示例代码 3-3 所示。
示例代码 3-3
【运行结果】按下“F5”键运行程序,结果如图 3.8 所示。
图 3.8 运行结果
【代码解析】在该段代码中A等于 90,B等于 100。在执行If语句时,表达式的结果为False。所以执行第二个语句组包含的语句,在窗体上打印“A<B”。看到这段代码,读者可能会想到,如果A等于B那代码应该输出什么结果呢?对于这个问题上述代码的确解决不了,将留到 3.2.3 节来解决。
If…Then…ElseIf语句用于多个条件判断的选择结构。可以将If…Then…ElseIf语句当成是If…Then…Else语句的扩展。读者如果需要判断多个条件,根据不同条件的结果来执行不同的数据处理任务时,可以选择使用If…Then…ElseIf语句来设计程序结构。其语法格式如下所示。
参数说明如下所示。
●表达式 1:必需。表达式 1 运算结果是进行条件判断的依据。
●语句组 1:可选。由一条或多条语句组成,表达式 1 的值为True时执行这个语句组。
●表达式 2:必需。表达式 2 运算结果是进行条件判断的依据。如果表达式 2 的结果为True,则执行语句组 2;表达式的结果为False,则判断下一表达式。
●语句组 2:可选。由一条或多条语句组成,表达式 2 的值为True时执行这个语句组。
●语句组n:可选。表达式 1 到表达式n-1 的值均为False时执行这个语句组。
【范例 3-4】 用If...Then…ElseIf…Else语句来解决范例 3-3 中遗留的问题。对于两个数值的比较会有三种情况,即A大于B;A小于B;A等于B。以下代码能够很好地解决两个数值比较的问题,代码如示例代码 3-4 所示。
示例代码 3-4
【运行结果】按下“F5”键运行程序,结果如图 3.9 所示。
图 3.9 运行结果
【代码解析】该段代码中赋值A等于 100,B等于 100。在执行If语句时,首先判断A>B表达式的结果为False,所以不执行第一个Print语句。接下来判断表达式A<B,结果为False,不执行第二个Print语句。由于前两个表达式的值均为False,所以执行第三个Print语句,在窗体上打印“A=B”。
提示
If…Then…ElseIf…Else语句可以解决多个条件判断的选择,但在代码中不建议读者采用过多的If…Then…ElseIf…Else语句。因为多个分支的If…Then…ElseIf…Else语句很容易造成程序结构的复杂化。
IIf函数的作用是根据表达式的值,返回所给出两个值其中的一个。IIf函数在一定的程度上能够简化程序结构,语法如下。
IIf(<表达式>,<值或表达式 1>,<值或表达式 2>)
参数说明如下所示。
●表达式:表达式结果是进行条件判断的依据。
●值或表达式 1:必需。如果表达式的结构为True,IIf函数返回值为值或表达式 1。
●值或表达式 2:必需。如果表达式的结构为False,IIf函数返回值为值或表达式 2。
【范例 3-5】 对于两个给定的数值,示例代码 3-5 演示了用IIf函数进行两个数值大小的比较。
示例代码 3-5
【运行结果】按下“F5”键运行程序,结果如图 3.10 所示。
图 3.10 运行结果
【代码解析】代码中的第 3 行通过使用IIf函数实现了两个数值比较大小的问题。由于 100 大于 99,所以IIf函数的返回值为表达式 1,也就是“100”。
【范例 3-6】 如用If…Then…Else语句实现上述代码的功能,代码编写如示例代码 3-6 所示。
示例代码 3-6
【运行结果】按下“F5”键运行程序,结果如图 3.11 所示。
图 3.11 运行结果
【代码解析】从上述两段代码中可以很清楚地看到,对于简单的选择结构,IIf函数在一定程度上要比使用If…Then…Else语句能够更加合理地简化程序结构。
If语句的嵌套是指If或者Else后面的语句组中包含有If语句,如图 3.12 所示。
图 3.12 If语句嵌套
这样可以形成分层的选择结构。If语句的嵌套语法如下所示。
参数说明同If语句一致。
【范例 3-7】 通过If语句嵌套求解一元二次方程ax 2 +bx+c=0 的根。
(1)分析:方程的解有以下几种可能。
●若a=0,不是二次方程。
●若b^2– 4*a*c=0,有两个相等实数根。
●若b^2– 4*a*c>0,有两个不等实数根。
●若b^2– 4*a*c<0,有两个共轭复数根。
(2)可以采用If语句的嵌套来求解。数据的输入用InputBox函数(该函数读者可以自己查阅MSDN)完成。
(3)代码编写如示例代码 3-7 所示。
示例代码 3-7
【运行结果】按下“F5”键运行程序,分别输入参数a=1、b=1、c=1。程序运行结果如图3.13 所示。
图 3.13 求解一元二次方程
【代码解析】代码中用了两层的If嵌套来解决方程根的问题。第一层If语句通过参数a的取值来判断所输入的参数是否为二次方程,如果不是则提示用户;如果是则进行第二层If语句。在第二层If语句中,根据根的判别式来判断方程根的情况,方程有两个相等的实数根;方程有两个不相等的实数根;方程有两个共轭复数根。然后通过不同的选择来进行根的计算。
提示
虽然If嵌套语句可以解决读者遇到的一些问题,但If语句嵌套会使程序结构变复杂,不利于程序的可读性和健壮性。此外,在用If语句嵌套时必须注意Else或EndIf与If语句的配对。
Select Case语句用于进行多分支选择结构。相对于用If…Then…ElseIf语句和If语句嵌套实现多分支选择结构,SelectCase语句显得更为直观清晰。Select Case语句流程如图 3.14 所示。
图 3.14 Select Case语句流程
Select Case语句语法如下所示。
Select Case<表达式>
[Case<值 1>
[<语句组 1>]]
...
[Case<值n-1>
[<语句组n-1>]]
[Case Else
[<语句组n>]]
End Select
参数说明如下所示。
●表达式:必需。用于条件判断。
●值n:条件入口参数。
●语句组n:可选。对应于值n所要执行的语句。
注意
对于Select Case语句的分支应该根据较为合理的分类而定,不要添加过多的分支。
【范例 3-8】 以下的程序输入一个星期值,显示出相应星期值的英文名称。这段代码能很好地说明Select Case语句的使用方法。程序代码如示例代码 3-8 所示。
示例代码 3-8
【运行结果】按下“F5”键运行程序,弹出“请输入星期”对话框,在输入文本框中输入 5,单击“确定”按钮,即可在窗体上看到输出结果为“Friday”,结果如图 3.15 所示。
图 3.15 运行结果
【代码解析】代码接收输入的星期数,以inWeek参数为条件通过Select Case语句将对应的星期英文单词输出到窗体上,从而实现了多分支结构。
Is、To关键字与Select Case语句可以配合使用。Is和To关键字用在Case语句后,用来表示值的范围。以下的两个实例分别用Is和To关键字来完成学生成绩的评价。Is关键字与关系运算符配合使用,用来表示取值的一个条件,语法如下。
Is<表达式>
【范例 3-9】 对于学生的成绩,可以按照优秀、良好、中等及及格来划分。以下代码用Is语句完成学生成绩评价,代码如示例代码 3-9 所示。
示例代码 3-9
【运行结果】按下“F5”键运行程序,在弹出的对话框中输入“84”,结果如图 3.16 所示。
图 3.16 运行结果
【代码解析】在该段代码中首先接收成绩输入,然后通过SelectCase语句和Is关键字进行判断,对于大于等于 90 分判定为优秀;对于大于等于 80分但低于 90 分的判定为良好;对于大于等于 70 分但低于 80 分的成绩判定为中等;对于大于等于 60 分但低于 70 分的成绩判定为及格;如果成绩小于 60 分判定为不及格。
To关键字用来指定取值的范围,语法如下。
<表达式>To<表达式>
【范例 3-10】 用To语句完成学生成绩评价,程序代码如示例代码 3-10 所示。
示例代码 3-10
【运行结果】按下“F5”键运行程序,在弹出的对话框中输入“77”,结果如图 3.17 所示。
图 3.17 运行结果
【代码解析】在该段代码中首先接收成绩输入,然后通过Select Case语句和To关键字进行判断。To关键字后的条件直接可以表示为数值的范围,例如代码第 9 行所示的。对于在 90 分到 100 分之间的成绩,可以直接表示为“90 To 100”。
提示
以上两段代码的结果是相同的,但读者应该仔细体会Is、To这两个关键字的区别。一定要注意,Is关键字表示的是一个条件,而To关键字表示的是一个范围。