第七章  过程
双击滚屏  关闭窗口

 

7.3 参数传递

  7.3.1 形参与实参
  7.3.2 按地址传递和按值传递
  7.3.3 使用参数
  7.3.4 传递数组

调用过程时可以把数据传递给过程,也可以把过程中的数据传递回来。正确地提供一个过程的输入数据和正确地引用其输出数据,是使用过程的关键问题,也就是调用过程和被调用过程之间的数据传递问题。

7.3.1 形参与实参

1. 形式参数

在通用过程中,出现在 Sub 或 Function 语句中的变量名,是接受数据的变量。

2. 实际参数

在调用 Sub 或 Function 过程时,传送给 Sub 或 Function 过程的常量、变量或表达式。

3. 形式参数和实际参数的对应关系

调用过程: Call exam(18, cj(), ch )

 

定义过程: Sub exam(r As Integer, a() As Single, c As String)

 

7.3.2 按地址传递和按值传递

1. 按地址传递参数

按地址传递参数时形式参数和实际参数使用相同的内存地址单元,通过子程序可改变变量的值,在传址调用时,实际参数必须是变量,常量和表达式无法传址。系统缺省按地址传递参数。

例 7 :利用示例 6 中的 Function 过程 Hcf ,求任意两个整数的最大公约数。

程序代码:

Private Sub Command1_Click()

Dim x As Long, y As Long

t = InputBox(" 请输入第一个整数: ")

x = Val(t)

t = InputBox(" 请输入第二个整数: ")

y = Val(t)

If x * y = 0 Then Exit Sub

Label1.Caption = x & "," & y & " 的最大公约数是: " & Str(Hcf(x, y))

Label2.Caption = x & "," & y & " 的最大公约数是: " & Str(Hcf(x, y))

End Sub

 

执行结果:

                    

2. 按值传递参数

按值传递参数时,传递的只是变量的副本,如果过程改变了这个值,并不影响变量本身。

希望按值传递参数时,可以采用下述两种方法:

◇将变量变成一个表达式,方法是,给变量加上圆括号

示例: (a)

◇在定义过程时,使用关键字 ByVal

示例: Sub fact(ByVal m As Integer)

例 8 :使用传值调用 Function 过程 Hcf ,求两个整数的最大公约数和最小公倍数。

程序代码:

Private Sub Command1_Click()

Dim m As Long, n As Long

t = InputBox(" 请输入第一个整数: ")

m = Val(t)

t = InputBox(" 请输入第二个整数: ")

n = Val(t)

If m * n = 0 Then Exit Sub

Label1.Caption = m & "," & n & " 的最大公约数是: " & Str(Hcf((m), (n)))

Label2.Caption = m & "," & n & " 的最小公倍数是: " & Str(m * n / Hcf((m), (n)))

End Sub

 

执行结果:

                   

7.3.3 使用参数

1. 使用可选的参数

在过程形参表中列入关键字 Optional ,指定的形式参数为可选参数。此参数后的其他参数也即为可选的,且每个参数都须用 Optional 关键字声明。

例 9 :两个命令按钮的事件代码调用同一个过程,一个传递两个参数,另一个传递一个参数。

程序代码:

Private Sub ListT(x As String, Optional y As String)
Const s = “@@@@@@@@@@”
If IsMissing(y) Then
t = Format(x, s)
Else
t = Format(x, s) & Format(y, s)
End If
List1.AddItem t

End Sub

Private Sub Command1_Click()

Dim a As String, b As String

a = InputBox("", " 第一个参数 ")

b = InputBox("", " 第二个参数 ")

Call ListT(a, b)

End Sub

 

Private Sub Command2_Click()

Dim a As String

a = InputBox("", " 输入参数 ")

Call ListT(a)

End Sub

 

执行结果:

                   

2. 提供可选参数的缺省值

例 10 :在例 9 中,为未传递参数指定一个缺省值 "########" 。

只需修改 Sub 过程 ListT 的代码

 

程序代码:

Private Sub ListT(x As String, Optional y As String = "########")

Const s = "@@@@@@@@@@"

t = Format(x, s) & Format(y, s)

List1.AddItem t

End Sub

 

执行结果:

                     

3. 使用不定数量的参数

在过程形参表中使用关键字 ParamArray ,则过程可以接受任意个数的参数。

例 11 :改写例 9 的 Sub 过程 ListT ,使之可以接受任意个数的参数。

程序代码:

Private Sub ListT(ParamArray strx())

For Each x In strx

t = t & Format(x, "|@@@@@@")

Next

List1.AddItem t

End Sub

 

◇传递 3 个参数的命令按钮 Command1 的单击事件代码:

Private Sub Command1_Click()

Dim a As String, b As String, c As String

a = Left(InputBox("", " 第一个参数 "), 6)

b = Left(InputBox("", " 第二个参数 "), 6)

c = Left(InputBox("", " 第三个参数 "), 6)

Call ListT(a, b, c)

End Sub

◇传递 2 个参数的命令按钮 Command2 的单击事件代码:

Private Sub Command2_Click()

Dim a As String, b As String

a = Left(InputBox("", " 第一个参数 "), 6)

b = Left(InputBox("", " 第二个参数 "), 6)

Call ListT(a, b)

End Sub

 

执行结果:

                    

7.3.4 传递数组

可以将数组或数组元素作为参数进行传递。

说明:

◇数组传递是按地址传递。

◇传递数组时,数组名及后面的圆括号要写全。

◇传递数组元素时,直接写上该数组元素。

例 12 :随机产生 10 个整数,存在数组 a 中,并将数组 a 作为参数,传递到排序过程对其排序。

程序代码:

Private Sub Command2_Click()

p = "": Call pai_xu(a())

For i = 1 To 10

p = p & Str(a(i)) & ","

Next

Label2.Caption = LTrim(Left(p, Len(p) - 1))

End Sub

 

Sub pai_xu(p() As Integer)

For i = 1 To 9

For j = i + 1 To 10

If p(i) > p(j) Then

t = p(i): p(i) = p(j): p(j) = t

End If

Next

Next

End Sub

 

执行结果:

                       

 

 
双击滚屏  关闭窗口
 
版权所有数学与信息科学学院