第3章VBScript编程语言.ppt
1,第3章 VBScript编程语言,3.1 VBScript概述3.2 VBScript的输入与输出3.3 VBScript结构化程序设计3.4 综合练习,2,3.1 VBScript概述,VBScript是一种脚本语言,属于Microsoft Visual Basic的简化版本。VBScript通过变量,操作符,循环,分支,函数和子过程,扩展了HTML。通过在HTML网页中加入VBScript脚本,可以使静态的HTML网页成为动态网页。,3,3.1 VBScript概述,3.1.1ASP的编程语言3.1.2客户端和服务器端编程语言3.1.3在HTML页面中添加VBScript代码,4,3.1.1ASP的编程语言,VBScript是Active Sever Pages的缺省语言,当然也可以在ASP网页中使用其它脚本语言,如Jscript等。可以在HTML文件中直接嵌入VBScript脚本,从而扩展HTML,使它不仅仅是一种页面格式语言。带有VBScript脚本的网页在每次下载到浏览器时都可以是不同的,而且可以对用户的操作做出反应。,5,3.1.2客户端和服务器端编程语言,VBScript既可以作为客户端编程语言,也可以作为服务器端编程语言。客户端编程语言是可以由浏览器解释执行的语言。当以客户端编程语言编制的程序被下载到一个兼容的浏览器中时,浏览器将自动执行该程序。,6,3.1.2客户端和服务器端编程语言,客户端编程语言的优点:浏览器完成了所有的工作,可以减轻服务器的负担。客户端程序运行起来比服务器端程序快得多。当一个浏览器的用户执行了一个操作时,不必通过网络对其做出响应,客户端程序就可以做出响应。但是,一般来说,可以解释VBScript脚本的浏览器只有Microsoft Internet Explorer,而Netscape Navigator将忽略VBScript脚本。,7,3.1.2客户端和服务器端编程语言,VBScript也可以作为服务器端编程语言。服务器端编程语言是在服务器上执行的语言。当创建ASP网页时,将用VBScript作为服务器端编程语言。用VBScript作为服务器端编程语言的好处是VBScript不受浏览器的限制。VBScript脚本在网页通过网络传送给浏览器之前被执行,Web浏览器收到的只是标准的HTML文件。,8,3.1.3在HTML页面中添加VBScript代码,在HTML文件中,使用标记引用VBScript代码。VBScript代码写在标记之间。【例3-1】第一个VBScript例子。说明:代码的开始和结束部分都有标记。LANGUAGE属性用于指定所使用的脚本语言。VBScript代码被嵌入在注释标记()中。,9,3.1.3在HTML页面中添加VBScript代码,SCRIPT块可以出现在HTML页面的任何地方(BODY或HEAD部分之中)。然而最好将所有的目标脚本代码放在HEAD部分中,以使脚本代码集中放置。这样可以确保在BODY部分调用代码之前所有脚本代码都被读取并解码。但是当脚本代码作为对象的事件代码时,则不必把它放在HEAD部分中,可以就近放在对象附近。【例3-2】以下代码将脚本代码放在按钮对象的定义之后以响应按钮的单击事件。,10,3.2VBScript基础,3.2.1VBScript的输入与输出3.2.2VBScript的数据类型3.2.3VBScript的变量3.2.4VBScript的数组变量3.2.5VBScript的常数3.2.6VBScript的运算符与表达式3.2.7VBScript的常用函数3.2.8语句,11,3.2.1VBScript的输入与输出,VBScript中实现信息输入与输出的方法有两种:一种是使用Document对象及其子对象的方法和属性,如例3-1中的document.write();一种是使用VBScript的内置函数。VBScript信息框函数和输入框函数。,12,3.2.1VBScript的输入与输出,1.信息框函数 信息框函数(MsgBox)是常用的输出信息的函数。MsgBox函数在对话框中显示信息,等待用户单击按钮,并返回一个整数以标明用户单击了哪个按钮。其语法格式为:变量=MsgBox(信息内容,对话框类型,对话框标题),13,3.2.1VBScript的输入与输出,说明:信息内容指定在对话框中出现的文本,在信息内容中使用硬回车符(CHR(13))可以使文本换行。最多可有1024个字符。对话框类型指定对话框中出现的按钮和图标,一般有三个参数。其取值和含义见表3-1、表3-2、表3-3(p54)。三种参数值可以相加以达到所需要的样式。对话框标题指定对话框的标题。,14,3.2.1VBScript的输入与输出,Msgbox()返回的值指明了在对话框中选择哪一个按钮,见表3-4(p55)。代码中的值可以是数值,也可以是数值常量。如果省略了某些可选项,必须加入相应的逗号分隔符。若不需要返回值,则可以使用MsgBox的命令形式:MsgBox信息内容,对话框类型,对话框标题,15,3.2.1VBScript的输入与输出,例如:msg=MsgBox(请确认输入的数据是否正确!,3+48+0,数据检查),16,3.2.1VBScript的输入与输出,2.输入框函数 输入框函数(InputBox)显示一个能接受用户输入的对话框,并返回用户在对话框中输入的信息。其语法格式为:变量=InputBox(信息内容,对话框标题,默认内容),17,3.2.1VBScript的输入与输出,说明:信息内容指定在对话框中出现的文本。在信息内容中使用硬回车符(CHR(13))可以使文本换行。最多可有1024个字符。对话框标题指定对话框的标题。默认内容可以指定输入框的文本框中显示的默认文本。如果用户单击“确定”按钮,文本框中的文本(字符串)将返回到变量中,若用户单击“取消”按钮,返回的将是一个零长度的字符串。,18,3.2.1VBScript的输入与输出,例如:aa=InputBox(“信息内容”,“对话框标题”,默认内容)注意:如果省略了某些可选项,必须加入相应的逗号分隔符。,19,3.2.2VBScript的数据类型,VBScript只有一种数据类型,称为Variant(变体类型)。Variant是一种特殊的数据类型,根据使用的方式,它可以包含不同类别的信息。最简单的Variant可以包含数值或字符串信息。Variant用于数值上下文中时作为数值处理,用于字符串上下文中时作为字符串处理。Variant还可以进一步区分数值信息的特定含义。例如使用数值信息表示日期或时间。,20,3.2.2VBScript的数据类型,Variant包含的数据信息类型称为子类型。大多数情况下,可将所需的数据放进Variant中,而Variant也会按照最适用于其包含的数据的方式进行操作。表3-5(p56)显示了Variant包含的数据子类型。可以使用转换函数来转换数据的子类型。另外,可使用VarType函数返回数据的Variant子类型。,21,3.2.3VBScript的变量,变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储脚本运行时可更改的程序信息。使用变量并不需要了解变量在计算机内存中的地址,只要通过变量名引用变量就可以查看或更改变量的值。,22,3.2.3VBScript的变量,1.变量的命名规则 第一个字符必须是字母,可以包括下划线(_);不能包含嵌入的句点;长度不能超过255个字符;在被声明的作用域内必须唯一。VBScript变量名对大小写不敏感。,23,3.2.3VBScript的变量,2.声明变量 声明变量的一种方式是使用Dim语句、Public语句和Private语句在脚本中显式声明变量,并分配存储空间。声明变量的语法为:Dim|Private|Public变量名,变量名2,变量名3,24,3.2.3VBScript的变量,说明:Public语句声明的变量可用于全部脚本中的所有过程;用Dim声明的Script级变量可用于脚本中的所有过程,过程级变量只能用于过程中;Private语句声明的变量只能在声明该变量的脚本中使用。变量名遵循VBScript的标准命名规则。,25,3.2.3VBScript的变量,例如:Dim DegreesFahrenheit 声明多个变量时,使用逗号分隔变量。例如:Dim Top,Bottom,Left,Right,26,3.2.3VBScript的变量,另一种方式是通过直接在脚本中使用变量名这一简单方式隐式声明变量。这通常不是一个好习惯,因为这样有时会由于变量名被拼错而导致在运行脚本时出现意外的结果。因此,最好使用Option Explicit语句显式声明所有变量,并将其作为脚本的第一条语句。,27,3.2.3VBScript的变量,注意:Option Explicit语句的位置很特殊,必须把Option Explicit语句作为一个ASP网页的起始语句之一,即它必须出现在任何HTML标识或其它VBScript命令之前,否则,该语句将被视为非法语句。,28,3.2.3VBScript的变量,3.变量的作用域与存活期 变量的作用域由声明它的位置决定。如果在过程中声明变量,则只有该过程中的代码可以访问或更改变量值,此时变量具有局部作用域并且是过程级变量。如果在过程之外声明变量,则该变量可以被脚本中所有过程所识别,称为Script级变量,具有脚本级作用域。,29,3.2.3VBScript的变量,变量存在的时间称为存活期。Script级变量的存活期从被声明的一刻起,直到脚本运行结束。对于过程级变量,其存活期仅是该过程运行的时间,该过程结束后,变量随之消失。在执行过程时,过程级变量(局部变量)是理想的临时存储空间。,30,3.2.3VBScript的变量,4.给变量赋值 使用赋值语句可以将指定的值赋给某个变量,赋值语句的一般格式为:名称=值 说明:名称是任何变量或可写的属性;值可以是任何数值或字符串文字、常数或表达式。赋值语句是先计算(表达式),然后再赋值。将计算所得的表达式值赋给赋值号“=”左边的变量或属性。赋值号不是数学上的等号。,31,3.2.4VBScript的数组变量,多数情况下,只需为声明的变量赋一个值。只包含一个值的变量被称为标量变量。有时候,将多个相关值赋给一个变量更为方便,因此可以创建包含一系列值的变量,称为数组变量。1.数组的声明 数组变量和标量变量是以相同的方式声明的,唯一的区别是声明数组变量时变量名后面带有括号()。语法为:Dim|Private|Public|ReDim变量名(维数),变量名2(维数2),32,3.2.4VBScript的数组变量,说明:维数是指数组变量的维数,最多可以声明60维的数组。维数参数使用以下语法:上界,上界2 数组的下界总是0。如下面的命令代码声明了一个包含11个元素的一维数组:Dim A(10)一般的,VBScript中数组元素的数目总是括号中显示的数目加1。这种数组被称为固定大小的数组。,33,3.2.4VBScript的数组变量,在数组中使用索引为数组的每个元素赋值。从0到10,将数据赋给数组的元素,如下所示:A(0)=256A(1)=324 A(2)=100.A(10)=55,34,3.2.4VBScript的数组变量,数组并不仅限于一维。数组的维数最大可以为 60。声明多维数组时用逗号分隔括号中每个表示数组大小的数字。在下例中,MyTable变量是一个有6行和11列的二维数组:Dim MyTable(5,10)在二维数组中,括号中第一个数字表示行的数目,第二个数字表示列的数目。,35,3.2.4VBScript的数组变量,2.动态数组 也可以声明动态数组,即在运行脚本时大小发生变化的数组。对动态数组的最初声明使用Dim语句或ReDim语句,括号中不包含任何数字。例如:Dim MyArray()ReDim AnotherArray()要使用动态数组,必须随后使用 ReDim 确定维数和每一维的大小。,36,3.2.4VBScript的数组变量,在下例中,ReDim将动态数组的初始大小设置为25,而后面的ReDim语句将数组的大小重新调整为30,同时使用Preserve关键字在重新调整大小时保留数组的内容。ReDim MyArray(25)ReDim Preserve MyArray(30)重新调整动态数组大小的次数是没有任何限制的,但是应注意:将数组的大小调小时,将会丢失被删除元素的数据。,37,3.2.5VBScript的常数,常数是具有一定含义的名称,用于代替数字或字符串,其值从不改变。声明常数的方法:Const 变量名数据的值例如:Const MyString=“这是一个字符串。”Const MyAge=49 注意:字符串文字包含在两个引号()之间。,38,3.2.5VBScript的常数,日期文字和时间文字包含在两个井号“#”之间。例如:Const CutoffDate=#6-1-97#,39,3.2.6VBScript的运算符与表达式,运算是对数据进行加工的过程,描述各种不同运算的符号称为运算符,而参与运算的数据称为操作数。表达式用来表示某个求值规则,它由运算符和配对的圆括号将值、常数、变量、函数、对象等操作数以合理的形式组合而成。VBScript有一套完整的运算符,包括算术运算符、比较运算符、连接运算符和逻辑运算符。,40,3.2.6VBScript的运算符与表达式,1.算术运算符 VBScript有8个算术运算符,见表3-6(p60)。在这8个算术运算符中,除取负“-”是单目运算符外,其他均为双目运算符。加(+)、减(-)、乘(*)、浮点除法(/)、取负(-)、乘方()运算的含义与数学中基本相同。,41,3.2.6VBScript的运算符与表达式,说明:/和 的区别:1/2=0.5,1 2=0。整除号 用于整数除法,在进行整除时,如果参加运算的数据含有小数,首先将它们四舍五入,使其成为整型数或长整型数(必须保证它们在-2147483648.5和+2147483647.5之间),然后再进行运算,其结果截尾成整型数。,42,3.2.6VBScript的运算符与表达式,模运算符Mod用来求整型除法的余数。其结果为第一个操作数整除第二个操作数所得的余数。例如:9 Mod 7的值为2,16 Mod 25的值是16。若表达式为:25.58 Mod 6.91,则首先把25.58和6.91分别取整为26和7,其值5。,43,3.2.6VBScript的运算符与表达式,进行除法(包括整除)运算时,除数为0或进行乘幂运算时指数为负数而底数为0时,都会产生算术溢出的错误信息。【例3-3】华氏温度和摄氏温度相互转换的网页。,44,3.2.6VBScript的运算符与表达式,2.比较运算符 VBScript有7个比较运算符,用于比较表达式,其说明见表3-7(p62)。说明:Is运算符是对象引用比较运算符。它并不比较对象或对象的值,而只是进行检查,判断两个对象引用是否引用同一个对象。,45,3.2.6VBScript的运算符与表达式,当比较两个表达式时,或许不容易确定比较的表达式是作为数值或作为字符串。表3-8(p62)描述了如何对表达式进行比较、以及比较的结果,它取决于比较的子类型。,46,3.2.6VBScript的运算符与表达式,3.连接运算符连接运算符用于连接两个或更多的字符串。VBScript中的连接运算符“&”,其语法格式为:字符串1&字符串2&字符串3 还可以用“+”把两个字符串连接成一个字符串。但是为了避免与算术加法运算符产生混淆,应该用“&”号。“&”会自动将非字符串子类型的数据转换成字符串后再进行连接,而“+”则不能自动转换。,47,3.2.6VBScript的运算符与表达式,4.逻辑运算符 VBScript提供的逻辑运算符有:And、Or、Not、Xor、Eqv、Imp等6种,见表3-9(p63)。说明:逻辑运算符两侧若有数值数据出现,则将数值数据转换为二进制数(补码形式)进行按位运算。此时,1为真,0为假。逻辑运算的结果见表3-10(真值表)(p63)。,48,3.2.6VBScript的运算符与表达式,5.运算符优先级 当表达式包含多个运算符时,将按预定顺序计算每一部分,这个顺序被称为运算符优先级。首先计算算术运算符,然后计算比较运算符,最后计算逻辑运算符。运算符的优先级见表3-11(p64)。,49,3.2.6VBScript的运算符与表达式,说明:同级运算按照它们从左到右出现的顺序进行计算。可以用括号改变优先顺序,强令表达式的某些部分优先计算。括号内的运算总是优先于括号外的运算,在括号之内,运算符的优先顺序不变。,50,3.2.7VBScript的常用函数,在VBScript中,有两类函数:内部函数和用户定义函数。用户定义函数是由用户自己根据需要定义的函数。内部函数也称标准函数,VBScript提供了大量的内部函数。在这些函数中,有些是通用的,有些则与某种操作有关。这些函数可分为:转换函数、数学函数、字符串函数、日期时间函数、随机函数。,51,3.2.7VBScript的常用函数,1.数学运算函数 数学运算函数用于各种数学运算。常用的数学运算函数见表3-12(P65)。,52,3.2.7VBScript的常用函数,53,3.2.7VBScript的常用函数,算术函数有几点说明:(1)函数具有返回值,应注意函数返回值的数据类型。(2)三角函数的运算都使用弧度。(3)Fix(x)和Int(x)函数都是对数值型变量取整,但对于正数和负数结果不同。Fix(10.5)=10Int(10.5)=10Fix(-10.5)=-10Int(-10.5)=-11,54,3.2.7VBScript的常用函数,2.字符串函数VBscript提供了大量的字符串函数,具有强大的字符串处理能力,见表3-13(P65)。,55,3.2.7VBScript的常用函数,56,3.2.7VBScript的常用函数,57,3.2.7VBScript的常用函数,3.日期和时间函数 时间和日期函数使程序能向用户显示日期和时间,提供某个事件何时发生及持续时间长短的信息。时间和日期函数见表3-14(P65)。,58,3.2.7VBScript的常用函数,59,3.2.7VBScript的常用函数,60,3.2.7VBScript的常用函数,4.随机数语句和函数 在测试、模拟和游戏程序中,经常要使用随机数,随机数语句和函数见表3-15(P65)。,61,3.2.7VBScript的常用函数,用Rnd(x)函数用于产生随机数,当x=0时产生与前一次相同的随机数。如果不断地重复Rnd函数,会反复出现同一序列的随机数,可以用Randomize语句消除这种情况。语法:Randomize(x)常用Rnd函数产生某个限定范围的随机整数,使用以下规则:Int(上限-下限+1)*Rnd)+下限例如:产生1199范围的随机整数:Int(99-11+1)*Rnd)+11,62,3.2.7VBScript的常用函数,5.数据类型转换函数 在VBScript中,一些数据类型可以自动转换,例如数字字符串可自动转换为数值型,但是,多数类型不能自动转换,这就需要用类型转换函数来显式地说明。转换函数见表3-16(P66)。每个类型转换函数都可以强制将一个表达式转换成某种特定数据子类型。,63,3.2.7VBScript的常用函数,64,3.2.7VBScript的常用函数,65,3.2.7VBScript的常用函数,例如:Area=CDbl(txtLength.Text*txtWidth.Text)注意:如果传递给函数的参数超过转换目标数据类型的范围,将发生错误。例如,如果想把Long型数转换成Integer型数,那么,Long型数必须在Integer数据类型的有效范围之内。,66,3.2.7VBScript的常用函数,6.测试函数 在VBScript中,还提供了一些测试函数,用来测试传入参数的各种形态。测试函数见表3-17(P66)。说明:Null值表示变量不包含有效数据。Null与Empty不同,后者表示变量未经初始化。Null与零长度字符串()也不同,零长度字符串往往指的是空串。,67,3.2.7VBScript的常用函数,68,3.2.7VBScript的常用函数,使用IsNull函数可以判断表达式是否包含Null值。例如:下面的示例利用IsNull函数决定变量是否包含Null:Dim MyVar,MyCheckMyCheck=IsNull(MyVar)返回 False。MyVar=Null 赋为 Null。MyCheck=IsNull(MyVar)返回 True。MyVar=Empty 赋为 Empty。MyCheck=IsNull(MyVar)返回 False。,69,3.2.8语句,1.程序语句 VBScript程序中的一行代码称为一条程序语句,简称为语句。语句是执行具体操作的指令,每个语句行以回车(Enter)键结束。一个语句行的长度最多不能超过1023个字符。建立程序语句时必须遵从的构造规则称为语法。,70,3.2.8语句,2.语句的书写规则(1)一行中的多条语句 一般情况下,输入程序时要求一行写一个语句。但是也可以使用复合语句行,即把几个语句放在一个语句行中,语句之间用冒号“:”隔开。例如:Text1.Text=Hello:Red=255:A=Red,71,3.2.8语句,(2)语句的续行 当一条语句很长时,在记事本窗口阅读程序时将不便查看,使用滚动条又比较麻烦。这时,就可以使用续行功能,用续行符“_”将一个较长的语句分为多个程序行。续行符只能出现在行尾。例如:strMyStr=当前用户为:&_ strUsername,72,3.2.8语句,3.语句格式中的符号约定 为了便于解释语句、方法和函数,本教程语句、方法和函数格式中的符号采用统一约定。在各语句、方法、函数的语法格式和功能说明中,以尖括号、方括号、花括号、竖线|、逗号加省略号,.、省略号.作为专用符号,这些符号的含义见表3-18(P67)。,73,3.2.8语句,注意:这些专用符号和其中的提示,不是语句行或函数的组成部分。在输入具体命令或函数时,上面的符号均不可作为语句中的成分输入计算机,它们只是语句、函数格式的书面表示。例如:If条件Then 语句1 Else语句2,74,3.3VBScript结构化程序设计,结构化程序设计有三种基本结构:顺序结构、选择结构、循环结构。3.3.1VBScript的选择结构3.3.2VBScript的循环结构3.3.3VBScript的过程,75,3.3.1VBScript的选择结构,VBScript中选择结构语句有:IfThenElse、Select Case语句,分别实现单条件选择结构和多分支条件选择结构。1.单条件选择结构 单条件选择结构是最常用的双分支选择结构,其特点是:所给定条件(条件表达式)的值如果为真,则执行a1块;如果为假则执行a2块。,76,3.3.1VBScript的选择结构,(1)行If语句 实现单条件选择结构最简单的语句是行If语句,其语法格式为:If条件Then 语句1 Else语句2【例3-4】下面的代码测试输入的数据是否有效的数值。,77,3.3.1VBScript的选择结构,(2)块If语句 块If语句又称为多行If语句,其语法结构为:If条件1Then 语句列1Else 语句列2End If【例3-5】将例3-4中的行If语句改为使用块If语句。,78,3.3.1VBScript的选择结构,(3)If语句的嵌套 If语句可以嵌套使用,即在If语句的操作块(语句列1或语句列2)中使用If语句。,79,3.3.1VBScript的选择结构,【例3-6】铁路托运行李,从甲地到乙地,规定每张客票托运费计算方法是:行李重量不超过50公斤时,每公斤0.25元,超过50公斤而不超过100公斤时,其超过部分每公斤0.35元,超过100公斤时,其超过部分每公斤0.45元。编写程序,输入行李重量,计算并输出托运的费用。分析:设行李重量为w公斤,应付运费为x元,则运费公式为:,80,3.3.1VBScript的选择结构,(4)If语句的嵌套格式 当代码中出现多层If语句嵌套时,将使程序冗长而不便阅读。为此VBScript提供了带ElseIf的If语句来处理当条件为假时又内嵌If语句的情形,以使程序简化易写。,81,3.3.1VBScript的选择结构,其语法格式为:If条件1Then 语句列1ElseIf条件2Then 语句列2.Else 其他语句列End If,82,3.3.1VBScript的选择结构,【例3-7】某百货公司为了促销,采用购物打折扣的优惠办法。每位顾客一次购物:(1)在1000元以上者,按九五折优惠。(2)在2000元以上者,按九折优惠。(3)在3000元以上者,按八五折优惠。(4)在5000元以上者,按八折优惠。分析:设购物款数为x元,优惠价为y元,则优惠付款公式为:,83,3.3.1VBScript的选择结构,2.多分支条件选择结构 多分支选择结构的特点是:从多个选择结构中,选择第一个条件为真的路线作为执行的路线。Select Case语法格式:Select Case测试条件 Case表达式表1 语句列1 Case表达式表2 语句列2.Case Else 其他语句列End Select,84,3.3.1VBScript的选择结构,说明:测试条件为必要参数,是任何数值或字符表达式。在Case子句中,表达式表为必要参数,用来测试其中是否有值与测试条件相匹配。当使用多个表达式的列表时,表达式与表达式之间要用逗号(,)隔开。语句列 为可选参数,是一条或多条语句,当表达式表中有值与测试条件相匹配时执行。Case Else子句用于指明其他语句列,当测试条件和所有的Case子句表达式表中的值都不匹配时,则会执行这些语句。【例3-8】例3-7中的If语句可以改为Select语句。,85,3.3.2VBScript的循环结构,循环是指在程序设计中,从某处开始有规律地反复执行某一程序块的现象,重复执行的程序块称为“循环体”。在VBScript中可使用下列循环语句:Do.Loop:当(或直到)条件为 True 时循环。While.Wend:当条件为 True 时循环。For.Next:指定循环次数,使用计数器重复运行语句。For Each.Next:对于集合中的每项或数组中的每个元素,重复执行一组语句。,86,3.3.2VBScript的循环结构,DoLoop语句有两种语法形式,分别是:前测型循环结构与后测型循环结构。(1)前测型DoLoop循环 前测型DoLoop循环结构,首先判断条件,根据条件决定是否执行循环,执行循环的最少次数为0。其语法为:Do While|Until 条件 语句列1 Exit Do 语句列2Loop,87,3.3.2VBScript的循环结构,Exit Do 语句用于退出 Do.Loop 循环。Do While.Loop 语句,当条件为 True 时或条件变为 True 之前,重复执行语句块。Do Until.Loop 语句,当条件为假时,重复执行语句块。条件为真时,跳出循环。【例3-9】求累加和1+2+3+100。分析:采用累加的方法,用变量s来存放累加的和(开始为0),用变量n来存放“加数”(加到s中的数)。这里n又称为计数器,从1开始到100为止。,88,3.3.2VBScript的循环结构,【例3-10】输入一个正整数,利用“当型”循环判断是否素数。分析:所谓“素数”是指除了1和该数本身,不能被任何整数整除的数。判断一个自然数n(n3)是否素数,只要依次用2n作除数去除n,若n不能被其中任何一个数整除,则n即为素数。,89,3.3.2VBScript的循环结构,(2)后测型DoLoop循环 首先执行循环体,然后判断条件,根据条件决定是否继续执行循环,因此执行循环的最少次数为1。其语法为:Do 语句列1 Exit Do 语句列2Loop While|Until 条件,90,3.3.2VBScript的循环结构,【例3-11】输入两个正整数,求它们的最大公约数。分析:求最大公约数可以用“辗转相除法”,如下:以大数m作被除数,小数n做除数,相除后余数为r。若r0,则mn,nr,继续相除得到新的r。若仍有r0,则重复此过程,直到r=0为止。最后的m就是最大公约数。,91,3.3.2VBScript的循环结构,2.While.Wend语句 当循环(While.Wend)比较简单,其特点是,只要指定的条件为True,则会重复执行一系列的语句。其语法格式为:While条件 语句列Wend,92,3.3.2VBScript的循环结构,【例3-12】利用下述公式计算圆周率的近似值:当最后一项的绝对值小于0.000001时停止计算。注意:程序运行时间可能很长。,93,3.3.2VBScript的循环结构,3.For.Next语句 For循环变量=初值To终值Step步长 语句列1 Exit For 语句列2 Next 循环变量,94,3.3.2VBScript的循环结构,说明:循环变量为必要参数,是用做循环计数器的数值变量,这个变量不能是数组元素。初值和终值都是必要参数,如果没有指定步长,则缺省值为1。步长可以是正数或负数。步长参数值决定循环的执行情况:如果步长的值为正数,则必须初值=终值。,95,3.3.2VBScript的循环结构,可以在循环中的任何位置放置任意个Exit For语句,随时退出循环。如果省略Next语句中的 循环变量,将不影响循环的执行。但如果Next语句在它相对应的For语句之前出现,则会产生错误。在循环中改变循环变量的值,将会使程序代码的阅读和调试变得困难。,96,3.3.2VBScript的循环结构,【例3-13】“同构数”是指这样的整数:它恰好出现在其平方数的右端,例如1和5就是这样的数。试找出19999之间的全部“同构数”。分析:1位同构数n应满足条件:n=n2 Mod 10,2位同构数n应满足条件:n=n2 Mod 100,3位同构数n应满足条件:n=n2 Mod 1000,4位同构数n应满足条件:n=n2 Mod 10000。,97,3.3.2VBScript的循环结构,4.For EachNext循环语句 For Each.Next循环与For.Next循环类似。For Each.Next不是将语句运行指定的次数,而是对于数组中的每个元素或对象集合中的每一项重复一组语句。这在不知道集合中元素的数目时非常有用。其语法格式为:For Each元素In名称 语句列1 Exit For 语句列2 Next 元素,98,3.3.2VBScript的循环结构,说明:元素是用来枚举集合或数组中所有元素的变量。对于集合,元素可能是Variant变量、通用Object变量或任意指定的Automation对象变量。对于数组,元素只能是Variant变量。名称是指对象集合或数组的名称。【例3-14】在窗体中有若干文本框,在代码中创建Dictionary对象,并赋值。然后将Dictionary对象的内容分别放置在多个文本框中。,99,3.3.2VBScript的循环结构,5.循环的嵌套 通常把循环体内不含循环语句的循环称为单重(层)循环,而把循环体内含有循环语句的循环称为多重循环,或称循环的嵌套。上面介绍的循环结构既可以单独嵌套,也可以互相嵌套,但是要注意内外循环不能交叉。【例3-15】求从1000到1100之间的所有素数。分析:例3-10介绍了利用DoLoop循环判断素数的方法,现在只需对10001100之间的各整数依次测试即可。,100,3.3.3VBScript的过程,在VBScript中,过程被分为两类:Sub过程和Function过程。1.Sub过程 VBScript的Sub过程分为事件过程和通用过程两种。事件过程是当发生某个事件时,对该事件做出响应的程序段;通用过程则是独立于事件过程的程序段,可以被其他过程调用。,101,3.3.3VBScript的过程,Sub过程是包含在Sub和End Sub语句之间的一组VBScript语句,执行操作但不返回值。(1)Sub过程的定义PublicDefault|Private Sub过程名(形参表)语句列 Exit Sub 语句列End Sub 参数说明见表3-19(p81)。,102,3.3.3VBScript的过程,其中形参表中出现的参数称为形式参数,简称为形参。形参表中形参的语法为:ByVal|ByRef变量名()其参数说明见表3-20(p82)。,103,3.3.3VBScript的过程,(2)Sub过程的调用 调用Sub过程有两种方法:使用Call语句:Call过程名(实参表)直接使用过程名:过程名实参表,104,3.3.3VBScript的过程,说明:实参表是实际参数列表,参数与参数之间要用逗号分隔。当用Call语句调用执行过程时,其过程名后必须加括号,若有参数,则参数必须放在括号之内。若省略Call关键字,则过程名后不能加括号,若有参数,则参数直接跟在过程名之后,参数与过程名之间用空格隔开,参数与参数之间用逗号分隔。,105,3.3.3VBScript的过程,【例3-16】编制判断素数的Sub过程,验证哥德巴赫猜想:一个不小于6的偶数可以表示为两个素数之和。例如:6=3+3,8=3+5,10=3+7,分析:假设有一个偶数n,将它表示为两个整数a和b的和,即n=a+b。如果n=10,先令a=2,判断2是否是素数,经检查2是素数,由于b=n-a,故b的值为8,经检查8不是素数,则这一组合(10=2+8)不合要求。再使a加1,即a=3,经检查3是素数,b=n a=7,经检查7也是素数,则这一组合(10=3+7)符合要求。,106,3.3.3VBScript的过程,2.Function过程 Function过程与Sub过程非常相似,只有关键的一点区别:函数有返回值。(1)Function过程的定义Public Default|Private Function函数名(形参表)语句列 函数名=表达式 Exit Function 语句列 函数名=表达式End Function,107,3.3.3VBScript的过程,(2)Function过程的调用 Function过程的调用比较简单,可以像使用VBScript内部函数一样来调用Function过程,即在表达式中写上它的名字。还可以像调用Sub过程那样调用Function过程。下面的代码调用了同一个Function过程:Call Hypotenuse(3,6)Hypotenuse 3,6 当用这种方法调用函数时,VBScript放弃返回值。,108,3.3.3VBScript的过程,函数可以没有参数。调用无参函数得到一个固定的值,如下述无参函数:Function F2 F2=Welcome to beijingEnd Function 可如下调用:MsgBox F2【例3-17】编写求两数最大公约数的Function过程。在网页中输入3个整数,调用Function过程求出3个整数的最大公约数。,109,3.3.3VBScript的过程,3.参数的传递方式 传递参数的方式有两种:如果调用语句中的实际参数是常量或表达式,或者定义过程时选用ByVal关键字,就可以按值传递。如果调用语句中的实际参数为变量,或者定义过程时选用ByRef关键字,就可以按地址传递。,110,3.3.3VBScript的过程,(1)按地址传递参数 按地址传递参数,就是让过程根据变量的内存地址去访问实际变量的内容,即形式参数与实际参数使用相同的内存地址单元,这样通过子过程就可以改变变量本身的值。系统缺省按地址传递参数。在传址调用时,实际参数必须是变量,常量或表达式无法传址。,111,3.3.3VBScript的过程,(2)按值