540 likes | 662 Views
第4章 程序结构. 4.1 顺序结构 4.2 选择结构 4.3 循环结构. 结束. 4.1 顺序结构. 4.1.1 赋值语句 4.1.2 Print 方法 4.1.3 With 结构. 返回首页. 返回本节. 返回首页. 4.1.1 赋值语句. 赋值语句是程序设计中最常用、最基本的语句,用于为变量或对象的属性赋值,格式如下: 格式 1 :变量名 = 表达式 格式 2 : [ 对象名 .] 属性名 = 表达式 在格式 2 中,若省略对象名,则默认对象为当前窗体。 对象类型变量的赋值比较特殊,需要使用 Set 关键字,格式如下:
E N D
第4章 程序结构 • 4.1 顺序结构 • 4.2 选择结构 • 4.3 循环结构 结束
4.1 顺序结构 • 4.1.1 赋值语句 • 4.1.2 Print方法 • 4.1.3 With结构 返回首页
返回本节 返回首页 4.1.1 赋值语句 赋值语句是程序设计中最常用、最基本的语句,用于为变量或对象的属性赋值,格式如下: 格式1:变量名 = 表达式 格式2:[对象名.]属性名 = 表达式 在格式2中,若省略对象名,则默认对象为当前窗体。 对象类型变量的赋值比较特殊,需要使用Set关键字,格式如下: Set 对象变量名 = 表达式
4.1.2 Print方法(1) 1. 用Print方法输出数据 Print方法用于在窗体、图片框或打印机等对象上输出数据,格式如下: [对象名.]Print [输出项列表][{;|,}] 说明: 对象名:可以是窗体、图片框或打印机等对象,若省略对象名,则在当前窗体上输出数据。 输出项列表:要输出的内容(表达式)。若有多个输出项,可用逗号或分号隔开。 分号(;):各输出项连续输出,中间无空格。
4.1.2 Print方法(2) 逗号(,):各输出项按分区格式输出,即将一个输出行以14个字符的宽度为单位分成若干区段(称为“打印区”),每个区段输出一个表达式的值。 如果调用Print方法的语句以分号或逗号结束,则下一次执行Print方法时将在同一行输出;否则,每执行一次Print方法即自动换行。 Print方法在Form_Load事件过程中不起作用。如果要在该事件中显示数据,必须在该过程内加上Form.Show方法或把窗体的AutoRedraw属性设置为True。 技巧:在输入Print关键字时可以只输入问号(?),VB会自动将其翻译成Print。
4.1.2 Print方法(3) 2. 与Print方法有关的函数 VB提供了Spc和Tab两个函数,用于配合Print方法对输出进行定位。 (1)Spc函数 格式: Spc(n) Spc函数用于插入n个空格。例如: Print "你好!"; Spc(8); "Hello!" 输出结果: 你好! Hello!
4.1.2 Print方法(4) (2)Tab函数 格式: Tab[(n)] Tab函数用于将输出位置定位于第n列。若省略参数n,则将插入点移动到下一个打印区的起点。如果n小于当前显示位置,则将输出位置移到下一行第n列。例如: Print "1234567890" Print "Hello"; Tab(10); "China" Print "Hello"; Tab; "China" Print "Hello"; Tab(4); "China "
返回本节 返回首页 4.1.2 Print方法(5) 若在窗体的Form_Click事件中加入以上代码,则单击窗体后输出如图4.2所示的结果。 图4.2 Tab函数示例
4.1.3 With结构(1) 使用With结构可以对某个对象执行一系列语句,而不用重复指出该对象的名称。With结构的格式如下: With 对象 语句块 End With 例如,要改变一个对象的多个属性,可以在With结构中添加为该对象的多个属性赋值的语句,此时只需引用对象一次而不是在每个属性赋值时都要引用它。下面的示例说明了如何使用With结构来给同一个对象的几个属性赋值。
4.1.3 With结构(2) '为文本框字体对象的多个属性赋值 With Text1.Font '下面只需输入圆点即可引用对象的属性或方法 .Name = "隶书"'字体名 .Size = 12'字号 .Bold = True'粗体 .Italic = True'斜体 .Underline = True'下划线 End With 注意:当程序一旦进入With结构,对象就不能改变。因此不能用一个With结构来设置多个不同的对象。
顺序结构示例 下面通过实例说明顺序结构程序设计的特点。 【例4.1】求一元二次方程ax2+bx+c=0的根。
顺序结构示例 设计步骤如下: (1)新建工程,在窗体上添加五个文本框、两个命令按钮和五个标签。文本框均采用默认名称,Text属性均为空。其他对象的属性设置如表4.1所示。 注:标签Label7用于显示二次方程通式的指数,六号字。
(2)编写代码。双击【计算】按钮,打开代码窗口,输入以下代码:(2)编写代码。双击【计算】按钮,打开代码窗口,输入以下代码: Private Sub cmdCalcu_Click() Dim a As Single, b As Single, c As Single Dim D As Single Dim x1 As Single, x2 As Single a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) D = b * b - 4 * a * c '二次方程求根的判别式 x1 = (-b + Sqr(D)) / (2 * a) '用求根公式计算x1和x2 x2 = (-b - Sqr(D)) / (2 * a) '显示结果,最多保留4位小数 Text4.Text = Format(x1, "0.####") Text5.Text = Format(x2, "0.####") End Sub
图4.3 二次方程求根 返回本节 返回首页 在【结束】按钮的单击事件中用End语句结束程序运行。 运行程序,单击【计算】按钮即可解出方程的根。运行效果如图4.3所示。
4.2 选择结构 • 4.2.1 If语句 • 4.2.2 Select Case语句 返回首页
4.2.1 If语句 • 1. If…Then结构 • 2. If…Then…Else结构 • 3. If...Then...ElseIf结构 • 4. If语句的嵌套 返回本节 返回首页
1. If…Then结构(1) If…Then结构的流程如图4.4所示。该结构表示“如果条件满足就执行Then后边的语句,否则不执行任何操作”。语法格式如下: (1)单行形式 If 条件Then 语句 (2)块(多行)形式 If 条件Then 语句块 End If
1. If…Then结构(2) 一般情况下,“条件”是运算结果为逻辑值的表达式,若表达式的值为True,则条件成立,若表达式的值为False,则条件不成立。“条件”也可以是运算结果为数值的表达式,此时VB将表达式的值解释成逻辑值:0为False,非零为True。 需要注意的是,If…Then的单行格式不用End If语句,整个语句必须写在一行上。如果条件为真时需要执行多条语句,所有语句必须在同一行上并且以冒号分开,如: If 条件Then 语句1:语句2:语句3 为了使程序便于维护,提高其可读性,建议尽量不要采用这种单行多句的形式。如果需要在Then关键字后面执行多条语句,应使用块形式的If…Then…End If结构。
1. If…Then结构(3) 【例4.2】编写程序,在文本框中输入一个整数,判断该数是不是偶数。 分析:判断某整数的奇偶性,可以检查该数能否被2整除。若某数能被2整除,则该数为偶数。 设计步骤如下: (1)建立用户界面,设置对象属性。各对象的属性如表4.2所示。 表4.2 例4.2对象属性
(2)编写程序代码。“判断”命令按钮的Click事件代码如下:(2)编写程序代码。“判断”命令按钮的Click事件代码如下: Private Sub Command1_Click() Dim x As Integer x = Val(Text1.Text) If x Mod 2 = 0 Then Label2.Caption = x & " 是偶数。" End If End Sub “清除”命令按钮Click事件的代码如下: Private Sub Command2_Click() Text1.Text = "" Label2.Caption = "" End Sub 运行结果如图4.5所示。
【例4.3】限制用户输入合法数据。 文本框是常用的数据输入控件,为了防止用户输入错误数据,可以在文本框的KeyPress事件中检查用户的按键。KeyPress事件有一个KeyAscii参数,用于传送或改变用户按键的ASCII码。在KeyPress事件过程中将KeyAscii设置为0即可取消按键。在本例中,要求只能输入数字,若输入非数字字符则取消本次按键。代码如下: Private Sub Text1_KeyPress(KeyAscii As Integer) If Not IsNumeric(Chr(KeyAscii)) And _ KeyAscii <> 8 Then KeyAscii = 0 End Sub 说明:IsNumeric是VB内部函数,用于判断参数是否为数字。“8”是回删键Backspace的ASCII码。
2. If…Then…Else结构 (1) (1)单行形式 If 条件Then 语句1 Else 语句2 (2)块形式 If 条件Then 语句块1 Else 语句块2 End If
2. If…Then…Else结构(2) 【例4.4】改进例4.2,使程序能判断整数的奇偶性。 分析:判断某数的奇偶性,就是检查该数能否被2整除,若能被2整除,该数为偶数,否则为奇数。 Private Sub Command1_Click() Dim x As Integer x = Val(Text1.Text) If (x Mod 2) = 0 Then Label2.Caption = x & " 是偶数" Else '增加Else子句, 显示奇数 Label2.Caption = x & " 是奇数" End If End Sub 返回本节 返回首页
3. If...Then...ElseIf结构(1) 语法格式如下: If 条件1 Then 语句块1 ElseIf 条件2 Then 语句块2 ... ElseIf 条件n Then 语句块n Else 语句块n+1 End If
3. If...Then...ElseIf结构(2) 【例4.5】改进例4.1求一元二次方程ax2+bx+c=0的根的程序,修正其中的缺陷。 分析:首先应判断方程中二次项的系数a:若a=0,则不是二次方程,不作求根运算;若a≠0,则根据判别式b2-4ac的值求根。方程的根有三种情况: ①b2-4ac=0,方程有两个相等的实根; ②b2-4ac>0,方程有两个不等的实根; ③b2-4ac<0,方程无实根,有两个共轭复根。
程序界面设计与例4.1相同。根据以上分析,将“计算”按钮单击事件过程的代码修改如下:程序界面设计与例4.1相同。根据以上分析,将“计算”按钮单击事件过程的代码修改如下: Private Sub cmdCalcu_Click() Dim a As Single, b As Single, c As Single Dim D As Single Dim x1, x2 '将x1、x2声明为变体型,可以存放不同类型的数据 a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) D = b * b - 4 * a * c '二次方程求根的判别式 If a = 0 Then 'a=0, 不是二次方程 x1 = "" x2 = "" ElseIf D = 0 Then 'a≠0, D=0, 方程有相等二实根 x1 = -b / (2 * a) x2 = x1 ElseIf D > 0 Then'a≠0, D>0, 方程有不等二实根
x1 = (-b + Sqr(D)) / (2 * a) x2 = (-b - Sqr(D)) / (2 * a) Else x1 = "无实根" 'a≠0, D<0, 无实根 x2 = x1 End If '显示结果,最多保留4位小数 Text4.Text = Format(x1, "0.####") Text5.Text = Format(x2, "0.####") End Sub 在上述代码中,变量D存放判别式(b2-4ac)的值。实际上,当D=0或D>0时,都是用求根公式计算x1和x2,因此可将两个ElseIf子句合并: ElseIf D >= 0 Then 'D≥0,方程有两个实根 x1 = (-b + Sqr(D)) / (2 * a) x2 = (-b - Sqr(D)) / (2 * a) 返回本节 返回首页
4. If语句的嵌套 嵌套是指在一个控制结构中插入另一个控制结构。If语句的嵌套是指在一个If语句中插入另一个If语句。内嵌的If语句可以出现在关键字Then或Else之后的语句块中。If语句嵌套常用于复杂的多分支选择,它的一般形式如下: If 条件1 Then … If 条件2 Then … End If … End If
4. If语句的嵌套 例如,例4.5中二次方程求根的If语句可以改为下面的形式: If a = 0 Then 'a=0, 不是二次方程 x1 = "" x2 = "" Else 'a≠0 If D >= 0 Then '内嵌If语句开始。D≥0,方程有两个实根 x1 = (-b + Sqr(D)) / (2 * a) x2 = (-b - Sqr(D)) / (2 * a) Else x1 = "无实根" 'D<0, 无实根 x2 = x1 End If '内嵌If语句结束 End If
4. If语句的嵌套 例如,例4.5中二次方程求根的If语句可以改为下面的形式: If a = 0 Then 'a=0, 不是二次方程 x1 = "" x2 = "" Else 'a≠0 If D >= 0 Then '内嵌If语句开始。D≥0,方程有两个实根 x1 = (-b + Sqr(D)) / (2 * a) x2 = (-b - Sqr(D)) / (2 * a) Else x1 = "无实根" 'D<0, 无实根 x2 = x1 End If '内嵌If语句结束 End If
4.2.2 Select Case语句(1) Select Case 测试表达式 Case 值表1 语句块1 Case 值表2 语句块2 … Case 值表n 语句块n Case Else 语句块n+1 End Select
形式 示例 说明 (1)表达式 Case 100+a 数值或字符串表达式 (2)一组用逗号分隔的枚举值 Case 2,4,6,8 测试表达式的值等于2,4,6,8之一 (3)表达式1 To 表达式2 Case 1 To 10 1 ≤测试表达式的值≤ 10 (4)Is 关系运算符表达式 Case Is > 20 测试表达式的值 > 20 4.2.2 Select Case语句(2) 说明: (1)“测试表达式”可以是数值表达式或字符串表达式。 (2)“值表”与“测试表达式”的类型必需相同。 (3)当使用多个表达式组成“值表”时,表达式与表达式之间要用逗号隔开。 (4) “值表”由以下形式的表达式组成:
4.2.2 Select Case语句(3) 【例4.6】设计一个程序,输入成绩,根据以下条件判断成绩的等级: 90~100 等级A 80~89 等级B 70~79 等级C 60~69 等级D 60以下等级E (1)新建工程,在窗体中添加两个标签,一个文本框,一个标题为“显示等级”的命令按钮。 (2)为“显示等级”按钮的单击事件编写如下代码:
4.2.2 Select Case语句(3) Private Sub Command1_Click() Dim Score As Integer Score = Val(Text1.Text) Select Case Score Case 90 To 100 Label2.Caption = Score & "分为等级A" Case 80 To 89 Label2.Caption = Score & "分为等级B" Case 70 To 79 Label2.Caption = Score & "分为等级C" Case 60 To 69 Label2.Caption = Score & "分为等级D" Case 0 To 59 Label2.Caption = Score & "分为等级E" Case Else Label2.Caption = "成绩有误,请重新输入!" End Select End Sub
4.3 循环结构 循环结构是指对同一程序段重复执行若干次,被重复执行的语句块称为循环体。循环体的执行与否以及次数多少视循环类型和条件而定。VB中常用的循环语句有For…Next语句和Do…Loop语句。For…Next循环用于已知循环次数的情况下,而Do…Loop循环主要用于不知道循环次数的情况下,在给定的条件满足时执行循环体。 • 4.3.1 For…Next循环 • 4.3.2 Do...Loop循环 • 4.3.3 循环的嵌套 返回首页
4.3.1 For…Next循环(1) For循环的语法格式如下: For 循环变量 = 初值To 终值 [Step 步长] [循环体] Next [循环变量] For…Next循环简称For循环。如果知道循环要执行多少次时,就可以使用For循环。For循环使用一个循环变量(计数器)控制循环体的执行次数。每执行一次循环之后,循环变量的值就会自动增加或者减少。
4.3.1 For…Next循环(2) 格式说明: 循环变量:必须为数值型。For和Next关键字后面的循环变量必须相同。 初值和终值:均为数值型,可以是数值表达式。 步长:数值型,可以是数值表达式,默认值为1。若步长为正数,应设初值≤终值;若步长为负数,应设初值≥终值,否则循环体不会被执行。步长不应为0,否则程序将陷入无限循环(死循环)。 循环体:在循环中被执行的语句块。若循环体中无语句,则为空循环。在循环体中可根据条件加入Exit For语句强制退出循环。Exit For通常出现在选择结构中。
4.3.1 For…Next循环(3) 【例4.7】编制程序,计算1+2+3+...+200的整数和。在窗体上放置一个命令按钮,编写如下代码: Private Sub Command1_Click() Dim Sum As Integer, i As Integer Sum = 0 For i = 1 To 200 Sum = Sum + i Next i Print " 1 + 2 + ... + 200 = " & Sum End Sub
4.3.1 For…Next循环(4) 【例4.8】制作ASCII码对照表。ASCII码(美国信息交换标准码)是7位二进制字符集,用来表示标准美制键盘上的字母、符号以及控制字符。其中,可打印字符的编码值范围为32~126(32=空格)。利用Chr函数可以将字符代码转换为对应的字符。 (1)设计界面。程序的界面很简单,窗体上无任何控件。将窗体的背景色设为白色,Caption属性设为“ASCII码表”。 (2)编写代码。由于可打印字符的ASCII码对照表具有明确的起止范围,因此,很适于用For…Next循环制作。单击窗体时,在循环中用Print方法将ASCII字符及其代码直接显示在窗体上,格式为“字符=字符代码”,每行显示8个字符及其代码,用Tab函数控制每个ASCII码的打印位置。
程序运行效果如图4.14所示。窗体单击事件的代码如下:程序运行效果如图4.14所示。窗体单击事件的代码如下: Private Sub Form_Click() Dim intASC As Integer Dim i As Integer Cls Print Me.FontSize = 10 '设置字号 Print Tab(29); "ASCII码对照表" Me.FontSize = 9 'String函数返回指定数目的重复字符 Print " "; String$(79, "-")
'intASC为循环变量,并代表要打印的ASCII码 For intASC = 32 To 126 Print Tab(10 * i + 3); _ Chr(intASC); " ="; intASC; i = i + 1 If i = 8 Then '每行显示8个ASCII码 i = 0 Print End If Next intASC Print vbCr; " "; String$(79, "-") End Sub
图4.14 ASCII码对照表 返回本节 返回首页
4.3.2 Do...Loop循环(1) Do...Loop循环简称Do循环,主要在循环次数未知时使用。Do循环有两类语法形式: 前测型循环(先判断,后执行) Do [{While|Until} 条件] [循环体] Loop 后测型循环(先执行,后判断) Do [循环体] Loop [{While|Until} 条件]
Do循环的流程图 使用While关键字的前测型和后测型Do循环的流程如图4.15和图4.16所示。使用Until关键字的Do循环与之相似,只需将图中的“T”和“F”互换位置即可。
4.3.2 Do...Loop循环(2) 说明: (1)前测型循环先判断条件,如果为真,执行循环体,否则退出,因此有可能一次也不执行循环体;后测型循环先执行循环体,然后判断条件,因此至少执行一次循环体。 (2)While关键字是指当条件为真时执行循环体;Until与之相反,条件为假时执行循环体,直到条件为真时退出循环。二者在功能上并无本质区别,只要将条件取反,就可以互相取代。例如,Do While x>=10与Do Until x<10是等价的。 (3)在循环体中可以插入Exit Do语句,随时跳出循环。Exit Do通常用于条件判断之后(如If...Then)。 (4)如果省略了“{While|Until} 条件”子句,则为无条件循环,此时应在循环体内适当位置插入Exit Do语句,否则会陷入死循环。
4.3.2 Do...Loop循环(3) 【例4.9】用Do While...Loop循环计算1到200的奇数和(1+3+5+...+199)。 在窗体上放置一个命令按钮,编写如下代码: Private Sub Command1_Click() Dim Sum As Integer, i As Integer Sum = 0 i = 1 Do While i <= 200 Sum = Sum + i i = i + 2 Loop Print " 1 + 3 + 5 + ... + 199 = " & Sum End Sub
4.3.2 Do...Loop循环(4) 上述功能亦可用For循环实现: For i = 1 To 200 Step 2 Sum = Sum + i Next 由此可见,Do循环完全可以代替For循环。尽管如此,在已知循环次数的情况下,还是应当使用For循环,它将使程序更加简洁,效率更高。
4.3.2 Do...Loop循环(5) 【例4.10】用“辗转相除法”求两个自然数m和n的最大公约数。 分析:用“辗转相除法”求最大公约数的计算方法如下: (1)两数相除(m除以n),取余数r; (2)若r≠0,则将除数改作被除数,余数改作除数(m←n,n←r),重复步骤(1)、(2),直到r = 0为止; (3)最后一次相除时所用的除数就是最大公约数。 程序设计: 本例采用Do...Loop Until循环实现。程序界面及运行效果如图4.18所示。
返回本节 返回首页 “计算”按钮单击事件的代码如下: Private Sub Command1_Click() Dim m As Integer, n As Integer, r As Integer m = Val(Text1.Text) n = Val(Text2.Text) '若数据超出有效范围,退出本过程 If m <= 0 Or n <= 0 Then Exit Sub Do '求最大公约数 r = m Mod n m = n n = r Loop Until r = 0 'r=0时退出循环 '退出循环时,m中存放的是最后的除数,即最大公约数 Label4.Caption = "两数的最大公约数 = " & m End Sub
4.3.3 循环的嵌套(1) 在循环结构中可以嵌套任何循环结构,也可以嵌套选择结构。 【例4.11】求100~200之间的素数。 分析:素数或称质数,是指一个大于1的整数,除了1和它本身以外不能被其他正整数整除,这个数就是素数。判断一个数n是否为素数,只要依次用2~ 作除数去除n,若n不能被其中任何一个数整除,则n即为素数。本题的求解可用双重循环实现,外循环遍历100~200之间的所有整数,内循环判断各数是否为素数。 程序设计:在窗体上添加一个命令按钮,设Caption属性为“开始”。运行时单击该按钮后用Print方法显示100~200之间的素数。“开始”按钮单击事件的代码如下: