
vb选择结构程序设计.ppt
37页第5章 选择结构程序设计本章要点:•1.块结构条件语句If…Then…End If的使用•2.多分支条件语句ElseIf的应用 •3 .多分支选择语句Select Case…End Selec的应用 选择结构是一种常用的基本结构,其特点是根据所给定的选择条件为真或假,来决定从不同操作中选择执行一种操作 选择结构程序设计 5.1 块If条件语句5.4 Select Case 语句5.5 应用举例返回退出5.2 块If语句的嵌套5.3 ElseIf条件语句5.1块块If语句(语句(If...Then语句)语句)块If语句是用来判断条件成立与否,然后决定下一步怎么执行的一种控制语句,这种选择结构是最常用的双选择结构,即只有两种操作可以选择如果条件为真,执行其中一个操作;如果条件为假,则执行另外一个操作块结构if语句语法格式如下:If <条件表达式> Then[<语句块1>][Else[<语句块2>]]End If说明:<条件表达式>为必选项,它可以是关系表达式、布尔表达式、数值表达式或字符串表达式,但总的说来它是一个逻辑值的表达式,其返回结果必须是True或False。
对于数值表达式,VB将0作为False,非0作为True 来处理;对于字符串表达式,VB只允许出现包含数字的字符串,当字符串中的数字值为0时,则认为是False,否则认为是True<语句块1>和<语句块2>可以是一条语句,也可以是多条语句单行结构If语句的执行过程是这样的:首先计算<条件表达式>的值,如果结果为True,则执行<语句块1>,否则,执行<语句块2>T(真)F(假)条件满足?语句块1语句块2End If之后的语句选择结构流程图【例5.1】设计界面如图5-2所示,用文本框Text1输入x的值,单击按钮时,在标签Label1中显示出x的绝对值 运行界面“求绝对值”按钮Command1的单击事件过程如下:Private Sub Command1_Click()x = Val(Text1.Text) '将文本框中的字符内容转换成数值If x > 0 Then Label1.Caption = x Else Label1.Caption = -x '根据x的正负确定显示结果End Sub使用该语句时,应该注意以下问题:(1)整个块结构必须以If开始,以End If结束。
2)块结构If 语句中Then后面的语句不能与其写在同一行上,否则,必须加上分隔符3)块结构中的<语句块2>是可以省略的省略后即简化为以下形式: If <条件> Then <语句块> End If 这种形式的If语句主要用来判断一些操作是否执行当条件成立时,根据<语句块>完成的一定的操作;而当条件不成立时不做任何处理,直接执行下条语句例如,例5.1也可以采用下列程序段来实现x = Val(Text1.Text)If x < 0 Then x = -x '取负数x的相反数End If Label1.Caption = x (4)在块结构中,If后面显式的给出了判断条件,Else后面虽然没有显式的给出一个条件,但相当于存在一个与If部分相反的隐含条件返回 在实际应用中,经常会遇到“多分支”选择的程序,即从多种情况中选择执行其中一种情况,这时,就要使用块if语句的嵌套 块结构If语句可以嵌套,即在上述结构中的<语句块1>和<语句块2>部分仍然可以包含另外一个块结构If语句。
如果在条件成立或不成立的情况下要继续判断其他条件,则可以在语句块的位置上再使用另外一个块结构条件语句5.2 块块ifif语句的嵌套语句的嵌套If子句部分的嵌套结构Else子句部分的嵌套结构使用嵌套语句时应注意以下问题:(1)如果存在嵌套时,语句中的每一个Else必须和一个If相对应,应避免产生混乱在书写时,可以将同一层的If子句和Else子句左对齐,内层的各语句块相对于外层向右缩进若干空格,以使程序结构更加清楚,便于阅读和查错2)每一个块结构都必须以If开始,以End If结束3)内层嵌套的块结构中除了满足该层规定的条件外,还必须首先满足外层结构中相应位置的条件4)VB中对块嵌套的层数没有限制,在嵌套的块结构中仍然可以继续嵌套其他的块结构,但嵌套时外层的块结构必须完全“包住”内层的块结构,不能相互“骑跨”5)利用块If语句的嵌套可以解决“多分支”选择的问题【例5.2】建立如图5-3所示的界面,输入任一点的坐标(X,Y),判断该点位于哪个象限在平面直角坐标系中,点所在的象限有以下4种情况: X>0 ,Y>0 点位于第一象限内 X>0, Y<0 点位于第四象限内 X<0, Y>0 点位于第二象限内 X<0, Y<0 点位于第三象限内 X=0或Y=0 位于原点,给出提示“该点不在任何象限内”。
建立界面,分别通过文本框Text1和Text2输入坐标X、Y的值,单击“判断”按钮Command1进行判断,将结果直接显示在窗体上Private Sub Command1_Click()x = Val(Text1.Text)y = Val(Text2.Text)'判断坐标点是否位于坐标轴If x = 0 Or y = 0 Then Print "该点不位于任何象限" Exit SubEnd If'判断坐标点所在象限If x > 0 Then If y > 0 Then Print "该点位于第一象限" Else Print "该点位于第四象限" End IfElse If y > 0 Then Print "该点位于第二象限" Else Print "该点位于第三象限" End IfEnd IfEnd Sub程序代码如下:程序运行界面【例5.3】编程序求一元二次方程ax^2+bx+c=0的根(a不等于零)分析:根据数学知识,要求一元二次方程的根,必须知道方程的三个系数a、b、c的值,然后根据判别式b^2-4ac的值的情况判断方程的根方程的根有以下三种情况:当b^2-4ac>0时,方程有两个不相等的实根;当b^2-4ac=0时,方程有两个相等的实根;当b^2-4ac<0时,方程有两个复根。
设计如右所示的界面,分别在文本框Text1、Text2和Text3中输入a、b、c的值,单击“求解”按钮后在标签Label5中给出方程的解“求解”按钮的事件代码如下:Private Sub Command1_Click()Dim a, b, c, dert As IntegerDim p, r, x1, x2 As SingleDim str As Stringstr = Chr(10) & Chr(13)a = Val(Text1.Text)'判断a是否为0,如果为0,则退出过程If a = 0 Then MsgBox "a不能为0": Exit Subb = Val(Text2.Text)c = Val(Text3.Text)dert = b * b - 4 * a * cp = -b / (2 * a)If dert >= 0 Then If dert > 0 Then r = Sqr(dert) / (2 * a) x1 = p + r x2 = p - r Else x1 = p x2 = p End If Label5.Caption = "x1=" & x1 & str & "x2=" & x2Else r = Sqr(-dert) / (2 * a) Label5.Caption = "x1=" & p & "+" & r & "i" & str & "x2=" & p & "-" & r & "i"End IfEnd Sub返回5.3 ElseIf语句语句ElseIf子句的格式:If 条件1 then 语句块1ElseIf 条件2 then 语句块2……[Else 语句块n+1]End If对ElseIf子句的格式说明:(1)可以放置任意多个ElseIf子句。
2)关键字ElseIf中间没有空格,不能写成Else IfElseIf子句的功能:依次判断条件,如某一条件成立,则执行其下面的语句块;如果所有条件均不成立,则执行Else后面的语句在相应语句块执行完后,会跳过End If,执行其后面的语句 Else If结构执行过程功能说明:(1)不管有几个ElseIf子句,程序执行完一个语句块后,其余ElseIf子句不再执行2)当多个ElseIf子句中的条件都成立时,只执行第一个条件成立的子句中的语句块因此,在使用ElseIf语句时,要特别注意各判断条件的前后次序例5.4】输入一个学生的成绩score,根据其所在分数段给出他的考试等级score<60时,打印“不及格”;60=
如果连续三次输入了口令仍不正确,则提示“你无权使用本系统”分析:假设使用一个文本框Text1来接收口令,运行时用户输入完口令并按回车键后系统才对输入的口令进行检查,因此本例使用了Text1的KeyUp事件当焦点位于文本框内,按下键盘上任一键后会产生KeyUp事件,同时返回按键代码KeyCode回车键的代码为13,所以程序首先判断用户是否在Text1中按下了回车键,若KeyCode=13,表示口令输入完 说明:在程序中是使用了一个静态变量I,用于统计输入错误口令的次数静态变量I只在第一次判断口令时被初始化为0,以后每次执行该过程时,如果口令错误,则I的值累加1,因此,当I的值为3时,表示用户已经连续三次输入了错误口令程序代码如下:Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)Static I As IntegerIf KeyCode = 13 Then If UCase(Text1.Text) = "abcd" Then Label2.Caption = "你已成功进入本系统" ElseIf I < 3 Then I = I + 1 Label2.Caption = "口令错!请重新输入" Text1.SetFocus Else MsgBox "你无权使用本系统" End IfEnd IfEnd Sub返回5.4 Select Case语句语句Select Case的结构形式为:Select Case <测试表达式>[Case <表达式列表1>[<语句块1>]][Case <表达式列表3>[<语句块2>]]…[Case <表达式列表n>[<语句块n>]][Case Else[<语句块n+1>]]End Select格式说明:(1)“测试表达式”可以是数值表达式或字符串表达式。
2)“表达式列表”与“测试表达式”的类型必需相同3)“表达式列表”由下表形式的表达式组成4)当使用多个表达式组成列表时,表达式与表达式之间要用英文逗号“,”隔开形式示例说明(1)表达式Case 100+a数值或字符串表达式(2)一组用逗号分隔的枚举值Case 2,4,6,8测试表达式的值等于2,4,6,8之一(3)表达式1 To表达式2Case 1 To 101 ≤ 测试表达式 ≤ 10(4)Is 关系运算符表达式Case Is > 20 测试表达式 > 20Select Case语句功能:根据“测试表达式”的值,选择第一个符合条件的语句块执行Select Case语句的执行过程是:先求“测试表达式”的值,然后顺序测试该值符合哪一个Case子句中情况,如果找到了,则执行该Case子句下面的语句块,然后执行End Select后面的语句;如果没找到,则执行Case Else后面的语句块,然后执行End Select后面的语句【例5.7】用Select Case语句代替ElseIf语句来实现成绩的鉴定保持界面不变,双击“鉴定”按钮,修改代码如下:Private Sub Command1_Click() '单击“鉴定”按钮Dim x! '单击“鉴定”按钮 x = Text1.Text Select Case x Case Is >= 90 Text2.Text = "优秀" Case Is >= 80'在x≥90不成立时,再判断x≥80是否成立 Text2.Text = "良好" Case Is >= 70 Text2.Text = "中" Case Is >= 60 Text2.Text = "及格" Case Else Text2.Text = "不及格" End SelectEnd Sub【例5.8】某交易中介公司按交易双方成交额收取中介费用,收费标准如下:交易额>=10000 5%5000=<交易额<10000 3%1000=<交易额<5000 2%500=<交易额<1000 1%交易额<500 免费假设交易额通过文本框Text1输入,则“计算费用”按钮Command1的事件代码如下:Private Sub Command1_Click() Trade=Val(Text1.Text) Select Case Trade Case Is<500 Discount=0 Case Is<1000 Discount=0.01 Case Is<5000 Discount=0.02 Case Is<10000 Discount=0.03 Case Else Discount=0.05 End Select Fee = Trade * Discount Print FeeEnd Sub在解决多分支选择情况的程序时,采用Select Case语句比较方便,并且程序结构清楚,便于阅读和修改。
IIf 函数VB中还提供了一个选择函数IIf 函数,用来实现简单的选择结构其功能是根据表达式的值,来返回两部分中的一个其语法格式为:IIf(<测试表达式>, <真值部分>, <假值部分>)例如,求分段函数:y= 函数值的语句可以简单地表示为:y=Iif(x<0,2*x+3,4-3*x)返回5.5 应用举例应用举例【例5.9】:猜数游戏由计算机任意设置一个1~100之间的整数,然后让用户猜出这个数是多少说明:为了引导用户猜中由计算机设置的随机数,可以在猜数的过程中给以适当的提示即在每次猜完之后,计算机显示相应的提示信息,用户可以根据这些信息继续猜,逐步接近要猜的数,直至猜中当用户猜的数与目标数之间相差不超过2时,提示“接近了”;相差不超过10时,提示“有些远”;相差超过10时,提示“太远了”Private Sub Form_Load() Cls Randomize number = Int(Rnd * 100) + 1 MsgBox "计算机设置了一个1~100之间的整数," & vbCrLf & _ "请您猜出这个数是多少" & vbCrLf & _ "如果输入-1,则停止猜数,并输出要猜的数。
"End SubPrivate Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)Dim guess, diff, k As IntegerIf KeyCode = 13 Then guess = Val(Text1.Text) If guess = -1 Then MsgBox "要猜的数是" & number: Exit Sub diff = Abs(number - guess) If diff = 0 Then k = 0 ElseIf diff <= 2 Then k = 1 ElseIf diff <= 10 Then k = 2 Else k = 3 End If Select Case k Case 0 MsgBox "恭喜你,猜对了!" Case 1 MsgBox "接近了,再努力!" Case 2 MsgBox "有些远,再努力!" Case 3 MsgBox "太远了,继续努力!" End SelectEnd IfEnd Sub【例5.10】:编程计算某年某月某日是星期几。
分析:该程序大致可分为三部分:(1)输入部分:输入年、月、日,可通过InputBox函数来实现2)计算部分:用来完成对输入的日期是星期几的计算,因此它是本题的关键在这一部分应解决以下几个问题:①判断平年、闰年•凡是能被4 整除但不能被100整除的年份为闰年,如1980年•凡是能被400整除的年份为闰年,如2000年•除以上两种情况以外的其余年份都是平年②计算总天数总天数的计算公式为:总天数=平年累积值+闰年累积值+月累积值+日期③计算星期几查阅有关资料可知,1899年12月31日是星期日,因此可把week的值定为1;week的初值加上总天数并对7取模,所得的余数即为星期几3)输出部分:把计算结果以适当的格式输出程序如下 :Private Sub Form_Click()'输入部分Dim Y, M, D, Month2, day0, day1, daysum, week As IntegerY = InputBox("请输入当前日期" & "先输入年份(1901-2100)")M = InputBox("请输入月份(1~12):")D = InputBox(" 请输入日(1~31):")'计算部分If ((Y Mod 100 <> 0) And (Y Mod 4 = 0) Or (Y Mod 100 = 0) And (Y Mod 400 = 0)) Then Month2 = 29Else Month2 = 28End IfSelect Case M Case 1 day0 = 31 day1 = 0 Case 2 day0 = Month2 day1 = 31 Case 3 day0 = 31 day1 = Month2 + 31 Case 4 day0 = 30 day1 = Month2 + 62 Case 5 day0 = 31 day1 = Month2 + 92 Case 6 day0 = 30 day1 = Month2 + 123 Case 7 day0 = 31 day1 = Month2 + 153 Case 8 day0 = 31 day1 = Month2 + 184 Case 9 day0 = 30 day1 = Month2 + 215 Case 10 day0 = 31 day1 = Month2 + 245 Case 11 day0 = 30 day1 = Month2 + 276 Case 12 day0 = 31 day1 = Month2 + 306End SelectIf (D <= day0) Or (D > 1) Then daysum = (Y - 1901) + (Y - 1901) / 4 + day1 + D daysum = Int(daysum + 0.5)Else MsgBox "数据输入错误!"End Ifweek = (week + daysum) Mod 7'输出部分Print Y; “年”; M; “月”; D; “日是”;Select Case week Case 0 Print "----星期日----" Case 1 Print "----星期一---" Case 2 Print "----星期二----" Case 3 Print "----星期三----" Case 4 Print "----星期四----" Case 5 Print "----星期五----" Case 6 Print "----星期六----"End SelectEnd Sub本章小结本章中主要介绍了一种常用的程序控制结构——选择结构以及VB中提供的用来实现选择结构流程控制的语句:•块结构条件语句If…Then…End If•多分支选条件语句ElseIf•多分支选择语句Select Case…End Select在解决实际问题时,经常使用块结构的选择语句,因为这种语句既可以解决单分支也可以解决多分支的选择问题,并且结构相对较好,灵活性较强。
最后,通过一些综合性的例子讲述了各种选择结构的程序的解决方法需要重点掌握每种语句的语法结构以及使用情况,会适当的运用各种语句解决问题,尤其注意语句的嵌套使用情况,避免产生混乱。
