分享

第三章:vbscript教案

 jojo1981 2009-10-16

3.1 VBScript语言简介

VBScriptVisual Basic Script的简称,即 Visual Basic 脚本语言,有时也被缩写为VBS。是asp动态网页默认的编程语言,配合asp内建对象和ADO对象,用户很快就能掌握访问数据库的asp动态网页开发技术。

VBScript是微软开发的一种脚本语言,可以看作是VB语言的简化版,目前这种语言广泛应用于网页和ASP程序制作,它不能生成可执行程序,只能嵌入HTML或者其他类型的中。

HTML中,使用Vbscript的方法如下:

Program3-1

</SCRIPT LANGUAGE=”language” [EVENT=”event”] [FOR=“object”]>

<! - -

       Scripting code

- - >

</SCRIPT>

格式中包括3个属性,其含义如下:

l         LANGUAGE:指定脚本代码所用的脚本编写语言。不同的浏览器所用的脚本语言是不一样的,对于Internet Explorer浏览器来说,可以使用的脚本语言有两种,即VBScriptJavaScript语言。而对于NetScape浏览器来说,目前VBScript还不能使用。

HTML不能直接运行脚本语言程序,只能通过解释器执行,LANGUAGE属性告诉HTML调用哪一个解释器。在用户建立的VBScript应用程序中,HTML调用驻留在Internet Explorer中的VBScript解释器。

l         EVENT:指定与该脚本部分相关联的事情。

l         FOR:指定与事件相关联的对象。

除了上面的属性外,脚本部分还含有注释标记<! - - - - > ,这个标记不是必需的。但一般应该加上。因为有了这个标记后,脚本代码就可以不被那些不支持脚本的浏览器显示。

 

Script程序段可以出现在HTML页面的任何部分,但是为了便于集中管理VBScript代码,最好将其放在head部分,在页面中调用。

通常在HTML页面加载到客户端浏览器时,<script>标记块中的脚本代码首先执行。如上面例子中如果添加的script语句为标注中的语句,程序执行时就会弹出对话框。

但是,如果脚本代码被放置在函数或者过程中,并且没有被调用,则脚本代码不会执行。

Program3-2】:

<html>

<head>

<script language="vbscript">

<!--

sub btn_clk()

   Msgbox "用户单击了按钮!"

end sub

-->

</script>

<title>单击按钮时执行</title>

</head>

<body>

<input type="button" name="button1" value="手式调用vbscript代码" onclick="btn_clk">

</body>

3.2 数据类型和运算符

3.2.1 数据类型

VBScript中,只有一种数据类型,即变体(Variant)类型,但它包含了多种基本数据类型,这些基本数据类型称为子类型。变体类型的子类型包括:

1Sting(字符串):一个字符序列,由ASCII字符组成,包括标准的ASCII字符和扩展ASCII字符。在VBScript中,字符串是放在双引号内的若干个字符,其中长度为0(不包含任何字符)的字符串称为空字符串。

字符串通常放在引号中,例如:

"hello"

"We are students"

""(空字符串)

VBScript中字符串的长度是不确定的,可以从02^31个字符。

2Empty(空类型):声明一个变量后,如果还没有初始化,则改变量的值为Empty。这个值是自动分配的,当变量的子类型为数值时,其值为0;而对于字符串变量,其值为0长度的字符串。

Variant变量在被赋值前为空值(内部表示为Empty0),它不同于数值0,不同于空字符串("",也不同于Null(见下)。

当一个Variant变量为空值时,可以用在表达式中,VBScript将根据具体情况将其解释为数值0或空字符串。如果将其一个空值Variant变量赋给一个非空值Variant变量,则使后者变为空值。

一旦Variant变量被赋值,空值即不复存在。

3Null(空值):可以把该值赋给一个变量,使该变量不包含任何有效数据。

4Byte(字节):以1个字节的无符号二进制数存储,其取值范围为0255

5Boolean(布尔):是一个逻辑值,用两个字节存储,它只取两种值,即TrueFalse

6Integer(整型数):用两个字节存储。取值范围为-3276832767

7Date(日期):格式:mm/dd/yyyy或者mm-dd-yyyy

8Time(时间):格式:hh:mm:ss,例如:144455

9Object(对象):对象型数据用来表示图形或OLE对象或其它对象。

10Error(错误):保存由VBScript产生的错误代码。

其它还有:Long(长整数)、Single(单精度数)、Double(双精度数)等。

3.2.2 运算符

运算(即操作)是对数据的加工。最基本的运算形式常常可以用一些简洁的符号来描述,这些符号称为运算符或操作符。被运算的对象,即数据,称为运算量或操作数。由运算符和运算量组成的表达式描述了对哪些数据、以何种顺序进行什么样的操作。运算量可以是常量,也可以是变量,还可以是函数。例如:A3TSina),X=A+BPI*r*r等都是表达式,单个变量或常量也可以看成是表达式。

VBScript提供了丰富的运算符,可以构成多种表达式。

(一)算术运算符

算术运算符是常用的运算符,用来执行简单的算术运算。VBScript提供了9个算术运算符,表5.1按优先级(从高到低)列出了这些算术运算符。

5.1     VBScript 算术运算符

运算

运算符

表达式例子

指数

^

X^Y

取负

X

乘法

*

X*Y

浮点除法

/

X/Y

整数除法

\

X\Y

取模

Mod

X Mod Y

加法

+

X+Y

减法

X-Y

连接

&

X&Y

9个算术运算符中,除取负(-)是单目运算符外,其它均为双目运算符(需要两个运算量)。加(+)、减(-)、乘(*)、取负(-)等几个运算符的含义与数学中基本相同。

(二)关系运算符

关系运算符也称比较运算符,用来对两个表达式的值进行比较,比较的结果是一个逻辑值,即真(True)或假(False)。VBScript提供了6个关系运算符,见表5.3(优先级从高到低)。

5.3     关系运算符

运算符

测试关系

表达式例子

=

相等

X=Y

<> ><

不相等

X<>Y X ><Y

< 

小于

X<Y

> 

大于

X>Y

<=

小于或等于

X<=Y

>=

大于或等于

X>=Y

 

用关系运算符连接两个算术表达式所组成的式子叫做关系表达式。关系表达式的结果是一个Boolean类型的值,即TrueFalseVBScript把任何非0的值都认为是“真”,但一般以-1表示真,以0表示假。

用关系运算符既可以进行数值的比较,也可以进行字符串的比较。数值比较通常是对两个算术表达式的比较。例如:

X+Y<(T-1)/2

如果X+Y的值小于(T-1)/2的值,则上述表达式的值为True,否则为False

在应用程序中,关系运算的结果通常作为判断用,例如:

X100

If X<>200 Then MsgBox "Not equal" Else MsgBox "equal"

由于X不等于100,关系运算的结果为真,执行Then后面的操作,输出“Not equal”。

(三)逻辑运算符

逻辑运算也称布尔运算。用逻辑运算符连接两个或多个关系式,组成一个布尔表达式。VBScript的逻辑运算符有以下六种:

(1)       Not(非)

由真变假或由假变真,进行“取反”运算。例如:

3>9

其值为False,而

Not3>9

的值为True

(2)       And(与)

对两个关系表达式的值进行比较,如果两个表达式的值均为True,结果才为True,否则为False。例如:

3>8And5<6)结果为False

(3)       Or(或)

对两个表达式进行比较,如果其中一个表达式的值为True,结果就为True,只有两个表达式的值均为False时,结果才为False。例如:

(3>8) Or 5<6 结果为True

(4)       Xor(异或)

如果两个表达式同时为True或同时为False,则结果为False,否则为True。例如:

8>3Xor5<6     结果为False

(5)       Eqv(等价)

如果两个表达式同时为True或同时为False,则结果为True。例如:

3>8Eqv10>20 结果为True

(6)       Imp(蕴含)

当第1个表达式为True,且第2个表达式为False时,结果为False

5.4列出了6种逻辑运算的“真值”

5.4     逻辑运算真值表

X

Y

Not X

X And Y

X Or Y

X Xor Y

X Eqv Y

X Imp Y

-1

-1

0

-1

-1

0

-1

-1

-1

0

0

0

-1

-1

0

0

0

-1

-1

 

-1

-1

0

-1

0

0

-1

0

0

0

-1

-1

 

和关系运算一样,逻辑运算通常也用来判断程序流程。例如:

If Num>=60 And Num<=100 Then ……

(四)表达式的执行顺序

一个表达式可能含有多种运算,计算机按一定的顺序对表达式求值。一般顺序如下:

1.  首先进行函数运算(将在下一节介绍函数)。

2.  接着进行算术运算,其次序为:

1)指数(^            2)取负(-)         3)乘、浮点除(*/

4)整除(\            5)取模(Mod      6)加、减(+、-)

7)连接(&

3.  然后进行关系运算(=><<><=>=)。

4.  最后进行逻辑运算,顺序为:

1Not        2And       3Or         4Xor

5Eqr        6Imp

 

3.3 常量和变量

 

前一节中介绍了VBScript中使用的数据类型。在程序中,不同类型的数据既可以以常量的形式出现,也可以以变量的形式出现。常量在程序执行期间其值时不发生变化的,而变量的值时可变的,它代表内存中指定的存储单元。

(一)常量

VBScript中的常量分为两种,一种是文字常量,一种是符号常量。

1)文字常量

VBScript的文字常量分为两种,即字符串和数值。

1)    字符串常量

字符串常量由字符组成,可以是除双引号和回车符之外的任何ASCII字符。例如:

"25,000,00"

"Number of Employees"

2)    数值常量

数值常量共有三种表示方式,即整型数、长整型数和浮点数。

l         整型数:符合上节规定的数值串,例如:624-4325等。

l         长整型:其组成和整型数相同,其取值范围为-214748364821474836474个字节存储),例如:784165423-88877454等。

l         浮点数:也称实数,分为单精度浮点数和双精度浮点数。例如:235.988E-7-56564E8等。

2)符号常量

VBScript,通过关键字Const定义符号常量。例如:

       Const  MYCONST100

习惯上,常量名一般由大写字幕组成。

例如:

const PI=3.14159

Const current_date=”2009-9-19”

Const date=#2009-9-18#

(二)变量

和其它语言一样,VBScript也用变量来存储数据值。每个变量有一个名字,通过名字来引用一个变量。

1)命名规则

变量是一个名字,给变量命名时应遵循以下规则:

(1)   名字只能由字母、数字和下划线组成;

(2)   名字的第一个字母必须是英文字母;

(3)   名字的有效字符为255个;

(4)   不能用VBScript的保留字(关键字)作变量名,但可以把保留字嵌入变量名中。

VBScript不区分变量名和其他名字中字母的大小写,HelloHELLOhello指的都是同一个名字,也就是说,在定义一个变量后,只要字符相同,则不管其大小写是否相同,指的都是这个变量。为了便于阅读,每个单词开头的字母一般用大小写,即大小写混合使用组成变量名(或其它名字),例如PrintText

2)变量的声明

在强类型语言(例如 C )中,变量必须先说明,然后才能使用。因为VBScript只有一种数据类型,即变体类型,因此,变量不必声明就可以直接使用。例如:

       msg"This is a string"

       这里的msg是一个变量,没有事先声明而直接使用。这样使用变量比较简单,也可以节省代码,但无法对变量进行跟踪。也就是说,不容易看出一个变量是从什么地方开始的。显式地声明变量是一种良好的编程习惯,同时可以提高代码的可读性。

       VBScript中通过Dim语句来声明变量并分配存储空间,其一般格式为:

       Dim 变量名[,变量名]...

       例如:

       Dim msg

       用一个Dim语句可以声明多个变量,例如:

       Dim msg1msg2msg3

3)变量的作用域

变量的作用域指的是变量的有效范围,即变量的“可见性”。定义了一个变量后,为了能正确地使用变量的值,应当明确可以在程序的什么地方访问改变量。

和其它语言一样,VBScript中的变量也可以分为局部变量和全局变量。其中局部变量是过程层(ProcedureLevel)变量,而全局变量是脚本层(ScriptLevel)变量。

1局部变量在过程(事件过程或通用过程)内定义的变量叫做局部变量,其作用域是它所在的过程,其生存期随着过程的结束而终止。局部变量通常用来存放中间结果或用作临时变量。某一过程的执行只对该过程内的变量产生作用,对其它过程中相同名字的局部变量没有任何关系。

局部变量在过程内用Dim定义,例如:

Sub Button1.OnClick()

       Dim Tempnum

      

End Sub

2全局变量

从前面的例子可以看出,脚本程序可以含有多个过程,全局变量的作用域是整个脚本部分,包括各个过程。全局变量在脚本的开头声明,而且不能隐式声明。也就是说,全局变量必须先声明后使用。

Program3-3】:下面通过一个例子说明全局变量和局部变量的作用域。

<HTML>

<HEAD>

<TITLE>变量作用域</TITLE>

<SCRIPT LANGUAGE="VBScript">

<!--

Dim intGlob

Const GLOBAL_CONST=3

 

SUB BUTTON1_OnClick

       Dim intLocal

       intLocal=180

       intLocal=intLocal*GLOBAL_CONST

       Alert intLocal

       intGlob=intLocal

End Sub

 

SUB Button2_OnClick

       Dim intLocalConst

       intLocalConst=6

       intGlob=intGlob/intLocalConst+GLOBAL_CONST

       Alert intGlob

End Sub

-->

</SCRIPT>

</HEAD>

 

<BODY>

<CENTER>

<INPUT TYPE="Button" NAME="Button1" VALUE="按钮1">

<p>

<INPUT TYPE="Button" NAME="Button2" VALUE="按钮2">

</CENTER>

</BODY>

</HTML>

上述程序在脚本部分声明了一个全局变量intGlob和一个全局变量GLOBAL_CONST,它们的作用域是脚本部分的各个过程。在按钮1的事件过程中,声明了一个局部常量intLocal,其作用域是本事件过程。而在按钮2的事件过程中,声明了一个局部变量intLocalConst,其作用域也是本事件过程。单击按钮1后,将计算局部变量intLocal与全局变量的乘积,并把结果赋給该局部变量,最后把局部变量的值赋給全局变量intGlob,这个值被带到了按钮2的事件过程,并参加运算。

3.4 控制语句

结构化程序的基本结构有三种,即顺序结构、选择结构和循环结构。其中顺序执行程序是最基本的,也是最简单的,在前几节中,已设计和编写了一些简单的程序(如事件过程)。除了个别程序外,这些程序一律为顺序结构,即整个程序按书写顺序依次执行。为此本节将不再讲述顺序结构,而主要介绍选择结构和循环结构。

(一)   选择结构程序设计

在大多数程序中都会包含选择结构。它的作用是,根据指定的条件是否满足,决定从给定的两组操作选择其一。在本小节中将介绍如何用VBScript实现选择结构。

1)单行结构条件语句

单行条件语句是用If语句来实现的,其格式如下:

If 条件 Then 语句1  [Else 语句2]

该语句的功能是:如果“条件”为True,则执行“语句1”,否则执行“语句2”。 If语句中的“Else部分”是可选的,当该项省略时,If语句简化为:

If 条件 Then 语句

它的功能时,如果“条件”为True,则执行“语句”,否则执行下一行程序。例如:

If X >=Y Then MsgBox "X>=Y"

MsgBox"X<Y"

如果X>=Y,则执行MsgBox "X>=Y",否则执行下面的语句,即MsgBox"X<Y"。这里的MsgBox"X<Y"If语句后面的语句。如果加上Else部分,则上面的语句可以改为:

If X >=Y   Then   MsgBox "X>=Y"  Else       MsgBox"X<Y"

2)块结构条件语句

块结构条件语句与CBasic等语言中的条件语句类似,一般格式如下:

If 条件1 Then

        语句块 1

[Else If 条件2  Then

语句块2]

[Else If 条件3  Then

语句块3]

……

[Else

语句块n]

       End If

       块结构条件语句的功能是:如果“条件1”为True,则执行“语句块1”;否则如果“条件2”为True,则执行“语句块2”;……否则执行“语句块n”。

Program3-4】:商店进行促销,购买商品的总价钱超过20打九折;超过50打八五折;超过100打八折;超过150打七五折;超过200打七折。输入总价钱,计算出折后价。

Function price(x)

Dim y

If x>=20 then y=x*0.9

Else if x>=50 then y=x*0.85

Else if x>=100 then y=x*0.8

Else if x>=150 then y=x*0.75

Else  y=x*0.7

End function

3)多分支结构语句

在多分支结构语句中,有很多分支语句,它是块结构形式条件语句的一种变形。它的基本格式如下:

Select Case 测试表达式

       Case 表达式 1

              [语句块1]

       Case 表达式 2

              [语句块2]

       ......

       Case Else

              [语句块n]

End Select

多分支语句以Select Case开头,以End Select结束。其功能是,根据“测试表达式”的值,从多个语句块中选择符合条件的一个语句块执行。下面举个例子。

【例3-4 从键盘上输入一个06的整数,然后输出相应的用中文表示的星期几。如0表示星期日,1表示星期一等。

程序代码如下:

<html>

<head>

<title></title>

<script language=vbscript>

<!--

Sub Button1_OnClick

       msg="Enter a number(0-6):"

       Var=InputBox(msg)

       Select Case Var

              case 0

                     MsgBox"星期日"

              case 1

                     MsgBox"星期一"

              case 2

                     MsgBox"星期二"

              case 3

                     MsgBox"星期三"

              case 4

                     MsgBox"星期四"

              case 5

                     MsgBox"星期五"

              case 6

                     MsgBox"星期六"

              Case Else

                     MsgBox"必须输入06的值"

       End Select

End Sub

-->

</script>

</head>

 

<body>

<input id=button1 name=button1 type=button value=Button>

</body>

</html>

运行上面的程序,在输入框中输入一个06的数值,将在信息框中显示出相应的星期几。例如输入4,则结果如图5.9所示。

5.9     多分支结构语句举例

 

(二)   循环结构程序设计

循环语句产生一个重复执行的语句序列,直到指定的条件满足为止。VBScript提供了三种不同风格的循环结构,包括:计数循环(ForNext循环)、当循环(WhileWend循环)和Do循环(DoLoop循环)。其中ForNext循环按规定的次数执行循环体,而While循环和Do循环则是在给定的条件满足时执行循环体。

1For循环结构

For循环也称ForNext循环或计数循环。其一般格式如下:

For 循环变量=初值  To  终值              [Step  步长]

       [ 循环体 ]

       [ Exit For ]

Next

For循环按指定的次数执行循环体。例如:

For x1 to 100  Step 1

       SumSumx

Next

该例从1100,步长为1,共执行100SumSumx。其中x是循环变量,1是初始值,100是终值,Step后面的是步长值,SumSumx是循环体。下面举一个具体的例子。

【例5.10 N!(N为自然数)

Sub Button1_OnClick

       N=InputBox("Enter N:")

       K=1

       For i=1 To N

              K=K*i

       Next

       MsgBox N&"!="$K

End Sub

一般情况下,ForNext正常结束,即循环变量到达终值,但有些情况下,可能需要在循环变量到达终值前退出循环,这可以通过Exit For语句来实现。在一个ForNext循环中,可以含有一个或多个Exit For语句,并且可以出现在循环体的任何位置。此外,用Exit For只能退出当前循环,即退出它所在的最内层循环。例如:

For i=1 To 100

       For j=1 To 100

              If i*j>5000 Then

                     MsgBox"i*j>5000"

                     Exit For

              End If

       Next

Next

在执行上述程序时,如果i*j>5000,程序将从内层循环中退出;此时外层循环也有一个Exit For语句,因而可以退出循环。

2While循环结构

While循环结构是当型循环语句。其格式如下:

While 条件

[语句块]

Wend

       它的功能是:当给定的“条件”为True时,执行循环中的“语句块”(即循环体)。

While语句的执行过程是:如果“条件”为True,则执行“语句块”,当遇到Wend语句时,控制返回到While语句并对“条件”进行测试,如仍然为True,则重复上述过程,如果“条件”为False,则不执行“语句块”,而执行Wend后面的语句。

3Do循环结构

Do循环不仅可以不按照限定的次数执行循环体内的语句块,而且可以根据循环条件是TrueFalse决定是否结束循环。

Do循环的格式如下:

(1)       Do

[ 语句块 ]

[ Exit Do ]

Loop [While | Until 循环条件 ]

(2)       Do [While | Until 循环条件 ]

[ 语句块 ]

[ Exit Do ]

Loop

       Do循环语句的功能是:当指定的“循环条件”为True或直到“循环条件”变为True之前重复执行一组语句(即循环体)

例如:

i=10

MsgBox"Value of i a beginning of Loop is";i

Do while i<10

       i=i+1

Loop

MsgBox"Value of i at end of loop is": i

该例中的循环条件为i<10,只要这个条件为True,就执行MsgBox语句和ii+1。当i10时,循环结束,执行后面的MsgBox语句。

在这个例子中,循环条件i<10求反(NOT)后为i>=10,把它作为DoLoop Until的条件,所得的结果完全一样:

Do

       MsgBox"Value of i is ":i

i=i+1

Loop Until i>=10

MsgBox "Value of i at end of loop is":i

在格式2中,WhileUntil放在循环的开头,即紧跟在关键字Do之后,组成两种循环,分别叫做Do While…Loop循环和Do Until…Loop循环。它们都是先判断条件,然后在条件满足时才执行循环体,否则不执行。例如:

i=10

MsgBox "value of i at beginning of loop is ":i

Do While i<10

       i=i+1

Loop

MsgBox "Value of i at end of loop is" :i

由于i10,条件不为True,因此不执行循环体。两个信息框中的结果相同。

DoLoop While|Until循环正好相反,它不管条件是否满足,先执行一次循环体。然后再判断条件以决定其后的操作。因此,在任何情况下,它至少执行一次循环体。请看下例:

i=10

Do

       MsgBox "value of i at beginning of loop is " :i

       i=i+1

loop while i<10

MsgBox "Value of i at end of loop is " :i

执行后,在第1个信息框中的结果为10,第2个信息框中的结果为11

3.5 自定义过程

在前面几节中,已多次见过事件过程,这样的过程是当发生在某个事件(如OnClick等)时,对该事件作出响应的程序段,这种事件过程构成了VBScript应用程序的主体。有时候,多个不同的事件过程可能需要使用一段相同的程序代码,可以把这一段代码独立出来,作为一个过程,这样的过程叫做“通用过程”,它可以单独建立,供事件过程调用。

       VBScript中,通用过程分为两类,即子程序过程和函数过程,前者叫做Sub过程,后者叫做Function过程。在这一节中,将介绍通用过程的定义、调用。

       VBScript中,通用过程分为两类,即子程序过程和函数过程,前者叫做Sub过程,后者叫做Function过程。在这一节中,将介绍通用过程的定义、调用及参数传递。

(一)    过程的定义

VBScript提供了与PascalCAda等语言类似的子程序调用机制,即子程序过程和函数过程。为了便于区分,在今后的叙述中,我们把Sub…End Sub定义的子程序叫做子程序过程或Sub过程,把由Function…End Function定义的函数叫做函数过程或Function过程。

1.Sub过程的定义

通用Sub过程的结构与前面见过的事件过程的结构类似。一般格式如下:

Sub 过程名[(参数列表)]

        语句块

        [Exit Sub]

        [语句块]

End Sub

说明:

1Sub过程以Sub开头,以End Sub结束,在SubEnd Sub之间是描述过程操作的语句块,称为“过程体”或“子程序体”。格式中各参数含义如下:

              1    过程名:是一个长度不超过255个字符的变量名,在同一个模块中,同一个变量名不能既用作Sub过程名又用作Function过程名。

              2    参数列表:含有在调用时传送给该过程的简单变量名或数组元素名,各名字之间用逗号隔开。“参数列表”指明了调用时传送给过程的参数的类型和个数。

2End Sub标志着Sub过程的结束。为了能正确运行,每个Sub过程必须有一个End Sub语句。当程序执行到End Sub时,将退出该过程,并立即返回到调用语句下面的语句。此外,在过程体内可以用一个或多个Exit Sub语句从过程中退出。

3Sub过程不能嵌套。也就是说,在Sub过程内,不能定义Sub过程或Function过程,只能通过调用执行Sub过程,并且可以嵌套调用。

下面是一个Sub过程的例子:

Sub caculatexy

        x=x+100

y=y*6

MsgBox x&y

End Sub

上面的过程有两个形式参数:xy,过程可以有参数,也可以不带任何参数。没有参数的过程称为无参过程。例如:

Sub Subtest()

        MsgBox "This is a Sub procedure"

End Sub

2.Function过程的定义

Function过程定义的格式如下:

Function 过程名[(参数列表)]

        [语句块]

        [过程名=表达式]

        [Exit Function]

        [语句块]

End Function

说明:

1Function过程以Function开头,以End Function结束,在两者之间是描述过程操作的语句块,即“过程体”。格式中的“过程名”、“参数列表”、“Exit Function”的含义与Sub过程中相同。

2)调用Sub过程相当于执行一个语句,不返回值;而调用Function过程要返回一个值。因此可以像内部函数一样在表达式中使用。由Function 过程返回的值放在上述格式中的“表达式”中,并通过“过程名=表达式”把它的值赋给“过程名”。如果在Function过程中省略“过程名=表达式”,则该过程返回一个默认值;数值函数过程返回0值,字符串函数过程返回空字符串。因此,为了能使一个Function过程完成指定的操作,通常要在过程体中为“过程名”赋值。例如:

Function BinarySerach(...)

......

If Lower>Upper Then

        BinarySearch=False

        Exit Function

End If

......

End Function

在这个例子中,把False赋给函数名BinarySearch,表示没有要查找的值。

【例3-5】编写一个求最大公约数(GCD)的函数过程。

Function gcd(x,y)

Do while y<>0

        Reminder = x Mod y

        x=y

        y=reminder

Loop

gcd=x

End Function

(二)    过程的调用

调用引起过程的执行。也就是说,要执行一个过程,必须调用该过程。Sub过程调用可以作为独立的基本语句,而Function过程调用要返回一个值,通常出现在表达式中。

1.  调用Function过程

Function过程的调用比较简单,因为可以像使用VBScript内部函数一样来调用Function过程。实际上由于Function过程能返回一个值,因此完全可以把它看成是一个函数,它与内部函数(如SqrAbs等)没什么区别,只不过内部函数由语言系统提供,而Function过程由用户自己定义。

前面编写了求最大公约数的函数Gcd,它有两个参数。可以在下面的事件过程中调用该函数:

Sub Button1_OnClick

Dim a,b

a=96; b=64

x=gcd(a,b)

MsgBox"G.C.D="&x

End Sub

上述事件过程中的“xGcdab)”就是调用gcd函数的语句,调用时的实际参数分别为9664,调用后的返回值放入变量x中。程序的输出结果为32

2. 调用Sub过程

Sub过程的调用有两种方式,一种是把过程的名字放在一个Call语句中,一种是把过程名作为一个语句来使用。

1 Call语句调用Sub过程

格式:Call过程名[(实际参数)]

Call语句把程序控制传送到一个VBScriptSub过程。用Call语句调用一个过程时,如果过程本身没有参数,则“实际参数”和括号可以省略;否则应给出相应的实际参数,并把参数放在括号中。“实际参数”是传送给Sub过程的变量或常数。例如:

Call Tryoutab

2 把过程名作为一个语句来使用

在调用Sub过程时,如果省略关键字Call,就成为调用Sub过程的第2种方式。与第1种方式相比,它有两点不同:

1)  去掉关键字Call

2)  去掉“实际参数表”的括号。

例如:

Tryout ab

下面举两个例子。

【例5.6 编写一个计算矩形面积的Sub过程,然后调用该过程计算矩形面积。

程序如下:

<html>

<head>

<title></title>

<SCRIPT LANGUAGE=vbscript>

<!--

Sub Button1_OnClick

Dim A,B

A = InputBox("What is the length?")

B = InputBox("What is the width?")

Recarea A,B

End Sub

 

Sub Recarea (Rlen,Rwid)

Dim Area

Area=Rlen*Rwid

MsgBox"Total Area is "&Area

End Sub

 

-->

</SCRIPT>

</head>

<body>

<INPUT id=button1 name=button2 type=button value=Button>

</p>

</body>

</html>

在上面的程序中,通用过程RecArea用来计算并输出矩形的面积,它有两个行参,分别为矩形的长和宽。在OnClick事件过程中,从键盘上输入矩形的长和宽,并用它们作为实参调用RecArea过程。在该例中,用第2种方式调用Sub过程。

【例5.7】编写一个用来实现延迟指定时间(秒)的Sub过程。调用这个过程,按指定的时间间隔显示若干行信息。

For…Next循环可以实现时间延迟,但很不精确。这里我们用VBScript的内部函数Timer来编写较为精确的时间延迟过程。

Timer函数返回系统时钟从午夜开始计算的秒数,把Timer加上需要延迟的时间(秒)作为循环结束的时间,当Timer超过这个时间则结束循环,即停止循环,即停止时间延迟。用这种方法可以得到精确的时间延迟。

程序如下:

<html>

<head>

<title></title>

<SCRIPT LANGUAGE=vbscript>

<!--

Sub Button_OnClick

MsgBox("Print the first line now. Wait for 5 seconds.")

DelayLoop 5

MsgBox("Print the second line.Wait for 10 seconds.")

Call DelayLoop(10)

MsgBox("print the third line.")

End Sub

 

Sub DelayLoop(DelayTime)

SecondsInDay=24*60*60

LoopFinish=Timer+DelayTime

If LoopFinish>SecondsInDay Then

        LoopFinish=LoopFinish-SecondsInDay

        Do While Timer>LoopFinish

        Loop

End If

Do While Timer<LoopFinish

Loop

End Sub

-->

</script>

 

</head>

<body>

<INPUT id=button1 name=button1 type=button value=Button>

</p>

</Body>

</html>

用上面程序中的DelayLoop过程可以延迟指定的时间,调用时用需要延迟的时间(秒)作为实参。例如:

DelayLoop 5

或此延迟5秒。在一般情况下,TimerLoopFinish要小,因此可以用

Do While Timer < LoopFinish

Loop

来控制时间延迟。但是,如果时间延迟从午夜前开始,到午夜后才结束,则Timer0开始起算,在这种情况下,必须用

Do While Timer > LoopFinish

Loop

来控制时间延迟。过程中对这两种情况都考虑到了。

程序运行后,单击按钮,显示第1个信息框,单击信息框中的“确定”(或OK)按钮,5秒钟后显示第2个信息框,单击“确定”按钮,再过10秒钟显示第3个信息框。

 

课后作业

1.设计一个程序,从键盘上输入学生的分数,程序可以计算并输出及格、不及格人数及平均分数。运行结果如图5.8所示:

1 计算分数

       源代码如下:

<html>

<head>

<title></title>

<script language=vbscript>

<!--

       Dim n, n1,n2,total

      

       Sub Button1_OnClick()

              msg="请输入分数(-1结束)"

              msgtitle="输入数据"

             Do

                     score=InputBox(msg,msgtitle)

                     If score<0 Or score>100 Then

                            Exit Sub

                     ElseIf  score<60  Then

                            n1=n1+1

                     Else

                            n2=n2+1

                     End If

                     total=CSng(total)+CSng(score)

                     n=n+1

              Loop

       End Sub

 

       Sub Button2_Onclick()

              text1.value=n2&""

              text2.value=n1&""

              text3.value=total/n

       End Sub

-->

</script>

</head>

 

<body>

<p>及格:  

<input id=text1 name=text1 size="20">

<p>不及格:

<input id=text2 name=text2 size="20">

<p>平均:  

<input id=text3 name=text3 size="20">

<p>

<input id=button1 name=button1 type=button value=输入并计算>

    

<input id=button2 name=button2 type=button value=显示结果>

</body>

</html>

2. 从键盘上输入一个06的整数,然后输出相应的用中文表示的星期几。如0表示星期日,1表示星期一等。

3.从键盘上输入字符,并对输入的字符进行计数,当输入的字符为“?”时,停止计数,并输出结果。

由于需要输入的字符的个数没有指定,无法用For循环来编写程序。停止计数的条件是输入的字符为“?”,可以用While循环语句来实现。

程序如下:

<html>

<head>

<title></title>

<script language=vbscript>

<!--

Sub Button1_OnClick

Dim char

Const ch="?"

counter=0

msg="Enter a character:"

char=InputBox(msg)

While char<>ch

        counter=counter+1

        char=InputBox(msg)

Wend

MsgBox"Number of characters entered:"&counter

End Sub

-->

</script>

</head>

 

<body>

<input id=button1 name=button1 type=button value=Button>

</body>

</html>

运行上面的程序,在输入对话框中输入一个字符,单击“OK”按钮后,将再次显示输入对话框,继续输入字符,直到输入“?”后停止输入,并在信息框中显示输入的字符的个数,如图5.10所示。

2 While循环执行情况

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多