460 likes | 702 Views
第5章. 选择结构 程序设计. 本章要点: 条件语句 单行结构条件语句 If...Then...Else ... 块结构条件语句 If...Then…EndIf 多分支选择语句 Select Case...End Select 语句的嵌套. 特点: 根据条件是否成立,决定程序的执行分支. 引言. 顺序结构程序的执行次序是按语句的先后排列次序依次执行的,然而,计算机在处理实际问题时,往往需要根据条件是否成立,决定程序的执行方向,在不同的条件下,进行不同的处理。假如遇到这样一个问题:. |x| x≤0 lnx x>0. Y=.
E N D
第5章 选择结构程序设计 • 本章要点: 条件语句 • 单行结构条件语句If...Then...Else ... • 块结构条件语句If...Then…EndIf • 多分支选择语句Select Case...End Select • 语句的嵌套 特点: 根据条件是否成立,决定程序的执行分支
引言 • 顺序结构程序的执行次序是按语句的先后排列次序依次执行的,然而,计算机在处理实际问题时,往往需要根据条件是否成立,决定程序的执行方向,在不同的条件下,进行不同的处理。假如遇到这样一个问题: |x| x≤0 lnx x>0 Y= 在输入变量x的值之后,需根据x的不同取值范围做不同的处理,使用顺序结构的程序无法解决这一问题的。本章将介绍解决此类问题的语句结构。
条件 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)
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
(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
例: • (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…
Text1 Label3 Command1 • 【例5-1】设界面如下图所示,用文本框输入x的值,单击“计算Y”按钮时,根据以下公式计算y的值。 |x| x≤0 lnx x>0 y=
代码如下: Private Sub Command1_Click() X = Val(Text1.Text) If X <= 0 Then Y = Abs(X) Else Y = Log(X) Label3.Caption = Y End Sub
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则给出提示“该点不在任何象限内”。
代码如下: 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
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
T F 条件1 T F 条件2 语句组1 …… 语句组2 T F 条件n 语句组n 语句组n+1 2. 功能
3. 说明 • 整个块结构必须以If语句开头,End If语句结束 • 除了第一行的If语句和最后一行的End If语句是必须的以外,ElseIf子句和Else子句都是可选的。 • 两种常见的简化形式: 形式一: If <条件> Then <语句组1> Else <语句组2> End If 形式二: If <条件> Then <语句组> End If
【例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
【例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"
Text1 Text2 • 设计界面:
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
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
5.3 多分支选择语句 2. 功能 根据测试表达式的值,按顺序匹配Case后的表达式,如果匹配成功,则执行该Case下的语句块,然后转到End Select语句之后继续执行。 • 1. 格式 • Select Case <测试表达式> • Case <表达式表1> • [<语句组1>] • [Case <表达式表2> • [<语句组2>]] • … • [Case Else • [<语句组n>]] • End Select
匹配 表达式表1 F T 语句组1 匹配表达式表2 F T …… 语句组2 匹配表达式表n F T 语句组n 语句组n+1 多分支选择语句的功能流程图:
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
Text1 Text2 Command1 【例5-5】按以下公式求分段函数y的值。 ex+e-x x<0 1.25 x=0 lgx x>0 Y= 设运行时从文本框Text1输入x的值,单击命令按钮Command1计算Y的值,结果显示于文本框Text2中,界面如下:
命令按钮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
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
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
4) 不要在Case后使用布尔运算符表示条件 例如,要表示条件0<X<100,不能写成: Select Case X Case Is>0 And Is<100 ' 使用了And, 是错误的 … End Select 对于较复杂的条件,可以用块结构条件语句来实现,而有些条件完全可以转换成Case语句允许的几种形式之一。
【例5-6】某运输公司对用户计算运费,距离越远,每公里运费越低,计算标准如下:【例5-6】某运输公司对用户计算运费,距离越远,每公里运费越低,计算标准如下: 距离<250km 没有折扣 250km≤距离<500km 2%折扣 500km≤距离<1000km 5%折扣 1000km≤距离<2000km 8%折扣 2000km≤距离<3000km 10%折扣 3000km≤距离 15%折扣
分析: 设每公里每吨货物的基本运费为Price, 货物重为Weight, 运输距离为Distance, 折扣为Discount, 则总运费Freight的计算公式为: Freight= Price * Weight * Distance * (1 - Discount)
Text1 Text2 Text3 Text4 Command1 设计界面如下图:
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
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
5.5 条件语句的嵌套 如果在条件成立或不成立的情况下要继续判断其他条件,则可以使用嵌套的条件语句来实现,也就是在语句组中再使用另一个条件语句。
例:输入年份和月份,求该月的天数。 已知: (1)当月份为1、3、5、7、8、10、12时,天数为31天;当月份为4、6、9、11时,天数为30天;当月份为2时,如果为闰年则天数为29天,否则为28天。 (2)某年为闰年的条件是:年份能被4整除,但不能被100整除;或年份能被400整除。
设计界面: Text1 Text2 Text3
代码: 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
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
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,则有两个共轭复根
Text1 Text2 Command1 Text3 • 设计界面: 运行界面:
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
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)
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
Text1 Label2 • 【例5-9】设计一个口令检测程序,界面如下图,当用户输入的口令正确时,显示“恭喜!您已成功进入本系统”,否则,显示,“口令错!请重新输入”。如果连续两次输入了错误口令,在第三次输入完口令后则显示一个消息框,提示“对不起,您不能使用本系统”,然后结束程序的执行。
分析:界面中用一个文本框Text1接受口令,Text1的属性设置如下:分析:界面中用一个文本框Text1接受口令,Text1的属性设置如下: • PasswordChar:* • MaxLength:6 • 要求运行时在用户输入完口令并按回车键时对口令进行判断,因此本例使用了文本框Text1的KeyUp事件过程,当焦点在文本框时,松开键盘任一键后产生KeyUp事件,同时返回按键代码KeyCode。回车键的KeyCode为13,所以程序首先判断如果用户在Text1中按下了回车键,表示口令输入完,再判断口令是否正确。 • Text1的KeyUp事件过程如下:
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
本章小结 1.单行结构条件语句 If <条件> Then [<语句组1>] [Else <语句组2>] 2. 块结构条件语句 If <条件1> Then [<语句组1>] [ElseIf <条件2> Then [<语句组2>]] … [ElseIf <条件n> Then [<语句组n>]] [Else [<语句组n+1>]] End If
3. 多分支选择语句 • Select Case <测试表达式> • Case <表达式表1> • [<语句组1>] • [Case <表达式表2> • [<语句组2>]] • … • [Case <表达式表n> • [<语句组n>]] • [Case Else • [<语句组n+1>]] • End Select