Transcript Document

第5章
选择结构设计
本章主要内容:
● 条件表达式
● 单条件选择语句
● 多条件选择语句
● 计时器控件
● 单选钮和复选框控件
5.1
条件表达式
在条件语句中作为判断依据的表达式称为“条件表达
式 ” , 条 件 表 达 式 的 取 值 为 布 尔 值 : 真 ( True ) 或 假
(False)。在VB表达式中,True的值等于–1,False的值
等于0。
根据“条件”的简单或复杂程度,条件表达式可以分为
两类:关系表达式与布尔表达式。
5.1.1
关系运算符与关系表达式
1. 关系运算符
关系运算符的作用是对两个表达式的值进行比较,若关
系成立,则返回True,否则返回False。VB提供了6种关系
运算符,见表5-1。
表5-1
运算符
名
称
关系运算符
例
子
说
明
<
小于
"12" < 56
值为:True,强制转换为数值型
<=
小于或等于
5 <= 5
值为:True
>
大于
1 > (2 > 1)
值为:True,强制转换为数值型
>=
大于或等于
"aa" >= "ab"
值为:False
=
等于
1 = True
<>
不等于
"abc" <> "ABC"
值为:False,强制转换为数值
型
值为:True
说明:
① 关系运算符两侧可以是数值表达式、字符型表达式
或日期型表达式,也可以是作为表达式特例的常量、变量
或函数。但其两侧的数据类型必须完全一致。
② 关系运算符的运算级别相同。
2. 关系表达式
关系表达式是指用关系运算符将两个表达式连接起来的
式子(例如2 * 3 > 2 + 3),关系表达式的格式为:
〈表达式1〉 〈关系运算符〉 〈表达式2〉
说明:
① 关系表达式的运算次序为:先分别求出关系运算符两
侧表达式的值,然后再把二者进行比较,二者的关系若与
关系运算符指示的一样,则关系运算的结果为真True,否
则为假False。
② 数值型数据按其数值大小进行比较。
③ 日期型数据将日期看成“yyyymmdd”的8位整数,按
数值大小比较。
④ 字符型数据按其ASCII码值进行比较。在比较两个字
符串时,首先比较两个字符串的第一个字符,其中ASCII
码值较大的字符所在的字符串大。如果第一个字符相同,
则比较第二个,…,依此类推。
常见字符值的大小如下:
"空格" < "0" < … < "9" < "A" < … < "Z" < "a" < … <
"z" < "任何汉字"
⑤ 不要对单精度数或双精度数进行等于“=”比较,例如:
1.0/3.0*3.0=1.0
在数学上该表达式为恒等式。但由于计算机运算时的浮
点误差,将造成不相等。
⑥ 数学不等式2≤x≤3,在VB中不能写成2<=x<=3。
5.1.2
布尔运算符与布尔表达式
布尔表达式是指用布尔运算符连接若干关系表达式或布
尔值而组成的式子。如不等式2≤x≤3可以表示为2 <= x And
x <= 3。布尔表达式的值也是一个布尔值。
常用的布尔运算符有:And、Or、Not等3种,见表5-2。
表5-2 布尔运算符
运算符
名 称
例 子
说
明
And
与
(2 > 3) And
(1 < 2)
值为False,两个表达式的值均为真,结果才为真,
否则为假
Or
或
(2 > 3) Or (1
< 2)
值为True,两个表达式中只要有一个值为真,结果
就为真,只有两个表达式的值均为假,结果才为假
Not
非
Not (1 > 0)
值为False,由真变假或由假变真,进行取“反”操
作
说明:
① 布尔运算符两侧若有数值数据出现,则将数值数据转换为二进制
数(补码形式)进行按位运算。此时,1为真,0为假。
② 布尔运算真值表见表5-3。
表5-3
a
b
布尔运算真值表
a And b
a Or b
Not a
True
True
True
True
False
True
False
False
True
False
False
True
False
True
True
False
False
False
False
True
例如:
1 +2 > 4 And 6 < 2
' 结果为:False
Not 3 < 2 And 2 * 3 = 3 + 3
' 结果为:True
2 >= 2 Or 3 * 2 <> 5
' 结果为:True
关系表达式绝不能比较布尔型数据!例如,假设Yn为
布尔型变量,下面写法是错误的:
Yn = True
5.1.3
运算符的优先顺序
在一个表达式中进行多种操作时,VB会按一定的顺序进
行求值,称这个顺序为运算符的优先顺序。
运算符的优先顺序见表5-4。
表5-4 运算符的优先顺序
优 先 顺 序
1
运 算 符
算术运算符
^(指数运算)
2
–(负数)
3
*、/(乘法和除法)
4
\(整数除法)
5
Mod(求模运算)
6
+、–(加法和减法)
字符串运算符
&(字符串连接)
7
关系运算符
=、<>、<、>、<=、>=
8
布尔运算符
Not
9
And
10
Or
说明:
① 同级运算按照从左到右出现的顺序进行计算。
② 可以用括号改变优先顺序,强制表达式的某些部分优先运行。
③ 括号内的运算总是优先于括号外的运算,在括号之内,运算符
的优先顺序不变。
【例5-1】写出VB表达式2 + 3 > 1 + 4 And Not 6 < 8的值。
在计算前,先要看清表达式中有哪些运算符,根据运
算符的优先级进行计算。本例中应按下面的步骤进行计
算:
① 算术运算:
5 > 5 And Not 6 < 8
② 关系运算:
False And Not True
③ 非运算:
False And False
④ 结果:
False
【例5-2】根据下列所给条件,写出VB布尔表达式:
① 一元二次方程ax2 + bx + c = 0有实根的条件为:a≠ 0,并且b2 - 4ac ≥ 0。
② 闰年的条件是:年号(year)能被4整除,但不能被100整除;或者能
被400整除。
分析:
① 一元二次方程ax2 + bx + c = 0有实根的条件有两个,即a≠ 0和b2 - 4ac ≥
0。
a≠ 0用VB表达式表示为a <> 0;b2 - 4ac ≥ 0用VB表达式表示为b^2 – 4 * a
* c >= 0。
两者是逻辑与And的关系,用And连接上面的两个式子,结果为:
a <> 0 And b^2 – 4 * a * c >= 0
② 设变量y表示年份,被某个数整除,可以用数值运算符Mod或Int()函数
来实现。
能被4整除,但不能被100整除的表达式为y Mod 4 = 0 And y Mod 100 <> 0;
能被400整除的表达式为y Mod 400 = 0。
两者取“或”,即可得出判断闰年的布尔表达式:
(y Mod 4 = 0 And y Mod 100 <> 0) Or (y Mod 400 = 0)
用Int()函数表示为:
(Int(y/4) = y/4 And Int(y/100) <> y/100) Or (Int(y/400) =y/400)
5.2
单条件选择语句If
5.2.1
单行结构条件语句If…Then…Else
单行条件语句比较简单,其语法格式为:
If 〈条件〉 Then [〈语句1〉] [ Else 〈语句2〉]
说明:
①〈条件〉可以是关系表达式、布尔表达式或数值表达
式。如果以数值表达式作条件,则非0值为真,0为假。
② 如果没有Else子句,〈语句1〉为必要参数,在〈条件〉
为True时执行。
【例5-3】
【例5-4】
5.2.2 使用IIf函数
IIf函数的语法结构为:
IIf(〈条件表达式〉,〈真部分〉,〈假部分〉)
说明:
①〈条件表达式〉可以是关系表达式、布尔表达式、数值
表达式。如果用数值表达式作条件,则非0为真,0为假。
②〈真部分〉是当条件表达式为真时函数返回的值,可以
是任何表达式。
③〈假部分〉是当条件表达式为假时函数返回的值,可以
是任何表达式。
④ 语句y = IIf(〈条件表达式〉,〈真部分〉,〈假部分〉) 相
当于:
If 〈条件表达式〉 then y=〈真部分〉 Else y=〈假部分〉
⑤ 执行IIf函数时,先分别计算真部分和假部分的值,然
后根据条件输出结果。例如,
y = IIf(x >= 0, Sqr(Abs(x)) , –x)
5.2.3 块结构条件语句If…Then…Else…End If
块If语句又称为多行If语句,其语法结构为:
If 〈条件〉 Then
[语句组1]
[Else
[语句组2]]
End If
说明:
① 在块形式中,If语句必须是第一行语句。If块必须以一个
End If语句结束。
② 当程序运行到If块时,首先测试〈条件〉。如果〈条件〉
为True,则执行Then之后的〈语句组1〉。如果〈条件〉为
False,并且有Else子句,则程序会执行Else部分的〈语句组2〉
。而在执行完Then或Else之后的语句列后,会从End If之后的
语句继续执行。
③ Else子句是可选的。
【例5-5】将例5-3中命令按钮Command1的单击(Click)
事件代码改为多行If语句:
Private Sub Command1_Click()
Dim x As Single, y As Single
x = Val(Text1.Text)
If x >= 0 Then
y = Sqr(x)
Else
y = -x
End If
Text2.Text = y
Text2.Locked = True
End Sub
【例5-6】将例5-4中命令按钮Command1的单击(Click)
事件代码改为多行If语句:
Private Sub Command1_Click()
Dim x As Single, y As Single
x = Val(Text1.Text)
y = Val(Text2.Text)
If x < y Then
Label3.Caption = "较大数为" & Str(y)
Else
Label3.Caption = "较大数为" & Str(x)
End If
End Sub
5.2.4
If语句的嵌套
1. If语句的嵌套
If语句的嵌套是指If或Else后面的语句块中又包含If语句。
语句形式如下:
If 〈条件1〉 Then
If 〈条件2〉 Then
…
End If
…
End If
【例5-7】
【例5-8】
2. If语句的嵌套格式ElseIf
ElseIf的块If语句语法结构为:
If 〈条件1〉 Then
[语句组1]
ElseIf 〈条件2〉 Then
[语句组2]
...
[Else
[其他语句组]]
End If
说明:
(1) 在If块中,Else和ElseIf子句都是可选的。可以放置任
意多个ElseIf子句,但是都必须在Else子句之前。
(2) 当程序运行到If块时,将测试〈条件1〉。如果条件为
True,则执行Then之后的语句。如果条件为False,则每个
ElseIf部分的条件式(如果有的话)会依次计算并加以测试
。如果找到某个为True的条件时,则其紧接在相关的Then
之后的语句组会被执行。如果没有一个ElseIf条件为True(
或是根本就没有ElseIf子句),则程序会执行Else部分的其
他语句组。而在执行完Then或Else之后的语句组后,会从
End If之后的语句继续执行。
【例5-9】在例5-8中使用带ElseIf的块If语句来计算出优惠
价,只需将其中命令按钮Command1的单击(Click)事件
代码改为:
Private Sub Command1_Click()
Dim x As Single, y As Single
x = Val(Text1.Text)
If x < 1000 Then
y=x
ElseIf x < 2000 Then
y = 0.95 * x
ElseIf x < 3000 Then
y = 0.9 * x
ElseIf x < 5000 Then
y = 0.85 * x
Else
y = 0.8 * x
End If
Text2.Text = y
Text2.Locked = True
End Sub
【例5-10】
' 不打折
' 九五折
' 九折
' 八五折
' 八折
5.3
多分支选择语句Select Case
Select Case语句的语法格式为:
Select Case 〈测试条件〉
[Case 〈表达式表1〉
[〈语句组1〉]]
[Case 〈表达式表2〉
[〈语句组2〉]]
...
[Case Else
[〈其他语句组〉]]
End Select
说明:
(1)〈测试条件〉为必选参数,是任何数值表达式或字符
串表达式。
(2) 在Case子句中,〈表达式表〉用来测试其中是否有值
与〈测试条件〉相匹配。Case子句中的〈表达式表〉是一
个或多个表5-5所示形式的表达式列表。
表5-5
形
式
示
例
表达式的形式
说
明
表达式
Case 2 * a
数值或字符串表达式
表 达 式 To
表达式
Case 1 To 9
Case "a" To "p"
用来指定一个值范围,较小的值要放在To之
前
Is 关系运算
表达式
Case Is < 10
可以配合比较运算符来指定一个数值范围。
如果没有提供,则Is关键字会被自动插入
当使用多个表达式的列表时,表达式与表达式之间要用逗
号“,”隔开。
(3)〈语句组〉为可选参数,是一条或多条语句,当
〈表达式表〉中有值与〈测试条件〉相匹配时执行。
(4) Case Else子句用于指明其他语句列,当〈测试条
件〉和所有的Case子句〈表达式表〉中的值都不匹配时,
则会执行这些语句。虽然不是必要的,但是在Select Case
区块中,最好还是加上Case Else语句来处理不可预见的测
试条件值。如果没有Case值匹配测试条件,而且也没有
Case Else语句,则程序会从End Select之后的语句继续执
行。
【例5-11】在例5-8中使用Select Case语句来计算优惠价,
只需将其中命令按钮Command1的单击(Click)事件代码改
为:
Private Sub Command1_Click()
Dim x As Single, y As Single
x = Val(Text1.Text)
Select Case x
Case Is < 1000
y=x
Case Is < 2000
y = 0.95 * x
Case Is < 3000
y = 0.9 * x
Case Is < 5000
y = 0.85 * x
Case Else
y = 0.8 * x
End Select
Text2.Text = y
Text2.Locked = True
End Sub
在Case子句中使用多个表达式时,所列表达式的形式可以不相同,
既可以使用值,又可以使用条件或范围,还可以混合使用。
【例5-12】将例5-10用Select语句编制命令按钮代码。
Private Sub Command1_Click()
Static i As Integer
' 声明静态变量i为整型数
i=i+1
Mytext1 = "床前明月光,"
Mytext2 = Mytext1 + Chr(13) + " 疑是地上霜。"
Mytext3 = Mytext2 + Chr(13) + " 举头望明月,"
Mytext4 = Mytext3 + Chr(13) + " 低头思故乡。"
Select Case i
Case 1
Label2.Caption = Mytext1
Case 2
Label2.Caption = Mytext2
Case 3
Label2.Caption = Mytext3
Case 4
Label2.Caption = Mytext4
i=0
End Select
End Sub
5.4
计时器控件
计时器控件的主要属性见表5-6。
表5-6
属
Timer控件的属性
性
说
明
Enabled
该属性为True时,定时器开始工作,为False时暂停
Interval
该属性用来设置定时器触发的周期(以毫秒计)取值范围为0~64767
【例5-13】
5.5
5.5.1
单选钮和复选框控件
单选钮控件
1. 单选钮的主要属性
单选钮的主要属性,见表5-8。
表5-8
基本属性
Alignment
Value
Style
单选钮的主要属性
属 性 值
说
明
0
单选钮在左边,标题显示在右边,缺省设置
1
单选钮在右边,标题显示在左边
True
单选钮被选定
False
单选钮未被选定,缺省设置
0—Standard
标准方式
1—Graphical
图形方式
说明:
① 如果想使某个按钮成为单选按钮组中的缺省按钮,则在设计
时将其Value属性设置成True。它将保持被选中状态,直到用户选择
另一个不同的单选钮或用代码改变它。
② 如果想禁用某单选钮,可将其Enabled属性设置为False。程
序运行时,若此单选钮显示模糊,表示无法选取该单选钮。
2. 选择单选钮的方法
选择一个单选钮可以用以下方法:
l
在运行期间用鼠标单击单选钮。
l
用Tab键定位到单选按钮组,然后在组内使用方向键(箭头
键)定位单选钮。
l
l
用代码将它的Value属性设置为真:Option1.Value = True
使用在OptionButton标题中指定的快捷键。
3. 使用单选按钮组
单选钮和复选框都可以接受Click事件,但一般不需要编写Click事件
过程。因为当用户单击单选钮和复选框时,它们自动改变状态。
单选钮的一个特点是当选定其中一个,其余就自动关闭。但当需要
在同一窗体中建立几组相互独立的单选钮时,就需要用框架(Frame)
将每一组单选钮框起来,这样在一个框架内的单选钮为一组,它们的
操作不影响框外其他组的单选钮。
【例5-14】
4. 使用图形选项按钮
可以将单选钮设计成图形按钮的形式。
【例5-15】
5.5.2 复选框控件
1. 复选框的常用属性
复选框的状态属性Value的取值为:
0—Unchecked:复选框未被选定,缺省设置。
1—Checked:复选框被选定。
2—Grayed:复选框变成灰色,禁止用户选择。
2. 复选框的使用
【例5-16】
5.6
习题