1 / 46

第5章

第5章. 选择结构 程序设计. 本章要点: 条件语句 单行结构条件语句 If...Then...Else ... 块结构条件语句 If...Then…EndIf 多分支选择语句 Select Case...End Select 语句的嵌套. 特点: 根据条件是否成立,决定程序的执行分支. 引言. 顺序结构程序的执行次序是按语句的先后排列次序依次执行的,然而,计算机在处理实际问题时,往往需要根据条件是否成立,决定程序的执行方向,在不同的条件下,进行不同的处理。假如遇到这样一个问题:. |x| x≤0 lnx x>0. Y=.

bart
Download Presentation

第5章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第5章 选择结构程序设计 • 本章要点: 条件语句 • 单行结构条件语句If...Then...Else ... • 块结构条件语句If...Then…EndIf • 多分支选择语句Select Case...End Select • 语句的嵌套 特点: 根据条件是否成立,决定程序的执行分支

  2. 引言 • 顺序结构程序的执行次序是按语句的先后排列次序依次执行的,然而,计算机在处理实际问题时,往往需要根据条件是否成立,决定程序的执行方向,在不同的条件下,进行不同的处理。假如遇到这样一个问题: |x| x≤0 lnx x>0 Y= 在输入变量x的值之后,需根据x的不同取值范围做不同的处理,使用顺序结构的程序无法解决这一问题的。本章将介绍解决此类问题的语句结构。

  3. 条件 T F 语句组1 语句组2 5.1 单行结构条件语句 • 1. 格式 • If<条件>Then [<语句组1>] [Else<语句组2>] • 2. 功能 • 如果<条件>成立(True),则执行<语句组1> • 否则执行<语句组2> 例:If x <= 0 Then y = abs(x) Else y = log(x)

  4. 3. 说明 • (1) <条件> 可以是: • 关系表达式;布尔表达式 • 例:If x > 0 Then y = 1 Else y = -1 • 例:If x > 0 And x < 10 Then y = 1 Else y = -1 • 数值表达式:0为False;非0为True • 例:x = 5 • If x Then y = 1 Else y = -1 • 字符串表达式:"0"为False;非"0"为True • (2) 可以没有Else部分,这时必须有<语句组1> • 例:If X<>"aaa" Then Print X

  5. (3) <语句组1>、<语句组2>: 可以有多条语句,各语句之间用冒号隔开。 • 例: • If N>0 Then A=A+B:B=B+A Else A=A-B:B=B-A • (4) 应作为一条语句书写。如果语句太长需要换行,必须在折行处使用续行符号。 • 例:If N>0 Then A=A+B:B=B+A Else_ • A=A-B:B=B-A

  6. 例: • (5) 无论条件是否成立,都具有共同出口 X = 2 If X >= 0 Then X = 1 + X Else X = 5 - X Y = 1 - X Print "Y="; Y 共同出口 X = -2 If X >= 0 Then X = 1 + X Else X = 5 - X Y = 1 - X Print "Y="; Y (6) 单行结构条件语句可以嵌套 IF ... THEN...IF ... THEN ...ELSE ...ELSE…

  7. Text1 Label3 Command1 • 【例5-1】设界面如下图所示,用文本框输入x的值,单击“计算Y”按钮时,根据以下公式计算y的值。 |x| x≤0 lnx x>0 y=

  8. 代码如下: Private Sub Command1_Click() X = Val(Text1.Text) If X <= 0 Then Y = Abs(X) Else Y = Log(X) Label3.Caption = Y End Sub

  9. Y 第一象限 X>0,Y>0 第二象限 X<0,Y>0 X 第三象限 X<0,Y<0 第四象限 X>0,Y<0 • 【例5-2】平面直角坐标系中,不同的象限内,点的坐标的符号有以下4种情况: 任意输入一对坐标值,找出它所在的象限。如果X=0或Y=0则给出提示“该点不在任何象限内”。

  10. 代码如下: Private Sub Command1_Click() X = Val(Text1.Text) Y = Val(Text2.Text) If X = 0 Or Y = 0 Then _ Print "该点不在任何象限内": Exit Sub IfX > 0 ThenIf Y > 0 Then Print "IN A" _ Else Print "IN D"ElseIf Y > 0 Then _ Print "IN B" Else Print "IN C" End Sub

  11. 5.2 块结构条件语句 • 例 • If x > 10 Then • y = x - 10 • ElseIf x > 5 Then • y = x - 5 • ElseIf x > 0 Then • y = x • Else • Print "error" • End If • 1.格式 • If <条件1>Then • [<语句组1>] • [ElseIf <条件2>Then • [<语句组2>]] • …… • [ElseIf <条件N> Then • [<语句组N>]] • [Else • [<其他语句组>]] • End If

  12. T F 条件1 T F 条件2 语句组1 …… 语句组2 T F 条件n 语句组n 语句组n+1 2. 功能

  13. 3. 说明 • 整个块结构必须以If语句开头,End If语句结束 • 除了第一行的If语句和最后一行的End If语句是必须的以外,ElseIf子句和Else子句都是可选的。 • 两种常见的简化形式: 形式一: If <条件> Then <语句组1> Else <语句组2> End If 形式二: If <条件> Then <语句组> End If

  14. 【例5-3】将例5-2改成用块结构条件语句实现。 Private Sub Command1_Click() X = Val(Text1.Text) : Y = Val(Text2.Text) If X = 0 Or Y = 0 Then Print "该点不在任何象限内" ElseIf X > 0 And Y > 0 Then Print "在第一象限" ElseIf X < 0 And Y > 0 Then Print "在第二象限" ElseIf X < 0 And Y < 0 Then Print "在第三象限" Else Print "在第四象限" End If End Sub

  15. 【例5-4】输入华氏温度F,利用公式C=5/9*(F-32)转换成摄氏温度C,根据转换结果C的不同值,按以下要求给出相应的提示。【例5-4】输入华氏温度F,利用公式C=5/9*(F-32)转换成摄氏温度C,根据转换结果C的不同值,按以下要求给出相应的提示。 C>40时,打印"HOT " 30<C≤40时,打印" WARM " 20<C≤30时,打印" ROOM TEMPERATURE " 10<C≤20时,打印" COOL " 0<C≤10时,打印" COLD " C≤0时,打印" FREEZING"

  16. Text1 Text2 • 设计界面:

  17. Private Sub Command1_Click() • C = 5 / 9 * (Val(Text1.Text) - 32) • Text2.Text = Format(C, "0.00") • If C > 40 Then • Label2.Caption = "HOT" • ElseIf C >30 Then • Label2.Caption = "WARM" • ElseIf C >20 Then • Label2.Caption = "ROOM TEMPERATURE" • ElseIf C >10 Then • Label2.Caption = "COOL" • ElseIf C >0 Then • Label2.Caption = "COLD" • Else • Label2.Caption = "FREEZING" • End If • End Sub

  18. 4. 注意 • 1) ElseIf不能写成Else If,即中间不能有空格。 • 2) 可以将If语句、ElseIf子句、Else子句、和End If语句左对齐,而各语句组向右缩进若干空格,以使程序结构更清楚。 • 3) 严格按格式要求书写,不可随意换行或将两行合并成一行。例如,对于条件结构: • If x >= 0 Then • y = 1 • Else • y = 2 • End If 以下两种写法都是错误的: 写法一: If x>=0 Then y=1 Else y = 2 End If 写法二: If x=1 Then y=10 Else y = 20 End If

  19. 5.3 多分支选择语句 2. 功能 根据测试表达式的值,按顺序匹配Case后的表达式,如果匹配成功,则执行该Case下的语句块,然后转到End Select语句之后继续执行。 • 1. 格式 • Select Case <测试表达式> • Case <表达式表1> • [<语句组1>] • [Case <表达式表2> • [<语句组2>]] • … • [Case Else • [<语句组n>]] • End Select

  20. 匹配 表达式表1 F T 语句组1 匹配表达式表2 F T …… 语句组2 匹配表达式表n F T 语句组n 语句组n+1 多分支选择语句的功能流程图:

  21. 3. 说明 • 1) <测试表达式> : 数值或字符表达式 • 2) Case 后的<表达式表>可以为如下形式: • ① 表达式1[,表达式2]... • 如: Case 1 , 3 , 5 • ② 表达式1 TO 表达式2 • 如: Case 10 TO 30 • Case "A" TO "Z" • ③ Is <关系运算符><表达式> • 如: Case Is >= 10 • Case Is = 0 与 Case 0 相同 • 且三种形式可以混用,如: • Case Is < -5 , 0 , 5 To 100

  22. Text1 Text2 Command1 【例5-5】按以下公式求分段函数y的值。 ex+e-x x<0 1.25 x=0 lgx x>0 Y= 设运行时从文本框Text1输入x的值,单击命令按钮Command1计算Y的值,结果显示于文本框Text2中,界面如下:

  23. 命令按钮Command1的Click事件过程: Private Sub Command1_Click() X = Val(Text1.Text) ' 输入X的值 Select Case X ' <测试表达式>为X Case Is < 0 Y = Exp(X) + Exp(-X) Case 0' 或 Case Is=0 Y = 1.25 Case Is > 0 Y = Log(X) / Log(10) End Select Text2.Text = Format(Y, "0.000000") End Sub

  24. 4. 注意 1) <测试表达式>的类型应与各Case后的表达式类型一致。 2) 不能在Case后的表达式中使用<测试表达式>中的变量。例如: Select Case X Case X < 0 ' 在这里使用了变量X,是错误的 Y = Exp(X) + Exp(-X) Case X=0 ' 在这里使用了变量X,是错误的 Y = 1.25 Case X > 0 ' 在这里使用了变量X,是错误的 Y = Log(X) / Log(10) End Select

  25. 3) <测试表达式>只能是一个变量或一个表达式,而不能是变量表或表达式表。例如,检查变量X1、X2、X3之和是否小于零,不能写成: Select Case X1,X2,X3 ' 错误写法 Case X1+X2+X3 < 0 … End Select 而应该写成: Select Case X1+X2+X3' 正确写法 Case Is < 0 … End Select

  26. 4) 不要在Case后使用布尔运算符表示条件 例如,要表示条件0<X<100,不能写成: Select Case X Case Is>0 And Is<100 ' 使用了And, 是错误的 … End Select 对于较复杂的条件,可以用块结构条件语句来实现,而有些条件完全可以转换成Case语句允许的几种形式之一。

  27. 【例5-6】某运输公司对用户计算运费,距离越远,每公里运费越低,计算标准如下:【例5-6】某运输公司对用户计算运费,距离越远,每公里运费越低,计算标准如下: 距离<250km 没有折扣 250km≤距离<500km 2%折扣 500km≤距离<1000km 5%折扣 1000km≤距离<2000km 8%折扣 2000km≤距离<3000km 10%折扣 3000km≤距离 15%折扣

  28. 分析: 设每公里每吨货物的基本运费为Price, 货物重为Weight, 运输距离为Distance, 折扣为Discount, 则总运费Freight的计算公式为: Freight= Price * Weight * Distance * (1 - Discount)

  29. Text1 Text2 Text3 Text4 Command1 设计界面如下图:

  30. Command1的Click事件过程如下: Private Sub Command1_Click() Price = Val(Text1.Text) Weight = Val(Text2.Text) Distance = Val(Text3.Text) Select Case Distance Case Is < 250 Discount = 0 Case Is < 500 Discount = 0.02 Case Is < 1000 Discount = 0.05

  31. Case Is < 2000 Discount = 0.08 Case Is < 3000 Discount = 0.1 Case Else Discount = 0.15 End Select Freight = Price * Weight * Distance * _ (1 - Discount) Text4.Text = Freight End Sub

  32. 5.5 条件语句的嵌套 如果在条件成立或不成立的情况下要继续判断其他条件,则可以使用嵌套的条件语句来实现,也就是在语句组中再使用另一个条件语句。

  33. 例:输入年份和月份,求该月的天数。 已知: (1)当月份为1、3、5、7、8、10、12时,天数为31天;当月份为4、6、9、11时,天数为30天;当月份为2时,如果为闰年则天数为29天,否则为28天。 (2)某年为闰年的条件是:年份能被4整除,但不能被100整除;或年份能被400整除。

  34. 设计界面: Text1 Text2 Text3

  35. 代码: Private Sub Command1_Click() Dim Ynum As Integer, Mnum As Integer Ynum = Val(Text1.Text) Mnum = Val(Text2.Text) Select Case Mnum Case 1, 3, 5, 7, 8, 10, 12 Text3.Text = 31 Case 4, 6, 9, 11 Text3.Text = 30

  36. Case 2 If (Ynum Mod 4 = 0 And_ Ynum Mod 100 <> 0) Or _ (Ynum Mod 400 = 0) Then Text3.Text = 29 Else Text3.Text = 28 End If End Select End Sub

  37. 5.6 应用举例 • 【例5-8】求一元二次方程ax2+bx+c=0的解 • 分析: • 1) 如果a=0,则不是二次方程,此时如果b=0,则提示重新输入系数;如果b 0,则: x=-c/b • 2) 如果a  0,且b2-4ac=0,则有两个相等的实根 • 3) 如果a  0,且b2-4ac>0,则有两个不等的实根 • 4) 如果a  0,且b2-4ac<0,则有两个共轭复根

  38. Text1 Text2 Command1 Text3 • 设计界面: 运行界面:

  39. Private Sub Command1_Click() • A = Val(Text1.Text): B = Val(Text2.Text) • C = Val(Text3.Text): Cls • CurrentX = 600: CurrentY = 1100 • If A = 0 Then • If B = 0 Then • MsgBox "系数为零,请重新输入" • Text1.SetFocus • Text1.SelStart = 0 • Text1.SelLength = Len(Text1.Text) • Else • X = -C / B • Print "X="; Format(X, "0.000") • End If • Exit Sub ' • End If

  40. Delta = B ^ 2 - 4 * A * C • Select Case Delta • Case 0 • Print "X1=X2="; Format(-B / (2 * A), "0.000") • Case Is > 0 • X1 = (-B + Sqr(Delta)) / (2 * A) • X2 = (-B - Sqr(Delta)) / (2 * A) • Print "X1="; Format(X1, "0.000") • CurrentX = 600: CurrentY = 1300 • Print "X2="; Format(X2, "0.000") • Case Is < 0 • A1 = -B / (2 * A) • A2 = Sqr(Abs(Delta)) / (2 * A)

  41. Print "X1="; Format(A1, "0.000"); "+"; _ • Format(A2, "0.000"); "i" • CurrentX = 600 • CurrentY = 1300 • Print "X2="; Format(A1, "0.000"); "-"; _ • Format(A2, "0.000"); "i" • End Select • End Sub

  42. Text1 Label2 • 【例5-9】设计一个口令检测程序,界面如下图,当用户输入的口令正确时,显示“恭喜!您已成功进入本系统”,否则,显示,“口令错!请重新输入”。如果连续两次输入了错误口令,在第三次输入完口令后则显示一个消息框,提示“对不起,您不能使用本系统”,然后结束程序的执行。

  43. 分析:界面中用一个文本框Text1接受口令,Text1的属性设置如下:分析:界面中用一个文本框Text1接受口令,Text1的属性设置如下: • PasswordChar:* • MaxLength:6 • 要求运行时在用户输入完口令并按回车键时对口令进行判断,因此本例使用了文本框Text1的KeyUp事件过程,当焦点在文本框时,松开键盘任一键后产生KeyUp事件,同时返回按键代码KeyCode。回车键的KeyCode为13,所以程序首先判断如果用户在Text1中按下了回车键,表示口令输入完,再判断口令是否正确。 • Text1的KeyUp事件过程如下:

  44. Private Sub Text1_KeyUp(KeyCode As Integer, _ Shift As Integer) • Static I As Integer' 保存输入错误口令的次数 • If KeyCode = 13 Then' 如果按下的键为回车键 • IfUCase(Text1.Text) = "HELLO" Then • Label2.Caption = "恭喜!,您已成功进入本系统" • ElseIf I = 0 Or I = 1 Then • I = I + 1 • Label2.Caption = "口令错!,请重新输入" • Text1.SelStart = 0 • Text1.SelLength = Len(Text1.Text) • Else • MsgBox "对不起,您不能使用本系统": End • End If • End If • End Sub

  45. 本章小结 1.单行结构条件语句 If <条件> Then [<语句组1>] [Else <语句组2>] 2. 块结构条件语句 If <条件1> Then [<语句组1>] [ElseIf <条件2> Then [<语句组2>]] … [ElseIf <条件n> Then [<语句组n>]] [Else [<语句组n+1>]] End If

  46. 3. 多分支选择语句 • Select Case <测试表达式> • Case <表达式表1> • [<语句组1>] • [Case <表达式表2> • [<语句组2>]] • … • [Case <表达式表n> • [<语句组n>]] • [Case Else • [<语句组n+1>]] • End Select

More Related