程序流程有三种最基本的控制结构,即顺序结构、选择结构和.ppt
第4章,选择结构程序设计,本章主要内容,第4章 选择结构程序设计,退出,选择程序结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程 4.1 条件表达式 示例 If x = 5 Then y = x + 1 If a>1 And b0 Then x = 1 结果是true/false 4.2 If语句(也称条件语句) 两种格式的If语句: If . Then If . Then . Else,选择结构程序设计,关系表达式(表4.1),逻辑表达式(表4.2),格式: If 条件 Then 语句组 或 If 条件 Then 语句组 End If 功能:若条件成立(值为真),则执行Then后面的语句组,否则直接执行下一条语句或“End If”的下一条语句,4.2.1 单分支If语句 (If.Then),多行(块)结构,单行结构,正例: If a < 12 Then y=2正例: If a < 12 Then y=2 End If错例:If a < 12 Then y=2 End If,格式: If 条件 Then 语句组1 Else 语句组2 End If 功能:首先测试条件(E),如果条件成立(即值为真),则执行Then后面的语句组1,如果条件不成立(即值为假),则执行Else后面的语句组2。而在执行Then或Else之后的语句组后,会从End If之后的语句继续执行。,4.2.2 双分支If语句,实现一些简单的条件判断分支结构 格式: IIf(条件,条件为真时的值,条件为假时的值) 功能:对条件进行测试,若条件成立(为真值),则取第一个值(即“条件为真时的值”),否则取第二个值(即“条件为假时的值”)。 例如,将a、b中的小数,放入Min变量中: Min=IIf(ab,a,b),4.2.3 IIf函数,1. 下列字符中,_字符最大,_字符最小。 A. 1 B. Z C. * D. a 2. 假设a=1,b=2,下列逻辑表达式中其值为真的有 A. a=0 And b>2 C. a "ab" D. a>=0 And Not b0 And b>0,请你给出答案,想一想,思考题,最大字符:D最小字符:C,FFTTT,Private Sub Form_Load() Show a = 1: b = 3 c = 2 * a - b a = IIf(c a Then a = a + 1 c = c - 1 Else a = a - 1 End If Print a, b, cEnd Sub,下列程序的运行结果是?,想一想,思考题,2 5 -2,例4.1a,(1)创建应用程序的用户界面和设置对象属性 (2)编写程序代码 功能要求:用户在“a=”文本框(Text1)、“b=”文本框(Text2)和“c=”文本框(Text3)中输入数据,单击“判断”按钮后,则在“最大数”文本框(Text4)中输出结果,例4.2 输入三个数a、b、c,求出其中最大数,例4.2,Private Sub Command1_Click() 'm用来存放较大值 Dim a As Integer, b As Integer Dim c As Integer, m As Integer a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) If a > b Then m = a Else m = b End If If c > m Then m = c Text4.Text = m End Sub,程序代码 程序流程图,Then和Else后面的语句组包含另一个条件语句 1.一般格式 If 条件1 Then If 条件2 Then End If Else End If 使用条件语句嵌套时,一定要注意If与Else,If与End If的配对关系。,4.2.4 If语句的嵌套,例如:0时至12时,显示“早上好” 利用窗体装载(Load)事件,采用Print直接在窗体上输出结果 Private Sub Form_Load() Dim h As Integer Show '使print输出在窗体上的内容可见 h = Hour(Time() '取系统的时间 FontSize = 30 : ForeColor = RGB(255, 0, 0) BackColor = RGB(255, 255, 0) If h < 12 Then Print "早上好!" Else If h < 18 Then Print "下午好!" Else Print "晚上好!" End If End If End Sub,例4.3 根据不同的时间段发出问候语,例4.3,If 条件1 Then 语句块1 ElseIf 条件2 Then 语句块2 ElseIf 条件3 Then 语句块3 Else 语句块n End If 先测试条件1,如果为假,就依次测试条件2,依此类推,直到找到为真的条件。 一旦找到一个为真的条件时,VB会执行相应的语句组,然后执行End If语句后面的代码。 如果所有条件都是假,那么执行Else后面的语句组n,然后执行End If语句后面的代码。,If h < 12 Then Print "早上好!" ElseIf h < 18 Then Print "下午好!" Else Print "晚上好!" End If,2. ElseIf格式,Private Sub Form_Load() Show a = 1: b = 3 If a * 4 - 1 >= b Then If b > 5 Then b = b + 1 ElseIf b > 2 Then b = b - 1 Else b = b + 2 End If b = IIf(a = b, b + 1, b - 1) Print bEnd Sub,下列程序的运行结果是?,想一想,思考题,2,例4.3a,使用多分支语句Select Case也可以实现多分支选择。更有效、更易读,并且易于跟踪调试。 Select Case 测试表达式 Case 表达式表1 语句组1 Case 表达式表2 语句组2 . . . Case Else 语句组n End Select 先计算表达式的值,然后将该值依次与结构中的每个Case的值进行比较,如果该值符合某个Case指定的值条件时,就执行该Case的语句组,然后跳到End Select,从End Select出口。如果没有相符合的Case值,则执行Case Else中的语句组。,4.3 多分支语句,示例Select Case x Case -1 y=10 Case 1 y=20 Case Else y=30End Select,用Select Case语句来实现多分支选择功能, 程序代码如下: Private Sub Command1_Click() Dim score As Integer, temp As String score = Val(Text1.Text) temp = "成绩等级为:" Select Case score Case 0 To 59 Label2.Caption = temp + "不及格" Case 60 To 79 Label2.Caption = temp + "及格" Case 80 To 100 Label2.Caption = temp + “优良" Case Else Label2.Caption = "成绩出错" End Select End Sub,例4.4 判断成绩的等级(优良、及格、不及格),例4.4,提供选项让用户选择,如选择“是”或“否”,从列表中选择某一项等 选择的控件有: 单选按钮、复选框、列表框和组合框,4.4 选择性控件,1. 单选按钮的用途 单选按钮(OptionButton)控件由一个圆圈“”及紧挨它的文字组成,能提供“选中”和“未选中”两种可选项 成组形式出现 2. 常用属性 Caption属性 Value属性:表示单选按钮是否被选中,选中时Value值为True,否则为False。 使用单选按钮组时,选中其中一个,其余就会自动关闭 Alignment属性:设置单选按钮标题的对齐方式 3. 事件 Click事件 在应用程序中可以创建一个事件过程,检测控件对象Value属性值,再根据检测结果执行相应的处理,4.4.1 单选按钮,(1) 创建应用程序的用户界面和设置对象属性 单选按钮组; 初始状态:设置Option1的Value属性值设置为True,或通过代码“Option1.Value=True” 来实现 (2) 编写程序代码 功能要求,例4.5 用单选按钮组控制显示不同的字体,例4.5,程序代码如下: Private Sub Option1_Click() Text1.FontName = "宋体" End Sub Private Sub Option2_Click() Text1.FontName = "幼圆" End Sub Private Sub Option3_Click() Text1.FontName = "楷体_GB2312" End Sub 说明:程序代码中所用的字体号(如“宋体”、“幼圆”等)必须与系统提供的字体相一致,1. 复选框的用途 复选框(CheckBox) 控件由一个四方形小框和紧挨它的文字组成。提供“选中”和“未选中”两种可选项 复选框控件与单选按钮控件在使用方面的区别 2. 常用属性 Caption属性 Value属性:表示复选框的状态 有三种取值:0未选中(缺省值) 1选中 2不可用(灰色显示) Alignment属性;Style属性 3. 事件 复选框可响应的事件与单选按钮基本相同,4.4.2 复选框,(1)创建应用程序的用户界面和设置对象属性 多行文本框(带垂直滚动条)和四个复选框 (2)编写程序代码 功能要求:程序开始运行后,用户在文本框中输入一段文字(如“复选框应用示例”),然后按需要单击各复选框,则文字的字体、字型、字号及颜色随之改变,例4.6 用复选框来控制文字的字体、字型、字号及颜色,例4.6,Private Sub Check1_Click() If Check1.Value = 1 Then '判复选框1是否选中 Text1.FontName = "楷体_GB2312" Else Text1.FontName = "宋体" End IfEnd SubPrivate Sub Check2_Click() If Check2.Value = 1 Then '判复选框2是否选中 Text1.FontItalic = True Else Text1.FontItalic = False End IfEnd SubPrivate Sub Check3_Click() If Check3.Value = 1 Then '判复选框3是否选中 Text1.FontSize = 25 Else Text1.FontSize = 9 End IfEnd Sub,Private Sub Check4_Click() If Check4.Value = 1 Then '判复选框4是否选中 Text1.ForeColor = RGB(255, 0, 0) Else Text1.ForeColor = RGB(0, 0, 0) End If End Sub 在运行中,可以任意设定这四个复选框的状态,可以四项都不选,也可以选择其中一项至四项,计时器(Timer)每隔一定的时间间隔自动产生一次Timer事件(或称报时),可以根据这个特性来定时控制某些操作,或计时 运行时计时器不显示 Enabled属性:确定计时器是否可用 Interval属性:设置两个Timer事件之间的时间间隔,其值以毫秒(1ms=1/1000 s)为单位 计时器控件只响应一个Timer事件。也就是说,计时器控件对象在间隔了一个Interval设定时间后,便触发一次Timer事件,4.5 计时器控件,例4.7 建立一个电子时钟,(1) 创建应用程序的用户界面和设置对象属性 一个计时器控件和一个文本框。计时器控件Timer1的Interval属性值设定为1000(1秒) (2) 编写程序代码 Private Sub Timer1_Timer() 'timer事件过程 Text1.Text = Time() 'Time是时间函数 End Sub,例4.7,运行界面,设计界面,计时器(Timer)每隔一定的时间间隔自动产生一次Timer事件和执行Timer事件过程 这个时间间隔由Interval属性设定 利用这个特性来定时控制某些操作,例4.8 实现字体的放大,利用计时器可以按指定间隔时间对字体进行放大 (1)创建应用程序的用户界面和设置对象属性 一个计时器控件和一个标签 。 标签内显示文字“放大” 计时器控件Timer1的计时器采用默认的属性值 Enabled属性值为True(真),Interval属性值为0,例4.8,(2)编写程序代码 Private Sub Form_Load() Label1.Caption = "放大" Label1.Width = Form1.Width '把标签的高度和宽度 '设置为窗体相同尺寸 Label1.Height = Form1.Height Timer1.Interval = 800 End Sub Private Sub Timer1_Timer() If Label1.FontSize < 140 Then Label1.FontSize = Label1.FontSize * 1.2 Else Label1.FontSize = 8 End If End Sub,例4.9 电子倒计时器。先由用户给定倒计时的初始分秒数,然后开始倒计时,每隔1秒,时间值(总秒数)减1,直到时间值为0,停止倒计时。 计时器的Enabled属性值为True, Interval属性值为0,4.6 程序举例,例4.9,(2)编写程序代码 Dim t As Integer '在窗体模块的声明段中声明模块级变量 Private Sub Form_Load() Timer1.Interval = 1000 '设置每隔1秒触发1次Timer事件 Timer1.Enabled = False '关闭计时器 End Sub Private Sub Command1_Click() '“倒计时” t = Val(Text1.Text) * 60 + Val(Text2.Text) If t = 0 Then MsgBox "请输入倒计时的初始时间" Exit Sub 退出过程 End If Timer1.Enabled = True '打开计时器 End Sub,Private Sub Timer1_Timer() '每隔1秒自动执行一次 Dim m As Integer, s As Integer t = t - 1 m = t 60 '分钟数 s = t Mod 60 '秒数 Text1.Text = Format(m, "00") Text2.Text = Format(s, "00") If t = 0 Then Timer1.Enabled = False '关闭计时器 MsgBox "倒计时时间到!" End If End Sub,先在窗体上显示以下考题: 鸡兔同笼,已知鸡和兔总头数为h=23,总脚数为f=56,求鸡兔各有多少只? 再提供输入框由学生回答问题,然后采用输出框显示对答案的评判意见。 分析:设鸡数为j1,兔鸡数为t1,则有 j1 + t1 = h j1 = (4 * h - f) / 2 2*j1 + 4*t1 = f t1 = (f - 2 * h) / 2,例4.10 求鸡数和兔数,例4.10,当用户单击“答题”按钮时,程序提供输入对话框,由用户输入答案,再通过输出框显示评判意见。采用的程序代码如下: Private Sub Form_Load() Show Print FontSize = 18 Print Spc(9); "考一考你" FontSize = 13 Print Print Spc(5); "鸡兔同笼,已知鸡和兔总头数为23," Print Spc(3); "总脚数为56,求鸡兔各有多少?" End Sub,Private Sub Command1_Click() “答题” h = 23 : f = 56 '总头数及总脚数 j1 = (4 * h - f) / 2 '求出的鸡数 t1 = (f - 2 * h) / 2 '求出的兔数 j2 = Val(InputBox("鸡的只数是多少?", "请回答") t2 = Val(InputBox("兔的只数是多少?", "请回答") Select Case True '选择真值 Case j1 = j2 And t1 = t2 MsgBox "回答完全正确!" Case j1 = j2 MsgBox "鸡数回答正确,但兔数不对!" Case t1 = t2 MsgBox "兔数回答正确,但鸡数不对!" Case Else MsgBox "回答错误!" End Select End Sub,(1)分析:不管哪一年,1、3、5、7、8、10、12月份都有31天;4、6、9、11月份都有30天;而对2月份则要看是否是闰年,若是闰年有29天,平年有28天。 判断某一年是否闰年的逻辑表达式请见例4.1。,例4.11 输入一个月份,输出该月份有多少天,例4.11,Private Sub Command1_Click() “输出”按钮 Dim y As Integer, m As Integer, d As Integer y = Val(Text1.Text) m = Val(Text2.Text) Select Case m Case 1, 3, 5, 7, 8, 10, 12 d = 31 Case 4, 6, 9, 11 d = 30 Case 2 If (y Mod 4 = 0 And y Mod 100 0) Or (y Mod 400 = 0) Then d = 29 '闰年的2月有29天 Else d = 28 '平年的2月有28天 End If Case Else Text3.Text = "非法月份!" Exit Sub '退出过程 End Select Text3.Text = dEnd Sub,(1)分析:方程的解有以下几种可能: 若a=0,不是二次方程 若b2 - 4ac=0,有两个相等实根 若b2 - 4ac>0,有两个不等实根 若b2 - 4ac<0,有两个共轭复根 (2)程序框图程序框图 程序框图也称程序流程图,它能直观地表示程序的处理步骤,是一种描述算法的常用方法。 (3)建立应用程序的用户界面和设置对象属性 (4)编写程序代码,附加题 求一元二次方程ax2+bx+c0的解,程序框图,当用户在“a=”文本框(Text1)、“b=”文本框(Text2)和“c=”文本框(Text3)输入a,b,c的值后,单击“计算”按钮,则从“x1=”文本框(Text4)和“x2=”文本框(Text5)输出计算结果。 当输入的a,b,c为1,2,-8时,运行结果如下图,解题要求,Private Sub Command1_Click() Dim a As Single, b As Single, c As Single Dim D As Single, X1 As Single, X2 As Single Dim R As Single, P As Single a = Val(Text1.Text) '取数据a b = Val(Text2.Text) '取数据b c = Val(Text3.Text) '取数据c If a = 0 Then '当a=0 Text4.Text = "不是二次方程" Text5.Text = "不是二次方程" Else 'a0 D = b * b - 4 * a * c R = -b / (2 * a),If D = 0 Then 'D=0 Text4.Text = R Text5.Text = R ElseIf D > 0 Then 'D>0 X1 = (-b + Sqr(D) / (2 * a) X2 = (-b - Sqr(D) / (2 * a) Text4.Text = X1 Text5.Text = X2 Else 'D<0 P = Sqr(-D) / (2 * a) Text4.Text = R & "+" & P & "i" Text5.Text = R & "-" & P & "i" End If End If End Sub,