第 7章 选择结构本章的学习要点
If语句的分类
If?Then 结构
If?Then?Else 结构
多分支 If结构,If?Then?ElseIf 和 If嵌套语句
Select Case结构
7.1 If语句
If语句可以分为如下几类:
If语句
If… Then结构
IIf函数多分支 If结构
If… Then… ElseIf结构
If嵌套
If… Then… Else结构
If语句
If?Then 结构
语法格式:
功能,如果表达式的值为真( True),执行 Then后的语句块内容;否则不执行语句块内容。
说明:
– 表达式可以是,关系表达式,逻辑表达式,算术表达式 。若为算术表达式,值为 0则为假,非 0则为真。
– 如果是单行 If格式,所有的代码必须写在同一行中,绝对不能换行。如果是块 If语句,各语句块必须独占一行,End If不能省略。
– 语句块若是一条语句,可用单行 If结构;为多条语句,则采用块
If结构较好。当然也可以采用单行 If格式,这时各语句必须在同一行中且用 ","分隔,且不能出现 End If。
If 表达式 Then
语句块
End IfIf 表达式 Then 语句块
7.1 If语句
例 7.1 输入两个数,输出较大的数。
分析:
本题由用户输入两个数,经计算机判断后将较大数输出,即有两个输入量和一个输出量。所以需要两个文本框接受用户输入,可以采用标签框来实现数据的输出。
界面设计:
7.1 If语句
例 7.1 输入两个数,输出较大的数。
属性设置:
对象 属性 属性值
Label Name Label1Caption 请输入数 1:
Label Name Label2Caption 请输入数 2:
Label
Name Label3
Caption 空白
BackColor 粉红色
TextBox Name Text1Text 空白
TextBox Name Text2Text 空白
CommandButton Name Command1Caption 较大值
CommandButton Name Command2Caption 退 出
7.1 If语句
例 7.1 输入两个数,输出较大的数。
编写代码:
Private Sub Command1_Click()
Dim max As Single
Dim min As Single
max = Val(Text1.Text)
min = Val(Text2.Text)
If max < min Then
max = min
End If
Label3.Caption = "较大值为 " & max
End Sub
F
T
max=min
max<min?
开始
dim max as single
dim min as single
max=val(text1.text)
min=val(text2.text)
结束
Label3.Caption = "较大值为 " & max注意:
块 if语句中的 end if能否省略?
i ax s Single
Dim min As Single
max = Val(Text1.Text)
min = Val(Text2.Text)
If max < min Then
max = min
Label3.Caption = "较大值为 " & max
块 语句中的 能否省略?
将块 if语句改为单行 if语句怎么改?
If max < min Then max = min
7.1 If语句
If语句
If?Then?Else 结构
语法格式,
功能,该结构用于解决 "二选一 "的问题。当表达式的值为真,执行语句块 1的语句内容;否则执行语句块 2的语句内容 。
说明,
– 表达式最终的值必须为逻辑值,即取值为真或假。
– 若语句块 1和语句块 2都是单条语句,可采用单行 If格式,否则采用块 If语句。
– 跟 If?Then 不同,该结构中即使表达式值为假,也有语句块 2的内容可被执行。
If 表达式 Then
语句块 1
Else
语句块 2
End If
If 表达式 Then 语句块 1 Else 语句块 2
7.1 If语句
例 7.2 编写一个程序,实现当用户输入的用户名和口令都正确时显示 "欢迎登录 "的消息对话框,当用户名或口令有错误时显示消息对话框报告错误。
分析:
本题需要两个文本框分别保存用户输入的用户名和口令,一个 "登录 "按钮,一个 "退出 "按钮。当输入的用户名和口令与正确的相符时显示 "合法用户 ",当不相符时显示 "非法用户 ",所以应当采用 If?Then?Else 结构来实现。
界面设计:
7.1 If语句
7.1 If语句
例 7.2 编写一个程序,实现当用户输入的用户名和口令都正确时显示 "欢迎登录 "的消息对话框,当用户名或口令有错误时显示消息对话框报告错误。
编写代码:
Private Sub Command1_Click()
Dim user As String
Dim psw As String
user = Text1.Text
psw = Text2.Text
End Sub
T F用户名和口令正确吗?
显示 "欢迎 "
消息框显示 "错误 "
消息框
If user ="SYL" And psw = "123456" Then
MsgBox ("欢迎您登录本系统! ")
Else
MsgBox ("您的用户名或口令有误,请重新输入! ")
End If
If语句
IIf函数
语法格式:
功能:当条件为真( True),该函数返回表达式 1的值,否则返回表达式 2的值。其中,函数的三个参数都是必须的,不可省略 。
说明:
– 在使用 IIf函数时,必须将其返回值赋值给一个变量,不可以单独调用。如上面的代码不可以写成,IIf(x = 1,“Yes”,
“No”),需为,a = IIf(x = 1,“Yes”,“No”),或作为其他函数的参数。
– 在使用 IIf函数时,第 2和第 3个参数必须只能为一条语句,而且必须是有返回值的,这是 IIf函数跟 If?Then?Else 结构的不同之处。
IIf(条件,表达式 1,表达式 2)
If user ="SYL" And psw = "123456" Then
MsgBox ("正确 ! ")
Else
MsgBox ("错误 ! ")
End If
MsgBox IIf(user = "SYL" And psw = "123456","正确 ! ","错误! ")
IIf(user = "SYL" And psw = "123456",MsgBox("正确! "),MsgBox("错误! "))
这样写对吗?
7.1 If语句
7.1 If语句
If语句
多分支 If结构
语法格式:
执行过程:如表达式 1为真则执行语句块 1;否则测试表达式 2的值,为真则执行语句块 2;依次类推至找到一个值为真的表达式则执行相应的语句块;若都不为真时,执行 Else后语句块内容 。
说明:
– 表达式最终的值必须为逻辑型,即取值是真或者是假;
– 如果要产生 n个分支,则需要 n-1个测试表达式;
– 此结构不能转换成单行 If格式 。
If 表达式 1 Then
语句块 1
ElseIf 表达式 2 Then
语句块 2
[ElseIf 表达式 3 Then
语句块 3]

[Else
语句块 n]
End If
例 7.4 编写一个程序,根据用户输入的某个学生的成绩评出优、良好、中等、及格和不及个五个等级。判断标准如下:
等级不及格 score<60
及格 60≤score<70
中等 70≤score<80
良好 80≤score<90
优 score≥90
7.1 If语句
例 7.4 编写一个程序,根据用户输入的某个学生的成绩评出优、良好、中等、及格和不及个五个等级。
分析:
本题要解决的问题是根据输入学生的成绩来判断该学生的成绩等级。有一个输入量(学生的成绩)和一个输出量(判断结果),所以用一个文本框来接受用户输入,
一个文本框来进行输出。再添加一个 "判断 "按钮,和一个 "退出 "按钮。
界面设计:
7.1 If语句
编写代码:
Private Sub Command1_Click()
Dim score As Single
Dim s As String
score = Val(Text1.Text)
End Sub
T
If score < 60 Then
s = "不及格 "
ElseIf score < 70 Then
s = "及格 "
ElseIf score < 80 Then
s = "中等 "
ElseIf score < 90 Then
s = "良好 "
Else
s = "优 "
End If
Text2.Text = s
7.1 If语句
例 7.5:学校对学习成绩优良的同学给予奖励,只要满足以下条件之一就可以获得奖励:
所考语文、数学和英语总分在 285以上;
每门课的成绩都在 90分以上;
语文和数学的成绩为 100分,英语在 80分以上。
界面设计:
7.1 If语句
例 7.5:学校对学习成绩优良的同学给予奖励。
编写代码:
Private Sub Command1_Click()
Dim a As Single,b As Single,c As Single
a = Val(Text1.Text):b = Val(Text2.Text):c = Val(Text3.Text)
If a + b + c >= 285 Then
Label4.Caption = "可以获奖! "
ElseIf a >= 90 And b >= 90 And c >= 90 Then
Label4.Caption = "可以获奖! "
ElseIf a = 100 And b = 100 And c >= 80 Then
Label4.Caption = "可以获奖! "
Else
Label4.Caption = "不可获奖! "
End If
End Sub
T
能改成下面的代码吗?
If a + b + c >= 285 or a >= 90 And b >= 90 And c >= 90 or _
a = 100 And b = 100 And c >= 80 Then
Label4.Caption = "不可获奖! "
End If
7.1 If语句
7.1 If语句
If语句
If嵌套,所谓 If嵌套,是指在 If的 Then或者 Else语句块中还可以嵌套 If结构,以达到多分支的目的。
语法格式,If 表达式 1 Then
语句块 1
If 表达式 2 Then
语句块 2
Else
语句块 3
End If
Else
语句块 4
if 表达式 3 Then
语句块 5
Else
语句块 6
End If
End If
例 7.7:编写一个程序,让用户输入三个数判并断该三个数能否组成一个直角三角形。
分析:
本题根据用户输入的三个数,判断它们能否组成一个直角三角形。程序中有三个输入量(即输入的三个数)和一个输出量(即能否组成一个直角三角形)。
故可以用三个文本框来接受用户输入的三个数,一个标签框来显示判断结果。
界面设计:
7.1 If语句
例 7.7:编写一个程序,让用户输入三个数判并断该三个数能否组成一个直角三角形。
编写代码:
Private Sub Command1_Click()
Dim a,b,c As Single
a = Val(Text1.Text),b = Val(Text2.Text),c = Val(Text3.Text)
End Sub
T
T
三角形?
F
T
直角三角形?
F 输出判断结果输出判断结果 输出判断结果
a + b > c And a + c > b And b + c > a
Label4,Caption= " "a ^ 2 = b ^ 2 + c ^ 2 Or b ^ 2 = a ^ 2 + c ^ 2 Or c ^ 2 = a ^ 2 + b ^ 2
Label4,Caption= " " Label4,Caption= " "
If a + b > c And a + c > b And b + c > a Then
If a ^ 2 = b ^ 2 + c ^ 2 Or b ^ 2 = a ^ 2 + c ^ 2 Or c ^ 2 = a ^ 2 + b ^ 2 Then
Label4,Caption= "可以构造一个直角三角形 "
Else
Label4,Caption= "可以构造一个非直角三角形 "
End If
Else
Label4,Caption= "不可以构造一个三角形 "
End If
7.1 If语句
7.2 Select Case语句
Select Case语句
Select Case语句同样可以解决多分支问题,但与 If嵌套结构不同在于这种结构中只有一个用于判断的测试表达式,根据此表达式产生的不同计算结果执行不同分支的语句块内容,其语法格式为:
功能:在同一个测试条件上可以有多个分支并列,根据测试表达式的不同计算结果来执行不同的分支。当测试值处于表达式列表 1范围时,则执行语句块 1并退出 Select Case语句;当其值处于表达式列表 2范围时,则执行语句块 2并退出 Select
Case语句; 。若其值跟所有的表达式列表表示的值都不匹配时则执行 Case Else对应的语句块 n并退出 Select Case语句。
Select Case 测试表达式
Case 表达式列表 1
语句块 1
[Case 表达式列表 2
语句块 2]

[Case Else
语句块 n]
End Select
注意:
测试表达式可以是数学表达式、字符串表达式、逻辑表达式或混合表达式。
Case子句后的表达式列表可是以下几种格式:
表达式 1,表达式 2,,表达式 n
表达式 1 to 表达式 2
Is 表达式
还可以是上述三种格式的结合
当表达式结果与多个 Case表达式列表的值匹配时,则只执行第一个匹配的 Case语句对应的语句块。
Case Else子句必须放在全部 Case子句语句后面。当表达式的值与前面所有 Case语句均不匹配时,才执行 Case Else子句部分。
这个子句可以省略。
Case 2,4,6,8,"VB ","程序设计 "
Case 60 to 100 Case "a" to "z"
Case is<60 Case is>=60 and is<=100(错误)
Case 2,4,6,8,10 to 15,is>100
例 7.11 邮局向国外寄包裹的收费计算如下:当包裹重量不超过 15克时收费 5元;当包裹重量为 15克至 30克时收费 9
元;当包裹重量为 30至 45克时收费 12元;当包裹重量为 45
克至 60克时收费 14元;当包裹重量为 60克至 75克时收费 16
元;当包裹重量超过 75克时收费 20元。请编写一个程序根据包裹重量计算邮费。
分析:
本题根据包裹的重量来计算包裹的邮寄费。一个输入量为包裹重量,一个输出量为邮寄费。所以用一个文本框接收输入量,一个文本框作为输出,一个按钮实现“计算”功能,
一个按钮实现“退出”功能。
界面设计:
7.2 Select Case语句
7.2 Select Case语句
编写代码,IF语句实现
Private Sub Command1_Click()
Dim a As Single,b As Integer
a = Val(Text1.Text)
If a <= 15 Then
b = 5
ElseIf a <= 30 Then
b = 9
ElseIf a <= 45 Then
b = 12
ElseIf a <= 60 Then
b = 14
ElseIf a <= 75 Then
b = 16
Else
b = 20
End If
Text2.Text = b
End Sub
7.2 Select Case语句
编写代码:
Private Sub Command1_Click( )
Dim a as Single,b as
Integer
a = Val(Text1.text)
Select Case a
Case Is <= 15
b = 5
Case Is <= 30
b = 9
Case 30 to 45
b = 12
Case 45 to 60
b = 14
Case 60 to 75
b = 14
Case Else
b = 20
End Select
Text2.text = b
End Sub
例 7.12 航空公司规定在旅游的旺季 7~ 9月份,如果订票数超过 20张,票价优惠 15%,20张以下,优惠 5%;在旅游的淡季 1~
5月份,10月份,11月份,如果订票数超过 20张,票价优惠 30%,
20张以下,优惠 20%;其他情况一律优惠 10%。设计程序,根据月份和订票张数来计算总的订票金额,假设每张飞机票单价为
600元。
分析:
本题根据订票的月份和张数来计算订票的总金额。所以用两个输入量即“月份”和“订票张数”,一个输出量即“总金额”。而第一个输入量“月份”是一个固定值,取值范围在 1~
12月,所以可以用一个组合框将 12月全部列出来供用户选择比较好。故用一个组合框来接收“月份”输入量,一个文本框来接收“订票张数”的输入量,一个文本框用来显示“总金额”
输出量。
界面设计:
7.2 Select Case语句
7.2 Select Case语句
编写代码:
Private Sub Form_Load( )
Combo1.AddItem "1月 "
Combo1.AddItem "2月 "
Combo1.AddItem "3月 "
Combo1.AddItem "4月 "
Combo1.AddItem "5月 "
Combo1.AddItem "6月 "
Combo1.AddItem "7月 "
Combo1.AddItem "8月 "
Combo1.AddItem "9月 "
Combo1.AddItem "10月 "
Combo1.AddItem "11月 "
Combo1.AddItem "12月 "
End Sub
Private Sub Command1_Click()
Dim num As Integer,rate As Single
num = Val(Text1.Text)
’ 计算每张票享受的折扣 rate!
Text2.Text = rate * num * 600
End Sub
Select Case Combo1.ListIndex
Case 6 To 8
If num < 20 Then
rate = 0.95
Else
rate = 0.85
End If
Case 9,10,0 To 4
If num < 20 Then
rate = 0.8
Else
rate = 0.7
End If
Case Else
rate = 0.9
End Select
其他月份 T
订票 <20
rate=0.95 rate= 0.85
F 订票 <20
rate=0.8 rate=0.7
F
rate=0.9
T
月份
7

9

1

5

10

11

例 7.13 输入方程的三个系数 A,B和 C,求方程 Ax2+Bx+C=0的解。
界面设计:
7.2 Select Case语句
7,2 Select Case语句
编写代码:
Private Sub Command1_Click ( )
Dim a As Single,b As Single,c As Single
End Sub
方程根的分类显示数据不合法输入合法性 FT
一次方程? FT
输出结果
Δ>0 Δ=0 Δ<0
输出结果 输出结果 输出结果
If IsNumeric(Text1.Text) And IsNumeric(Text2.Text) And _
IsNumeric(Text3.Text) Then
a = Val(Text1.Text)
b = Val(Text2.Text)
c = Val(Text3.Text)
If a = 0 Then
Label4.Caption = "一次方程只有 1个实根 "
Label5.Caption = "x1=" & -c / b
Else
Select Case b ^ 2 - 4 * a * c
Case Is > 0
Label4.Caption = "x1=" & (-b + Sqr(b ^ 2 - 4 * a * c)) / (2 * a)
Label5.Caption = "x2=" & (-b - Sqr(b ^ 2 - 4 * a * c)) / (2 * a)
Case Is = 0
Label4.Caption = "二次方程有 2个实根 "
Label5.Caption = "x1,x2=" & -b / (2 * a)
Case Is < 0
Label4.Caption = "二次方程没有实根 "
End Select
End If
Else
MsgBox ("你输入的数据无效,请重新输入! ")
End If