1 / 54

第4章 程序结构

第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 关键字,格式如下:

Download Presentation

第4章 程序结构

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. 第4章 程序结构 • 4.1 顺序结构 • 4.2 选择结构 • 4.3 循环结构 结束

  2. 4.1 顺序结构 • 4.1.1 赋值语句 • 4.1.2 Print方法 • 4.1.3 With结构 返回首页

  3. 返回本节 返回首页 4.1.1 赋值语句 赋值语句是程序设计中最常用、最基本的语句,用于为变量或对象的属性赋值,格式如下: 格式1:变量名 = 表达式 格式2:[对象名.]属性名 = 表达式 在格式2中,若省略对象名,则默认对象为当前窗体。 对象类型变量的赋值比较特殊,需要使用Set关键字,格式如下: Set 对象变量名 = 表达式

  4. 4.1.2 Print方法(1) 1. 用Print方法输出数据 Print方法用于在窗体、图片框或打印机等对象上输出数据,格式如下: [对象名.]Print [输出项列表][{;|,}] 说明: 对象名:可以是窗体、图片框或打印机等对象,若省略对象名,则在当前窗体上输出数据。 输出项列表:要输出的内容(表达式)。若有多个输出项,可用逗号或分号隔开。 分号(;):各输出项连续输出,中间无空格。

  5. 4.1.2 Print方法(2) 逗号(,):各输出项按分区格式输出,即将一个输出行以14个字符的宽度为单位分成若干区段(称为“打印区”),每个区段输出一个表达式的值。 如果调用Print方法的语句以分号或逗号结束,则下一次执行Print方法时将在同一行输出;否则,每执行一次Print方法即自动换行。 Print方法在Form_Load事件过程中不起作用。如果要在该事件中显示数据,必须在该过程内加上Form.Show方法或把窗体的AutoRedraw属性设置为True。 技巧:在输入Print关键字时可以只输入问号(?),VB会自动将其翻译成Print。

  6. 4.1.2 Print方法(3) 2. 与Print方法有关的函数 VB提供了Spc和Tab两个函数,用于配合Print方法对输出进行定位。 (1)Spc函数 格式: Spc(n) Spc函数用于插入n个空格。例如: Print "你好!"; Spc(8); "Hello!" 输出结果: 你好! Hello!

  7. 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 "

  8. 返回本节 返回首页 4.1.2 Print方法(5) 若在窗体的Form_Click事件中加入以上代码,则单击窗体后输出如图4.2所示的结果。 图4.2 Tab函数示例

  9. 4.1.3 With结构(1) 使用With结构可以对某个对象执行一系列语句,而不用重复指出该对象的名称。With结构的格式如下: With 对象 语句块 End With 例如,要改变一个对象的多个属性,可以在With结构中添加为该对象的多个属性赋值的语句,此时只需引用对象一次而不是在每个属性赋值时都要引用它。下面的示例说明了如何使用With结构来给同一个对象的几个属性赋值。

  10. 4.1.3 With结构(2) '为文本框字体对象的多个属性赋值 With Text1.Font '下面只需输入圆点即可引用对象的属性或方法 .Name = "隶书"'字体名 .Size = 12'字号 .Bold = True'粗体 .Italic = True'斜体 .Underline = True'下划线 End With 注意:当程序一旦进入With结构,对象就不能改变。因此不能用一个With结构来设置多个不同的对象。

  11. 顺序结构示例 下面通过实例说明顺序结构程序设计的特点。 【例4.1】求一元二次方程ax2+bx+c=0的根。

  12. 顺序结构示例 设计步骤如下: (1)新建工程,在窗体上添加五个文本框、两个命令按钮和五个标签。文本框均采用默认名称,Text属性均为空。其他对象的属性设置如表4.1所示。 注:标签Label7用于显示二次方程通式的指数,六号字。

  13. (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

  14. 图4.3 二次方程求根 返回本节 返回首页 在【结束】按钮的单击事件中用End语句结束程序运行。 运行程序,单击【计算】按钮即可解出方程的根。运行效果如图4.3所示。

  15. 4.2 选择结构 • 4.2.1 If语句 • 4.2.2 Select Case语句 返回首页

  16. 4.2.1 If语句 • 1. If…Then结构 • 2. If…Then…Else结构 • 3. If...Then...ElseIf结构 • 4. If语句的嵌套 返回本节 返回首页

  17. 1. If…Then结构(1) If…Then结构的流程如图4.4所示。该结构表示“如果条件满足就执行Then后边的语句,否则不执行任何操作”。语法格式如下: (1)单行形式 If 条件Then 语句 (2)块(多行)形式 If 条件Then 语句块 End If

  18. 1. If…Then结构(2) 一般情况下,“条件”是运算结果为逻辑值的表达式,若表达式的值为True,则条件成立,若表达式的值为False,则条件不成立。“条件”也可以是运算结果为数值的表达式,此时VB将表达式的值解释成逻辑值:0为False,非零为True。 需要注意的是,If…Then的单行格式不用End If语句,整个语句必须写在一行上。如果条件为真时需要执行多条语句,所有语句必须在同一行上并且以冒号分开,如: If 条件Then 语句1:语句2:语句3 为了使程序便于维护,提高其可读性,建议尽量不要采用这种单行多句的形式。如果需要在Then关键字后面执行多条语句,应使用块形式的If…Then…End If结构。

  19. 1. If…Then结构(3) 【例4.2】编写程序,在文本框中输入一个整数,判断该数是不是偶数。 分析:判断某整数的奇偶性,可以检查该数能否被2整除。若某数能被2整除,则该数为偶数。 设计步骤如下: (1)建立用户界面,设置对象属性。各对象的属性如表4.2所示。 表4.2 例4.2对象属性

  20. (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所示。

  21. 【例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码。

  22. 2. If…Then…Else结构 (1) (1)单行形式 If 条件Then 语句1 Else 语句2 (2)块形式 If 条件Then 语句块1 Else 语句块2 End If

  23. 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 返回本节 返回首页

  24. 3. If...Then...ElseIf结构(1) 语法格式如下: If 条件1 Then 语句块1 ElseIf 条件2 Then 语句块2 ... ElseIf 条件n Then 语句块n Else 语句块n+1 End If

  25. 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,方程无实根,有两个共轭复根。

  26. 程序界面设计与例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, 方程有不等二实根

  27. 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) 返回本节 返回首页

  28. 4. If语句的嵌套 嵌套是指在一个控制结构中插入另一个控制结构。If语句的嵌套是指在一个If语句中插入另一个If语句。内嵌的If语句可以出现在关键字Then或Else之后的语句块中。If语句嵌套常用于复杂的多分支选择,它的一般形式如下: If 条件1 Then … If 条件2 Then … End If … End If

  29. 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

  30. 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

  31. 4.2.2 Select Case语句(1) Select Case 测试表达式 Case 值表1 语句块1 Case 值表2 语句块2 … Case 值表n 语句块n Case Else 语句块n+1 End Select

  32. 形式 示例 说明 (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) “值表”由以下形式的表达式组成:

  33. 4.2.2 Select Case语句(3) 【例4.6】设计一个程序,输入成绩,根据以下条件判断成绩的等级: 90~100 等级A 80~89 等级B 70~79 等级C 60~69 等级D 60以下等级E (1)新建工程,在窗体中添加两个标签,一个文本框,一个标题为“显示等级”的命令按钮。 (2)为“显示等级”按钮的单击事件编写如下代码:

  34. 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

  35. 4.3 循环结构 循环结构是指对同一程序段重复执行若干次,被重复执行的语句块称为循环体。循环体的执行与否以及次数多少视循环类型和条件而定。VB中常用的循环语句有For…Next语句和Do…Loop语句。For…Next循环用于已知循环次数的情况下,而Do…Loop循环主要用于不知道循环次数的情况下,在给定的条件满足时执行循环体。 • 4.3.1 For…Next循环 • 4.3.2 Do...Loop循环 • 4.3.3 循环的嵌套 返回首页

  36. 4.3.1 For…Next循环(1) For循环的语法格式如下: For 循环变量 = 初值To 终值 [Step 步长] [循环体] Next [循环变量] For…Next循环简称For循环。如果知道循环要执行多少次时,就可以使用For循环。For循环使用一个循环变量(计数器)控制循环体的执行次数。每执行一次循环之后,循环变量的值就会自动增加或者减少。

  37. 4.3.1 For…Next循环(2) 格式说明: 循环变量:必须为数值型。For和Next关键字后面的循环变量必须相同。 初值和终值:均为数值型,可以是数值表达式。 步长:数值型,可以是数值表达式,默认值为1。若步长为正数,应设初值≤终值;若步长为负数,应设初值≥终值,否则循环体不会被执行。步长不应为0,否则程序将陷入无限循环(死循环)。 循环体:在循环中被执行的语句块。若循环体中无语句,则为空循环。在循环体中可根据条件加入Exit For语句强制退出循环。Exit For通常出现在选择结构中。

  38. 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

  39. 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码的打印位置。

  40. 程序运行效果如图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, "-")

  41. '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

  42. 图4.14 ASCII码对照表 返回本节 返回首页

  43. 4.3.2 Do...Loop循环(1) Do...Loop循环简称Do循环,主要在循环次数未知时使用。Do循环有两类语法形式: 前测型循环(先判断,后执行) Do [{While|Until} 条件] [循环体] Loop 后测型循环(先执行,后判断) Do [循环体] Loop [{While|Until} 条件]

  44. Do循环的流程图 使用While关键字的前测型和后测型Do循环的流程如图4.15和图4.16所示。使用Until关键字的Do循环与之相似,只需将图中的“T”和“F”互换位置即可。

  45. 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语句,否则会陷入死循环。

  46. 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

  47. 4.3.2 Do...Loop循环(4) 上述功能亦可用For循环实现: For i = 1 To 200 Step 2 Sum = Sum + i Next 由此可见,Do循环完全可以代替For循环。尽管如此,在已知循环次数的情况下,还是应当使用For循环,它将使程序更加简洁,效率更高。

  48. 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所示。

  49. 返回本节 返回首页 “计算”按钮单击事件的代码如下: 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

  50. 4.3.3 循环的嵌套(1) 在循环结构中可以嵌套任何循环结构,也可以嵌套选择结构。 【例4.11】求100~200之间的素数。 分析:素数或称质数,是指一个大于1的整数,除了1和它本身以外不能被其他正整数整除,这个数就是素数。判断一个数n是否为素数,只要依次用2~ 作除数去除n,若n不能被其中任何一个数整除,则n即为素数。本题的求解可用双重循环实现,外循环遍历100~200之间的所有整数,内循环判断各数是否为素数。 程序设计:在窗体上添加一个命令按钮,设Caption属性为“开始”。运行时单击该按钮后用Print方法显示100~200之间的素数。“开始”按钮单击事件的代码如下:

More Related