5.1 课前导读
5.2 课堂教学
5.3 上机练习
5.4 课后作业第 5课 VBScript编程语言(二)
5.1 课前导读
VBScript虽然采用事件驱动,调用相对划分得比较小的子过程,但是对于具体的过程本身,仍然要用到结构化程序的方法,用控制结构控制程序执行的流程 。 有些简单程序可以只用单向流程来编写,有些流程可以依靠运算符的优先级来控制,但为了处理复杂问题,就要通过选择和循环改变语句的执行顺序 。
结构化程序设计有三种基本结构:顺序结构,选择结构,循环结构 。 由这 3种基本结构还可以派生出
,多分支结构,,即根据条件从多个分支路径中选择执行其中的一个 。
5.2 课堂教学
5.2.1 VBScript的选择结构
5.2.2 VBScript的循环结构
5.2.3 VBScript的过程
5.2.1 VBScript的选择结构
1,单条件选择结构
2,多分支条件选择结构
1,单条件选择结构单条件选择结构是最常用的双分支选择结构,其特点是:所给定条件 ( 条件表达式 ) 的值如果为真,
则执行 a1块;如果为假则执行 a2块 。
(1) 行 If语句实现单条件选择结构最简单的语句是行 If语句,
其语法格式为:
If〈 条件 〉 Then [〈 语句 1〉 ] [ Else〈 语句 2〉 ]
说明:
① 当程序运行到 If语句时,首先测试 〈 条件 〉 。
如果条件为 True,则执行 Then之后的语句 。 如果条件为 False,并且有 Else子句,则程序会执行 Else部分的语句 2。 而在执行完 Then或 Else之后的语句后,会从
End If之后的语句继续执行 。
② Else子句是可选的 。
③ 可以在 〈 语句 1〉 或 〈 语句 2〉 中使用冒号 (,)
将多个命令组合成一条语句 。
【 例 5-1】 下面的代码测试输入的数据是否有效的数值 。
<HTML>
<HEAD><TITLE>简单验证 </TITLE></HEAD>
<BODY><H3>简单验证 </H3><HR>
请输入数值数据:
<INPUT name="Text1" TYPE="TEXT" SIZE="10"><P>
<INPUT TYPE="Button" NAME="Button1" VALUE="确认 ">
<SCRIPT FOR="Button1" EVENT="onClick"_
LANGUAGE="VBScript">
x = Text1.value
If IsNumeric(x) Then p = "数值数据是," &_
x Else p = "不是数值数据 "
MsgBox "您输入的 " & p
</SCRIPT>
</BODY>
</HTML>
以 5_1.htm或 5_1.asp为文件名存盘,存放位置为工作目录 H:\ASP例 \第 5章例题 。 ( 参见 1.2.3) 。 打开浏览器,在地址栏中直接输入虚拟目录名及文件名:
http://127.0.0.1/myasp/第 5章例题 /5_1.htm
在浏览器上的 显示效果 。
(2) 块 If语句虽然行 If语句使用方便,可以满足许多选择结构程序设计的需要,但是当 Then部分和 Else部分包含较多内容时,在一行中就难以容纳所有命令 。 为此,
VBScript提供了块 If语句,将一个选择结构用多个语句行来实现 。 块 If语句又称为多行 If语句,其语法结构为:
If〈 条件 1〉 Then
[语句列 1]
[Else
[语句列 2]]
End If
说明:
① 当程序运行到 If块时,首先测试 〈 条件 〉 。 如果条件为 True,则执行 Then之后的语句 。 如果条件为
False,并且有 Else子句,则程序会执行 Else部分的语句列 2。 而在执行完 Then或 Else之后的语句列后,会从
End If之后的语句继续执行 。
② Else子句是可选的 。
【 例 5-2】 将例 5-1中的行 If语句改为使用块 If语句 。
<HTML>
<HEAD><TITLE>简单验证 </TITLE></HEAD>
<BODY><H3>简单验证 </H3><HR>
请输入数值数据:
<input name="Text1" TYPE="TEXT" SIZE="10"><P>
<INPUT TYPE="Button" NAME="Button1" VALUE="确认 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
x = Text1.value
If Not IsNumeric(x) Then
MsgBox "您输入的不是数值数据 "
Else
MsgBox "您输入的数据是," & x
End If
</SCRIPT>
</BODY>
</HTML>
(3) If语句的嵌套
If语句可以嵌套使用,即在 If语句的操作块 ( 语句列 1或语句列 2) 中使用 If语句 。
【 例 5-3】 铁路托运行李,从甲地到乙地,规定每张客票托运费计算方法是:行李重量不超过 50公斤时,
每公斤 0.25元,超过 50公斤而不超过 100公斤时,其超过部分每公斤 0.35元,超过 100公斤时,其超过部分每公斤 0.45元 。 编写程序,输入行李重量,计算并输出托运的费用 。
分析:设行李重量为 w公斤,应付运费为 x元,则运费公式为:
)1 0 0(
)1 0 050(
)50(
)1 0 0(45.05035.05025.0
)50(35.05025.0
25.0

w
w
w
w
w
w
x
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>托运费计算 </TITLE></HEAD>
<BODY><H3>托运费计算 </H3><HR>
请输入行李重量:
<input name="Text1" TYPE="TEXT" SIZE="10">&nbsp;kg&nbsp;
&nbsp;
<INPUT TYPE="Button" NAME="Button1" VALUE="计算 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
w = Text1.value
If Not IsNumeric(w) Then
MsgBox "您输入的不是数值数据 "
Else
If w <= 50 Then
x = 0.25 * w
Else
If w <= 100 Then
x = 0.25 * 50 + 0.35 * (w - 50)
Else
x = 0.25 * 50 + 0.35 * 50 + 0.45 * (w - 100)
End If
End If
MsgBox "行李的托运费是," & x & "元 "
End If
</SCRIPT>
</BODY>
</HTML>
执行 VBScript程序,浏览器 显示 。
(4) If语句的嵌套格式当代码中出现多层 If语句嵌套时,将使程序冗长而不便阅读 。 为此 VBScript提供了带 ElseIf的 If语句来处理当条件为假时又内嵌 If语句的情形,以使程序简化易写 。 其语法格式为:
If〈 条件 1〉 Then
[语句列 1]
ElseIf〈 条件 2〉 Then
[语句列 2]
...
[Else
[其他语句列 ]]
End If
【 例 5-4】 某百货公司为了促销,采用购物打折扣的优惠办法 ( 如图 5-3) 。 每位顾客一次购物:
(1) 在 1000元以上者,按九五折优惠 。
(2) 在 2000元以上者,按九折优惠 。
(3) 在 3000元以上者,按八五折优惠 。
(4) 在 5000元以上者,按八折优惠 。
分析:设购物款数为 x元,优惠价为 y元,则优惠付款公式为:
)5 0 0 0(
)5 0 0 03 0 0 0(
)3 0 0 02 0 0 0(
)2 0 0 01 0 0 0(
)1 0 0 0(
8.0
85.0
9.0
95.0

x
x
x
x
x
x
x
x
x
x
y
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>优惠价计算 </TITLE></HEAD>
<BODY><H3>优惠价计算 </H3><HR>
所购商品总金额:
<INPUT name="Text1" TYPE="TEXT" SIZE="10">&nbsp;元 <P>
<INPUT TYPE="Button" NAME="Button1" VALUE="计算 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
x = Text1.value
If Not IsNumeric(x) Then MsgBox "您输入的不是数值数据 ",Exit Sub
If x < 1000 Then
y = x
ElseIf x < 2000 Then
y = 0.95 * x
ElseIf x < 3000 Then
y = 0.9 * x
ElseIf x < 5000 Then
y = 0.85 * x
Else
y = 0.8 * x
End If
MsgBox "优惠价为," & y & "元 "
</SCRIPT>
</BODY>
</HTML>
执行 VBScript程序,浏览器 显示 。
2,多分支条件选择结构多分支选择结构的特点是:从多个选择结构中,
选择第一个条件为真的路线作为执行的路线 。 即所给定的选择条件 1为真时,执行 a1块;如果为假则继续检查下一个条件 。 如果条件都不为真,就执行其他操作块,如果没有其他操作块,则不作任何操作就结束选择 。
虽然使用嵌套的办法可以利用 If语句实现多分支选择,但是最好还是使用 VBScript提供的多分支选择结构 ( Select Case语句 ) 来实现多分支选择 。
Select Case语句可以根据测试条件的值,来决定执行几组语句中之一组,其语法格式为:
Select Case〈 测试条件 〉
[Case〈 表达式表 1〉
[〈 语句列 1〉 ]]
[Case〈 表达式表 2〉
[〈 语句列 2〉 ]]
...
[Case Else
[〈 其他语句列 〉 ]]
End Select
说明:
① 〈 测试条件 〉 为必要参数,是任何数值或字符表达式 。
② 在 Case子句中,〈 表达式表 〉 为必要参数,用来测试其中是否有值与 〈 测试条件 〉 相匹配 。 表达式列表中的多个表达式之间要用逗号 (,) 隔开 。
③ [〈 语句列 〉 ] 为可选参数,是一条或多条语句,当 〈 表达式表 〉 中有值与 〈 测试条件 〉 相匹配时执行 。
④ Case Else子句用于指明其他语句列,当测试条件和所有的 Case子句 〈 表达式表 〉 中的值都不匹配时,则会执行这些语句 。 虽然不是必要的,但是在
Select Case区块中,最好还是加上 Case Else语句来处理不可预见的测试条件值 。 如果没有 Case值匹配测试条件,而且也没有 Case Else语句,则程序会从 End
Select之后的语句继续执行 。
【 例 5-5】 例 5-4中的 If语句可以改为 Select语句,其代码为:
<HTML>
<HEAD><TITLE>优惠价计算 </TITLE></HEAD>
<BODY><H3>优惠价计算 </H3><HR>
所购商品总金额:
<input name="Text1" TYPE="TEXT" SIZE="10">&nbsp;元 <P>
<INPUT TYPE="Button" NAME="Button1" VALUE="计算 ">
<SCRIPT FOR="Button1" EVENT="onClick"
LANGUAGE="VBScript">
x = Text1.value
If Not IsNumeric(x) Then MsgBox "您输入的不是数值数据 ",
Exit Sub
Select Case True
Case x < 1000
y = x
Case x >= 1000 And x < 2000
y = 0.95 * x
Case x >= 2000 And x < 3000
y = 0.9 * x
Case x >= 3000 And x < 5000
y = 0.85 * x
Case Else
y = 0.8 * x
End Select
MsgBox "优惠价为," & y & "元 "
</SCRIPT>
</BODY>
</HTML>
代码的 执行情况 。
5.2.2 VBScript的循环结构
1,Do?Loop 语句
2,While...Wend语句
3,For...Next语句
4,For Each?Next 循环语句
5,循环的嵌套循环是指在程序设计中,从某处开始有规律地反复执行某一程序块的现象,重复执行的程序块称为
,循环体,。 使用循环可以避免重复不必要的操作,
简化程序,节约内存,从而提高效率 。
无论何种类型的循环结构,其特点都是:循环体执行与否及其执行次数多少都必须视其循环类型与条件而定,且必须确保循环体的重复执行能在适当的时候得以终止 ( 即非死循环 ) 。
1,Do? Loop语句
Do? Loop语句有两种语法形式,分别是:前测型循环结构与后测型循环结构 。
(1) 前测型 Do? Loop循环前测型 Do? Loop循环结构,首先判断条件,根据条件决定是否执行循环,执行循环的最少次数为 0。 其语法为:
Do [{ While | Until }〈 条件 〉 ]
[〈 语句列 1〉 ]
[Exit Do]
[〈 语句列 2〉 ]
Loop
说明:
① Do While? Loop是 ( 前测型 ) 当型循环语句,
当条件为真 ( True) 时执行循环体,条件为假 ( False)
时终止循环; Do Until? Loop是 ( 前测型 ) 直到型循环语句,条件为假时执行循环体,直到条件为真时终止循环 。
②,条件,是条件表达式,为循环的条件 。 其值为 True或 False。 如果省略条件 ( Null),则条件会被当作 False。
③,语句列,是一条或多条命令 ( 循环体 ),它们将被重复当或直到条件为 True。
④ 可以在 Do? Loop中的任何位置放置任意个数的
Exit Do语句,随时跳出 Do? Loop循环 。 Exit Do通常用于条件判断之后,例如 If? Then,在这种情况下,
Exit Do语句将控制权转移到紧接在 Loop命令之后的语句 。 如果 Exit Do使用在嵌套的 Do? Loop语句中,则
Exit Do会将控制权转移到 Exit Do所在位置的外层循环 。
【 例 5-6】 求累加和 1 + 2 + 3 +? + 100。
分析:采用累加的方法,用变量 s来存放累加的和
( 开始为 0),用变量 n来存放,加数,( 加到 s中的数 ) 。 这里 n又称为计数器,从 1开始到 100为止 。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>累加和计算 </TITLE></HEAD>
<BODY><H3>累加和计算 </H3><HR>
求累加和 1 + 2 + 3 +? + 100。 <P>
<INPUT TYPE="Button" NAME="Button1" VALUE="计算 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
s = 0,n = 1
Do While n <= 100
s = s + n
n = n + 1
Loop
MsgBox "1+2+3+? +100 = " & s
</SCRIPT>
</BODY>
</HTML>
执行 VBScript程序,浏览器 显示 。
说明:还可以改为直到型,只需将其中 VBScript
代码改为:
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
s = 0,n = 1
Do While n <= 100
s = s + n
n = n + 1
Loop
MsgBox "1+2+3+? +100 = " & s
</SCRIPT>
【 例 5-7】 输入一个正整数,利用,当型,循环判断是否素数 。
分析:所谓,素数,是指除了 1和该数本身,不能被任何整数整除的数 。 判断一个自然数 n( n≥ 3) 是否素数,只要依次用 2~ 作除数去除 n,若 n不能被其中任何一个数整除,则 n即为素数,如图 5-5所示 。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>判断素数 </TITLE></HEAD>
<BODY><H3>判断素数 </H3><HR>
请输入一个大于 2的自然数:
<input name="Text1" TYPE="TEXT" SIZE="20"><P>
<INPUT TYPE="Button" NAME="Button1" VALUE="判断 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
x = Text1.value
n
Select Case True
Case Not IsNumeric(x)
MsgBox "您输入的不是数值数据 "
Case x < 3
MsgBox "请输入一个大于 2的整数 !",vbInformation + vbOKOnly,"注意 "
Case x > 2147483647
MsgBox "此数太大 !",vbInformation + vbOKOnly,"注意 "
Case Else
s = 0,i = 2
Do While i <= Sqr(x) And s = 0
If x Mod i = 0 Then s = 1 Else i = i + 1
Loop
If s = 0 Then a = "是一个素数 " Else a = "不是素数,
MsgBox x & a
End Select
</SCRIPT>
</BODY>
</HTML>
(2) 后测型 Do? Loop循环后测型 Do? Loop循环结构,首先执行循环体,然后判断条件,根据条件决定是否继续执行循环,因此执行循环的最少次数为 1。 其语法为:
Do
[语句列 1]
[Exit Do]
[语句列 2]
Loop [{While | Until} 条件 ]
说明:
① Do? While Loop是 ( 后测型 ) 当型循环语句,
当条件为真 ( True) 时继续执行循环体,条件为假
( False) 时终止循环; Do? Until Loop是 ( 后测型 )
直到型循环语句,条件为假时继续执行循环体,直到条件为真时终止循环 。
②,条件,是条件表达式,为循环的条件 。 其值为 True或 False。 如果省略条件 ( Null),则条件会被当作 False。
③,语句列,是一条或多条命令 ( 循环体 ),
它们将被重复当或直到条件为 True。
④ 在 Do? Loop中可以在任何位置放置任意个数的
Exit Do语句,随时跳出 Do? Loop循环 。 Exit Do通常用于条件判断之后,例如 If? Then,在这种情况下,
Exit Do语句将控制权转移到紧接在 Loop命令之后的语句 。 如果 Exit Do使用在嵌套的 Do? Loop语句中,则
Exit Do会将控制权转移到 Exit Do所在位置的外层循环 。
【 例 5-8】 输入两个正整数,求它们的最大公约数 。
分析:求最大公约数可以用,辗转相除法,,方法如下:
① 以大数 m作被除数,小数 n做除数,相除后余数为 r。
② 若 r ≠ 0,则 m ← n,n ← r,继续相除得到新的 r。 若仍有 r ≠ 0,则重复此过程,直到 r = 0为止 。
③ 最后的 n就是最大公约数 。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>求最大公约数 </TITLE></HEAD>
<BODY><H3>求最大公约数 </H3><HR>
请输入两个自然数,<P>
<input name="Text1" TYPE="TEXT" SIZE="10"><P>
<input name="Text2" TYPE="TEXT" SIZE="10"><P>
<INPUT TYPE="Button" NAME="Button1" VALUE="判断 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
m = Text1.value
n = Text2.value
If Not (IsNumeric(m) And IsNumeric(n)) Then MsgBox "输入的不是数值 ",Exit Sub
If n * m = 0 Then MsgBox "两数都不能为 0!",Exit Sub
If m < n Then t = m,m = n,n = t
Do
r = m Mod n
m = n,n = r
Loop While r <> 0
MsgBox "最大公约数是 " & m
</SCRIPT>
</BODY>
</HTML>
执行 VBScript程序,浏览器 显示 。
2,While...Wend语句当循环 ( While...Wend) 比较简单,其特点是,
只要指定的条件为 True,则会重复执行一系列的语句 。
其语法格式为:
While〈 条件 〉
[〈 语句列 〉 ]
Wend
说明:
① 〈 条件 〉 为必要参数,可以是关系表达式或布尔表达式 。 如果 〈 条件 〉 为 Null,则 〈 条件 〉 会视为
False。
② 如果 〈 条件 〉 为 True,则所有的 〈 语句列 〉 都会执行,一直执行到 Wend语句 。 然后再回到 While语句,
并再一次检查 〈 条件 〉,如果 〈 条件 〉 还是为 True,
则重复执行 。 否则程序会从 Wend语句之后的语句继续执行 。
【 例 5-9】 利用下述公式计算圆周率 π 的近似值:
9171513114π
当最后一项的绝对值小于 0.000001时停止计算 。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>计算圆周率 π </TITLE></HEAD>
<BODY><H3>计算圆周率 π </H3><HR>
<INPUT TYPE="Button" NAME="Button1" VALUE="计算 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
k = 1,s = 1,t = 1,m = 1
While Abs(t) > 0.0000001
k = k + 2
m = -m
t = m / k
s = s + t
Wend
MsgBox "圆周率 π =" & 4 * s
</SCRIPT>
</BODY>
</HTML>
执行 VBScript程序,浏览器 显示 。
3,For...Next语句在不知道循环内需要执行多少次语句时,宜用
Do? Loop循环 。 但是,若知道要执行多少次循环时,
则最好使用 For...Next循环 。 与 Do? Loop循环不同,
For循环使用一个循环变量,每重复一次循环之后,循环变量的值就会自动增加或者减少 。 其语法为:
For〈 循环变量 〉 =〈 初值 〉 To〈 终值 〉 [Step
〈 步长 〉 ]
[语句列 1]
[Exit For]
[语句列 2]
Next [循环变量 ]
说明:
① 〈 循环变量 〉 为必要参数,是用做循环计数器的数值变量,这个变量不能是数组元素 。
② 〈 初值 〉 和 〈 终值 〉 都是必要参数,如果没有指定 〈 步长 〉,则缺省值为 1。
③ 〈 步长 〉 可以是正数或负数 。 步长参数值决定循环的执行情况:如果步长的值为正数,则必须初值
<= 终值;否则必须初值 >= 终值 。
当所有循环中的语句都执行后,步长的值会加到循环变量中 。 此时,循环中的语句可能会再次执行
( 基于循环开始执行时同样的测试 ),也可能是退出循环并从 Next语句之后的语句继续执行 。
④ 可以在循环中的任何位置放置任意个 Exit For
语句,随时退出循环 。
⑤ 如果省略 Next语句中的 [循环变量 ],将不影响循环的执行 。 但如果 Next语句在它相对应的 For语句之前出现,则会产生错误 。
⑥ 在循环中改变循环变量的值,将会使程序代码的阅读和调试变得困难 。
【 例 5-10】,同构数,是指这样的整数:它恰好出现在其平方数的右端,例如 1和 5就是这样的数 。 试找出 1~ 9999之间的全部,同构数,。
分析,1位同构数 n应满足条件,n=n^2 Mod 10,
2位同构数 n应满足条件,n=n^2 Mod 100,
3位同构数 n应满足条件,n=n^2 Mod 1000,
4位同构数 n应满足条件,n=n^2 Mod 10000。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>同构数 </TITLE></HEAD>
<BODY><H3>找出 1~ 9999之间的全部,同构数,</H3><HR>
<INPUT TYPE="Button" NAME="Button1" VALUE="确定 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
p=""
For n = 1 To 9999
If n = n^2 Mod 10 Or n = n^2 Mod 100 Or _
n = n^2 Mod 1000 Or n = n^2 Mod 10000 Then
p = p & n & " " & n^2 & Chr(13)
End If
Next
MsgBox "同构数为," & Chr(13) & p
</SCRIPT>
</BODY>
</HTML>
在浏览器中执行打开
VBScript程序,显示如图
5-8所示 。
图 5-8 同构数
4,For Each? Next循环语句
For Each...Next循环与 For...Next循环类似 。
For Each...Next不是将语句运行指定的次数,而是对于数组中的每个元素或对象集合中的每一项重复一组语句 。 这在不知道集合中元素的数目时非常有用 。 其语法格式为:
For Each〈 元素 〉 In〈 名称 〉
[语句列 1]
[Exit For]
[语句列 2]
Next [〈 元素 〉 ]
说明:
① 〈 元素 〉 是用来枚举集合或数组中所有元素的变量 。 对于集合,〈 元素 〉 可能是 Variant变量,通用
Object变量或任意指定的 Automation对象变量 。 对于数组,〈 元素 〉 只能是 Variant变量 。
② 〈 名称 〉 是指对象集合或数组的名称 。
【 例 5-11】 在窗体中有若干文本框,在代码中创建 Dictionary对象,并赋值 。 然后将 Dictionary对象的内容分别放置在多个文本框中 。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>控件组 </TITLE></HEAD>
<BODY>
<CENTER>
<Input Type = "Text" name = text1><p>
<Input Type = "Text" name = text1><p>
<Input Type = "Text" name = text1><p>
<Input Type = "Text" name = text1><p>
<Input Type = "Button" NAME="Button1" VALUE="单击此处 "><p>
</CENTER>
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
Dim d ' 创建一个变量
Set d = CreateObject("Scripting.Dictionary")
d.Add 0,,北京” ‘ 添加键和项目
d.Add 1,"上海 "
d.Add 2,"天津 "
d.Add 3,"重庆 "
For Each i in d
text1(i).Value = d.Item(i)
Next
</SCRIPT>
</BODY>
</HTML>
在浏览器中执行打开 VBScript程序,显示结果 。
5,循环的嵌套通常把循环体内不含循环语句的循环称为单重
( 层 ) 循环,而把循环体内含有循环语句的循环称为多重循环,或称循环的嵌套 。 根据嵌套的层数有二重循环,三重循环? 等等 。
上面介绍的循环结构既可以单独嵌套,也可以互相嵌套,但是要注意内外循环不能交叉 。
【 例 5-12】 求从 1000到 1100之间的所有素数 。
分析:例 5-7介绍了利用 Do? Loop循环判断素数的方法,现在只需对 1000~ 1100之间的各整数依次测试即可 。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>素数 </TITLE></HEAD>
<BODY><H3>找出 1000~ 1100之间的所有素数 </H3><HR>
<INPUT TYPE="Button" NAME="Button1" VALUE="确定 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
p=""
For n = 1001 To 1100 Step 2
s = 0
For i = 2 To Sqr(n)
If n Mod i = 0 Then s = 1,Exit For
Next
If s = 0 Then p = p & Chr(13) & n
Next
MsgBox "1000~ 1100之间素数有," & Chr(13) & p
</SCRIPT>
</BODY>
</HTML> 在浏览器中执行程序,显示结果 。
5.2.3 VBScript的过程
1,Sub过程
2,Function过程
3,参数的传递方式
1,Sub过程
VBScript的 Sub过程分为事件过程和通用过程两种 。
事件过程是当发生某个事件时,对该事件做出响应的程序段;而通用过程则是独立于事件过程的程序段,
可以被其他过程调用 。 本课只介绍通用过程,事件过程将在第 6课中讨论 。
Sub过程是包含在 Sub和 End Sub语句之间的一组
VBScript语句,执行操作但不返回值 。
(1) Sub过程的定义
Sub过程的定义从 Sub命令开始,其格式为:
[Public [Default] | Private]
Sub〈 过程名 〉 ( [〈 形参表 〉 ] )
[〈 语句列 〉 ]
[ Exit Sub ]
[〈 语句列 〉 ]
End Sub
参数说明见表 5-1。
表 5-1 Sub过程的参数说明参数 说明
Public 表示 Sub过程可被所有脚本中的所有其他过程访问
Default 只与类块中的 Public关键字连用,用来表示 Sub过程是类的默认方法。
如果在类中指定了不止一个 Default过程,就会出错
Private 表示 Sub过程只可被声明该过程的脚本中的其他过程访问(默认)
过程名 遵循标准变量命名规则,长度不得超过 40个字符,在同一脚本中,
同一名称不能既作 Sub过程名又作 Function过程名形参表 代表在调用时要传递给 Sub过程的参数的变量列表。用逗号隔开多个变量语句列 是 VBScript的程序段,语句列中可以用一个或多个 Exit Sub语句从过程中退出其中 〈 形参表 〉 中出现的参数称为形式参数,简称为形参 。 它并不代表一个实际的存在的变量,也没有固定的值 。 在调用此过程时它被一确定的值所代替 。
形式参数的名字并不重要,重要的是其所表示的关系和调用时所给定的实际参数 。
〈 形参表 〉 中形参的语法为:
[ByVal | ByRef]〈 变量名 〉 [( )]
其参数说明见表 5-2。
表 5-2 形参的参数说明参数 说明
ByVal 表示该参数按值传递
ByRef 表示该参数按地址传递,为 VBScript的缺省选项变量名 代表参数的变量的名称,遵循标准的变量命名约定。
如果是数组变量,要在数组名后加上一对小括号
(2) Sub过程的调用建立 Sub过程的目的之一就是减少重复代码,将公共语句放入分离开的过程并由代码来调用它 。
每次调用 Sub过程都会执行 Sub和 End Sub之间的
〈 语句列 〉 。 Sub过程以 Sub开始,以 End Sub结束 。 当程序遇到 End Sub时,将退出过程,并立即返回到调用语句的后续语句 。
调用 Sub过程有两种方法:
使用 Call语句,Call〈 过程名 〉 ( [〈 实参表 〉 ] )
直接使用过程名,〈 过程名 〉 [〈 实参表 〉 ]
说明:
① 〈 实参表 〉 是实际参数列表,参数与参数之间要用逗号分隔 。
② 当用 Call语句调用执行过程时,其过程名后必须加括号,若有参数,则参数必须放在括号之内 。
③ 若省略 Call关键字,则过程名后不能加括号,
若有参数,则参数直接跟在过程名之后,参数与过程名之间用空格隔开,参数与参数之间用逗号分隔 。
【 例 5-13】 编制判断素数的 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) 符合要求 。
由于需要多次检查一个整数是否素数,所以把判断是否素数这一过程编写为一个 Sub程序 Prime。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>验证哥德巴赫猜想 </TITLE>
<SCRIPT LANGUAGE="VBScript">
Sub Prime(m,f)
f = True
If m > 3 Then
For i = 3 To Sqr(m)
If m Mod i = 0 Then f = False,Exit For
Next
End If
End Sub
</SCRIPT>
</HEAD>
<BODY><H3>验证哥德巴赫猜想:一个不小于 6的偶数可以表示为两个素数之和 </H3><HR>
请输入一个不小于 6的偶数:
<input name="Text1" TYPE="TEXT" SIZE="10"><P>
<INPUT TYPE="Button" NAME="Button1" VALUE="确定 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
n = Text1.value
If Not IsNumeric(n) Then MsgBox "输入的不是数值数据 ",Exit Sub
If n < 6 Or n Mod 2 <> 0 Then MsgBox "必须输入大于 6的偶数,请重新输入 !",Exit Sub
For x = 3 To n / 2 Step 2
Call Prime(x,p)
If p Then
y = n - x,Call Prime(y,p)
If p Then MsgBox n & " = " & x & "+" & y,Exit For
End If
Next
</SCRIPT>
</BODY>
</HTML>
在浏览器中执行 VBScript程序,显示结果 。
2,Function过程
Function过程与 Sub过程非常相似,只有关键的一点区别:函数有返回值 。
(1) Function过程的定义
Function过程的定义格式为:
[Public [Default] | Private] Function
〈 函数名 〉 [(〈 形参表 〉 )]
[〈 语句列 〉 ]
[〈 函数名 〉 =〈 表达式 〉 ]
[ Exit Sub ]
[〈 语句列 〉 ]
[〈 函数名 〉 =〈 表达式 〉 ]
End Function
其中 〈 表达式 〉 为 Function过程的返回值,其他参数同 Sub过程 。
(2) Function过程的调用
Function过程的调用比较简单,可以在表达式中写上它的名字 。 还可以像调用 Sub过程那样调用
Function过程 。 下列代码调用同一个 Function过程:
Call Hypotenuse (3,6)
Hypotenuse 3,6
当用这种方法调用函数时,VBScript放弃返回值 。
函数可以没有参数,在调用无参函数时不发生虚实结合 。 调用无参函数得到一个固定的值,如下述无参函数:
Function F2
F2 = "Welcome to beijing"
End Function
可如下调用:
MsgBox F2
【 例 5-14】 编写求两数最大公约数的 Function过程 。
在网页中输入 3个整数,调用 Function过程求出 3个整数的最大公约数 。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>最大公约数 </TITLE>
<SCRIPT LANGUAGE="VBScript">
Function Hcf(k,h)
If k < h Then c = k,k = h,h = c
r = k Mod h
Do While r <> 0
k = h,h = r,r = k Mod h
Loop
Hcf = h
End Function
</SCRIPT>
</HEAD>
<BODY><H3>求 3个数的最大公约数 </H3><HR>
请输入 3个自然数:
<input name="Text1" TYPE="TEXT" SIZE="6">&nbsp;&nbsp;
<input name="Text2" TYPE="TEXT" SIZE="6">&nbsp;&nbsp;
<input name="Text3" TYPE="TEXT" SIZE="6"><P>
<INPUT TYPE="Button" NAME="Button1" VALUE="确定 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
l = Text1.value
m = Text2.value
n = Text3.value
If IsNumeric(l) And IsNumeric(m) And IsNumeric(n) Then
If l * m * n = 0 Then Exit Sub
MsgBox "3个数的最大公约数是," & Hcf(Hcf(l,m),n)
Else
MsgBox "您输入的不是数值数据 "
End If
</SCRIPT>
</BODY>
</HTML>
在浏览器中执行 VBScript程序,显示结果 。
3,参数的传递方式传递参数的方式有两种:如果调用语句中的实际参数是常量或表达式,或者定义过程时选用 ByVall关键字,就可以按值传递 。 如果调用语句中的实际参数为变量,或者定义过程时选用 ByRefl关键字,就可以按地址传递 。
(1) 按地址传递参数按地址传递参数,就是让过程根据变量的内存地址去访问实际变量的内容,即形式参数与实际参数使用相同的内存地址单元,这样通过子过程就可以改变变量的值 。 系统缺省按地址传递参数 。 在传址调用时,
实际参数必须是变量,常量或表达式无法传址 。
(2) 按值传递参数按值传递参数时,传递的只是变量的副本 。 如果过程改变了这个值,则所作变动只影响副本而不会影响变量本身 。
当要求变量按值传送时,可以先把变量变成一个表达式,把变量转换成表达式的最简单的方法就是把它放在括号内 。 例如把变量 a变为一个表达式,(a)。
也可以在定义过程时用 ByVal关键字指出参数是按值来传递的,例如:
Sub PostAccounts( ByVal intAcctNum )
' 这里放语句
End Sub
下面给出的程序,可以理解按值传递参数 。
【 例 5-15】 求两个整数的最大公约数和最小公倍数,如图 5-13所示 。
编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>最大公约数与最小公倍数 </TITLE>
<SCRIPT LANGUAGE="VBScript">
Function Hcf(m,n)
If m < n Then c = m,m = n,n = c
r = m Mod n
Do While r <> 0
m = n,n = r,r = m Mod n
Loop
Hcf = n
End Function
</SCRIPT>
</HEAD>
<BODY>
<H3>求最大公约数与最小公倍数 </H3><HR>
请输入 2个自然数:
<input name="Text1" TYPE="TEXT" SIZE="6">&nbsp;&nbsp;
<input name="Text2" TYPE="TEXT" SIZE="6">&nbsp;&nbsp;
<INPUT TYPE="Button" NAME="Button1" VALUE="确定 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
n = Text1.value
m = Text2.value
If IsNumeric(n) And IsNumeric(m) Then
If n * m = 0 Then Exit Sub
p = n & "," & m & "的最大公约数是," & Hcf((n),(m))
p = p & Chr(13) & n & "," & m & "的最小公倍数是,"
p = p & n * m / Hcf((n),(m))
MsgBox p
Else
MsgBox "输入的不是数值数据 "
End If
</SCRIPT>
</BODY>
</HTML>
说明:
① 代码中使用的传值方式是将实参变量用括号括起 。
② 过程中的变量名即使与主程序中使用的变量名相同,在内存中也占用不同的内存单元地址 。 在执行过程时即使其变量内容发生变化,主程序中的变量内容并不会随之改变 。
③ 用传值调用这种传递参数的方法只能传递计算值,如数值,字符串 。
④ 值参数与变量参数的一种重要区别是,值参数对应的实参是表达式,而变量参数对应的只能是变量 。
采用值参数只能从外界向过程 ( 函数 ) 传入信息,
但不能传出;而采用变量参数 ( 传址 ) 则既能传入,
又能传出 。 正是由于不能传出,过程结束后,值参数的值就不会影响外界的任何量,因而在一定意义上说,
值参数比较安全 。
变量参数和值参数各有特点,采用哪一种更合适,
则视需要情况而定 。 一般来说,需要传出参数值时应该用变量参数,否则采用值参数为好 。
5.3 上机练习
【 练习 5-1】 有编号 1~ 10的 10个球,编写程序,
在其中随机抽取 6个球,并输出它们的编号 。
在记事本中编写如下 VBScript程序代码:
<HEAD><TITLE>随机取号 </TITLE></HEAD>
<BODY bgcolor=LightYellow>
<FONT size=6 face=方正舒体 color= blue>随机取号
</FONT><HR>
&nbsp;&nbsp;有编号 1~ 10的 10个球,在其中随机抽取 6个球 <P>
<INPUT type=button value=抽取 NAME=Button1>
<SCRIPT FOR=Button1 EVENT=onClick LANGUAGE=VBScript>
s=10
redim t(s),c(6)
for each j in t
j=0
next
' 随机抽取编号
Randomize timer
for j=1 to 6
k=int(rnd*s+1)
do while t(k)<>0
k=int(rnd*s+1)
loop
t(k)=1 ' 第 k号被选中
next
i=1
for j=1 to s
if t(j)=1 then
c(i)=j
i=i+1
end if
next
p="6个球的编号分别是," & chr(13)
for i=1 to 5
p=p & c(i) & ","
next
p=p & c(6)
msgbox p
</SCRIPT>
</BODY>
</HTML>
在浏览器中执行程序,显示结果
【 练习 5-2】 编写输入一个 0~ 6数字,输出汉英对照星期名的 Function过程 。
在记事本中编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>汉英对照 </TITLE>
<SCRIPT LANGUAGE="VBScript">
Function MyDay(n)
Select Case n
Case 0
MyDay = "星期日 " & Chr(13) & "Sunday"
Case 1
MyDay = "星期一 " & Chr(13) & "Monday"
Case 2
MyDay = "星期二 " & Chr(13) & "Tuesday"
Case 3
MyDay = "星期三 " & Chr(13) & "Wednesday"
Case 4
MyDay = "星期四 " & Chr(13) & "Thursday"
Case 5
MyDay = "星期五 " & Chr(13) & "Friday"
Case 6
MyDay = "星期六 " & Chr(13) & "Saturday"
End Select
End Function
</SCRIPT>
</HEAD>
<BODY><H3>显示汉英对照星期名 </H3><HR>
请输入一个 0~ 6之间的整数:
<input name="Text1" TYPE="TEXT" SIZE="2"><P>
<INPUT TYPE="Button" NAME="Button1" VALUE="确定 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
n = Text1.value
If Not IsNumeric(n) Then
MsgBox "您输入的不是数值数据 "
ElseIf n >= 0 And n < 7 Then
MsgBox MyDay(n)
Else
MsgBox "请输入 0~ 6之间的整数! "
End If
</SCRIPT>
</BODY>
</HTML> 在浏览器中执行程序,显示结果 。
【 练习 5-3】 编制判断素数的 Function过程,验证哥德巴赫猜想:一个不小于 6的偶数可以表示为两个素数之和 。
将例 5-13中的 Sub过程改为 Function过程,编写如下 VBScript程序代码:
<HTML>
<HEAD><TITLE>验证哥德巴赫猜想 </TITLE>
<SCRIPT LANGUAGE="VBScript">
Function Prime(m)
f = True
If m > 3 Then
For i = 3 To Sqr(m)
If m Mod i = 0 Then f = False,Exit For
Next
End If
Prime = f
End Function
</SCRIPT>
</HEAD>
<BODY><H3>验证哥德巴赫猜想:
一个不小于 6的偶数可以表示为两个素数之和 </H3><HR>
请输入一个不小于 6的偶数:
<input name="Text1" TYPE="TEXT" SIZE="10"><P>
<INPUT TYPE="Button" NAME="Button1" VALUE="确定 ">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
n = Text1.value
If Not IsNumeric(n) Then MsgBox "您输入的不是数值数据 ",
Exit Sub
If n < 6 Or n Mod 2 <> 0 Then MsgBox "必须输入大于 6的偶数,
请重新输入 !",Exit Sub
For x = 3 To n / 2 Step 2
If Prime(x) Then
y = n - x
If Prime(y) Then MsgBox n & " = " & x & "+" & y,
Exit For
End If
Next
</SCRIPT>
</BODY>
</HTML> 在浏览器中执行程序,显示结果 。