vb选择结构程序设计.ppt
第4章 选择结构程序设计,第4章 选择结构程序设计(分支结构),选择结构是计算机科学用来描述自然界和社会生活中分支现象的重要手段。其特点是根据所给定的条件为真(即条件成立)与否,而决定从各实际可能的不同分支中执行某一分支的相应操作,并且任何情况下总有:“无论分支多寡,必择其一;纵然分支众多,仅选其一”。,4.1 选择结构程序设计的概念 在VB中,实现选择结构的语句有:If.Then.Else、If.Then.ElseIf、Select Case语句。这些语句又称为条件语句,条件语句的功能都是根据表达式的值有选择地执行一组语句。4.2 条件表达式 在条件语句中作为判断依据的表达式称为“条件表达式”,条件表达式的取值为布尔值:真(True)或假(False)。在VB中,True的值等于1,False的值等于0。根据“条件”的简单或者复杂程度,条件表达式可以分为两类:关系表达式以及布尔表达式。,4.2.1 关系运算符与关系表达式 关系表达式是指用关系运算符将两个表达式连接起来的式子(例如a+b 0),关系运算符又称比较运算符,用来对两个表达式的值进行比较,比较的结果是一个布尔值(True或False),这个结果就是关系表达式的值。,1.关系运算符 VB提供的关系运算符有以下6种,见表4-1。表4-1 关系运算符,2.关系表达式 关系表达式的格式为表达式1关系运算符表达式2关系运算符表达式3 关系表达式的运算次序为:先分别求出关系运算符两侧表达式的值,然后再把二者进行比较,二者的关系若与关系运算符指示的一样,则关系运算的结果为真True,否则为假False。,4.2.2 布尔运算符与布尔表达式 对于较为复杂的条件,必须使用布尔表达式。布尔表达式是指用布尔运算符连接若干关系表达式或布尔值而成的式子。布尔表达式的值也是一个布尔值。VB提供的布尔运算符有:And、Or、Not、Xor、Eqv、Imp等6种,其中常用的为前3种,见表4-2。,表4-2 布尔运算符 说明:1)布尔运算符两侧若有数值数据出现,则将数值数据转换为二进制数(补码形式)进行按位运算。此时,1为真,0为假。2)布尔运算真值表见表4-3。,表4-3 布尔运算真值表aba And ba Or bNot aTrueTrueTrueTrueFalseTrueFalseFalseTrueFalseFalseTrueFalseTrueTrueFalseFalseFalseFalseTrue Not由真变假,由假变真。And对两个布尔值进行比较,如果两个值均为真,则结果为真,否则为假。Or对两个布尔值进行比较,如果其中一个值为真,则结果为真,只有两个值都为假时,结果才为假。运算布尔表达式时,先运算关系表达式,再运算布尔表达式。,逻辑运算的运算规则,按二进制进行的逻辑运算规则,Print 12 and 8=8 1100 and 1000=1000Print 12 or 16=28 1100 and 10000=11100Print 12 Xor 7=11 1100 Xor 111=1011Print 11 Xor 7=12 1011 xor 111=1100注:先把数字转换为二进制数,再进行运算。(A Xor B)Xor B=A,4.2.3 运算符的优先顺序 在一个表达式中进行多种操作时,VB会按一定的顺序进行求值,称这个顺序为运算符的优先顺序。运算符的优先顺序见表4-4。表4-4 运算符的优先顺序,【例4-1】设变量x=4,y=1,a=7.5,b=6.2,求表达式x+y a+b And Not y 1.3 And Not y b 2)再作关系运算:True And Not False 3)作非运算:True And True 4)最后得:True,【例4-2】判断某个年份是闰年的根据是年份数满足下述条件之一。条件1:能被4整除,但不能被100整除的年份都是闰年。条件2:能被100整除,又能被400整除的年份都是闰年。设变量y表示年份,写出判断y是否闰年的布尔表达式。解:判断y是否满足条件1的布尔表达式是y Mod 4=0 And y Mod 100 0 判断y是否满足条件2的布尔表达式是y Mod 100=0 And y Mod 400=0 两者取“或”,即得判断闰年的布尔表达式:y Mod 4=0 And y Mod 100 0 Or y Mod 100=0 And y Mod 400=0,4.3 单条件选择语句IF 单条件选择结构是最常用的双分支选择结构,其特点是:所给定条件(条件表达式)的值如果为真,则执行a1块;如果为假则执行a2块。其一般形式如图4-1所示。图4-1 单条件选择结构的流程图 实现单条件选择结构的语句是If语句,在VB中有行If语句和块If语句两种。,4.3.1 单行结构条件语句IFTHENELSE 单行If语句的语法格式为If 条件 Then 语句序列1 Else 语句序列2 说明:1)条件可以是关系表达式、布尔表达式或数值表达式。如果以数值表达式作条件,则非0值为真,0为假。2)如果没有Else子句,语句序列1为必要参数,在条件为True时执行。,【例4-3】输入x,计算y的值。其中:,流程图4-2所示。图4-2 计算y值的流程图 根据流程图,写出命令按钮Command1的单击(Click)事件代码为:,图4-3 计算函数的值Private Sub Command1_Click()Dim x As Single,y As Single x=Val(Text1.Text)If x=0 Then y=1+x Else y=12*x Text2.Text=yEnd Sub,【例4-4】学校对学习成绩优良的学生进行奖励,获奖的条件如下:1)所考5门课的总分超过450分;2)每门课的成绩都在88分以上;3)前3门(主课)的成绩都在95分以上,其他两门(非主课)的成绩都在80分以上。输入某学生5门课的成绩s1、s2、s3、s4、s5,判断他是否能够获奖。分析:依题意列出3个条件表达式:1)s1+s2+s3+s4+s5=450 2)s1=88 AND s2=88 AND s3=88 AND s4=88 AND s5=88 3)s1=95 AND s2=95 AND s3=95 AND s4=80 AND s5=80,图4-4 判断能否获奖 命令按钮Command1的单击(Click)事件代码为:Private Sub Command1_Click()Dim s1 As Single,s2 As Single,s3 As Single,s4 As Single,s5 As Single Dim p As String s1=Val(InputBox(请输入第1门课的成绩:,输入框,0)s2=Val(InputBox(请输入第2门课的成绩:,输入框,0)s3=Val(InputBox(请输入第3门课的成绩:,输入框,0)s4=Val(InputBox(请输入第4门课的成绩:,输入框,0)s5=Val(InputBox(请输入第5门课的成绩:,输入框,0),t1=(s1+s2+s3+s4+s5=450)t2=(s1=88 And s2=88 And s3=88 And s4=88 And s5=88)t3=(s1=95 And s2=95 And s3=95 And s4=80 And s5=80)If t1 Or t2 Or t3 Then p=可以获奖!Else p=不能获奖!p=Str(s1)&,&Str(s2)&,&Str(s3)&,&Str(s4)&,&Str(s5)&Chr(13)&p Label1.Caption=该生五门课的成绩分别是:&Chr(13)&pEnd Sub,【例4-5】利用输入框函数输入3个不同的数,选出其中最大的数。命令按钮Command1的单击(Click)事件代码为:Private Sub Command1_Click()Dim a As Single,b As Single,c As Single a=Val(InputBox(请输入第1个数:,输入框,0)b=Val(InputBox(请输入第2个数:,输入框,0)c=Val(InputBox(请输入第3个数:,输入框,0)p=&a&,&b&,&c p=p&三个数中最大的数是:If a b And a c Then p=p&a If b a And b c Then p=p&b If c a And c b Then p=p&c Label1.Caption=pEnd Sub,图4-5 求3个数中最大数4.3.2 使用IIF函数 还可以使用IIf函数来实现一些比较简单的选择结构。IIf函数的语法结构为:IIf(条件表达式,真部分,假部分)语句y=IIf(条件表达式,真部分,假部分)相当于:If 条件表达式 then y=真部分 Else y=假部分,【例4-6】例4-3中命令按钮Command1的单击(Click)事件代码可以改为:Private Sub Command1_Click()Dim x As Single,y As Single x=Val(Text1.Text)y=IIf(x=0,1+x,12*x)Text2.Text=yEnd Sub,4.3.3 块结构条件语句IFTHENELSEEND IF VB提供的块If语句,将一个选择结构用多个语句行来实现。其语法结构为:If 条件1 Then 语句序列1Else 语句序列2End If 在块形式中,If语句必须是第1行语句。If块必须以一个End If语句结束。,【例4-7】将例4-3中命令按钮Command1的单击(Click)事件代码改为多行If语句:Private Sub Command1_Click()Dim x As Single,y As Single x=Val(Text1.Text)If x=0 Then y=1+x Else y=12*x End If Text2.Text=yEnd Sub,4.3.4 IF语句的嵌套1.IF语句的嵌套 如果在If语句中操作块a1块(语句序列1)或a2块(语句序列2)本身又是一个If语句,则称为If语句的嵌套。,If 语句的嵌套 If then If then if then if then Else if then Else Else ifthen End if Else Else ifthen End if Else End if End if End if,【例4-8】铁路托运行李,从甲地到乙地,规定每张客票托运费计算方法是行李重量不超过50kg时,0.25元/kg,超过50kg而不超过100kg时,其超过部分按0.35元/kg收费,超过100kg时,其超过部分按0.45元/kg收费。编写程序,输入行李重量,计算并输出托运的费用。分析:设行李重量为wkg,应付运费为x元,则运费公式为:,命令按钮Command1的单击(Click)事件代码为:Private Sub Command1_Click()Dim w As Single,x As Single w=Val(Text1.Text)If w=50 Then x=0.25*w Else If w=100 Then x=0.25*50+0.35*(w50)Else x=0.25*50+0.35*50+0.45*(w100)图4-7 计算托运费 End If End If Text2.Text=xEnd Sub,图4-8 计算优惠价【例4-9】某百货公司为了促销,采用购物打折扣的优惠办法:每位顾客一次购物 1)在1000元以上者,按九五折优惠;2)在2000元以上者,按九折优惠;3)在3000元以上者,按八五折优惠;4)在5000元以上者,按八折优惠。输入购物款数,计算并输出优惠价,如图4-8所示。分析:设购物款数为x元,优惠价为y元,付款公式为:,命令按钮Command1的单击(Click)事件代码为:Private Sub Command1_Click()Dim x As Single,y As Single x=Val(Text1.Text)If x 1000 Then y=x Else If x 2000 Then y=0.95*x Else If x 3000 Then y=0.9*x Else,If x 5000 Then y=0.85*x Else y=0.08*x End If End If End If End If Text2.Text=yEnd Sub图4-8 计算优惠价,2.IF语句的嵌套格式ELSEIF 例4.8中出现的多层If语句嵌套,使程序冗长,不便阅读。为此VB提供了带ElseIf的块If语句来处理当条件为假时又内嵌块If语句的情形,以使程序简化易写。其语法结构为:If 条件1 Then 语句序列1ElseIf 条件2 Then 语句序列2.Else 其他语句序列End If,【例4-10】在例4-9中使用带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.08*x End If Text2.Text=yEnd Sub,4.4 多分支条件选择语句SELECT CASE 多分支选择结构的特点是:从多个选择结构中,选择第1个条件为真的路线作为执行的路线。即所给定的选择条件1为真时,执行a1块;如果为假则继续检查下一个条件。如果条件都不为真,就执行其他操作块,如果没有其他操作块,则不作任何操作就结束选择。如图4-9所示。图4-9 多条件多分支选择结构的流程图,4.4.1 SELECT CASE结构与语法 虽然使用嵌套的办法可以利用If语句实现多分支选择,但是最好还是使用VB提供的多分支选择结构(Select Case语句)来实现多分支选择。根据单一表达式来执行多种可能的动作时,Select Case更为简捷,它根据表达式的值,来决定执行几组语句中的一组。,4.4.1 SELECT CASE结构与语法 Select Case语句的语法格式为Select Case 测试条件 Case 表达式表1 语句序列1 Case 表达式表2 语句序列2.Case Else 其他语句序列End Select,其中:为数值型或字符串表达式;每个是一个或几个值的列表,可以是表达式、枚举值表达式1 To 表达式2,Is关系运算表达式等几种形式。如果在一个列表中有多个值,就用逗号把值隔开;每个语句组中含有零个到多个语句。Select Case语句执行过程:1、计算的值 2、将的值与Case语句中的中的每一个值逐一比较。如果与其中一个相匹配,则执行相应的语句组。如果不止一个,则只执行第一个相匹配的语句组。如果没有相匹配的,则执行Case Else子句(可选)。最后执行End Select语句。,Select Case 语句表达式的值有如下规定:1)可以是一个值,也可以是几个值的列表;2)如果列表中的值不连续,就用逗号把值隔开.如:Case 1,3,7,10.3)如果列表中的值是连续的,可用TO表达式,如:Case 1 to 5,表示 1 到5这5个数.4)列表中还可以包含Is关系表达式,如case Is79.表示大于79的值5)表达式值的类型必须与测试表达式的类型相同.If 结构和select case结构相互间的转换小结:,Case子句中的表达式表是一个或多个如表4-5所示形式表达式的列表。表4-5 表达式的形式 当使用多个表达式的列表时,表达式与表达式之间要用逗号“,”隔开。,4.4.2 SELECT CASE结构的应用【例4-11】在例4-9中使用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.08*x End Select Text2.Text=yEnd Sub,【例4-12】某航空公司规定在旅游的旺季79月份,如果订票数超过20张,票价优惠15%,20张以下,优惠5%;在旅游的淡季15月份、10月份、11月份,如果订票数超过20张,票价优惠30%,20张以下,优惠20%;其他情况一律优惠10%。设计程序,根据月份和订票张数决定票价的优惠率。图4-11 计算优惠价,命令按钮Command1的单击(Click)事件代码为:Private Sub Command1_Click()Dim m As Integer,n As Integer,r As Integer m=Val(Text1.Text)n=Val(Text2.Text)Select Case m Case Is=5,10,11 If n 20 Then r=20 Else r=30 Case 7 To 9 If n 20 Then r=5 Else r=15 Case Else r=10 End Select Label4.Caption=所订机票的优惠率为:&Str(r)&%End Sub,为了使用更加方便,再增加如下代码。窗体的Load事件代码:Private Sub Form_Load()Text1.Text=Month(Date)Text1中的默认值为当前月份End Sub 文本框Text1的GotFocus事件代码:Private Sub Text1_GotFocus()Text1.SelStart=0 Text1.SelLength=Len(Text1.Text)End Sub,文本框Text1的按健(KeyPress)事件代码:Private Sub Text1_KeyPress(KeyAscii As Integer)If KeyAscii=13 Then 在Text1按Enter键,光标跳到Text2 If Text1.Text 0 And Text1.Text 13 Then Text2.SetFocus End If End IfEnd Sub,文本框Text2的GotFocus事件代码:Private Sub Text2_GotFocus()Text2.SelStart=0 Text2.SelLength=Len(Text2.Text)End Sub 文本框Text2的按健(KeyPress)事件代码:Private Sub Text2_KeyPress(KeyAscii As Integer)If KeyAscii=13 Then 在Text2按Enter键,光标跳到Command1 If Text2.Text 0 Then Command1.SetFocus End IfEnd Sub,4.5 使用计时器控件 计时器(Timer)是Visual Basic提供的一个用于定时的特殊控件,当到达预定时间时,系统会自动触发其Timer事件,以便完成指定的操作。计时器控件在设计时显示为一个小时钟图标,而在运行时则不可见,常用来做一些后台处理。计时器的属性和事件都相当少,能响应的事件只有自身特有的一个Timer事件,其主要属性见表4-6。表4-6 Timer控件的属性,【例4-13】为一个应用系统设计流动字幕板,如图4-12所示,标题“欲穷千里目,更上一层楼”在窗体中自右至左地反复移动。图4-12 电子标题板,命令按钮Command1的Click事件代码:Private Sub Command1_Click()If Command1.Caption=&S 暂停 Then Command1.Caption=&C 继续 Timer1.Enabled=False Else Command1.Caption=&S 暂停 Timer1.Enabled=True End IfEnd Sub,编写Timer1的Timer事件代码:Private Sub Timer1_Timer()If Label1.Left+Label1.Width 0 Then Label1.Move Label1.Left 20 Else Label1.Left=Form1.ScaleWidth End IfEnd Sub,4.6 提供简单选择的控件 成组使用的选项按钮以及复选框可以为用户提供简单的、事先准备的选项。4.6.1 选项按钮 选项按钮(OptionButton)又称单选按钮。一般来说,选项按钮总是作为一个组(选项按钮组)的组成部分工作的。选项按钮组是一组相互排斥的选项按钮,选择一个选项按钮就会立即清除该组中的其他按钮。在选项按钮组中只能单击一个选项,即选项按钮组只允许用户从选择菜单中选择一个选项。,1.使用选项按钮组 在窗体中定义的若干选项按钮可以组成一个选项组,一般常用框架(Frame)控件来组织一个选项组。【例4-14】设银行定期存款年利率为:1年期2.25%,2年期2.70%,3年期3.24%,5年期3.60%(不计复利)。今有本金a元,5年以后使用,共有以下6种存法:存一次5年期;存一次3年期,一次2年期;存一次3年期,两次1年期;存两次2年期,一次1年期;存一次2年期,三次1年期;存五次1年期。图4-14 计算利息,分别计算各种存法5年后到期时的本息合计,如图4-14所示。分析:设x1、x2、x3、x5分别表示1年、2年、3年、5年定期储蓄的利息,a表示本金,则定期的本息计算公式分别为:(1+x1)a、(1+2x2)a、(1+3x3)a、(1+5x5)a。,编写命令按钮Command1的单击(Click)事件代码:Private Sub Command1_Click()Dim a As Single,y As Single Dim x1 As Single,x2 As Single Dim x3 As Single,x5 As Single a=Val(Text1.Text)x1=0.0225:x2=0.0270 x3=0.0324:x5=0.0360 Select Case True Case Option1.Value y=(1+5*x5)*a Case Option2.Value y=(1+3*x3)*(1+2*x2)*a,Case Option3.Value y=(1+3*x3)*(1+x1)2*a Case Option4.Value y=(1+2*x2)2*(1+x1)*a Case Option5.Value y=(1+2*x2)*(1+x1)3*a Case Option6.Value y=(1+x1)5*a End Select Text2.Text=y Text1.SetFocusEnd Sub,编写文本框Text1的GotFocus事件代码:Private Sub Text1_GotFocus()Text1.SelStart=0 Text1.SelLength=Len(Text1.Text)End Sub,2.使用图形选项按钮 可以将选项按钮设计成图形按钮的形式。【例4-15】用图形选项按钮组控制流动字幕中的字体,如图4-15所示。在例4-13中增加4个选项按钮Option1Option4,并修改Option1Option4的Style属性为:1 Graphical(图形方式),再依次修改其Caption属性,如图4-15所示。图4-15 图形选项按钮组,编写选项按钮Option1Option4的Click事件代码:Private Sub Option1_Click()Text1.FontName=宋体End SubPrivate Sub Option2_Click()Text1.FontName=隶书End SubPrivate Sub Option3_Click()Text1.FontName=黑体End SubPrivate Sub Option4_Click()Text1.FontName=楷体_GB2312End Sub 说明:可以为图形按钮添加图形文件,以创建真正的“图形按钮”。,4.6.2 复选框 选项按钮组属于多项中选择一项的选择,若需要选择多项的情况,可以采用多个复选框(CheckBox)控件。当复选框被选定时,复选框中出现一个“”。复选框的Caption属性可以指定出现在复选框旁边的文本,而Picture属性用来指定当复选框被设计成图形按钮时的图像。复选框的状态由其Value属性决定:0 假,1 真,2 暗。,1.使用单个复选框 单个的复选框是让用户在两个选项之间进行选择,如是或否,真或假。这有点儿像两个按钮的选项组,只是形式上要简单一些,操作更方便一些。【例4-16】在上例中,增加复选框,控制选项按钮组的显示,如图4-16所示。图4-16 利用复选框控制选项按钮组的显示,复选框控件Check1的Click事件代码:Private Sub Check1_Click()Option1.Visible=Check1.Value Option2.Visible=Check1.Value Option3.Visible=Check1.Value Option4.Visible=Check1.ValueEnd Sub,2.使用多个复选框 一般情况下,复选框总是成组出现,用户可以从中选择一个或多个选项。【例4-17】设计一个个人资料输入窗口,使用选项按钮组输入性别与民族,使用复选框输入个人爱好,如图4-17所示。图4-17 使用多个复选框,编写命令按钮Command1的Click事件代码:Private Sub Command1_Click()If Text1.Text=Then a=InputBox(您忘了输入姓名!,注意,请在此输入姓名)If a=Or a=请在此输入姓名 Then Exit Sub Text1.Text=a End If p1=Text1.Text+,p2=IIf(Option1,男,女)+,p3=IIf(Option3,汉族,少数民族)p4=,喜欢:If Check1.Value=1 Then p4=p4+Check1.Caption+、If Check2.Value=1 Then p4=p4+Check2.Caption+、If Check3.Value=1 Then p4=p4+Check3.Caption+、If Check4.Value=1 Then p4=p4+Check4.Caption+、,aa=p1+p2+p3+IIf(p4=,喜欢:,,无爱好。,p4)Label4.Caption=Left(aa,Len(aa)1)+。Text1.SetFocusEnd Sub 编写文本框Text1的Change事件代码:Private Sub Text1_Change()Label4.Caption=End Sub 说明:框架Frame1不能少,否则4个选项按钮成为一组。,3.复选框的图形方式 也可以将复选框做成图形(即按钮)方式,这只要改变Style属性的设置,然后使用Picture、DownPicture和DisabledPicture属性。DownPicture 属性指的是按钮处于被按下状态时显示的一个图片对象。除非控件的Style属性设置为1(图形的),否则DownPicture属性将被忽略。【例4-18】利用图形复选框来控制文本的字体风格,如图4-19所示。图4-19 使用图形复选框,设置对象属性。只介绍4个复选框Check1Check4的属性设置,其余参见图4-227所示。依次选中4个复选框Check1Check4,将其Style属性改为:1 Graphical(图形方式),将图片(Picture)属性通过浏览按钮“”进行查找,并分别改为 program filesmicrosoft visual studiocommongraphicsiconsmiscsecur01a.ico program filesmicrosoft visual studiocommongraphicsbitmapstlbr_w95bld.bmp program filesmicrosoft visual studiocommongraphicsbitmapstlbr_w95itl.bmp program filesmicrosoft visual studiocommongraphicsbitmapstlbr_w95undrln.bmp Check1的DownPicture属性改为:program filesmicrosoft visual studiocommongraphicsiconsmiscsecur01b.ico,复选框控件Check1的Click事件代码:Private Sub Check1_Click()Check2.Enabled=Check1.Value Check3.Enabled=Check1.Value Check4.Enabled=Check1.Value Check1.Caption=IIf(Check4.Caption=锁上,打开,锁上)End Sub 复选框控件Check2的Click事件代码:Private Sub Check2_Click()Text1.FontBold=Check2.ValueEnd Sub,复选框控件Check3的Click事件代码:Private Sub Check3_Click()Text1.FontItalic=Check3.ValueEnd Sub 复选框控件Check4的Click事件代码:Private Sub Check4_Click()Text1.FontUnderline=Check4.ValueEnd Sub 说明:DownPicture属性表示复选框被按下时的图形。,