第 4章 数组与过程
学习目标:
? 掌握数组和过程的概念
? 掌握数组的定义和应用
? 掌握 Sub过程和 Function过程的应用
? 掌握过程的参数传递与过程的作用域
? 了解 Shell函数
第 4章 数组与过程
教学内容:
4.1 数组
4.2 过程
4.3 Shell函数
4.1 数组 - 数组的概念
? 数组用于保存大量的, 逻辑上有联系的数据
? 数组的特点:
? 数据中的元素在类型上是一致的
? 数组元素在内存空间上是连续存放的
? 数组元素的引用可通过下标进行
? 数组在使用前必须要定义 (声明 )
返回目录
4.1 数组 - 一维数组的定义和使用
1,数组的定义 (声明 )
Dim 数组名 ([下界 To ]上界 ) As 数据类型
例如, Dim Data(1 To 40) As Integer
? 定义数组可以使用类型符
例, Dim Data%(1 To 40)
? 下界的默认值为 0
例, Dim Salary(1000) As Currency
? 通过数组名和下标可引用数组中的元素
例, Data(25)=95
Form1.Print Data(25)
返回目录
4.1 数组 - 一维数组的定义和使用
说明 -1:
? 数组定义后的初值:数值型数组各元素为 0,逻辑型数组
各元素为 False,字符串数组各元素为空串 ("")。
? 可同时声明几个数组, 用逗号分隔, 例如
Dim A%(10 To 100),B(800) As Long
? 定义数组时, 下标的下界和上界值只能是常数或常数表达
式 。 下例的定义是错误的
N=100, Dim Data(N) As Integer
? 定义时, 数组的上界值不得超出长整型范围, 且数组的上
界值不得小于下界值 。
返回目录
4.1 数组 - 一维数组的定义和使用
说明 -2:
? 数组的元素个数称为数组长度 。
? Lbound(),Ubound()函数可测定数组的下界与上界值
例如,Private Sub Form_Click()
Dim A%(12 To 24)
Print LBound(A),UBound(A)
End Sub
? 用 Option Base n可设定数组的默认下界
? n的取值只能是 0或 1
? 设定方法:在代码窗口的通用声明段中输入
Option Base 0 或 Option Base 1
返回目录
4.1 数组 - 一维数组的定义和使用
2,数组元素的使用 通过数组名和下标
[例 4.1]
Private Sub Command1_Click()
Dim Data(5) As Integer
Dim Sum,I As Integer
For I = 1 To 5 '输入 5个数据到数组中
Data(I) = InputBox("输入第 " & I & "个数据 ")
Next I
For I = 1 To 5 '完成 5个数组元素的相加
Sum = Sum + Data(I)
Next I
Print Sum
End Sub
返回目录
For I = 1 To 5
Data(I) = InputBox("输入第 " & I & "个数据 ")
Sum = Sum + Data(I)
Next I
4.1 数组 - 一维数组的定义和使用
说明,
? 数组实际上是用一个变量名字代表一组数, 这组数是
连续排列的, 用顺序号作为下标区分各个数 。
? 数组下标是一个整型量, 如果有小数则自动按四舍五
入取整 。 例如, Data(3.4)=3,而 Data(3.5)=2。
? 数组常见的错误:
下标出界
返回目录
Test(1)=4
Test(2)=3
Test(3)=2
Test(4)超出定义
4.1 数组 - 一维数组应用例题
[例 4.3] 输出斐波那契级数的前 20项
Private Sub Form_Click()
Dim F(20) As Integer,I As Integer
F(1) = 1, F(2) = 1 '第一, 第二项为 1
For I = 3 To 20 '第三项起每项为前二项之和
F(I) = F(I - 2) + F(I - 1)
Next I
For I = 1 To 20 '在窗体上输出
Print F(I);
If I Mod 5 = 0 Then Print
Next I
End Sub
返回目录
4.1 数组 - 一维数组应用例题
[例 4.4] 输入一组不重复的数据, 找出最大值及其位置
Private Sub Form_Click()
Const Length = 5 '定义常量 Length作为数组最大下标
Dim Test%(Length),I%,Max%,L%
For I = 1 To Length '通过键盘输入给数组赋值
Test(I) = InputBox("输入第 " & I & "个数据 ")
Next I
Max = Test(1), L = 1 '设数组第一个元素为最大值
For I = 2 To Length
If Max < Test(I) Then '找到新的最大值, 记录其值和位置
Max = Test(I)
L = I
End If
Next I
MsgBox "最大值 x=" & Max & ",位置是 "& L
End Sub
返回目录
4.1 数组 - 一维数组应用例题
[例 4.5] 产生 10个整数到数组中, 将其顺序颠倒后输出
Private Sub Form_Click()
Const Length = 10, Dim D(Length) As Integer,I%,Temp%
For I = 1 To Length '给数组赋值并输出
D(I) = 14 + I, Print D(I);
Next I
Print,Print '换行
For I = 1 To Length / 2 '交换
Temp = D(I)
D(I) = D(Length - I + 1)
D(Length - I + 1) = Temp
Next I
For I = 1 To Length '交换后输出
Print D(I);
Next I
End Sub
返回目录
D(1)与 D(10)交换
D(2)与 D(9)交换
… …
D(I)与 D(10-I+1)
4.1 数组 - 一维数组应用例题
[例 4.8] 产生 100个不重复的 3位随机整数,
并按每行 7列的格式输出
Private Sub Form_Click()
Dim Data(100) As Integer,I%,J%
Randomize Timer '设置随机化种子, 保证每组数据不重复
For I = 1 To 100 '循环产生 100个数据
Data(I) = Int(Rnd() * 900) + 100
For J = 1 To I – 1 '与已经产生的数据比较
If Data(I) = Data(J) Then '数据已存在则舍弃, 重新产生
I = I - 1
Exit For '提前退出数据比较的循环
End If
Next J
Next I
返回目录
4.1 数组 - 一维数组应用例题
I = 1, J = 1
Do While I <= 100
For J = 1 To 7 '每行打印 7列
If I > 100 Then Exit For
Print Data(I);
I = I + 1
Next J
Print '打印换行
Loop
End Sub
返回目录
For I = 1 To 100
Print Data(I);
If I Mod 7 = 0 Then Print
Next I
4.1 数组 - 一维数组应用例题
[例 4.10] 统计成绩分布
Private Sub Form_Click()
Dim N(10) As Integer,I As Integer,X As Integer
Const m = 10
For I = 1 To m
X = InputBox("请输入 " + Str(I) + "个学生的成绩 ")
X = Int(X / 10) '也可写成 X=X\10
N(X) = N(X) + 1
Next I
Print 100; "--"; 100; N(10)
For I = 9 To 0 Step -1
Print 10 * I; "--"; 10 * I + 9; N(I)
Next I
End Sub
返回目录
4.1 数组 - 排序问题
1,选择法 排序 (N个数据 升序 )
1)先假设第 1个数据最小, 依次同第 2,第 3,…, 第 N个数据
进行比较, 一旦第 1个数据大于其它值则交换 。 这样, 第 1
轮比较完毕, 找出了最小数据作为第 1个数据 。
2)以第 2个数据为最小数据, 依次同第 3,第 4,…, 第 N个数
据进行比较, 若第 2个数据大于其它值则交换 。 这样, 第 2
轮交换完毕, 则找出第二小的数据作为第 2个数据 。
3)依此类推, 第 N-1轮比较将找出第 N-1小的数据, 剩下的一
个数据就是最大数, 排列在最后 。 以 6个数据为例:
返回目录
原始序列,30,20,10,90,50,60
第 1轮比较结果,10 | 30,20,90,50,60
第 2轮比较结果,10,20 | 30,90,50,60
第 3轮比较结果,10,20,30 | 90,50,60
第 4轮比较结果,10,20,30,50 | 90,60
第 5轮比较结果,10,20,30,50,60 | 90
4.1 数组 - 排序问题
[例 4.11] 用选择法完成 10个随机数据的升序排序 。
Const N = 10, Dim D(N) As Integer,I%,J%,T%
Randomize Timer
For I = 1 To N
D(I) = Rnd * 100,Print D(I); '排序前的数据序列
Next I
Print,Print
For I = 1 To N - 1 '挑出前 N-1个小的数
For J = I + 1 To N
If D(I) > D(J) Then '数据元素交换
T = D(I), D(I) = D(J), D(J) = T
End If
Next J
Next I
For I = 1 To N '输出排序结果
Print D(I);
Next I
返回目录
找最小数据作为第 1个数据:
I = 1
For J = 2 To N '这里 2等价 I+1
If D(1) > D(J) Then
T = D(1),D(1) = D(J),D(J) = T
End If
Next J
4.1 数组 - 排序问题
2,选择法 排序 (N个数据 升序 )
1)第 1轮比较, 从第 1个元素开始,两两相邻比较到 N-1,值大
的放在后面 。 比较完毕, 最大的数成为第 N个元素 (沉底 )。
2)第 2轮比较, 从第 1个元素开始,两两相邻比较到 N-2,值大
的放在后面 。 比较完毕, 最大的数成为第 N-1个元素 。
3)依此类推, 直至最后一次比较 。
返回目录
第 1轮比较:
原序列,30,20,10,90,50,60
第 1次比较结果,20,30,10,90,50,60
第 2次比较结果,20,10,30,90,50,60
第 3次比较结果,20,10,30,90,50,60
第 4次比较结果,20,10,30,50,90,60
第 5次比较结果,20,10,30,50,60,90
第 2轮比较:
原序列,20,10,30,50,60,90
第 1次比较结果,10,20,30,50,60,90
第 2次比较结果,10,20,30,50,60,90
第 3次比较结果,10,20,30,50,60,90
第 4次比较结果,10,20,30,50,60,90
4.1 数组 - 排序问题
[例 4.12] 用冒泡法完成 10个随机数的升序排序
Const N = 10, Dim D(N) As Integer,I%,J%,T%
Randomize Timer
For I = 1 To N
D(I) = Rnd * 100,Print D(I);
Next I
Print,Print
For I = N - 1 To 1 Step -1 '大数逐个 "沉底 "
For J = 1 To I
If D(J) > D(J + 1) Then
T = D(J),D(J) = D(J + 1),D(J + 1) = T
End If
Next J
Next I
For I = 1 To N '输出排序结果
Print D(I);
Next I
返回目录
最大的数成为第 N个元素 (沉底 ):
I = N - 1
For J = 1 To N-1 '这里 N-1等价 I
If D(J) > D(J + 1) Then
T = D(J),D(J) = D(J + 1),D(J + 1) = T
End If
Next J
4.1 数组 - 排序问题
[例 4.13]
Private Sub Form_Click()
Dim S_Name(7) As String,S_Age(7) As Integer
Dim I%,J%,N%
N = 7
S_Name(1) = "李大明 ", S_Age(1) = 18
S_Name(2) = "王超 ", S_Age(2) = 21
S_Name(3) = "张弓 ", S_Age(3) = 20
S_Name(4) = "陈卫国 ", S_Age(4) = 24
S_Name(5) = "马太原 ", S_Age(5) = 25
S_Name(6) = "吴济贫 ", S_Age(6) = 19
S_Name(7) = "戴天 ", S_Age(7) = 18
返回目录
对字符串数组 S_Name
和 S_Age赋值
4.1 数组 - 排序问题
For I = 1 To N - 1 '用选择法排序
For J = I + 1 To N
If S_Age(I) < S_Age(J) Then
S_Age(0) = S_Age(I)
S_Age(I) = S_Age(J)
S_Age(J) = S_Age(0)
S_Name(0) = S_Name(I)
S_Name(I) = S_Name(J)
S_Name(J) = S_Name(0)
End If
Next J
Next I
For I = 1 To N
Print LeftB(S_Name(I),2); S_Age(I); " ";
Next I
End Sub
返回目录
在交换年龄值的同时,
也要交换姓名,以保持姓
名和年龄下标的一致。
函数 LeftB()表示按字节取出指
定数量的字符。
一个汉字占两个字节。
4.1 数组 - 动态数组与静态数组
1,动态数组的声明与使用
? 声明:说明数组的名称和类型 (不说明下标范围 )
? 使用前用 ReDim语句定义
? 不需要动态数组时, 可用 Erase语句将其删除
例, 统计输入的任意个数之和 。
Dim N As Integer,A( ) As Single,i As Integer,s As Single
N = InputBox("输入几个数? ")
ReDim A(1 To N)
For i = 1 To N
A(i) = InputBox("输入第 " + Str(i) + "个数 ")
s = s + A(i)
Next i
Print N; "个数之和为 "; s
返回目录
4.1 数组 - 动态数组与静态数组
2,静态数组的声明与使用
用 Static声明, 元素的值保留到程序运行结束 。
例如,
Private Sub Form_Click()
Dim Test(10) As Integer,I As Integer
For I = 1 To 10
Test(I) = Test(I) + I
Next I
For I = 1 To 10
Print Test(I);
Next I
Print
End Sub
返回目录
改成:
Static Test(10) As Integer
4.1 数组 - 二维数组
1,二维数组的定义 (声明 )
? 二维数组由行和列组成, 有两个下标
? 定义格式:
Dim 数组名 ([下界 To ]上界,[下界 To ]上界 ) As 数据类型
例如, Dim Data(1 To 5,3 To 9) As Integer
? 下界默认为 0
例如, Dim Salary(30,10) As Currency '31行 11列
? 二维数组有行, 列两维, 通常需使用二重循环引用
返回目录
4.1 数组 - 二维数组
二维数组中的数据按行存储, 其引用与一维数组相似 。
Private Sub Form_Click()
Dim A(2,3) As Integer,I%,J%,C%
For I = 0 To 2
For J = 0 To 3 '数组赋值
A(I,J) = C, C = C + 1
Next J
Next I
For I = 0 To 2 '输出数组
For J = 0 To 3
Print A(I,J);
Next J
Print '另起一行打印
Next I
End Sub
返回目录
A(0,0)=0 A(0,1)=1 A(0,2)=2 A(0,3)=3
A(1,0)=4 A(1,1)=5 A(1,2)=6 A(1,3)=7
A(2,0)=8 A(2,1)=9 A(2,2)=10 A(2,3)=11
4.1 数组 - 二维数组
2,二维数组应用举例 - [例 4.15]
返回目录
Private Sub Form_Click()
Dim D%(9,9),I%,J%
For I = 1 To 9
For J = 1 To 9
If I = J Or I = 10 - J Then
D(I,J) = 1
Else
D(I,J) = 5
End If
Next J
Next I
For I = 1 To 9
For J = 1 To 9
Print D(I,J);
Next J
Print
Next I
End Sub
4.1 数组- 二维数组
[例 4.16]
Private Sub Command1_Click()
(1) 变量, 数组定义
(2) 数组 Sell,Price赋值:
销售情况, 单价
(3) 计算各连锁店各类食品的销售金额
(4) 计算 总计数据
(5) 输出
End Sub
返回目录
销售总额 咖啡 奶粉 茶叶 饼干
总计 15175.90 6919.00 6182.40 1106.00 968.50
一店 4838.00 2220.00 2016.00 316.00 286.00
二店 4764.80 2127.50 1971.20 347.60 318.50
三店 5573.10 2571.50 2195.20 442.40 364.00
4.1 数组- 二维数组
'(1)变量, 数组定义
Dim Sell(3,4)
Dim Money(3,4) As Single
Dim Price(4) As Single
Dim I%,J%
'(2)数组 Sell,Price赋值, 销售情况, 单价
Sell(1,1) = 120, Sell(1,2) = 90, Sell(1,3) = 20, Sell(1,4) = 44
Sell(2,1) = 115, Sell(2,2) = 88, Sell(2,3) = 22, Sell(2,4) = 49
Sell(3,1) = 139, Sell(3,2) = 98, Sell(3,3) = 28, Sell(3,4) = 56
Price(1) = 18.5, Price(2) = 22.4
Price(3) = 15.8, Price(4) = 6.5
返回目录
销售总额 咖啡 奶粉 茶叶 饼干
总计 15175.90 6919.00 6182.40 1106.00 968.50
一店 4838.00 2220.00 2016.00 316.00 286.00
二店 4764.80 2127.50 1971.20 347.60 318.50
三店 5573.10 2571.50 2195.20 442.40 364.00
4行 5列
店 名 咖啡 奶粉 茶叶 饼干
第一连锁店 120 90 20 44
第二连锁店 115 88 22 49
第三连锁店 139 98 28 56
4.1 数组- 二维数组
'(3)计算各连锁店各类食品的销售金额
For I = 1 To 3
For J = 1 To 4
Money(I,J) = Sell(I,J) * Price(J)
Next J
Next I
'(4)计算 总计 数据
For I = 1 To 3
For J = 1 To 4
Money(I,0) = Money(I,0) + Money(I,J)
Money(0,J) = Money(0,J) + Money(I,J)
Money(0,0) = Money(0,0) + Money(I,J)
Next J
Next I
返回目录
销售总额 咖啡 奶粉 茶叶 饼干
总计 0 0 0 0 0
一店 0 2220.00 2016.00 316.00 286.00
二店 0 2127.50 1971.20 347.60 318.50
三店 0 2571.50 2195.20 442.40 364.00
销售总额 咖啡 奶粉 茶叶 饼干
总计 15175.90 6919.00 6182.40 1106.00 968.50
一店 4838.00 2220.00 2016.00 316.00 286.00
二店 4764.80 2127.50 1971.20 347.60 318.50
三店 5573.10 2571.50 2195.20 442.40 364.00
4.1 数组- 二维数组
'(5)输出
Print "销售总额 "; Tab(12);"咖啡 "; Tab(24); "奶粉 ";
Print Tab(36); "茶叶 "; Tab(48); "饼干 "
For I = 0 To 3
For J = 0 To 4
Print Tab(12 * J); Format(Money(I,J),"#.00");
Next J
Print
Next I
返回目录
销售总额 咖啡 奶粉 茶叶 饼干
总计 15175.90 6919.00 6182.40 1106.00 968.50
一店 4838.00 2220.00 2016.00 316.00 286.00
二店 4764.80 2127.50 1971.20 347.60 318.50
三店 5573.10 2571.50 2195.20 442.40 364.00
用 Format()函数使输出项保留两位小数,
4.1 数组 - 二维数组
[例 4.17]
Private Sub Form_Click()
(1) 常量, 变量, 数组定义
(2) 产生学号 (从 1001开始 )
(3) 产生课程名称 A,B,C,…
(4) 产生 M个学生 N门课程的成
绩 (全部 60分以上 )
(5) 求每个学生的总分,
放在第 N+1列中
(6) 输出每个学生的总分和
N门课程成绩
(7) 按总分降序排序 (选择法排序 )
(8) 输出排序后的每个学生的 N门课程成绩和总分
End Sub
返回目录
4.1 数组 - 二维数组
'(1)常量, 变量, 数组定义, 随机数初始化
Const M = 10,N = 6
Dim Data(M,N + 1) As Integer,I%,J%,K%,Temp%
Randomize Timer
'(2)产生学号 (从 1001开始 )
For I = 1 To M
Data(I,0) = 1000 + I
Next I
'(3)产生课程名称 A,B,C,…
For I = 1 To N
Data(0,I) = I + Asc("A") - 1
Next I
返回目录
M名学生 N门课程,N+1列是该生的总分
第 0列是学号
第 0行是课程名称
4.1 数组 - 二维数组
'(4)产生 M个学生 N门课程的成绩 (全部 60分以上 )
For I = 1 To M
For J = 1 To N
Data(I,J) = 60 + 40 * Rnd
Next J
Next I
'(5)求每个学生的总分, 放在 N+1列
For I = 1 To M
For J = 1 To N
Data(I,N + 1) = Data(I,N + 1) + Data(I,J)
Next J
Next I
返回目录
4.1 数组 - 二维数组
'(6)输出每个学生的总分和 N门课程成绩
For I = 1 To N '输出课程名称
Print Tab(8 * I + 2); Chr(Data(0,I));
Next I
Print '换行
For I = 1 To M
For J = 0 To N + 1
Print Tab(8 * J); Data(I,J);
Next J
Print
Next I
Print
返回目录
4.1 数组 - 二维数组
'(7)按总分降序排序 (选择法排序 )
For I = 1 To M - 1
For J = I + 1 To M
If Data(I,N + 1) < Data(J,N + 1) Then
For K = 0 To N + 1
Temp = Data(I,K)
Data(I,K) = Data(J,K)
Data(J,K) = Temp
Next K
End If
Next J
Next I
返回目录
4.1 数组 - 二维数组
'(8)输出排序后的每个学生的 N门课程成绩和总分
For I = 1 To N '输出课程名称
Print Tab(8 * I + 2); Chr(Data(0,I));
Next I
Print
For I = 1 To M
For J = 0 To N + 1
Print Tab(8 * J); Data(I,J);
Next J
Print
Next I
返回目录
4.2 过程
? 过程是一段程序代码, 是相对独立的逻辑模块 。
? 一个完整的 VB应用程序由若干过程和模块组成 。
? 常用的 VB过程有,Sub过程和 Function过程 。
? Sub过程 (子过程 ):完成一定的操作和功能, 无返回值,
通过程序调用和事件触发而执行, 分为事件过程和通
用过程 。
? Function过程 (函数过程 ):相当于用户自定义的函数,
通过程序调用才能被执行, 并且可将数据处理的结果
返回 。
? 一个过程的代码长度不要超过 64K。
返回目录
4.2 过程 - Sub过程
? 过程定义格式:
[Private|Public][Static]Sub 过程名 (参数表 )
语 句
End Sub
? Private表示模块级子过程, Public表示全局级子过程 (缺省值 ) 。
? Static表示过程内部定义的变量值在整个程序运行期间被保留 。
? 过程名 符合 VB标识符 的命名约定
? 参数表可以是空表, 也可以放置若干个变量 (形式参数 )。 如:
Public Sub Sum(X As Integer,Y As Integer,Z As Integer)
? Sub过程分为:事件过程和通用过程
返回目录
4.2 过程 - Sub过程
1,事件过程
? 这类过程与对象有关, 对象事件触发后被调用 。
? 事件过程的过程名由系统自动指定 。
? 建立对象的事件过程:
(1) 进入代码窗口
? 方法 1:双击对象
? 方法 2:, 视图 → 代码窗口,
(2) 选择, 对象, 和, 事件过程,, 系统
自动形成该事件过程的头和尾
(3) 编写该事件的程序代码
返回目录
“对象”,事件过程

4.2 过程 - Sub过程
2,通用 Sub过程
? 这类过程不与对象相关, 是用户创建的一段共享代码 。
? 过程的名称由用户自己命
? 建立通用 Sub过程:
(1) 建立过程框架
? 方法 1,在模块的, 通用, 段中输入
过程名, 按回车后系统自动添加
End Sub。
? 方法 2:, 工具 → 添加过程,
(2) 编写该过程的程序代码
返回目录
4.2 过程 - Sub过程
3,过程的调用方法
(1) 通用 Sub过程的两种调用方式:
? Call 过程名 (参数表 )
? 过程名 参数表
(2) 事件过程的调用
? 一般由事件的触发而引起 (单击, 窗体加载等 )
? 也可以象通用 Sub过程那样调用, 如:
Private Sub Form_DblClick()
Call Command1_Click
End Sub
返回目录
4.2 过程 - Sub过程
[例 4.19] 用随机函数生成表中数据, 计算总分并输出 。
'表格横线用通用过程 Print_Line绘出, 在主程序中多次调用
Private Sub Print_Line()
Dim I As Integer
Print Tab(10);
For I = 1 To 25
Print "-";
Next I
Print
End Sub
返回目录
定长
4.2 过程 - Sub过程
Private Sub Command1_Click() '单击, 输出,
定义数组和变量
For I = 1 To 5
用随机函数生成表中数据
Next I
Print_Line '调用画线过程
Print Tab(10); "数学 "; Tab(20); "物理 "; Tab(30); "化学 "
Print_Line '调用画线过程
For I = 1 To 5
打印表中数据, 并统计各科总分
Next I
Print_Line '调用画线过程
Print Tab(10); Math(0); Tab(20); Phy(0); Tab(30); Chem(0)
Print_Line '调用画线过程
End Sub
返回目录
4.2 过程 - Sub过程
将 Print_Line过程改写如下:
Private Sub Print_Line(n As Integer)
Dim I As Integer
Print Tab(10);
For I = 1 To n
Print "-";
Next I
Print
End Sub
返回目录
调用语句改为:
Print_Line 实参 或 Call Print_Line(实参 )
例如,Print_Line 30 或 Call Print_Line(30)
n为形参
调用过程时,实参
将值交给形参,由
形参带入子过程中
执行。
4.2 过程 - Sub过程
[例 4.20] 用不同的方式分别调用带有形式参数的求和通用
过程 Add和求差通用过程 Subst
返回目录
Private Sub Command1_Click()
Dim X%,Y%
X = InputBox("请输入数据 ")
Y = InputBox("请输入数据 ")
Call Add(X,Y) '调用求和通用过程
Subst X,Y '调用求差通用过程
End Sub
Sub Add(A,B)
Dim C%
C = A + B,Print C
End Sub
Sub Subst(A,B)
Dim C%
C = A - B,Print C
End Sub
4.2 过程 - Function过程
? Function过程的实质是一个自定义函数, 定义格式:
[Private|Public][Static]Function 函数过程名 (参数表 ) [类型 ]
语句
End Function
Private,Public,Statc及参数的含义同 Sub子过程
? Function过程 具有函数值, 类型缺省为变体型, 由函数过
程名返回 。
? Function过程的建立与 Sub过程的建立相似, 调用方法:
? 用 Call语句
? 将 Function返回值赋给一个变量
? 将 Function过程 的返回值用在表达式中
返回目录
4.2 过程 - Function过程
[例 4.21] 计算
Private Sub Command1_Click()
Dim I As Integer
Dim e As Single,F As Long
For I = 0 To 10
F = Factorial(I) ' 计算 I!
e = e + 1 / F
Next I
Print "e="; e
End Sub
返回目录
!10
1...
!3
1
!2
1
!1
11 ??????e
Function Factorial(X As Integer) As Long
Dim I As Integer,T As Long
T = 1
For I = 1 To X '计算 X!
T = T * I
Next I
Factorial = T
End Function
计算阶乘的
函数过程
4.2 过程 - 参数传递
在 调用 Sub过程和 Function过程时, 参数的传递有两种方
式:按值传递, 按地址传递
1,按值传递
? 主调过程的实参与被调过程的形参 各有自己的存储单元
? 调用时:主调过程的实参值复制给被调过程的形参
? 定义被调过程时, 各形参前加 ByVal
2,按地址传递
? 主调过程的实参与被调过程的形参 共享同一存储单元
? 形式参数与实际参数是同一个变量
? 定义被调过程时, 各形参前加 ByRef
定义过程时, 缺省 的参数传递方式是 按地址传递
返回目录
4.2 过程 - 参数传递
[例 4.23/4.24] 参数传递示例
返回目录
Sub Command1_Click()
Dim A%,B%
A = 100, B = 900
Print "A="; A,"B="; B
Print
Call Exchange1(A,B)
Print "A="; A,"B="; B
Print
Call Exchange2(A,B)
Print "A="; A,"B="; B
End Sub
Sub Exchange1(ByVal X%,ByVal Y%)
T = X,X = Y,Y = T
Print "X="; X,"Y="; Y
End Sub
Sub Exchange2(ByRef X%,ByRef Y%)
T = X,X = Y,Y = T
Print "X="; X,"Y="; Y
End Sub
4.2 过程 - 参数传递
3,数组作为参数值的传递方式
? 数组参数只能按地址传递
? 在实参和形参中无需说明数组的维数
? 数组的上界和下界可用 Lbound()和 Ubound()函数测出
返回目录
[例 4.25] 将一个数值型一维
数组按升序排序输出, 排序
在通用过程 Sort中进行, 采
用选择法排序 。
4.2 过程 - 参数传递
Private Sub Command1_Click()
Dim Data(5 To 14) As Integer '定义 5-14为有效的下标范围
Dim I%
For I = 5 To 14 '数组赋值
Data(I) = 30 - I
Next I
Print "排序前,"
For I = 5 To 14
Print Data(I);
Next I
Print, Print "排序后,"
Call Sort(Data())
For I = 5 To 14
Print Data(I);
Next I
End Sub
返回目录
Private Sub Sort(Element() As Integer)
Dim I%,J%,T%
For I = LBound(Element) To UBound(Element) – 1
For J = I + 1 To UBound(Element)
If Element(I) > Element(J) Then
T = Element(I)
Element(I) = Element(J)
Element(J) = T
End If
Next J
Next I
End Sub
4.2 过程 - 作用域
? 变量的作用域指定义的变量能有效发挥其作用的范围 。
? 变量按其作用域可分为局部变量 (过程级 ),模块变量 (模块
级 )和全局变量 (全局级 )
? 对过程而言, 也有 模块级过程 和 全局级过程 之分
1,模块级过程
在一个窗体模块中以 Private定义的过程为模块级过程, 可为
模块内的各个过程引用 。
2,全局级过程
在一个窗体模块中以 Public定义的过程为全局级过程, 其他窗
体可通过, 窗体模块名,过程名, 引用;在标准模块中定义的全
局过程可 直接通过过程名 引用 。
返回目录
4.2 过程 - 作用域
[例 4.26] 在标准模块中建立可将窗口居中安放的全局级过程,
窗体启动时即调用该过程 。
(1),工程 → 添加模块,, 添加标准模块
(2) 在标准模块代码窗口建立全局过程 CenterOnSetupForm
返回目录
4.2 过程 - 作用域
(3) 编写 Form1窗体的 Load事件响应代码:一启动即调用过程 。
CenterOnSetupForm
返回目录
4.3 Shell函数
? 作用:运行一个 Windows或 DOS可执行程序 。 如果程序存
在并且执行成功, 则返回一个标识号 (ID),否则返回 0。
? 语法格式,Shell(路径名, 窗口方式 )
例如,
Private Sub Command1_Click()
X = Shell("c:\windows\pbrush.exe",1)
End Sub
返回目录
见教材表 4.1