第3章 分支结构程序设计 3.1 关系、逻辑运算符及其表达式 3.2 If 语句 3.3 Select Case 语句
3.1 关系、逻辑运算符与表达式 要实现分支结构,一般先需要判断给定的条件,然后再根据判断的结果进行相应的处理。在判断条件时,最常用的运算符是关系运算符和逻辑运算符。
【例3.1】在窗体上添加两个命令按钮。 单击 单击
编写代码: Private Sub cmdNum_Click() Cls Print " 关系运算实例" Print Print " True<>1", True <> 1 Print " 3>1>=0", 3 > 1 >= 0 End Sub 数值型关系表达式实例
Private Sub cmdChar_Click() Cls Print " 关系运算实例" Print Private Sub cmdChar_Click() Cls Print " 关系运算实例" Print Print " abc=abc", "abc" = "abc“ Print " ade>abcf", "ade" > "abcf“ Print " abcd>ab", "abcd" > "ab" End Sub 字符型关系表达式实例
说明: 关系运算是对运算符左右两边的表达式进行比较,而且比较的结果只能为“真”或“假”; 对于数值型数据按其数值大小比较,在VB中True对应的数值为-1,False对应的数值为0; 对于字符型数据从字符串的第一个字符开始,逐个按其ASCII码值进行比较。
【例3.2】在窗体上添加3个命令按钮。 单击 单击 单击
程序代码: Private Sub cmdAnd_Click() Cls Print Tab(12); "逻辑运算实例" Print Print "3>1 And 1>=0"; Spc(8); 3 > 1 And 1 >= 0 Print "True<>1 And False"; Spc(3); True <> 1 And False End Sub 逻辑与运算
Private Sub cmdOr_Click() Cls Print Tab(12); "逻辑运算实例" Print Private Sub cmdOr_Click() Cls Print Tab(12); "逻辑运算实例" Print Print "abC<aBC Or ac>AC"; Spc(4); "abc" < "aBC" Or "ac" > "AC" Print " 3>5 Or False=0"; Spc(6); 3 > 5 Or False = 0 End Sub 逻辑或运算
Private Sub cmdNot_Click() Cls Print Tab(12); "逻辑运算实例" Print Print "Not(False=0)"; Spc(7); Not (False = 0) Print "Not(3<5)"; Spc(11); Not (3 < 5) End Sub 逻辑非运算
说明: VB中各种运算符其运算的先后顺序是: 算术运算符 字符串运算符 关系运算符 逻辑运算符
3.2 If语句 3.2.1 单行If语句 3.2.2 多行If语句 3.2.3 If语句的嵌套
3.2.1 单行If语句 分支结构就是利用计算机语言来描述分支现象,即,通过比较和判断来决定采取何种操作。在VB中,通常用If语句、Select Case语句或条件函数解决分支结构问题。
【例3.3】输入一个数,判断该数是奇数还是偶数。在窗体上添加两个文本框、一个标签、三个命令按钮。 判断奇偶性 重新输入 结束运行
程序代码: Private Sub cmdJudge_Click() a = Val(Text1.Text) If a Mod 2 = 0 Then b$ = "偶数" Else b$ = “奇数" Text2.Text = b$ End Sub 根据条件有选择地执行其中一个
Private Sub cmdClear_Click() Text1.Text = "" Text2.Text = "" Text1.SetFocus End Sub Private Sub cmdExit_Click() End 清空文本框,并将焦点定位在Text1中
判断某数是奇数还是偶数的流程图 开始 a=Val(Text1.Text) Yes No a Mod2=0? b$="偶数" b$="奇数" Text2.Text=b$
【例3.4】计算以下分段函数的值。在窗体上添加两个文本框、两个标签和两个命令按钮。 【例3.4】计算以下分段函数的值。在窗体上添加两个文本框、两个标签和两个命令按钮。 2 (0<x≤2) x3+1 (x≤0) 5x (x>2) y= 计算函数值 结束运行 重新输入
程序代码: Private Sub txtInput_Change() Dim x, y As Integer x = Val(txtInput.Text) If x <= 0 Then y = x ^ 3 + 1 If x > 0 And x <= 2 Then y = 2 If x > 2 Then y = 5 * x txtResult.Text = y End Sub 单行If语句
x = Val(textInput.Text) y = 2 x > 0 And x <= 2 ? x <= 0 ? y = x ^ 3 + 1 y = 5 * x txtResult.Text = y 定义x,y Yes No 计算分段函数的流程图
单行If语句的一般格式为: If 表达式 Then 语句1 [Else 语句2]
说明: If、Then、Else是系统保留字; 非0 表达式 语句1 语句2
根据情况可以省略子句“Else 语句2” 语法上要求“语句1”和“语句2”均为一条语句,若要用多条语句,则需用“ :”隔开
【例3.5】在窗体上分别添加一个标签和复选框。 单击复选框,未选中时情况 单击复选框,选中时情况
Private Sub chk1_Click() If chk1.Value=1 Then Label1.Caption= “选中” Else Label1.Caption = "未选中" End Sub 根据Value值,判断是否选中
说明: 复选框有3种状态,其状态用Value属性值表示,0表示没有选中;1表示选中;2表示选中但不可用(复选框呈灰色); 通过If…Then…Else语句实现对复选框不同状态的信息显示。
【例3.6】在窗体上添加一个文本框、一个标签、4个复选框和一个命令按钮。 单击“确定”,改变文本框中数据的字体、字型、大小和颜色
Private Sub cmdOk_Click() If chkFnt.Value Then txt1.FontName = “ 宋体“ Else txt1.FontName = “黑体” If chkItc.Value Then txt1.FontItalic = True Else txt1.FontItalic = False 若选中字体复选框,则文本框中的字体设置为宋体,否则为黑体 若选中斜体复选框,则文本框中的字型设置为斜体,否则为正常字型
If chkCol.Value Then txt1.ForeColor = 未选中大小复选框时 选中大小复选框时 If chkSz.Value Then txt1.FontSize = 18 Else txt1.FontSize = 24 If chkCol.Value Then txt1.ForeColor = QBColor(6) Else txt1.ForeColor=QBColor(0) End Sub 黄色 黑色
说明: 使用4个If语句处理各复选框的选择情况。当If后面表达式的值为非0时,执行Then后面的语句,否则执行Else后面的语句; QBColor是VB提供的函数,它返回不同的颜色,其调用形式是:QBColor(颜色参数) 其中颜色参数是介于0到15之间的整数。
【例3.7】在窗体上添加3个文本框、3个标签、两个单选按钮和两个命令按钮。 单击选择 显示最大或最小数 退出整个程序 重新输入数据
编程点拨 本例涉及到程序算法问题。为了在3个数中求出最大数或最小数,可设计如下流程图(以求最大数为例):
max<Val(Text2.Text)? max<Val(Text3.Text)? Yes max = Val(Text2.Text) max = Val(Text3.Text) Label3.Caption = max No max<Val(Text3.Text)? 求解最大数的流程图
程序代码: Private Sub option1_Click() max = Val(Text1.Text) 程序代码: Private Sub option1_Click() max = Val(Text1.Text) If max < Val(Text2.Text) Then max = Text2.Text If max < Val(Text3.Text) Then max = Text3.Text Label3.Caption = max End Sub max中存放第一个数 找前两个数中大者 找三个数中最大者
Private Sub option2_Click() min = Val(Text1.Text) If min > Val(Text2.Text) Then min = Text2.Text If min > Val(Text3.Text) Then min = Text3.Text Label3.Caption = min End Sub
Private Sub cmdClear_Click() Text1.Text = "" : Text2.Text = "": Text3.Text = "" Label3.Caption = "" Text1.SetFocus End Sub Private Sub cmdExit_Click() End
说明: max是为了存放最大数而开辟的变量,min是为存放最小数而开辟的变量; 本例中用到一个新的控件——单选按钮。其特点是在一组单选按钮中只能选中其中的一项。
3.2.2 多行If语句 多行If 语句也称为块 If 语句,在一个分支结构中若使用多条语句,则需用多行If语句实现。
【例3.8】编写验证密码程序。在窗体1上添加一个文本框、一个标签、一个命令按钮。在窗体2上添加一个标签、一个命令按钮。 验证密码是否正确 进入窗体2 退出整个程序
Private Sub cmdCheck_Click() If Text1.Text = "123456" Then 窗体1的代码: Private Sub cmdCheck_Click() If Text1.Text = "123456" Then MsgBox "密码正确,请进入!" frmEx3_8_1.Hide frmEx3_8_2.Show Else MsgBox “密码错,请重新输入!” Text1.Text = "“ Text1.SetFocus End If End Sub 多行IF语句 语句组 完成窗体间的切换
窗体2的代码: Private Sub cmdExit_Click() End End Sub
说明: 多行If语句的一般形式是: If 表达式 Then 语句组1 [Else 语句组2] End If
语句组不能与Then书写在同一行 省略Else子句时的多行If语句形式为: If 表达式 Then 语句组 End If
【例3.9】将输入的3个不同的整数,按小到大的顺序重新排序输出。在窗体上添加3个标签、3个文本框和两个命令按钮。 排序结果 单击时, 按小到大的顺序将数据显示在标签中 单击时, 重新输入数据
三个数排序过程 冒泡法 If a > b Then temp = a: a = b: b = temp End If 345 a 234 b 123 c If a > c Then temp = a: a = c: c = temp End If 234 345 123 a b c 冒泡 冒泡 If b > c Then temp = b: b = c: c = temp End If 123 234 234 123 345 a b c
a > b ? Yes 交换a和b b > c ? 交换b和c 输入a,b,c 3个数 输出a,b,c No 3个数排序的流程图
Private Sub cmdSort_Click() Dim a As Long, b As Long, c As Long, temp As Long a = Val(txtInput1.Text) b = Val(txtInput2.Text) c = Val(txtInput3.Text)
If a > b Then temp = a a = b b = temp End If If a > c Then a = c c = temp If b > c Then temp = b b = c b中存放a和b中较大的数 c中存放3个数中的最大数 b中存放3个数中次大数
lblOuput.Caption = a & Space(2)& b & Space(2) & c End Sub Private Sub cmdNext_Click() txtInput1.Text = "" txtInput2.Text = "" txtInput3.Text = "" lblOuput.Caption = "" txtInput1.SetFocus End Sub 显示排序结果
说明: 为了实现排序算法,使用3个多行If语句。各If语句均省略了Else情况; 定义temp临时变量,借用它完成两数之间的交换。
【例3.10】在窗体上添加4个标签、一个计时器、一个图像框和一个命令按钮。 数值相同,表示中大奖 单击时,不停地显示0到9之间的随机整数
对 象 属性名 属性值 窗 体 Caption 祝你走运中大奖! 图像框 Stretch True Visible False 标签1~3 BorderStyle 1 标签4 计时器 Interval 100 Enabled
Private Sub Command1_Click() Timer1.Enabled = True Dim i As Integer Private Sub Command1_Click() Timer1.Enabled = True Command1.Enabled = False Form1.Height = 2100 End Sub 声明窗体级变量 窗体的高度为2100点
Private Sub Timer1_Timer() Randomize Label1.Caption = Format(Int(Rnd * 10)) Label2.Caption = Format(Int(Rnd * 10)) Label3.Caption = Format(Int(Rnd * 10)) If Label1.Caption = Label2.Caption And Label2.Caption = Label3.Caption Then Image1.Visible = True Label4.Visible = True Timer1.Enabled = False Form1.Height = 3600 Command1.Enabled = True i = 0 Else Image1.Visible = False Label4.Visible = False End If 每隔0.1秒触发一次 产生3个随机数 判断是否相等
计算投币时间 If i >= 50 Then MsgBox “对不起,没有中奖!” Label1.Caption = "" i = i + 1 If i >= 50 Then MsgBox “对不起,没有中奖!” Label1.Caption = "" Label2.Caption = "" Label3.Caption = "" Command1.Enabled = True Timer1.Enabled = False i = 0 End If End Sub 计算投币时间
说明: 使用计时器控制随机数产生的时间间隔。由于每隔0.1秒产生3个随机数,因此将产生随机数的语句写在计时器的Timer事件中。程序中通过If…Then…Else结构实现是否中奖的处理;
程序中变量i是用来判断是否已过5秒钟,因此每次触发Timer事件时,i应代表同一个存储单元,所以本例在“通用”段中使用语句Dim i As Integer声明了变量i(这时称i为窗体级变量)。
3.2.3 If语句的嵌套 在If语句的If或Else后面还可以包含另一If语句,这样结构的If语句称为If语句的嵌套。
【例3.11】查看商品单价。在窗体上添加两个框架(分别在每一个框架中添加两个单选按钮)和一个命令按钮。
Private Sub cmdDisplay_Click() If optBanana.Value=True Then If optWhole.Value=True Then a=MsgBox(“单价是1.8元!”,vbOKOnly,“批发时香蕉单价”) Else a=MsgBox(“单价是2.3元!”,vbOKOnly,“零售时香蕉单价”) End If If optWhole.Value = True Then a=MsgBox(“单价是1.5元!”,vbOKOnly,“批发时葡萄单价”) a=MsgBox(“单价是2.0元!”,vbOKOnly,“零售时葡萄单价”) End Sub
嵌套If语句的一般形式 If 表达式1 Then [语句组1] If 表达式2 Then 语句组2 [Else 语句组3] End If [语句组4] [语句组5] If 表达式3 Then 语句组6 语句组7 [语句组8] ] 外 层 If 语 句 嵌套If语句的一般形式 内层If语句 内层If语句
【例3.12】用计时器控制旋转木马在窗体内摇摆运动。在窗体上添加一个标签、一个计时器、一个图片框和一个直线控件。 程序运行时, 木马摇摆运动
编程点拨 要使木马在窗体内产生摇摆运动,需要做两件事请,一是将木马摇摆状态的三幅图按顺序轮流在一个图片框上显示;二是使图片框不断向左移动。 轮流显示
Dim i As Integer Private Sub Timer1_Timer() If Picture1.Left + Picture1.Width < 10 Then Picture1.Move 3900 Else Picture1.Move Picture1.Left – 100 If i Mod 4 = 1 Then Picture1.Picture=LoadPicture("horse1.gif") ElseIf i Mod 4 = 0 Or i Mod 4 = 2 Then Picture1.Picture=LoadPicture("horse2.gif") Picture1.Picture=LoadPicture("horse3.gif") End If i = i + 1 End Sub 图形向左移动 摇摆状态相当于有4种
If 表达式1 Then 语句组1 ElseIf 表达式2 Then 语句组2 ElseIf 表达式3 Then 语句组3 …… ElseIf 表达式n Then 语句组n [Else 语句组n+1] End If 多分支If语句的一般形式
3.3 Select Case 语句 一个If语句最多只能实现两个分支问题,所以要解决多分支问题时,必须使用嵌套的If语句和上例中用到的If…Then…ElseIf语句。在实际应用中,对于多分支选择,更方便的方法是使用本节将要介绍的Select Case语句来实现。
【例3.13】Select Case语句示例。在窗体上添加1个标签、1个文本框、1个命令按钮和形状控件。 单击时,显示相应的图形
Private Sub Command1_Click() Dim a As Integer a = Val(Text1.Text) Select Case a Case 0 Shape1.Shape = 0 Case 1 Shape1.Shape = 1 Case 2 Shape1.Shape = 2 Case 3 Shape1.Shape = 3 Case 4 Shape1.Shape = 4 Case 5 Shape1.Shape = 5 Case Else MsgBox "Wrong" End Select End Sub 矩形形状 正方形形状 椭圆形形状 圆形形状 圆角矩形形状 圆角正方形形状 对0-5之外,显示出错信息
程序执行的流程图 a=? 1 2 3 4 5 其他 Shape置0 Shape置1 Shape置2 Shape置3 Shape置4 出错信息 1 2 3 4 5 其他
Select Case语句的一般格式: Case 表达式表1 语句组1 Case 表达式表2 语句组2 …… Case 表达式表n 语句组n [Case Else 语句组n+1] End Select
说明: 表达式可以是一个常量或变量,也可以是数值型表达式或字符型表达式; Case后面的“表达式表”用来判断其值是否与测试表达式相匹配,若匹配,则执行该Case后面的语句组后,立即退出本Select Case语句;若所有的Case后面的“表达式表”,其值与测试表达式均不匹配,则执行Case Else后面的语句组。
【例3.14】在窗体上按图所示添加标签、文本框和命令按钮。 单击时,显示对应的成绩等级 单击时,重新输入成绩 单击时,退出程序
Private Sub Form_Activate() txtScore.Text = "" txtResult.Text = "" txtScore.SetFocus End Sub 使用窗体的Activate事件设置文本框的焦点
Private Sub cmdCheck_Click() score = Val(txtScore.Text) If score < 0 Or score > 100 Then MsgBox(“数据超范围!”) Else Select Case score Case Is >= 90 txtResult.Text = "A“ Case Is >= 80 txtResult.Text = "B“ Case Is >= 70 txtResult.Text = "C“ Case Is >= 60 txtResult.Text = "D“ Case Else txtresult.Text = "E“ End Select End If End Sub 判断成绩的5个等级 判断从上而下,直到遇到第一个满足条件的
Private Sub cmdClear_Click() Form_Activate End Sub Private Sub cmdEnd_Click() End 调用Form_Activate过程