第3章Visual Basic的秘密—算法和程序控制结构

本章视频教学录像:1小时2分钟

算法是问题求解过程的精确描述,因此掌握算法是学习程序设计的核心,它可以帮助用户更好、更快地掌握编程思想及编程方法。程序的执行就像水在管道中流动,如果不加以控制,只能从上流到下。任何一种程序设计语言都有自己的算法和程序控制结构,但大致结构都相似。在Visual Basic中,控制程序执行的基本结构有3种:顺序结构、选择结构和循环结构。本章将详细介绍这3种结构的程序控制语句。

本章要点(已掌握的在方框中打钩)

□ 了解算法基本概念、特性及算法的几种描述方法

□ 了解结构化程序设计

□ 掌握程序的顺序结构

□ 掌握程序的选择结构

□ 掌握程序的循环结构

□ 了解其他辅助控制语句

3.1 算法

本节视频教学录像:3分钟

算法是学习程序设计的基础,也可以说是程序设计的入门知识,掌握算法可以帮助读者快速理清程序设计的思路,找出多种解决问题的方法,从而选择最合适的解决方案。

1. 什么是算法

“算法”这个术语听起来可能很陌生,其实大多数人每天都会用到许多算法。

我们早晨坐车上班,一般情况下会坐公交车上班,但如果时间来不及或遇到其他特殊情况,可能会打车上班,这就是一个“算法”。因此,广义地讲,“算法”就是解决某个问题或处理某件事的方法和步骤。

2. 算法的特性

一个算法应该具有以下5个主要特性。

⑴ 有穷性:一个算法(对任何合法的输入)在执行有穷步后能够结束,并且在有限的时间内完成。

⑵ 确定性:算法中的每一步都有确切的含义。

⑶ 可行性:算法中的操作能够用已经实现的基本运算执行有限次来实现。

⑷ 输入:一个算法有零个或者多个输入,零个输入就是算法本身确定了初始条件。

⑸ 输出:一个算法有一个或多个输出,以反映出数据加工的结果,没有输出的算法是没有意义的。

3. 算法的描述方法

为了让算法清晰易懂,需要选择一个好的描述方法。算法的描述方法有很多,有自然语言、伪代码、传统流程图等。

⑴ 自然语言

自然语言就是用人们日常使用的语言描述解决问题的方法和步骤,这种描述方法通俗易懂,即使是不熟悉计算机语言的人也很容易理解程序。但是,自然语言在语法和语义上往往具有多义性,并且比较繁琐,对程序流向等描述不明了、不直观。

⑵ 伪代码

伪代码是介于自然语言和计算机语言之间的文字和符号,它与一些高级编程语言(如Visual C++)类似,但是没有真正编写程序时所要遵循的严格规则。伪代码用一种从顶到底、易于阅读的方式表示算法。在程序开发期间,伪代码经常用于“规划”一个程序,然后再转换成VB程序。

⑶ 传统流程图

传统流程图使用不同的几何图形来表示不同性质的操作,使用流程线来表示算法的执行方向。比起前两种描述方式,它具有直观形象、逻辑清晰、易于理解等特点,但占用篇幅较大,流程随意转向,较大的流程图不易读懂。

3.2 结构化程序设计

本节视频教学录像:4分钟

结构化程序设计(Structured Programming)是进行以模块功能和处理过程设计为主的详细设计的基本原则。

1. 概念

其概念最早由E.W.Dijikstra在1965年提出的,是软件发展的一个重要的里程碑。它的主要观点是采用自顶向下、逐步求精及模块化的程序设计方法。使用三种基本控制结构构造程序,任何程序都可由顺序、选择、循环三种基本控制结构构造。结构化程序设计主要强调的是程序的易读性。

2. 内容

结构化程序设计曾被称为软件发展中的第三个里程碑。该方法的要点是:

⑴ 主张使用顺序、选择、循环三种基本结构来嵌套连结成具有复杂层次的“结构化程序”,严格控制GOTO语句的使用。用这样的方法编出的程序在结构上具有以下效果。

① 以控制结构为单位,只有一个入口,一个出口,所以能独立地理解这一部分。

② 能够以控制结构为单位,从上到下顺序地阅读程序文本。

③ 由于程序的静态描述与执行时的控制流程容易对应,所以能够方便正确地理解程序的动作。

⑵ “自顶而下,逐步求精”的设计思想,其出发点是从问题的总体目标开始,抽象低层的细节,先专心构造高层的结构,然后再一层一层地分解和细化。这使设计者能把握主题,高屋建瓴,避免一开始就陷入复杂的细节中,使复杂的设计过程变得简单明了,过程的结果也容易做到正确可靠。

⑶ “独立功能,单出、入口”的模块结构,减少模块的相互联系使模块可作为插件或积木使用,降低程序的复杂性,提高可靠性。程序编写时,所有模块的功能通过相应的子程序(函数或过程)的代码来实现。程序的主体是子程序层次库,它与功能模块的抽象层次相对应,编码原则使得程序流程简洁、清晰,增强可读性。

3. 基本结构

结构化程序设计的三种基本结构是:顺序结构、选择结构和循环结构。

⑴ 顺序结构

顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的。

⑵ 选择结构

选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。选择结构有单选择、双选择和多选择三种形式。

⑶ 循环结构

循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。在循环结构中最主要的是:什么情况下执行循环,哪些操作需要循环执行。循环结构的基本形式有两种:当型循环和直到型循环。

当型循环:表示先判断条件,当满足给定的条件时执行循环体,并且在循环终端处流程自动返回到循环入口;如果条件不满足,则退出循环体直接到达流程出口处。因为是“当条件满足时执行循环”,即先判断后执行,所以称为当型循环。

直到型循环:表示从结构入口处直接执行循环体,在循环终端处判断条件,如果条件不满足,返回入口处继续执行循环体,直到条件为真时再退出循环到达流程出口处,是先执行后判断。因为是“直到条件为真时为止”,所以称为直到型循环。

4. 设计方法

⑴ 自顶向下

程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。

⑵ 逐步细化

对复杂问题,应设计一些子目标作为过渡,逐步细化。

⑶ 模块化

一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为子目标,再进一步分解为具体的小目标,把每一个小目标称为一个模块。

5. 优缺点

⑴ 优点

由于模块相互独立,因此在设计其中一个模块时,不会受到其他模块的牵连,因而可将原来较为复杂的问题化简为一系列简单模块的设计。模块的独立性还为扩充已有的系统、建立新系统带来了不少的方便,因为我们可以充分利用现有的模块做积木式的扩展。

按照结构化程序设计的观点,任何算法功能都可以通过由程序模块组成的三种基本程序结构的组合:顺序结构、选择结构和循环结构来实现。

结构化程序设计的基本思想是采用“自顶向下,逐步求精”的程序设计方法和“单入口单出口”的控制结构。自顶向下、逐步求精的程序设计方法从问题本身开始,经过逐步细化,将解决问题的步骤分解为由基本程序结构模块组成的结构化程序框图;“单入口单出口”的思想认为一个复杂的程序,如果它仅是由顺序、选择和循环三种基本程序结构通过组合、嵌套构成,那么这个新构造的程序一定是一个单入口单出口的程序。据此就很容易编写出结构良好、易于调试的程序来。

① 整体思路清楚,目标明确。

② 设计工作中阶段性非常强,有利于系统开发的总体管理和控制。

③ 在系统分析时可以诊断出原系统中存在的问题和结构上的缺陷。

⑵ 缺点

① 用户要求难以在系统分析阶段准确定义,致使系统在交付使用时产生许多问题。

② 用系统开发每个阶段的成果来进行控制,不能适应事物变化的要求。

③ 系统的开发周期长。

3.3 顺序结构

本节视频教学录像:1分钟

顺序结构是指程序按照语句出现的先后次序执行。可以把顺序结构想像成一个没有分支的管道,把数据想像成水流,数据从入口进入后,依次执行每一条语句直到结束。流程如图所示。

在Visual Basic中赋值语句、注释语句、输入语句、输出语句、变量定义语句等都属于顺序结构功能的语句。这些语句本身没有控制和改变程序结构的能力,它们在语句中出现的顺序就是执行的顺序。

3.3.1 赋值运算符

赋值运算符用来为变量或事件的属性赋值。程序的计算实质上是数据的计算,而数据依存于各种变量、属性值等里面,我们通过赋值运算符把数据和变量、属性值等关联起来从而进行实际计算。赋值运算符的常见语法形式是:

      变量名 = 表达式
      对象名.属性 = 表达式

赋值运算符中的等号并不是表示等号两边的值是相等的,而是将等号右边的值赋给等号左边的变量或属性。如果等号右边是一个表达式,则会先执行这个表达式,执行完毕将执行结果赋给等号左边的变量或属性。

下面两个是正确的赋值运算符表达式。

      a=a+1   '把数值变量a加1后赋给变量a
      Command1.Caption="确定" '把字符串“确定”赋给Command1的Caption属性

下面两个是错误的赋值运算符表达式。

      6=a+b   '错误原因:赋值符号左边不能是常量
      a+b=6   '错误原因:赋值符号左边不能是表达式

3.3.2 数据的输入与输出

1. 数据的输入

Visual Basic中的数据输入主要通过文本框控件、列表框、组合框、复选框等控件以及InputBox函数来实现。控件的使用在后续篇章中将详细介绍,这里主要介绍InputBox函数的用法。InputBox函数是用来接收用户通过键盘输入的数据。调用InputBox函数的格式如下。

        Var=InputBox (<提示>[,对话框标题][,编辑框中默认值][,x坐标][,y坐标][,帮助文件名,帮助
    主题号])

功能:打开一个对话框,等待用户输入内容,当用户单击【确定】按钮或按【Enter】键,函数返回输入的值,其值的类型为字符串。参数说明如下。

⑴ 提示:不能省略该项。字符串表达式,在对话框中作为信息显示,可为汉字;若要多行显示,必须在每行行末加回车Chr(13)和换行Chr(10)控制符或vbCrLf符号常数。

⑵ 对话框标题:字符串表达式,在对话框的标题区显示;若省略,则把应用程序名放入标题栏中。

⑶ 编辑框中默认值:字符串表达式,当输入对话框中无输入时,则该默认值作为输入的内容。

⑷ x坐标、y坐标:整型表达式,坐标确定对话框左上角在屏幕上的位置,屏幕左上角为坐标原点。

例如:下面程序实现从键盘接收一个字符串,并将其显示在窗体上。

      Private Sub Form_Click()
        Dim num As String
        num = lnputBox(“请输入学号”,“示例”)
        Print num
        End Sub

上述程序将用户的输入显示在窗体上,运行效果如图所示。

InputBox函数接收输入

InputBox函数显示输入

当用户输入完成后单击左图中的【确定】按钮,表示输入成功,用户输入的数据将被赋值到变量num中,使用Print函数可以显示在窗体上。如果单击【取消】按钮,则输入失败。

2. 数据的输出

Visual Basic中,数据的输出主要有Print方法、MsgBox函数和控件输出3种方式。一般来说,Print方法主要输出在特定控件上,例如Form.Print,即输出在窗体上;MsgBox函数则以对话框的形式输出信息;而控件输出主要是指输出在数据控件上,例如Label1.Caption="Visual Basic"。下面通过示例看一下这3种输出的形式。例如,用Print方法、MsgBox函数和控件输出3种方式输出a中的数据。

在窗体上使用Print方法输出数据的输出格式为:

      Print变量

使用MsgBox函数的简单输出格式为:

      MsgBox变量

使用Label控件的输出即使用其Caption标题属性,使用格式为:

      Label1.Caption = 变量

这3种方式在后续的章节中都将详细介绍。

该示例的实现代码如下。

      Private Sub Form_Click()
      Dim a As String
      a = lnputBox("请输入a的值","示例")
      Print a      'Print方法输出
      MsgBox"a"="&a  'MsgBox函数输出
      Label1.Caption=a '标签控件输出
      End Sub

该程序执行效果如图所示。

Print方法输出

标签控件输出

程序执行时,先由用户在输入框InputBox中输入a的值,再分别用Print方法、MsgBox输出和Label控件输出在窗体上。控件的输出将结合具体的控件,除了Label标签控件外,还有许多如TextBox文本框输出、Image图片框输出等,这些将在以后的章节中详细讲解,此处只介绍前两种方法。

3.4 选择结构

本节视频教学录像:16分钟

选择结构是通过对给定的条件进行判断,然后根据判断结果执行不同任务的一种程序结构。Visual Basic中的If条件语句和多分支条件语句(Select)是最为常用的两种条件语句。条件语句和多分支条件语句的流程如图所示。

3.4.1 If条件语句

If语句的常见语法格式是:

      lf条件表达式Then
        语句1
        语句2
        …
      End lf

If…Then…翻译成中文就是:“如果……就……”。所以上面的代码意思是如果If后面的条件表达式成立的话,就执行Then下面的语句,否则就什么都不做。

如果希望再加一个选择分支,可以使用If…Then…Else的语法格式:

      lf条件表达式Then
      语句1
      Else
      语句2
      End lf

加上Else以后的代码意思是如果If后面的条件表达式成立的话,就执行Then下面的语句,否则执行Else后面的语句。

3.4.2 Select case语句

If语句主要用于单分支或者双分支的判断性选择结构,虽然也可以用形如If…Then…ElseIf…ElseIf…ElseIf…Else这样的语法来实现多分支的选择结构,但是这显然太麻烦了,Select语句是更为方便和有效的一种办法。Select语句的语法是:

      Select Case <条件表达式>
      Case <表达式列表1>
      <语句块1>
      Case <表达式列表2>
      <语句块2>
      …
      [Case Else
      <语句块n>]
      End Select

上述语句中的条件表达式可以是数值表达式或字符串表达式,一般为变量。表达式列表则是表明条件表达式的可能取值,表达式列表有以下3种形式。

⑴ 逗号分隔的多个表达式。例如:

      Case 1,2,3  '表达式的值是1、2或者3

⑵ <表达式1> To <表达式2>。例如:

      Case 1 to 10 '表达式的值介于1到10之间

⑶ Is <关系操作符> <表达式1>。例如:

      ls<10      '表达式的值小于10

【范例3-1】 在文本框中输入一个数值型数字,单击【Command】按钮后,判断该数字的奇偶性。

⑴ 启动Visual Basic 6.0,在弹出的【新建工程】对话框中选择【标准EXE】图标,然后单击【打开】按钮。

⑵ 用鼠标双击工具箱中的【TextBox】按钮,在Form1窗体上添加一个文本框控件,并用鼠标双击工具箱中的【CommandButton】按钮,添加一个按钮控件。

⑶ 双击Command1控件,进入代码窗口,输入以下代码(代码3-1.txt)。

      01 Private Sub Command1_Click()
      02  Dim a As lnteger'定义一个整型变量
      03  a=Val(Text1.Text)      '得到输入的整数
      04  lf a Mod 2=0 Then     '判断能否被2整除
      05    Print a&"是偶数"     '可以被2整除是偶数
      06  Else
      07   Print a&"是奇数"     '不可以被2整除是奇数
      08  End lf  '退出条件判断
      09 End Sub

注意

第3行使用了一个Val函数,Val函数是将文本框中的字符串型的数字转换为整型。

【运行结果】

保存程序,单击【启动】按钮,运行程序。清空文本框中的内容,输入数字“3”,单击【Command1】按钮,窗体上显示“3是奇数”。清空文本框中的内容,输入数字“6”,单击【Command1】按钮,窗体上显示“6是偶数”。

【拓展训练3-1】

在文本框中输入学生的考试成绩,采用多分支条件语句对学生分数进行评定,判断其优良性。

学会了使用If条件语句的判断方法,可以尝试使用多分支条件语句来控制程序的运行。可以将【范例3-1】中步骤⑶的代码修改如下(拓展代码3-1.txt)。

      01 Private Sub Command1_Click()
      02  Dim x As Single,y As Single     '定义两个单精度类型的变量
      03  x=Val(Text1.Text)      '获取输入的整数
      04   Select Case x  '进行多条件分支判断
      05   Case 0 To 59  '如果输入的数为0~50之间的数
      06     Print"不及格"       '输出"不及格"字样
      07   Case 60 To 70 '如果输入的数为60~70之间的数
      08     Print"中等" '输出"中等"字样
      09   Case 70 To 80 '如果输入的数为70~80之间的数
      10    Print"良好"  '输出"良好"字样
      11   Case 81 To 100'如果输入的数为81~100之间的数
      12    Print"优秀"  '输出"优秀"字样
      13   End Select    '结束判断
      14 End Sub

运行后,清空文本框内容,输入“90”,单击【Command1】按钮,窗体上显示“优秀”。再次清空文本框内容,输入“50”,单击【Command1】按钮,窗体上显示“不及格”。

3.4.3 条件函数

在Visual Basic中,除了上述这几种分支语句外,还有两个条件函数值得读者注意:IIF函数和Choose函数。

IIF函数用于替代IF函数,适用于简单的判断场合。其调用格式为:IIf (表达式,当表达式的值为Ture时的值,当表达式的值为False时的值)。其功能与If...Then...Else选择结构相同。

例如,求x,y中大的数,放入max变量中,语句如下。

      max = llf(x > y, x, y)

上述代码等同于下列代码。

      lf x>y Then
        max=x
    Else
        max=y
    End lf

因此,IIF函数可以作为If...Then...Else结构的简介形式来书写。

Choose函数用于替代Select Case语句,也适用于简单的判断场合。其调用格式为:

      Choose(整数表达式,选项列表)

功能为:根据整数表达式的值来决定返回选项列表中的某个值。如果整数表达式值是1,则Choose会返回列表中的第1个选项;如果整数表达式值是2,则会返回列表中的第2个选项,依此类推。若整数表达式的值小于1或大于列出的选项数目时,Choose函数返回Null。

例如,根据当前日期函数Now、WeekDay,利用Choose函数显示今日是星期几的形式。

      Private Sub Form_Click( )
      Print "今天是:";Now
      t =Choose(Weekday(Now),"星期日","星期一","星期二","星期三","星期四","星期五","星期六")
      Print"是:";t
      End Sub

上述程序中,函数Weekday(Now)获取当前是星期几的一个数字,根据Choose函数返回具体的中文星期几显示。其执行效果如图所示。

上述代码等同于如下程序。

      Private Sub Form_Click( )
      Print"今天是:";Now
      t =Weekday(Now)
      Print t
      Select Case t
      Case 1
      t = "星期日"
      Case 2
      t = "星期一"
      Case 3
      t = "星期二"
      Case 4
    t = "星期三"
    Case 5
    t = "星期四"
    Case 6
    t = "星期五"
    Case 7
    t = "星期六"
    End Select
    Print "是:";t
      End Sub

同样地,Choose函数使Select Case语句的应用简单化了。在实际的使用中,读者可根据情况自行选择使用哪种方式。

3.5 循环结构

本节视频教学录像:15分钟

当程序需要重复执行一些任务时,就可以考虑采用循环结构。例如重复100次加减乘除,数组中的每个整数加1等。当然可以为每次的任务都编写一条语句,但是这样就违背了使用计算机的初衷:“使用计算机的目的就是为了减轻工作量,而不是增加工作量。”对于这些重复的任务,可以使用Visual Basic中的循环结构很轻松地完成。

提示

Visual Basic中的循环结构是指通过计算机来实现重复执行某任务的程序结构。循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,Visual Basic中所提供的各种循环可以用来处理同一问题,一般情况下它们可以互相替换。

3.5.1 For循环语句

For循环又叫作计数循环,如果能够预知循环的次数,就可以预先设定计数循环的所计数值。For循环的语法是:

      For循环变量=初值To终值 [Step步长]
      [语句块]
      [Exit For]
      [语句块]
      Next [循环变量]

在For循环语句中,循环变量、初值、终值和步长等都是数值型数据,如果步长没有指定,则默认值为1。步长可以为正,也可以为负。若为正,则初值应小于或等于终值;若为负,则初值应大于或等于终值,这样才能保证执行循环体内的语句;若为0,则循环永不结束(死循环)。For循环语句的流程如图所示。

3.5.2 Do...Loop循环语句

Do循环分为先判断条件的Do…Loop循环和后判断条件的Do…Loop循环两种。先判断条件的Do…Loop循环的语法是:

      Do While条件表达式
      语句块
      Loop

或者

      Do Until条件表达式
      语句块
      Loop

后判断条件的Do…Loop循环的语法是:

      Do
      语句块
      Loop While条件表达式

条件循环结构的流程如图所示。

3.5.3 循环的嵌套

循环的嵌套,就是在一个循环体内含有其他循环结构的循环体。在实际问题中,有些单靠一个循环是无法很好解决的,例如对二维甚至多维数组的遍历,这时我们使用在循环中再嵌套循环的方式来实现一些复杂的逻辑。

【范例3-2】 在文本框中输入一个数值型数字,通过使用计数循环结构方法,来计算所输入数值型数字的阶乘。

⑴ 启动Visual Basic 6.0,在弹出的【新建工程】对话框中选择【标准EXE】图标,然后单击【打开】按钮。

⑵ 用鼠标双击工具箱中的【TextBox】按钮,在Form1窗体上添加一个文本框控件,并用鼠标双击工具箱中的【CommandButton】按钮,添加一个按钮控件。

⑶ 双击Command1控件,进入代码窗口,输入以下代码(代码3-2.txt)。

      01 Private Sub Command1_Click()
      02  Dim i,x As lnteger,s As Double  '定义两个整型变量和一个双精度型变量
      03  x=Val(Text1.Text)      '获取输入的数值
      04  s=1  '给变量s赋初值1
      05   For i=1 To x  '条件符合,利用循环结构进行计算
      06    s=s*i     '累积
      07   Next i '进行下一轮循环
      08  Print x;"的阶乘为";s;   '输入最终结果
      09 End Sub

【代码详解】

第02行定义了两个整型变量i和x,同时定义了一个双精度型的变量s。其中,变量i主要用于循环语句的初始值,变量x主要用于获得文本框中所输入的数值,变量s主要用于每一次计算后的结果。

第05~07行主要进行For循环来计算获得数值的阶乘数。例如在文本框中输入一个数值3,那么代码执行到第03行时,将其转换为数值型的数,以便进行数值的计算。当代码执行到For i=1 To x时,此时x为3,首先判断当前i的值是否大于x的值,如果大于,则停止循环,如果小于,则开始进行第1次循环,计算s=1×1,此时s的结果值为1。然后执行代码Next i语句,将i的值加1,并判断是否大于3,如果不大于,执行第2次循环,此时s的值变为1×2,得到最终的结果值为2。然后再次将i的值加1,i的值变为了3,并判断当前i的值是否大于3,不大于继续执行循环体,s的值变为了2×3。然后再次将i的值加1,此时i的值为4,已经大于3,所以退出循环体。执行最后一行代码语句,将结果输出出来。

提示

在使用For循环时,如果需要在代码执行过程中停止当前循环,可以使用Exit For语句退出当前循环。

【运行结果】

保存程序,单击【启动】按钮,运行程序。清空文本框中的内容,输入数字“6”,单击【Command1】按钮,窗体上显示“6的阶乘为720”。

【拓展训练3-2】

利用嵌套循环方法编写代码,运行程序后,单击窗体显示出九九乘法表。

条件循环结构与计数循环结构的用法类似,下面来尝试一下使用嵌套循环显示出九九乘法表。

首先新建一个工程,在窗体上添加一个按钮控件,双击按钮控件,进入代码窗口,输入以下代码(拓展代码3-2.txt)。

      01 Private Sub Command1_Click()
      02  Dim i,j As lnteger      '定义两个整型变量
      03   For i=1 To 9  '用For循环,打印9行内容
      04    j=1 '为变量j赋初值
      05     Do While j<=l      '用Do循环,打印每一列中的内容
      06      Print i;"*";j;"=";i*j, '输出每一列的内容
      07      j=j+1   '增加行数
      08     Loop      '满足条件,继续内部循环
      09    Print '打印空行,起换行作用
      10   Next i '满足条件,继续外部循环
      11 End Sub

运行后,单击【Command1】按钮,即可显示出九九乘法表。

3.6 其他辅助控制语句

本节视频教学录像:11分钟

除了上面提到的几种语句外,Visual Basic还提供了其他一些辅助控制语句。下面简单介绍其用法。

3.6.1 End结束语句

End语句可以结束一个过程或块,独立的End语句用于结束一个程序的运行,可以放在任何事件过程中。该语句使用形式如下。

      End

此外,在Visual Basic 6.0中,还有多种形式的End语句,用于结束一个过程或块,主要形式包括End If、End Select、End With、End Type、End Function、End Sub等,与对应的语句配对使用。End语句在各种代码块中的格式及作用如下表所示。

End语句用于停止执行过程或块,可以在过程中的任何位置关闭代码的执行。在执行时,End语句会重置所有模块级别变量和所有模块的静态局部变量。若要保留这些变量的值,改为使用Stop语句,则可以在保留这些变量值的基础上恢复执行。

注意

End语句不调用Unload、QueryUnload或Terminate事件或任何其他Visual Basic代码,只是生硬地终止代码的执行,并且释放程序所占用的内存资源。

3.6.2 Exit退出语句

Exit语句为退出语句。其调用形式有如下几种:Exit For、Exit Do、Exit Sub、Exit Function,其功能都为退出某种控制结构的执行。

⑴ Exit For:退出For循环结构。用于中途跳出For循环,可以直接使用,也可以用条件判断语句加以限制,在满足某个条件时才能执行此语句,跳出For循环。例如,在For循环内部添加语句“If条件Then Exit For”。

⑵ Exit Do:退出Do Loop循环结构。用于中途跳出Do循环,与上述类似,既可以直接使用,也可以用条件判断语句限制使用。

⑶ Exit Sub:退出Sub过程。用于中途跳出Sub过程,既可以直接使用,也可以用条件判断语句限制使用。

⑷ Exit Function:退出Function函数。用于中途跳出Function过程,可以直接使用,也可以用条件判断语句限制使用。

3.6.3 GoTo跳转语句

GoTo语句是无条件程序跳转语句,其功能是无条件地转移到标号或行号指定的一行语句。该语句使用形式如下。

      GoTo {标号|行号}

在使用上述形式的GoTo语句跳转到某一个标号的代码时,应注意如下问题。

⑴ GoTo语句只能转移到同一过程的标号或行号处。标号是一个字符序列,首字符必须为字母,与大小写无关,任何转移到的标号后应有冒号。

⑵ 行号是一个数字序列。

⑶ 结构化程序设计中要求尽量少用或不用GoTo语句,用选择结构或循环结构来代替。

提示

Goto语句在使用上争议很大。因为Goto语句使用起来比较灵活,而且有些情形能够提高程序的效率,使得很多开发人员喜欢使用该语句。但是Goto语句使程序的静态结构和程序的动态执行之间差别很大,造成程序难以阅读,难以查错。

3.6.4 On Error语句

On Error语句用于启动一个错误处理程序并指定该子程序在一个过程中的位置,也可用来禁止一个错误处理程序。

语法有On Error GoTo line 、On Error Resume Next、On Error GoTo 0等。

On Error语句的语法可以具有以下任何一种形式的语句描述。

1. On Error GoTo line

启动错误处理程序,且该历程从必要的line参数中指定的line开始。line参数可以是任何行标签或行号。如果发生一个运行时错误,则控件会跳到line,激活错误处理程序。指定的line必须在一个过程中,这个过程与On Error语句相同,否则会发生编译时间错误。

2. On Error Resume Next

说明当一个程序运行时发生错误时,控件转到紧接着发生错误的语句之后的语句,并在此继续运行。访问对象时要使用这种形式而不使用On Error GoTo。

3. On Error GoTo 0

禁止当前过程中任何已启动的错误处理程序。

说明:如果不使用On Error语句,则任何运行时错误都是致命的。也就是说,结果会导致显示错误信息并中止运行。一个“允许的”错误处理程序是由On Error语句打开的一个处理程序,一个“活动的”错误处理程序是处理错误的过程中允许的错误处理程序。如果在错误处理程序处于活动状态时(在发生错误和执行Resume、Exit Sub、Exit Function或Exit Property语句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误。控件返回调用的过程。如果调用过程有一个已启动的错误处理程序,则激活错误处理程序来处理该错误。如果调用过程的错误处理程序也是活动的,则控件将再往回传到前面的调用过程,这样一直进行下去,直到找到一个被允许的但不是活动的错误处理程序为止。如果没有找到被允许而且不活动的错误处理程序,那么在错误实际发生的地方,错误本身是严重的。错误处理程序每次将控件返回调用过程时,该过程就成为当前过程。在任何过程中,一旦错误处理程序处理了错误,在当前过程中就会从Resume语句指定的位置恢复运行。注意一个错误处理程序不是Sub过程或Function过程。它是一段用行标签或行号标记的代码。

3.6.5 复用语句With...End With

With语句用于定制一个对象或用户自定义类型。With语句不仅方便用户定制对象,也可增强代码的可读性使程序结构更加清晰。With语句用于在一个单一对象或一个用户定义类型上执行一系列的语句。该语句的使用形式如下。

      With object
          [statements]
      End with

With语句的语法具有以下两个参数。

⑴ object:必要参数,一个对象或用户自定义类型的名称。

⑵ Statements:可选参数,对object执行一条或多条语句。

With语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。例如,要改变一个对象的多个属性,可以在With控制结构中加上属性的赋值语句,这时只是引用对象一次而不是在每个属性赋值时都要引用。例如,下列语句使用With语句执行一系列对标签控件的参数设置。

      With MyLabel
          .Height = 2000
          .Width = 2000
          .Caption = “Visual Basic”
      End With

技巧

当程序一旦进入With块,object就不能改变,因此不能用一个With语句来设置多个不同的对象。

3.7 高手点拨

本节视频教学录像:12分钟

上面只是对几种程序控制结构的简单介绍,在实际应用中,很多复杂的程序都是由这些基本结构组成,下面介绍一些程序中常用的算法。

1. 累加、累乘

累加、累乘是较常见的数值问题。累加(累乘)是将多个数相加(乘),所以一般采用循环结构来实现。在循环体中应有表示累加(如sum=sum+x)或累乘(如t=t*i)的赋值语句。需要注意的是,累加中用于存放和的变量一般赋初值为0,而累乘中用于存放积的变量赋初值为1。

下面以例子说明。

求1!+2!+…+n!的值,n由键盘输入。

      Private Sub Form_Click()
      Dim s as double,t as double,n as integer
      s=0
      t=1
      n=lnputBox("请输入n的值")
      For i=1 to n
          t=t*l      '求i!并赋给变量t
          s=s+t
      Next i
      Print "1!+2!+…+";n;"!=";s
      End Sub

2. 求最大值和最小值

求若干数的最大值(最小值),其算法思想是,先取第一个数作为最大值(最小值)的初值,然后依次将下一个数和它比较,若比它大(小),将该数替换为最大值(最小值)。

下面以例子说明。

产生10个1~100之间的随机整数,输出它们的最大值。

      Private Sub Form_Click()
      Dim i%,x%,max%
      Randomize
      Print "10个随机整数:"
      x=int(Rnd*100)+1
      Print x;
      max=x       '将第一个数作为初值赋给max
      For i=2 to 10
        x=int(Rnd*100)+1
        if x>max Then max=x
        Print x;
      Next i
      Print
      Print "最大值为:";max
      End Sub

3. 迭代法

“迭代法”是指重复执行一组工作,每次执行这组工作时,都从旧值递推出新值,并用新值代替旧值。

下面以例子说明。

已知某球从100米高度自由落下,落地后反弹,每次弹起的高度都是上次高度的一半。求小球第10次落地后反弹的高度和球所经过的路程。

      Private Sub Form_Click()
      Dim h as single,r as single,s as single
      h=100
      s=0
      For i=1 to 10
        r=h/2
        s=s+r+h
        h=r
      Next i
      Print "h=";h,"s=";s
    End Sub

3.8 实战练习

上机题

运用计数循环结构计算出1+2+3+4+…+100的结果。