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 习题