Visual Basic学习手册
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4章 掌握算法和程序控制结构

(名师课堂:1小时47分)

要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一下算法,然后再根据算法编写程序。算法是问题求解过程的精确描述,因此掌握算法是学习程序设计的基础,也可以说是程序设计的入门知识,可以帮助用户更好、更快地掌握编程思想及编程方法。本章将简要地介绍算法,使读者初步了解算法,为日后编程打下良好的基础。学好程序的基本控制结构是结构化程序设计的基础,本章还详细地介绍了程序常用的三种控制结构,讲解过程中为了便于读者理解结合了大量的举例。

通过学习本章,读者可以达到以下学习目的:

初步了解算法;

掌握顺序结构程序设计方法中的基本语句、输入/输出语句的使用;

掌握赋值语句“=”的使用方法;

掌握选择结构中If语句的使用方法;

掌握If语句的嵌套;

掌握选择结构中Select Case语句的使用方法;

掌握循环结构中For…Next循环语句的使用方法;

掌握循环结构中Do…Loop循环语句的使用方法;

掌握多重循环的使用方法;

掌握选择结构与循环结构的嵌套。

4.1 了解算法

专题讲座:光盘文件\MR\Video\4\算法.exe

视频速递:详细讲解什么是算法及算法的特点

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

本节将介绍什么是算法、算法的特点、算法的描述方法以及构成算法的基本结构。

4.1.1 什么是算法

人们使用计算机,就是要利用计算机处理各种不同的问题,而要解决问题,就必须事先对各类问题进行分析,确定采用的方法和步骤。为解决某一个问题所采取的方法和步骤称为“算法”。

实例位置:光盘文件\MR\ Instance\4\4.1

例4.1】 例如,设计一个计算1~5的整数连乘的算法,并根据算法编写程序。

首先,需要定义两个整型变量intSum和i,其中intSum用来存放每次乘积的值和最后的计算结果,其初始值为1,而i用于存放1~5的整数,初始值为0,用intSum=intSum*i来完成每次连乘后的结果。算法可以表述如下。

将存放每次乘积的值和最后计算结果的变量intSum初始化为1。

将用于乘积运算的依次递增的整型变量i初始化为0。

整型变量i为1~5的整数。

计算变量intSum与i的乘积,并将结果存入intSum,即intSum=intSum*i。

输出变量intSum。

有了上述算法,就可以在Visual Basic中编写程序了,程序代码如下:

        Private Sub Command1_Click()
            Dim intSum As Integer,i As Integer                  '定义整型变量
            intSum=1:i=0                                        '给变量赋初值
            For i=1 To 5                                      '计算1~5的连乘结果
                intSum = intSum * i
            Next i
            Debug.Print intSum       '                          输出最后的计算结果
        End Sub

4.1.2 熟悉算法的特点

一个算法应该具有以下的特点。

(1)有穷性:一个算法必须在执行有穷多个计算步骤后终止。

(2)确定性:一个算法给出的每个计算步骤,必须是有精确定义、无二义性。

(3)有效性:算法中的每一个步骤必须有效地执行,并能得到确定的结果。

(4)输入:一个算法中可以没有输入,也可以有一个或者多个输入信息。这些输入信息是算法所需的初始数据。

(5)输出:一个算法应该有一个或者多个输出,一个算法得到的结果(中间结果或最后结果)就是算法的输出,没有输出的算法是没有意义的。

4.1.3 算法的描述方法

为了让算法清晰易懂,需要选择一种好的描述方法。算法的描述方法有很多,有自然语言、传统流程图、N-S结构化流程图等。自然语言就是用人们日常使用的语言描述解决问题的方法和步骤,例如4.1.1节中设计计算1~5的整数连乘的算法中所阐述的。这种描述方法通俗易懂,但比较烦琐,并且对程序流向等描述不明了、不直观。针对这些缺点产生了传统流程图和N-S结构化流程图。

下面分别介绍这两种流程图。

1.传统流程图

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

传统流程图的基本符号及说明如表4.1所示。

表4.1 流程图符号及说明

2.N-S结构化流程图

N-S结构化流程图是美国学者I·Nassi和B·Shneiderman在1973年首次提出的一种描述算法的图形方法。N-S结构化流程图将传统流程图中的流程线去掉,将全部算法写在一个矩形框里,这个框包含其他从属于它的从属框。当程序算法比较烦琐时,一般采用N-S结构化流程图。另外,N-S结构化流程图更有利于程序设计的结构化。

以上介绍的两种流程图各有特点,但对于初学者和编写较小的程序时,笔者建议使用传统流程图来描述算法。

4.1.4 了解程序三种控制结构

在程序设计中,构成算法的基本结构有三种:顺序结构、选择结构和循环结构。合理使用这些控制结构可以使程序结构清晰,易读性强,并且易于查错和排错。

1.顺序结构

顺序结构是最简单、最基本的结构方式,各流程框依次按顺序执行。其传统流程图的表示方式与N-S结构化流程图的表示方式分别如图4.1和图4.2所示。其执行顺序为:开始→语句1→语句2→……→结束。

图4.1 顺序结构传统流程图

图4.2 顺序结构N-S结构化流程图

2.选择(分支)结构

选择结构就是对给定条件进行判断,条件为True时执行一个分支,条件为False时执行另一个分支。双分支和单分支选择结构的传统流程图表示方式与N-S结构化流程图表示方式如图4.3和图4.4所示。

图4.3 双分支选择结构的两种流程图

图4.4 单分支选择结构的两种流程图

3.循环结构

循环结构可以按照需要多次重复执行一行或者多行代码。循环结构分为两种:当型循环和直到型循环。

当型循环,先判断后执行。当条件为True时反复执行语句或语句块,条件为False时,跳出循环,继续执行循环后面的语句,流程图如图4.5所示。

图4.5 当型循环流程图

直到型循环,先执行后判断。先执行语句或语句块,再进行条件判断,直到条件为False时,跳出循环,继续执行循环后面的语句,否则一直执行语句或语句块,流程图如图4.6所示。

图4.6 直到型循环流程图

4.2 学习使用顺序结构

专题讲座:光盘文件\MR\Video\4\顺序结构.exe

视频速递:详细讲解赋值语句和输入、输出

顺序结构是程序中最简单、最常用的结构,在该结构中各语句按出现的先后次序执行。它是任何程序的主体基本结构。

一般的程序设计语言中,顺序结构的语句主要包括赋值语句、输入/输出语句等,Visual Basic 6.0也不例外,其中输入/输出可以通过文本框控件、标签控件、InputBox函数、MsgBox函数以及Print方法来实现。

4.2.1 使用赋值语句给变量赋值

赋值语句是将表达式的值赋给变量或属性,通过Let关键字使用赋值运算符“=”给变量或属性赋值。

语法:

        [Let] <变量名> = <表达式>

Let:可选的参数。显式使用的Let关键字是一种格式,通常都省略该关键字。变量名:必需的参数。变量或属性的名称,变量命名遵循标准的变量命名约定。表达式:必需的参数。赋给变量或属性的值。

例如,定义一个长整型变量,给这个变量赋值2205,代码如下:

        Dim a As Long
        Let a = 2205

上述代码中可以省略关键字Let。

例如,在文本框中显示文字,代码如下:

        Text1.Text="mingrisoft"

赋值语句看起来简单,但使用时也要注意以下几点。

(1)赋值号与表示等于的关系运算符都用“=”表示,Visual Basic 6.0系统会自动区分,即在条件表达式中出现的是等号,否则是赋值号。

(2)赋值号左边只能是变量,不能是常量、常数符号和表达式。下面均是错误的赋值语句:

        X+Y=1                                               '左边是表达式
        Visual Basic 6.0Black=myColor                       '左边是常量,代表黑色
        10=abs(s)+x+y                                       '左边是常量

(3)当表达式为数值型并与变量精度不同时,需要强制转换左边变量的精度。

例如:

        n%=4.6                                          'n为整型变量,转换时四舍五入,值为5

(4)当表达式是数字字符串,左边变量是数值型时,右边值将自动转换成数值型再赋值。如果表达式中有非数字字符或空字符串,则会出错。

        n%="123"                                           '将字符串123转换为数值数据123

下列情况会出现运行时错误。

        n%="123mr"
        n%=""

(5)当逻辑值赋值给数值型变量时,True转换为−1,False转换为0,反之当数值赋给逻辑型变量时,非0转换为True,0转换为False。

实例位置:光盘文件\MR\ Instance\4\4.2

例4.2】 在“立即”窗口中将单选按钮被选择的状态赋值给整型变量。

新建一个工程,在Form1窗体中添加一个CommandButton控件和两个Option Button控件。

在代码窗口中编写如下代码:

        Private Sub Command1_Click()
          Dim a As Integer,b As Integer                      '定义整型变量
          a=Option1.Value     '                              将逻辑值赋给整型变量a
          b=Option2.Value     '                              将逻辑值赋给整型变量b
        Debug.Print "Opt1的值:"&a                           '输出结果
        Debug.Print "Opt2的值:"&b
        End Sub

按【F5】键运行程序,结果如图4.7所示。

图4.7 在“立即”窗口中显示OptionButton控件的返回值

(6)任何非字符型的值赋值给字符型变量,自动转换为字符型。

为了保证程序的正常运行,一般利用类型转换函数将表达式的类型转换成与左边变量匹配的类型。

4.2.2 将用户数据输入到应用程序

在程序设计时,通常使用文本框(TextBox控件)或InputBox函数来输入数据。当然,也可以使用其他对象或函数来输入数据。

1.文本框

利用文本框控件的Text属性可以获得用户从键盘输入的数据,或将计算的结果输出。

实例位置:光盘文件\MR\ Instance\4\4.3

例4.3】 在两个文本框中分别输入“单价”和“数量”,然后通过Label控件显示金额,代码如下:

        Private Sub Command1_Click()
          Dim mySum As Single     '                        定义单精度浮点型变量
          mySum=Val(Text1.Text)*Val(Text2.Text)            '计算“单价”和“数量”相乘
        Label1.Caption ="金额为:"&mySum    '              显示计算结果
        End Sub

按【F5】键运行程序,结果如图4.8所示。

图4.8 在标签控件显示金额

2.输入对话框InputBox函数

InputBox函数提供了一个简单的对话框供用户输入信息,如图4.9所示。在该对话框中有一个输入框和两个命令按钮。显示对话框后,将等待用户输入。当用户单击“确定”按钮后返回输入的内容。InputBox函数的介绍如下。

图4.9 InputBox输入框

语法:

        InputBox (prompt[, title] [, default] [, xpos][, ypos])

InputBox函数语法中的参数说明如表4.2所示。

表4.2 InputBox函数语法中的参数说明

InputBox输入函数有两种表达方式,一种为带返回值的,另一种为不带返回值的。(1)带返回值

带返回值的输入函数的使用方法举例如下:

        MyValue = InputBox("请输入电话号码", , 4978981)

上述语句中InputBox函数其后的一对圆括号不能省略,其中各参数之间用逗号隔开。(2)不带返回值

不带返回值的输入函数的使用方法举例如下:

        InputBox "请输入电话号码", 4978981

学习手册

注意 ① InputBox函数中各项参数的顺序必须一一对应,除第一项参数“提示”不能省略外,其余参数均可省略,省略可选参数时其后的逗号不可省。

② 由InputBox函数返回的数据类型为字符类型数据,如果要得到数值类型数据,则必须用Val函数进行类型转换。

4.2.3 将指定信息显示给用户

输出数据可以通过Label控件、输出对话框函数MsgBox和Print方法等。通过Label控件输出数据较简单,这里就不介绍了,下面仅介绍MsgBox函数和Print方法。

1.MsgBox函数

MsgBox函数的功能是在对话框中显示消息,如图4.10所示,等待用户单击按钮,并返回一个整数告诉系统用户单击的是哪一个按钮。

图4.10 MsgBox对话框

另外,在使用该函数时,可以通过设置其中的可用参数,在消息框中显示信息、按钮、图标或警告声音。

语法:

        MsgBox(prompt[,buttons][,title])

MsgBox函数语法中的参数说明如表4.3所示。

表4.3 MsgBox函数语法中的参数说明

buttons参数用于指定对话框中按钮的数目及形式、图标样式、默认按钮等,它的取值如表4.4所示。

表4.4 buttons参数的取值

MsgBox函数支持命名参数。返回一个整数,表示关闭对话框前哪一个按钮被单击,具体意义如表4.5所示。

表4.5 MsgBox函数的返回值

表4.4和表4.5中列出的符号常量是Visual Basic 6.0定义的常量,可以在程序中的任何地方使用,这些符号常量所对应的值就是表中“值”列中的数。

MsgBox函数有两种表达方式,一种为带返回值的,另一种为不带返回值的。

(1)带返回值

带返回值的函数的使用方法举例如下:

        myvalue=MsgBox("注意:请输入数值型数据",2+Visual Basic 6.0Exclamation,"错误提示")
        If myvalue=3 Then End

上述语句中MsgBox函数其后的一对圆括号不能省略,其中各参数之间用逗号隔开。

(2)不带返回值

不带返回值的输入函数的使用方法举例如下:

        MsgBox "请输入数值型数据!", , "提示"

2.Print方法

Print是输出数据、文本的一个重要方法,其格式如下:

        窗体名称.Print[<表达式>[,|;[<表达式>]…]]

参数说明:

<表达式>:可以是数值或字符串表达式。对于数值表达式,先计算表达式的值,然后输出;而字符串则原样输出。如果表达式为空,则输出一个空行。

当输出多个表达式时,各表达式用分隔符(逗号、分号或空格)隔开。若用逗号分隔将以14个字符位置为单位把输出行分成若干个区段,每个区段输出一个表达式的值。而表达式之间用分号或空格作为分隔符,则按紧凑格式输出。

一般情况下,每执行一次Print方法将自动换行,可以通过在末尾加上逗号或分号的方法使输出结果在同一行显示。

学习手册

注意 Print方法除了可以作用于窗体外,还可以作用于其他多个对象,如立即窗口(Debug)、图片框(PictureBox)、打印机(Printer)等。如果省略“对象名”,则在当前窗体上输出。

实例位置:光盘文件\MR\ Instance\4\4.4

例4.4】 使用Print方法在窗体中输出图书排行数据,代码如下:

        Private Sub Form_Click()
            Print                                                         '输出空行
            Font.Size=14                                                  '设置字体
          Font.Name  ="华文行楷"
          Print  Tab(45);Year(Date)&"年"&Month(Date)&"月份图书销售排行"
            '打印标题
          CurrentY  =700
          Font.Size  =9
          Font.Name  ="宋体"
          Print  Tab(15);"书名";Tab(55);"出版社";Tab(75);"销售数量"
            Print Tab(14);String(75,"-")     '                              输出线
            '打印内容
          Print  Tab(15);"Visual Basic经验技巧宝典";Tab(55);"人民邮电出版社";Tab(75);10
          Print  Tab(15);"Visual Basic数据库系统开发案例精选";Tab(55);"人民邮电出版社";Tab(75);6
          Print  Tab(15);"Delphi数据库系统开发案例精选";Tab(55);"人民邮电出版社";Tab(75);8
        End Sub

代码说明:

Tab(n):内部函数,用于将指定表达式从窗体第n列开始输出。

Spc(n):内部函数,用于在输出表达式前插入n个空格。

Print:如果Print后面没有内容,则输出空行。

按【F5】键,运行工程,单击窗体,效果如图4.11所示。

图4.11 使用Print语句在窗体中输出数据

4.3 学习使用选择结构

专题讲座:光盘文件\MR\Video\4\选择结构.exe

视频速递:详细讲解If语句和Select Case语句

选择结构属于分支结构中的一种,也可以称为判定结构。程序通过判断所给的条件和判断条件的结果执行不同的程序段。

4.3.1 单分支If…Then语句

If…Then语句用于判断表达式的值,满足条件时执行其包含的一组语句,执行流程如图4.12所示。

图4.12 If…Then语句执行流程图

If…Then语句有两种形式,即单行和块形式。

1.单行形式

顾名思义,单行形式的If…Then语句只能在一行内书写完毕,即不能一行超过255个字符的限制。

语法:

        If条件表达式 Then 语句

If和Then都是关键字。“条件表达式”应该是一个逻辑表达式,或者其值是可以转换为逻辑值的其他类型表达式。

当程序执行到此语句时,首先检查“条件表达式”,以确定下一步的流向。如果“条件”为True,则执行Then后面的语句;如果“条件”为False,则不执行“语句”中的任何语句,直接跳到下一条语句执行。

下面是一条单行形式的If…Then语句:

2.块形式

块形式的If…Then语句是以连续数条语句的形式给出的。

语法:

        If条件表达式Then
            语句块
        End If

其中“语句块”可以是单个语句,也可以是多个语句。多个语句可以写在多行中,也可以写在同一行中,并用冒号“:”隔开。

当程序执行到此语句时,首先检查“条件表达式”,以确定下一步的流向。如果“条件”为True,则执行Then后面的语句块;如果“条件”为False则跳过Then后面的语句或语句块。如果逻辑表达式为数值表达式,计算结果为非0时表示True,计算结果为0时表示False。

学习手册

注意 块形式的If…Then…End If语句必须使用End If关键字作为语句的结束标志,否则会出现语法错误或逻辑错误。

实例位置:光盘文件\MR\ Instance\4\4.5

例4.5】 判断“密码”文本框中的值是否为“111”,如果是则提示用户登录成功,代码如下:

按【F5】键,运行工程,单击窗体,效果如图4.13所示。

图4.13 用户登录

4.3.2 双分支If…Then…Else语句

在If…Then…Else语句中,可以有若干组语句块,根据实际条件只执行其中的一组,其执行流程如图4.14所示。

图4.14 If…Then…Else语句执行流程图

If…Then…Else语句也分为单行形式和块形式。

1.单行形式

语法:

        If 条件表达式 Then 语句块1 Else 语句块2

当条件满足时(即“条件表达式”的值为True),执行“语句块1”,否则执行“语句块2”,然后继续执行If语句下面的语句。

例如,下面就是一个单行形式的If…Then…Else语句:

2.块形式

如果单行形式的两个语句块中的语句较多,则写在单行不易读,且容易出错,这时就应该使用块形式的If…Then…Else语句。

语法:

        If条件表达式T hen
            语句块1
        Else
            语句块2
        End If

块形式的If…Then…Else…End If语句与单行形式的If…Then…Else语句功能相同,只是块形式更便于阅读和理解。

另外,块形式中的最后一个End If关键字不能省略,它是块形式的结束标志,如果省略会出现编译错误,如图4.15所示。

图4.15 省略最后一个End If出现错误

实例位置:光盘文件\MR\ Instance\4\4.6

例4.6】 下面用块形式判断用户输入的密码,如果“密码”文本框中的值为“111”,则提示用户登录成功,否则提示用户“密码错误,请重新输入!”,代码如下:

        Private Sub Command1_Click()
            If Text1.Text="111"Then                             '判断"密码"文本框中的值是否为"111"
                MsgBox"登录成功!",,"提示"                       '提示登录成功
            Else
                MsgBox"密码错误,请重新输入!",,"提示"   '        否则提示密码错误
            End If
        End Sub

4.3.3 If语句的嵌套

一个If语句的“语句块”中可以包括另一个If语句,这种就是“嵌套”。在Visual Basic 6.0中允许If语句嵌套。

下面语句就是If语句的嵌套形式:

        If条件表达式1 Then     '                                  最外层If语句
            语句块1
            If条件表达式2 Then         '                          内层If语句
                语句块2
            Else
                If条件表达式4 Then …语句块3 Else …语句块4   '   最内层If语句
            End If                                                '内层If结束语句
            语句块5
        Else                                                      '最外层If语句
            语句块6
            If条件表达式3 Then      '                              内层If语句
                语句块7
            End If                                                '内层If结束语句
            语句块8
        End If                                                    '最外层If结束语句

上面的语句看起来不太直观,下面用流程图来表示,如图4.16所示。

图4.16 If语句嵌套执行流程图

对于这种结构,书写时应该采用缩进形式,这样可以使程序代码看上去结构清晰,增强代码的可读性,便于日后修改调试。另外,Else或End If必须与它相关的If语句相匹配,构成一个完整的If结构语句。

实例位置:光盘文件\MR\ Instance\4\4.7

例4.7】 下面通过一个典型的“用户登录”实例,介绍If语句的嵌套在实际项目开发中的应用,设计步骤如下。

新建一个工程,在Form1窗体中添加Label控件、ComboBox控件和TextBox等控件,如图4.17所示。

图4.17 用户登录界面设计效果

设置窗体和控件的相关属性,设置结果如表4.6所示。

表4.6 各窗体和控件的主要设置

在代码窗口中编写如下代码:

        Option Explicit
        Public intMyTimes As Integer
        Const MaxTimes As Integer = 3
        Private Sub Form_Load()
            intMyTimes=1                                      '给变量赋初值
            '窗体载入时,将用户添加到ComboBox控件中
          cboUserName.AddItem  "管理员"
          cboUserName.AddItem  "操作员1"
          cboUserName.AddItem  "操作员2"
        End Sub
        Private Sub cmdOK_Click()
            If cboUserName.Text<>""Then                     '如果操作员不为空
                If txtPassword.Text=""Then                  '判断密码是否为空
                  MsgBox "请输入密码!", , "提示窗口"
                  txtPassword.SetFocus
                  Exit Sub
                End If
                If txtPassword.Text<>"11"Then               '如果密码不是"11"
                  If intMyTimes>MaxTimes Then                '密码输入次数大于3次,则退出程序
                      MsgBox "您无权使用该软件!", , "提示窗口"
                      End
                  Else                                     '否则提示密码输入不正确
                      intMyTimes=intMyTimes+1  '每输入一次错误的密码,变量intMyTimes就加1
                      MsgBox "密码不正确,请重新输入!", , "提示窗口"
                      txtPassword.SetFocus
                  End If
                Else                                       '否则登录成功
                  MsgBox "登录成功!", , "提示窗口"
                End If
            Else:                                          '提示用户操作员不能为空
                MsgBox "操作员不能为空!", , "提示窗口"
                Exit Sub
            End If
        End Sub
        Private Sub cmdCancel_Click()
            End                                             '退出程序
        End Sub

按【F5】键,运行工程。选择操作员,输入密码,单击“确定”按钮,如图4.18所示。

图4.18 操作员为空

具体执行过程如下。

① 判断操作员是否为空,如果操作员为空则提示用户,如图4.18所示,否则执行②。

② 判断密码是否为空,如果密码为空则提示用户,如图4.19所示,否则执行③。

图4.19 密码为空

③ 判断密码输入是否正确,如果正确则提示“登录成功”,如图4.20所示,否则执行④。

图4.20 登录成功

④ 判断密码输错的次数是否大于3次,如果大于3次,则提示用户无权使用,如图4.21所示,然后退出程序,否则执行⑤。

图4.21 密码输错次数大于3次

⑤ 每输入一次错误的密码,变量intMyTimes就加1,并提示用户密码输入有误,如图4.22所示。

图4.22 提示用户密码有误

4.3.4 多分支If…Then…ElseIf语句

只有块形式的写法,语句格式为:

        If条件表达式1 Then
            语句块1
        ElseIf条件表达式2 Then
            语句块2
        ElseIf条件表达式3 Then
            语句块3
            ……
        ElseIf条件表达式n Then
            语句块n
            ……
        [Else
            语句块n+1]
        End If

该语句的作用是根据不同的条件确定执行哪个语句块,其执行顺序为条件表达式1、条件表达式2、……,一旦条件表达式的值为True,则执行该条件下的语句块。

多分支If…Then…ElseIf语句的执行流程如图4.23所示。

图4.23 多分支If…Then…ElseIf语句执行流程图

在Visual Basic 6.0中,该语句中的条件表达式和语句块的个数没有具体限制。另外,书写时应注意,关键字ElseIf中间没有空格。

实例位置:光盘文件\MR\ Instance\4\4.8

例4.8】 下面通过一个实例,介绍多分支If语句的应用。将输入的分数做不同程度的分类,即“优”、“良”、“及格”和“不及格”,先判断分数是否等于100,再判断是否>=80,是否>=60,……以此类推。程序设计步骤如下。

启动Visual Basic 6.0,新建工程,在新建的Form1窗体中添加一个文本框(Text1)、3个标签(Label1、Label2和Label3)和一个命令按钮(Command1)。

在代码窗口中编写如下代码:

        Private Sub Command1_Click()
            Dim a As Integer      '                                      定义一个整型变量
            a=Val(Text1.Text)                                            '给变量a赋值
            If a = 100 Then
                lblResult.Caption = "优"
            ElseIf a >= 80 Then
                lblResult.Caption = "良"
            ElseIf a >= 60 Then
                lblResult.Caption = "及格"
            Else
                lblResult.Caption = "不及格"
            End If
        End Sub

按【F5】键,运行工程,在第一个文本框中输入一个整数,单击“判断”按钮,程序会在第二个文本框中显示判断结果,如图4.24所示。

图4.24 多分支If实例运行效果图

4.3.5 利用Select Case语句处理多分支控制结构

当选择的情况较多时,使用If语句实现就会很麻烦,而且不直观,而Visual Basic 6.0中提供的Select Case语句可以方便、直观地处理多分支的控制结构。

语法:

        Select Case测试表达式
            Case表达式1
                语句块1
            Case表达式2
                语句块2
                ……
            Case表达式n
                语句块n
            [Case Else
                语句块n+1]
        End Select

Select Case语句的执行流程如图4.25所示。

图4.25 Select Case语句的执行流程图

执行过程说明。

首先计算“测试表达式”的值。

然后用这个值与Case后面表达式1,表达式2,……中的值比较。

若有相匹配的,则执行Case表达式后面的语句块,执行完该语句块则结束Select Case语句,不再与后面的表达式比较。

当“测试表达式”的值与后面所有表达式的值都不相匹配时,若有Case Else语句,则执行Case Else后面的语句块n+1,若没有Case Else语句,则直接结束Select Case语句。

在Select Case语句中“表达式”通常是一个具体的值(如Case 1),每一个值确定一个分支。“表达式”的值称为域值,有以下4种方法可以设定该值。

(1)表达式列表为表达式,例如:X+100。

        Case X+100                                         '表达式列表为表达式

(2)一组值(用逗号隔开),例如:

        Case 1,4,7                                          '表示条件在1、4、7范围内取值

(3)表达式1To表达式2,例如:

        Case 50 To 60                                       '表示条件取值范围为50~60

(4)Is关系表达式,例如:

        Case Is<4                                           '表示条件在小于4的范围内取值

实例位置:光盘文件\MR\ Instance\4\4.9

例4.9】 将4.3.4节中的多分支If语句的应用实例改写为Select Case语句形式,代码如下:

        Private Sub Command1_Click()
            Dim a As Integer    '                           定义一个整型变量
            a=Val(Text1.Text)                               '给变量a赋值
          Select  Case a
            Case Is = 100
                lblResult.Caption = "优"
            Case Is >= 80
                lblResult.Caption = "良"
            Case Is >= 60
                lblResult.Caption = "及格"
            Case Else
                lblResult.Caption = "不及格"
            End Select
        End Sub

比较二者之间的区别,可以看出,在多分支选择的情况下,使用Select Case语句,结构更清晰。当然,若只有两个分支或分支数很少的情况下,直接使用If…Then语句更好一些。

4.3.6 使用IIf函数简化程序

在使用Visual Basic 6.0设计程序时,往往会遇到一个变量或属性与另一个变量或属性进行比较的情况,根据这个比较的条件(大于、小于、等于、大于等于、小于等于等),将之前的变量或属性重新赋予一个新值。如果使用If…Then…Else等语句实现,程序的代码就比较烦琐,而使用IIf函数就比较简单了。

IIf函数的作用是根据表达式的值,返回两部分中其中一个的值或表达式。

语法:

        IIf(<表达式>,<值或表达式1>, <值或表达式2>)

参数说明:

表达式:必要参数。用来判断值的表达式。

值或表达式1:必要参数。如果表达式为True,则返回这个值或表达式。

值或表达式2:必要参数。如果表达式为False,则返回这个值或表达式。

学习手册

注意 如果表达式1与值或表达式2中任何一个在计算时发生错误,那么程序就会发生错误。

实例位置:光盘文件\MR\ Instance\4\4.10

例4.10】 将4.3.1节中的实例,即如果“密码”文本框中的值为“111”,则提示用户输入正确,否则提示用户“密码不正确,请重新输入!”,分别使用If…Then…Else语句与IIf函数实现,比较它们用法的区别。

1.使用If…Then…Else语句实现

        Private Sub Command1_Click()
            If Text1.text="111"Then     '                   判断“密码”文本框中的值是否为“111”
      MsgBox"输入正确!",,"提示"                            '是“111”则提示用户输入正确
            Else
      MsgBox"密码不正确,请重新输入!",,"提示"              '否则提示用户密码不正确
            End If
        End Sub

2.使用IIf函数实现

        Private Sub Command1_Click()
            Dim str As String                               '定义字符型变量
            str = IIf(Text1.Text = "111", "输入正确!", "密码不正确,请重新输入!")
            MsgBox str, , "提示"
        End Sub

4.3.7 情景应用——十进制转换为其他进制

开发项目时,经常会遇到进制间的相互转换。下面通过一个实例讲解如何实现十进制转换为其他进制功能。

实例位置:光盘文件\MR\ Instance\4\4.11

例4.11】 这里介绍的是将一个十进制整数转换成二至十六任意进制的数值,进制转换的算法思想是:将十进制正整数n不断除进制数r取余数,直到商为零,将得到的值反序连接,即最后得到的余数在最高位。本例实现将十进制整数转换成二至十六任意进制的字符串。程序设计步骤如下。

新建一个标准工程。

在工程中添加一个窗体,窗体的名称使用其默认名称,Caption属性设置为“进制转换”,StartUpPosition属性设置为“2-屏幕中心”。

在窗体上添加4个Label控件,前两个Label控件用于显示提示信息,后两个Label控件用于显示最大公约数和最小公倍数的值。

在窗体上添加两个TextBox控件,名称使用默认名称,用于输入两个自然数;在窗体上添加一个CommandButton控件,Caption属性设置为“计算”,用于执行计算命令。

程序的运行代码如下。

        Private Sub Command1_Click()
            If Text1.Text = "" Or Text2.Text = "" Then
                MsgBox "请输入正确数值!", vbInformation, "信息提示"
                Exit Sub
            End If
          Te xt3.Text=TrDec(Text1.Text,Text2.Text)               '获取转换后的数值
        End Sub
        Private Function TrDec(idec As Integer, ibase As Integer) As String
          Dim  strDecR$,iDecR%
            strDecR = ""
          Do  While idec<>0
            iDecR   =idec Mod ibase                             '用十进制数除以转换进制数取余数
            If   iDecR>=10 Then
                  strDecR=Chr$(65+iDecR-10)&strDecR   '
                Else
                  strDecR = iDecR & strDecR
                End If
            idec   =idec\ibase
          Loop
            TrDec = strDecR
        End Function

程序的运行结果如图4.26所示。

图4.26 进制转换程序运行界面

4.4 学习使用循环结构

专题讲座:光盘文件\MR\Video\4\循环结构.exe

视频速递:详细讲解For语句、Do语句、Do…While语句用法

当程序中有重复的工作要做时,就需要用到循环结构。循环结构是指程序重复执行循环语句中一行或多行代码。例如,在窗体上输出10次1,每个1单独一行。如果使用顺序结构实现,就需要书写10次“Print 1”这样的代码,而使用循环语句则简单多了,使用For…Next语句实现的代码如下:

        For i = 1 To 11
            Print 1
        Next i

在上述代码中i是一个变量,用来控制循环次数。

Visual Basic 6.0提供了3种循环语句来实现循环结构:For…Next、Do…Loop和While…Wend,下面分别进行介绍。

4.4.1 For…Next循环语句

当循环次数确定时,可以使用For…Next语句。

语法:

        For循环变量= 初值To终值[S tep步长]
            循环体
            [Exit For]
            循环体
        Next循环变量

For…Next语句执行过程如图4.27所示。

图4.27 For语句的执行流程图

(1)如果不指定“步长”,则系统默认步长为1;当“初值<终值”时,“步长”为0;当“初值>终值”时,“步长”应小于0。

(2)Exit For用来退出循环,执行Next后面的语句。

(3)如果出现循环变量的值总是不超出终值的情况,则会产生死循环。此时,可按【Ctrl+Break】组合键,强制终止程序的运行。

(4)循环次数N=Int((终值-初值)/步长+1)。

(5)Next后面的循环变量名必须与For语句中的循环变量名相同,并且可以省略。

实例位置:光盘文件\MR\ Instance\4\4.12

例4.12】 在ComboBox下拉列表控件中添加1~12个月,代码如下:

        Private Sub Form_Load()
            Dim i%                              '定义一个整型变量
            For i = 1 To 12
            Combo1.AddItem   i&"月"
            Next i
        End Sub

按【F5】键,运行工程,效果如图4.28所示。

图4.28 For语句的简单应用

如果只显示2、4、6等偶数月份,则应将上述代码改为:

        Private Sub Form_Load()
          Dim  i%
            For i = 1 To 12 Step 2
            Combo1.AddItem   i+1&"月
            Next i
        End Sub

如果只显示1、3、5等奇数月份,则只需要将上述代码中的Combo1.AddItem i + 1 & "月"改为Combo1.AddItem i & "月"。

另外,For循环中的计数还可以是倒数,只要把间隔值设为负值(即间隔值小于0),而令初始值大于终止值就可以了。这时,循环的停止条件将会变成当计数值小于终止值时停止。

例如,在窗体上输出10~1的整数,代码如下:

        Private Sub Form_Click()
          Dim  i%
            For i = 10 To 1 Step -1
                Print i
            Next i
        End Sub

4.4.2 For Each…Next循环语句

For Each…Next语句用于依照一个数组或集合中的每个元素,循环执行一组语句。

语法:

        For Each数组或集合中元素In数组或集合
            循环体
            [Exit For]
            循环体
        Next数组或集合中元素

学习手册

说明 ①“数组或集合中元素”:必要参数,是用来遍历集合或数组中所有元素的变量。对于集合,可能是一个Variant类型变量、一个通用对象变量或任何特殊对象变量;对于数组,这个变量只能是一个Variant类型变量。

②“数组或集合”:必要参数,对象集合或数组的名称(不包括用户定义类型的数组)。

③ 循环体:可选参数,循环执行的一条或多条语句。

实例位置:光盘文件\MR\ Instance\4\4.13

例4.13】 单击窗体时使用For Each…Next语句列出窗体上所有控件名称,代码如下:

        Private Sub Form_Click()
          Dim  Myctl As Control
            For Each Myctl In Me.Controls      '                       遍历窗体中的控件
                Print Myctl.Name
            Next Myctl
        End Sub

按【F5】键,运行工程,效果如图4.29所示。

图4.29 在窗体中显示所有控件名称

4.4.3 Do…Loop循环语句

对于那些循环次数难以确定,但控制循环的条件或循环结束的条件已知的情况下,常常使用Do…Loop语句。Do…Loop语句是最常用、最有效、最灵活的一种循环结构,它有以下4种不同的形式。

1.Do While…Loop

使用While关键字的Do…Loop循环称为“当型循环”,是指当循环条件的值为True时执行循环。

语法:

        Do While <循环条件>
            循环体1
            <Exit Do>
            循环体2
        Loop

该语句的执行流程如图4.30所示。

图4.30 Do While…Loop语句执行流程图

从流程图可以看出,Do While…Loop语句的执行过程如下。

<循环条件>定义了循环的条件,是逻辑表达式,或者能转换成逻辑值的表达式。当程序执行到Do While…Loop语句时,首先判断While后面的<循环条件>,如果其值为True,则由上到下执行“循环体”中的语句,当执行到Loop关键字时,返回到循环开始处再次判断While后面的<循环条件>是否为True。如果为True,则继续执行循环体中的语句,否则跳出循环,执行Loop后面的语句。

实例位置:光盘文件\MR\ Instance\4\4.14

例4.14】 下面使用Do While…Loop语句计算1+2+3+…+50的值,代码如下:

        Private Sub Form_Click()
            Dim i%,mySum%                                '定义整型变量
            Do While i < 50
                i=i+1                                    '每循环一次,变量i就加1
                mySum=mySum+i                            '每循环一次,变量mySum就加变量i
            Loop
            Print mySum                                  '输出计算结果
        End Sub

结果为:1225

2.Do…Loop While

这是“当型循环”的第二种形式,它与第一种形式的区别在于While关键字与<循环条件>在Loop关键字后面。

语法:

        Do
            循环体1
            <Exit Do>
            循环体2
        Loop While <循环条件>

该语句的执行流程如图4.31所示。

图4.31 Do…Loop While语句执行流程图

从流程图可以看出,Do…Loop While语句的执行过程为:

当程序执行Do…Loop While语句时,首先执行一次循环体,然后判断While后面的<循环条件>,如果其值为True,则返回到循环开始处再次执行循环体,否则跳出循环,执行Loop后面的语句。

实例位置:光盘文件\MR\ Instance\4\4.15

例4.15】 下面使用Do…Loop While语句计算1+2+3+…+myVal的值,myVal值通过InputBox输入对话框输入,代码如下:

        Private Sub Form_Click()
            Dim i%,mySum%,myVal%    '                         定义整型变量
          my Val=Val(InputBox("请输入一个数:"))    '         得到输入的值
            Do While i < myVal
              i=i+1                                           '每循环一次,变量i就加1
            my   Sum=mySum+i                                  '每循环一次,变量mySum就加变量i
            Loop
            Print mySum                                       '输出计算结果
        End Sub

上述代码中,如果myVal的值大于等于256时,程序会出现“溢出错误”,因为代码中变量myVal定义的是整型,整型的有效范围是−32768~32768,因此出现错误。

解决办法有两种:一种是将变量myVal定义为长整型,这样输入值的有效范围会大些;另一种就是在代码i = i + 1后面加上代码If myVal >= 256 Then Exit Do,判断如果变量myVal的值大于等于256,则使用Exit Do语句退出循环。

3.Do Until…Loop

使用Until关键字的Do…Loop循环被称为“直到型循环”。

语法:

        Do Until <循环条件>
            循环体1
            <Exit Do>
            循环体2
        Loop

该语句的执行流程如图4.32所示。

图4.32 Do Until…Loop语句执行流程图

从流程图可以看出,用Until关键字代替While关键字的区别在于,当循环条件的值为False时才进行循环,否则退出循环。

实例位置:光盘文件\MR\ Instance\4\4.16

例4.16】 下面使用Do Until…Loop语句计算阶乘n!,n值通过InputBox输入对话框输入,代码如下:

        Private Sub Form_Click()
            Dim i%,n%,mySum&                            '定义整型和长整型变量
          n  =Val(InputBox("请输入一个数:"))    '      得到输入的值
            mySum=1                                     '给变量mySum赋初值
            Do Until i = n
                i=i+1                                   '每循环一次,变量i就加1
                mySum=mySum*i                           '每循环一次,变量mySum就乘以变量i
            If   n>12 Then Exit Do                      '如果输入数大于12,就退出循环
          Loop
            Print mySum                                 '输出计算结果
        End Sub

4.Do…Loop Until

Do…Loop Until语句是“直到型循环”的第二种形式。

语法:

        Do
            循环体1
            <Exit Do>
            循环体2
        Loop Until <循环条件>

该语句的执行流程如图4.33所示。

图4.33 Do…Loop Until流程图

从流程图可以看出,Do…Loop Until语句的执行过程为:

当程序执行Do…Loop Until语句时,首先执行一次循环体,然后判断Until后面的<循环条件>,如果其值为False,则返回到循环开始处再次执行循环体;否则跳出循环,执行Loop后面的语句。

学习手册

注意 因为浮点数和精度问题,两个看似相等的值实际上可能不精确相等,所以,在构造Do…Loop循环条件时要注意,如果测试的是浮点类型的值,要避免使用相等运算符“=”,应尽量使用运算符“>”或“<”进行比较。

4.4.4 掌握While…Wend循环语句

While…Wend语句只要指定的条件为True,就会重复执行一行或多行语句。可以嵌套使用,但要注意每个Wend语句都与前面最近的While语句匹配。

语法:

        While <循环条件>
            循环体
        Wend

当循环条件的值为True时,执行循环体,否则退出循环,执行Wend后面的语句。While…Wend语句是早期Basic语言的循环语句,它的功能已经完全被Do…Loop语句包括,所以建议实际开发中尽量不用它。

4.4.5 在应用程序中使用多重循环

在一个循环体内又包含了循环结构称为多重循环或循环嵌套。循环嵌套对For…Next语句、Do…Loop语句均适用。在Visual Basic 6.0中,对嵌套的层数没有限制,可以嵌套任意多层。嵌套一层称为二重循环,嵌套两层称为三重循环。

学习手册

说明 ① 外循环必须完全包含内循环,不可以出现交叉现象。

② 内循环与外循环的循环变量名称不能相同。

下面介绍几种合法且常用的二重循环形式,如表4.7所示。

表4.7 合法的循环嵌套形式

实例位置:光盘文件\MR\ Instance\4\4.17

例4.17】 将100元钱换成零钱(5元、10元、20元中的任意多个面值)有很多种换法。

下面通过一个简单的例子演示两重For…Next循环,代码如下。多重循环的道理相同:

          第一种形式:
          Private Sub Form_Click()
          Dim i%,j%    '              定义整型变量
          For i=1 To 3                '外层循环
            Print"i=";i               '输出变量i
            For j=1 To 3              '内层循环
              Print Tab;"j=";j        '输出变量j
            Next j
          Nex t i
          End Sub
           第二种形式:
         Private Sub Form_Click()
         Dim i%,j%    '                定义整型变量
         For i=1 To 3                  '外层循环
            For j=1 To 3               '内层循环
           P  rint"i=";i;"j=";j        '输出变量i和j
           Next j
           Print                       '输出空行
        Nex t i
       End Sub

上述两段程序只是输出形式不同(即输出语句上有些区别),运行结果分别如图4.34和图4.35所示。从这两段程序的执行情况可以看出,外层循环执行一次(如i=1),内层循环要从头循环一遍(如j=1、j=2和j=3)。

图4.34 多重循环示例(1)

图4.35 多重循环示例(2)

4.4.6 学会选择结构与循环结构的嵌套

在Visual Basic 6.0中,所有的控制结构(包括If语句、Select Case语句、Do…Loop语句、For…Next语句等)都可以嵌套使用。

实例位置:光盘文件\MR\ Instance\4\4.18

例4.18】 将100元钱换成零钱(5元、10元、20元中的任意多个面值)有很多种换法。组成100元的零钱中,最多有20个5元、10个10元和5个20元。判断所有的组合中,总和正好是100元的,代码如下。这类方法称为“穷举法”,也称为“列举法”。

        Private Sub Form_Click()
            Dim x%,y%,z%,n%                                                 '定义整型变量
            Print"5元个数","10元个数","20元个数"                            '输出标题
            For x=0 To 20                                                   '5元的个数
                For y=0 To 10                                               '10元的个数
                  For z=0 To 5                                              '20元的个数
                If      5*x+y*10+z*20=100 Then                              '满足条件
                      n=n+1                                                 '满足条件的组合数
                      Print x,y,z                                           '输出结果
                      End If
                  Next z
                Next y
            Next x
            Print"共有"&n&"种换法"                                          '输出满足条件的组合数
        End Sub

上述程序使用了三重For…Next循环,循环计数器变量分别为x、y、z,代表5元、10元和20元的个数,20个5元、10个10元和5个20元之内共有21×11×6=1386种组合,内嵌If…Then判断总和正好等于100元的只有36种,如图4.36所示。

图4.36 兑换零钱

4.4.7 情景应用——起泡排序算法的实现

起泡排序(BubbleSort)就是依次比较相邻两个元素,将小数放在前面,大数放在后面。即数列中的第1个元素与第2个元素进行比较,将小数放前,大数放后,然后比较第2个数和第3个数,将小数放前,大数放后,以此类推,直至比较最后两个数。

实例位置:光盘文件\MR\ Instance\4\4.19

例4.19】 创建一个Visual Basic应用程序,在一个文本框中输入一组数字,利用起泡排序算法,在另一个文本框中按照从小到大的顺序输出,要求写出排序的整个过程。

程序的设计过程如下:

在工程中新建一个窗体,窗体的名称使用其默认名称Form1,窗体的Caption属性设置为“起泡插入排序”,StartUpPosition属性设置为“2-屏幕中心”。

在窗体上添加两个Label控件,名称均使用其默认名称,并分别设置其Caption属性为“请输入数组:”和“按照从小到大的顺序排列:”。

在窗体上添加两个TextBox控件,名称均使用其默认名称,BoderStyle属性均设置为“0-None”,MultiLine属性均设置为True,Text2控件的ScrollBars属性设置为“2-Vertical”。

在窗体上添加一个CommandButton控件,名称使用其默认名称Command1,Caption属性设置为“排列”。

程序代码如下:

        Private Sub Command1_Click()
            Call BubbleSort      '                                  调用过程
        End Sub
        Private Sub BubbleSort()
            Dim i,j,h As Integer      '                              定义整型变量
            Dim r()As String     '                                   定义字符串变量数组
            Dim k As String                                          '定义字符串变量
            r()=Split(Text1.Text,",")       '                        给数组赋值
          Te xt2.Text=Text2.Text&"[初始关键字]:"
            For t=0 To UBound(r)    '                                循环语句
                Text2.Text=Text2.Text&r(t)&"  "                     '显示初始关键字
            Next t
            Text2.Text=Text2.Text&vbCrLf&vbCrLf                     '文本框内部换行
            For i=0 To UBound(r)–1                                 '外循环
                For j=0 To UBound(r)-i–1                           '内循环
              If     Val(r(j))>Val(r(j+1))Then      '判断条件
                      k=r(j)                        '赋值语句
                      r(j)=r(j+1)                   '赋值语句
                      r(j+1)=k                      '赋值语句
                  End If
                Next j
                '显示第几趟排序结果
                Text2.Text=Text2.Text&i+1&" 趟排序结果:"
            For   t=0 To UBound(r)
                  Text2.Text=Text2.Text&r(t)&"  "
                Next t
                Text2.Text=Text2.Text&vbCrLf  '文本框内部换行
            Next i
        End Sub

程序的运行结果如图4.37所示。

图4.37 起泡排序算法运行结果

4.5 了解其他辅助控制语句

专题讲座:光盘文件\MR\Video\4\其他辅助控制语句.exe

视频速递:详细讲解Goto语句、With…End With、Exit和End语句用法

本节主要介绍其他辅助控制语句,包括跳转语句GoTo、复用语句With…End With、退出语句Exit和结束语句End。

4.5.1 跳转语句GoTo

GoTo语句使程序无条件跳转到过程中指定的语句行执行。

语法:

        GoTo<行号|行标签>

学习手册

说明 ① GoTo语句只能跳转到它所在过程中的行。

② 行标签是任何字符的组合,不区分大小写,必须以字母开头,以冒号“:”结尾,且必须放在行的开始位置。

③ 行号是一个数字序列,且在使用行号的过程中该序列是唯一的。行号必须放在行的开始位置。

④ 太多的GoTo语句,会使程序代码不容易阅读及调试。所以应尽可能少用或不用GoTo语句。

例如,在程序中使用GoTo语句,代码如下:

        Private Sub Command1_Click()
          GoTo l1
        End
        Ex it Sub
        l1:
          Print "没有退出"
        End Sub

当程序执行到GoTo语句时,程序跳转到l1标签下的语句去执行,而不执行End语句结束程序。

学习手册

说明 Exit Sub的作用是立即退出Command1_Click的Sub过程。

4.5.2 复用语句With…End With

With语句是在一个定制的对象或一个用户定义的类型上执行的一系列语句。

语法:

        With <对象>
            [<语句组>]
        End With

参数说明:

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

语句组:可选参数。要在对象上执行的一条或多条语句。

With语句可以嵌套使用,但是外层With语句的对象或用户自定义类型会在内层的With语句中被屏蔽,所以必须在内层的With语句中使用完整的对象或用户自定义类型名称来引用在外层的With语句中的对象或用户自定义类型。

实例位置:光盘文件\MR\ Instance\4\4.20

例4.20】 嵌套使用With语句,在窗体Load事件中设置按钮与窗体的部分属性,代码如下:

        Private Sub Form_Load()
            With Form1                                           '外层With语句
            .Height   =10000
            .Width   =10000
            With   Command1                                    '内层With语句
              .Height     =2000
              .Width     =2000
                  .Caption = "按钮高度与宽度都是2000"
                  Form1.Caption = "窗体高度与宽度都是10000"
                End With
            End With
        End Sub

在外层嵌套With语句中直接设置Form1窗体的高度和宽度,在内层嵌套With语句中直接设置Command1按钮的高度、宽度和显示的标题。在设置Form1的显示标题时需要写入窗体的名称。

4.5.3 退出语句Exit

Exit语句用来退出Do…Loop、For…Next、Function、Sub或Property代码块。Exit语句包括了以下几种类型。

        Exit Do
        Exit For
        Exit Function
        Exit Property
        Exit Sub

Exit语句中各类型的作用如表4.8所示。

表4.8 Exit语句中各类型的作用

例如,在For…Next循环语句中,当满足某种条件时退出循环,就可以通过使用Exit For语句实现,程序代码如下:

        Dim I As Long
        For I = 1 To 100
            If I=50 Then Exit For                            '当I=50时退出循环
        Next I
        Debug.Print I 'I  的值为50

4.5.4 结束语句End

End语句用来结束一个过程或块。End语句与Exit语句容易混淆,Exit语句是用来退出Do…Loop、For…Next、Function、Sub或Property的代码块,并不说明一个结构的终止;而End语句是终止一个结构。

语法:

        End
        End Function
        End If
        End Property
        End Select
        End Sub
        End Type
        End With

End语句中各类型的作用如表4.9所示。

表4.9 End语句中各类型的作用

学习手册

注意 在使用End语句关闭程序时,Visual Basic 6.0不调用Unload、QueryUnload、Terminate事件或任何其他代码,而是直接终止程序(代码)执行。

实例位置:光盘文件\MR\ Instance\4\4.21

例4.21】 下面分别使用End语句与Unload语句关闭程序和窗体。在使用End语句关闭程序时,窗体不发生Unload事件而直接被关闭。在使用Unload语句关闭窗体时,窗体发生Unload事件,调用对话框选择是否退出程序。

程序代码如下:

        Private Sub Command1_Click()
            End                                         '退出程序
        End Sub
        Private Sub Command2_Click()
            Unload Form1      '                           卸载窗体
        End Sub
        Private Sub Form_Unload(Cancel As Integer)
            If MsgBox("是否退出?", Visual Basic 6.0YesNo, "提示") = Visual Basic 6.0No Then Cancel = 1
        End Sub

学习手册

说明 窗体Unload事件中的Cancel参数是一个整数,决定了窗体是否被关闭。只要Cancel参数值不为0,窗体就不会被关闭。

4.6 实战练习

4.6.1 求100以内的素数

难度系数:★★★

题目描述

求100以内的素数。本例通过使用循环结构语句实现素数算法,程序运行以后,单击窗体将100以内的所有素数显示在窗体上。

本例要实现的就是在程序运行时,用鼠标单击窗体,在窗体上输出100以内的素数,程序的运行结果如图4.38所示。

图4.38 求100以内的素数

技术指导

素数又称质数。指在一个大于1的自然数中,除了1和他自身以外,不能被其他自然数整除的数。换句话说,只有两个正因数(1和其本身)的自然数即为素数。素数在数论中占有很重要的地位。

紧急救援

如果您在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。

救援通道:http://www.mrbccd.com/VisualBasic/loveVisualBasic/4.6.1

4.6.2 用Do While语句求最大公约数和最小公倍数

难度系数:★★★

题目描述

使用While关键字的Do…Loop循环称为“当型循环”,是指当循环条件的值为True时执行循环。本练习要求开发一个程序,使用Do while语句计算两个数的最大公约数和最小公倍数,效果如图4.39所示。

图4.39 计算两个自然数的最大公约数和最小公倍数

技术指导

本例主要通过使用最大公约数和最小公倍数的算法来实现。下面介绍实现计算两个数的最大公约数和最小公倍数的算法。

(1)已知两个自然数m和n,使得m>n。

(2)m除以n得余数r。

(3)判断,若r=0,则n是最大公约数,算法结束;否则执行(4)。

(4)将n值赋给m,r值赋给n,重复执行(2)。

最大公约数算法流程图如图4.40所示。

图4.40 最大公约数算法流程图

这里使用Do While…Loop语句判断循环条件余数r是否为零,不满足条件继续循环。

最小公倍数为两个自然数的乘积除以这两个数的最大公约数,即:最小公倍数=两个数之积/最大公约数。

紧急救援

如果您在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。

救援通道:http://www.mrbccd.com/VisualBasic/loveVisualBasic/4.6.2

4.6.3 简单的加密解密算法

难度系数:★★★★

题目描述

将26个英文字母进行加密解密,加密后的字母为该字母向后推五位(即A加密后为F,B加密后为G,……,Z加密后为E)。本练习要求开发一个程序,这里利用For…Next语句分别取出文本框中的每个字母进行加密,结果如图4.41所示。

图4.41 加密解密算法运行结果

技术指导

简单的加密的思想是:将要加密的而每个字母加上或减去一个序数,例如,加上序数5,这时“A”→“F”,“a”→“f”,“B”→“G”,“Y”→“D”,“Z”→“E”。这里要注意对加密后字符范围超出英文字母范围时的判断。

程序中用到了字母的ASCII码值,通过使用ASC函数和CHR函数进行ASCII码值和字母的相互转换。

紧急救援

如果您在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。

救援通道:http://www.mrbccd.com/VisualBasic/loveVisualBasic/4.6.3

4.7 本章小结

通过本章的学习,读者可能发现了看似简单的几个控制语句能够构筑出灵活多变的程序流程,因此学好控制语句是掌握好一门语言的基础。

最后在本章即将结束的时候,笔者对初学者提出几点要求。

(1)结构必须有入口和出口,即结构的起始语句和终止语句。

(2)结构的控制功能由结构本身决定,控制的依据是条件,控制机理是当前变量的值与预先设定的临界值进行比较,得到一个逻辑值“真”或“假”,然后根据这一逻辑值选择程序的执行流程。

(3)在程序中仅有结构语句没有任何意义,结构中必须“装”进内容。结构中可以“装入”任何合法的语句及结构。

(4)在书写结构时尽量采用缩排格式,以增强代码的可读性。

另外,为了提高编程效率,应掌握一些常用编程定式:累加定式、连乘定式、穷举法等。