Access 第八章 模块与VBA编程基础(5)
(2013-03-24 16:10:37)8.4.4 标号和GoTo语句
8.5 过程调用和参数传递
2-32. 在VBA中,下列关于过程的描述中正确的是( )。
A)
B)
C)
D)
参考答案:B
【解析】在VBA中过程不可以嵌套定义,即不可以在一个过程中定义另一个过程,但是过程可以嵌套调用。
5-30. 在定义过程时,系统将形式参数类型默认为( )。
A)
B)
C)
D)
参考答案:B
【解析】在VBA中定义过程时,如果省略参数类型说明,那么该参数将默认为按地址传递的参数,这就意味着,过程调用时会把实际参数的地址传递给过程,如果在过程内部对该参数的值进行了改变,那么就会影响实际参数的值。
1-32. 如果在被调用的过程中改变了形参变量的值,但又不影响实参变量本身,这种参数传递方式称为( )。
A)
B)
C)
D)
参考答案:A
【解析】参数传递有两种方式:按值传递ByVal和按址传递ByRef。按值传递是单向传递,改变了形参变量的值而不会影响实参本身;而按址传递是双向传递,任何引起形参的变化都会影响实参的值。
8-32. 在过程定义中有语句:
Private
其中"ByVal"的含义是( )。
A)
B)
C)
D)
参考答案:A
【解析】过程定义语句中形参变量说明中使用ByVal指定参数传递方式为按值传递,如果使用ByRef则指定参数传递方式为按地址传递,如果不指定参数传递方式,则默认为按地址传递。
2-37. 在窗体上有一个命令按钮Commandl,编写事件代码如下:
Private Sub Command1_Click()
Dim x As Integer, y As Integer
x = 12: y = 32
Call Proc(x, y)
Debug.Print x; y
End Sub
Public Sub Proc(n As Integer, ByVal m As Integer)
n = n Mod 10
m = m Mod 10
End Sub
打开窗体运行后,单击命令按钮,立即窗口上输出的结果是( )。
A)
B)
C)
D)
参考答案:A
【解析】参数有两种传递方式:传址传递ByRef和传值传递ByVal。如果没有说明传递类型,则默认为传址传递。在函数Proc(n As Integer,ByVal m As Integer)参数中,形参n默认为传址传递,形参的变化将会返回到实参,即形参n mod 10(12 mod 10)得到的结果2将返回给实参x,即x=2;而y为传值类型,不因形参的变化而变化,所以输出的x和y应为2和32。
3-39. 窗体中有命令按钮Command1,事件过程如下:
Public Function f(x As Integer) As Integer
Dim y As Integer
x = 20
y = 2
f = x * y
End Function
Private Sub Command1_Click()
Dim y As Integer
Static x As Integer
x = 10
y = 5
y = f(x)
Debug.Print x; y
End Sub
运行程序,单击命令按钮,则立即窗口中显示的内容是( )。
A)
B)
C)
D)
参考答案:D
【解析】本题考查的是变量的作用域,程序中命令按钮中的x是用static定义的局部静态变量,只在模块的内部使用,过程执行时才可见。当调用f函数时,所求的f函数的值是f函数中x和y的值乘积,即f函数的值是2*20=40,调用f函数后,原命令按钮中x的值被f函数的值覆盖,即x=20,。最后输出x=20,y=40,故答案为D)。
4-37. 若有如下Sub过程:
Sub
t = x
x = t / y
y = t Mod y
End
在窗体中添加一个命令按钮Command33,对应的事件过程如下:
Private
Dim
Dim
a = 5
sfun a, b
MsgBox
End
打开窗体运行后,单击命令按钮,消息框中有两行输出,内容分别为( )。
A)
B)
C)
D)
参考答案:B
【解析】此题中设定了一个sfun()函数,进行除法运算和求模运算。命令按钮的单击事件中,定义两变量a=5,b=4,调用sfun函数传递a,b的值给x,y进行运算,t=x=5,y=4;x=t/y=5/4=1.25(除法运算);y=t Mod y=5 mod 4=1(求模运算)。Sfun函数参数没有指明参数传递方式,则默认以传址方式传递,因此a的值为1.25,b的值为1。
4-39. 在窗体中有一个命令按钮Command1,编写事件代码如下:
Private Sub Command1_Click()
Dim s As Integer
s = P(1) P(2) P(3) P(4)
debug.Print s
End Sub
Public Function P(N As Integer)
Dim Sum As Integer
Sum = 0
For i = 1 To N
Sum = Sum i
Next i
P = Sum
End Function
打开窗体运行后,单击命令按钮,输出结果是( )。
A)
B)
C)
D)
参考答案:B
【解析】题目中在命令按钮的单击事件中调用了过程P。而过程P的功能是根据参数N,计算从1到N的累加,然后返回这个值。N=1时,P(1)返回1,N=2时,P(2)返回3,N=3时,P(3)返回6,N=4时,P(4)返回10,所以s=1 3 6 10=20
4-36. 窗体中有命令按钮Command1和文本框Text1,事件过程如下:
Function result(ByVal x As Integer)As Boolean
If x Mod 2 = 0 Then
result = True
Else
result = False
End If
End Function
Private Sub Command1_Click()
x = Val(InputBox("请输入一个整数"))
If
【
Text1 = Str(x)& "是偶数."
Else
Text1 = Str(x)& "是奇数."
End If
End Sub
运行程序,单击命令按钮,输入19,在Text1中会显示"19是奇数"。那么在程序的括号内应填写( )。
A)
B)
C)
D)
参考答案:B
【解析】本题程序是判断奇偶性的程序,函数Result用来判断x是否是偶数,如果x是偶数,那么Result的返回值为真,否则返回值为假,单击命令按钮时执行的过程是输入整数x,然后调用Result函数,如果值为真,文本框会显示输入的值是偶数,否则显示输入的值为奇数。调用Result函数且Result函数值为真时的表达式为:Result(x)。
5-37. 假定有以下两个过程:
Sub s1(ByVal x As Integer,ByVal y As Integer)
Dim t As Integer
t=x
x=y
y=t
End Sub
Sub S2(x As Integer,y As Integer)
Dim t As Integer
t=x:x=y:y=t
End Sub
下列说法正确的是( )。
A)
B)
C)
D)
参考答案:B
【解析】VBA中定义过程时如果省略传值方式则默认为按地址传递,过程S2中省略了参数传递方式说明,因此,参数将按传址调用,而过程S1由于声明为按值传递(ByVal)所以会按传值调用参数。而在过程调用时,如果按传值调用,实参只是把值传给了形参,在过程内部对形参值进行改变不会影响实参变量,按址调用却不同,这种方式是把实参的地址传给了形参,在过程中对形参值进行改变也会影响实参的值。因此,过程S2能够交换两个变量的值,而S1不能实现。
1-37. 在窗体中添加一个名称为Command1的命令按钮,然后编写如下事件代码:
Private Sub Command1_Click()
MsgBox f(24,18)
End
Public Function f(m As Integer,n As Integer)As Integer
Do While m<>n
Do While
m = m-n
Loop
Do While
n = n-m
Loop
Loop
f = m
End Function
窗体打开运行后,单击命令按钮,则消息框的输出结果是( )。
A)
B)
C)
D)
参考答案:C
【解析】题目中命令按钮的单击事件是使用MsgBox显示过程f的值。在过程f中有两层Do循环,传入参数m=24,n=18,由于m>n所以执行m=m-n=24-18=6,内层第1个Do循环结束后m=6,n=18;此时m小于n,所以再执行n=n-m=18-6=12,此时m=6,n=12;再执行n=n-m后m=n=6;m<>n条件满足,退出循环,然后执行f=m的赋值语句,即为f=m=6。