vb子过程和子函数题型分析.docx
《vb子过程和子函数题型分析.docx》由会员分享,可在线阅读,更多相关《vb子过程和子函数题型分析.docx(20页珍藏版)》请在冰豆网上搜索。
vb子过程和子函数题型分析
※子过程和子函数题型分析
(30)以下有关把数组作为形参的说明中错误的是 30 。
(A)形参数组只能按地址传递
(B)调用过程时,只需把要传递的数组名填入实参表
(C)使用动态数组时,可用ReDim语句改变形参数组的维界
(D)在过程中也可用Dim语句对形参数组进行说明
答案:
D
分析:
(5)当Sub过程Value形参表中存在ByVal关键字时,执行本程序,单击窗体,在窗体上显示的第一行内容是 [1] ,第二行内容是
(2) ;若将形参表中的ByVal关键字删除,再执行本程序,单击窗体后在窗体上显示的第一行内容是 [3] ,第二行内容是 (4) 。
PrivateSubValue(ByValmAsInteger,ByValnAsInteger)
m=m*2
n=n-5
Print"m=";m,"n=";n
EndSub
PrivateSubForm_Click()
DimxAsInteger,yAsInteger
x=10:
y=15
CallValue(x,y)
Print"x=";x,"y=";y
EndSub
x
y
m
n
打印
10
15
10
15
20
10
m=20n=10
x=10y=15
将形参表中的ByVal关键字删除后执行程序
x/m
y/n
打印
10
15
m=20n=10
20
10
x=20y=10
答案:
(1)m=20n=10
(2)x=10y=15
(3)m=20n=10
(4)x=20y=10
分析:
(25)在语句PublicSubSort(iAsInteger)中i是一个按 25 传递的参数。
(A)地址 (B)值 (C)变量 (D)常量
答案:
A
分析:
(3)运行下面的程序,单击窗体后在窗体上显示的第一行结果是
(1) ,第二行结果是
(2) 。
PrivateFunctiondigit(nAsInteger,kAsInteger)AsInteger
digit=0
DoWhilek>0
digit=nMod10
n=n\10
k=k-1
Loop
EndFunction
PrivateSubForm_Click()
Printdigit(1234,2)
Printdigit(1234,3)
EndSub
n
k
digit
打印
1234
2
0
123
1
4
12
0
3
3
1234
3
0
123
2
4
12
1
3
1
0
2
2
答案:
(1)3
(2)2
(6)运行下面的程序,单击窗体后在窗体上显示的第二行结果是 [1] ,第四行结果是 [2] 。
DimyAsInteger
PrivateSubForm_Click()
DimxAsInteger
x=1:
y=1
Print"x1=";x,"y1=";y
Test
Print"x4=";x,"y4=";y
EndSub
PrivateSubTest()
DimxAsInteger
Print"x2=";x,"y2=";y
x=2:
y=3
Print"x3=";x,"y3=";y
EndSub
x(主)
x(子)
y
打印
1
1
x1=0 y1=1
0
x2=0 y2=1
2
3
x3=2 y3=3
x4=1 y4=3
答案:
(12)x2=0 y2=1
(13)x4=l y4=3
分析:
变量y是窗体变量,x是过程变量。
2.运行下面的程序,当单击窗体时,窗体上第一行内容是 【4】 ,第三行内容是 【5】 ,第四行内容是 【6】 。
OptionExplicit
DimxAsInteger,yAsInteger
PrivateSubForm_Click()
DimaAsInteger,bAsInteger
a=5:
b=3
Callsub1(a,b)
Printa,b
Printx,y
EndSub
PrivateSubsub1(ByValmAsInteger,nAsInteger)
DimxAsInteger,yAsInteger
x=m+n:
y=m-n
m=fun1(x,y)
n=fun1(x,y)
EndSub
PrivateFunctionfun1(aAsInteger,bAsInteger)AsInteger
x=a+b:
y=a–b
Printx,y
fun1=x+y
EndFunction
x
y
a
b\n\fun1
m\fun1
x
y
a
b
打印
0
0
5
3
3
5
8
2
8
2
10
6
16
106
8
2
10
6
16
106
516
106
答案:
【4】10 6
答案:
【5】5 16
答案:
【6】10 6
24.若在应用程序中用“PrivateSubSub1(XAsInteger,YAsSingle)”定义了子程序Sub1,调用程序中的变量I,J均为Integer型,则正确调用子程序Sub1的Call语句是___24___。
①CallSub1(I,J)②CallSub1(3.1415,I)
③CallSub1(3.14,234)④CallSub1("245","231.5")
(A)①③(B)③④(C)①②③(D)无
答案:
B
分析:
用I,J对应y会产生类型不匹配的错误。
PrivateSubSub1
XAsInteger
YAsSingle
①CallSub1(I,J)
I
JInteger
②CallSub1(3.1415,I)
IInteger
③CallSub1(3.14,234)
④CallSub1("245","231.5")
32.在应用程序中用"PrivateFunctionFun(XAsInteger,YAsSingle)"定义了函数Fun.调用函数Fun的过程中的变量I,J均定义为Integer型,能正确引用函数Fun的是___32___。
①Fun(I,J)②CallFun(I,3.65)
③Fun(3.14,234)④Fun("245","231.5")
(A)①③(B)②③④(C)①②③(D)①②③④
答案:
B
分析:
PrivateFunctionFun
XAsInteger
YAsSingle
①Fun(I,J)
I
J
②CallFun(I,3.65)
③Fun(3.14,234)
Fun("245","231.5")
26.在窗体Form1中用"PublicSubFun(xAsInteger,yAsSingle)”定义过程Fun,在窗体Form2中定义了变量i为Integer,j为Single,若要在Form2的某事件过程中调用Form1中的Fun过程,下列语句中能够被正确使用语句有 26 个
①CallFun(i,j)②CallForm1.Fun(i,j)
③Form1.Fun(i),j④Form1.Funi+1,(j)
(A)1(B)2(C)3(D)4
答案:
C
分析:
①CallFun(i,j)只能调用Form2中的Fun过程。
27.以下有关过程中形式参数的描述中,错误的是27。
A)函数过程可以没有形式参数
B)事件过程一定没有形式参数
C)形参数组只能按地址与实参数组结合
D)窗体与控件也可以作为过程的参数
答案:
B
25.以下子过程或函数定义正确的是25。
A)Subf1(nAsString*1)
B)Subf1(nAsInteger)AsInteger
C)Functionf1(f1AsInteger)AsInteger
D)Functionf1(ByValnAsInteger)
答案:
D
解析:
如果形参变量的类型被说明为“String”,它只能是不定长的。
25.下列有关过程的说法中,错误的是25。
A)在Sub或Function过程内部不能再定义其它Sub或Function过程
B)对于使用ByRef说明的形参,在过程调用时形参和实参只能按传址方式结合
C)递归过程既可以是递归Function过程,也可以是递归Sub过程
D)可以像调用Sub过程一样使用Call语句调用Function过程
答案:
B
解析:
默认方式也是按传址方式结合的。
29.若在模块中用PrivateFunctionFun(AAsSingle,BAsInteger)AsInteger定义了函数Fun。
调用函数Fun的过程中定义I、J和K三个Integer型变量,则下列语句中不能正确调用函数Fun的语句是(29)。
A)Fun3.14,JB)CallFun(I,365)
C)Fun(I),(J)D)K=Fun("24","35")
答案:
B
27.以下有关过程中形式参数的描述中,错误的是27。
A)函数过程可以没有形式参数
B)事件过程一定没有形式参数
C)形参数组只能按地址与实参数组结合
D)窗体与控件也可以作为过程的参数
答案:
B
3.执行下面的程序,第一行输出结果是___(48)___,第三行输出结果是___(1286)___。
PrivateSubForm_Click()
DimAAsInteger,IAsInteger
A=2
ForI=1To9
CallSub1(I,A)
PrintI,A
NextI
EndSub
PrivateSubSub1(XAsInteger,YAsInteger)
StaticNAsInteger
DimIAsInteger
ForI=3To1Step-1
N=N+X
X=X+1
NextI
Y=Y+N
EndSub
分析:
循环变量I在子过程被改变了,本循环9次实际只循环了3次,打印出3行结果。
I=1+3+1+3+1+3+1=13,A/Y=2,8,32,86。
3.执行下面的程序,第一行输出结果是___(625)___,第三行输出结果是___(-237)___。
PrivateSubForm_Click()
DimNAsInteger,IAsInteger
N=2
ForI=9To1Step-1
CallSub2(I,N)
PrintI,N
NextI
EndSub
PrivateSubSub2(XAsInteger,YAsInteger)
StaticNAsInteger
DimIAsInteger
ForI=3To1Step-1
N=N+X
X=X-1
Y=N+I
NextI
EndSub
分析:
同上。
5.执行下面的程序,第一行输出结果是___(23)___,第二行输出结果是___(47)___。
OptionExplicit
PrivateSubForm_Click()
DimAAsInteger
A=2
CallSub1(A)
EndSub
PrivateSubSub1(XAsInteger)
X=X*2+1
IfX<10Then
CallSub1(X)
EndIf
X=X*2+1
PrintX
EndSub
A/X
打印
2
5
11
23
23
47
47
分析:
由于X是按地址传送,递归后的值不再保留原值。
5.执行下面程序,单击命令按钮Command1后,显示在窗体上第一行的内容是 ,第二行的内容是 ,第三行的内容是 。
OptionExplicit
PrivateSubCommand1_Click()
DimNAsInteger,MAsInteger
N=2
DoWhileM<3
N=N+2
IfFun(N)Then
PrintN
M=M+1
EndIf
Loop
EndSub
PrivateFunctionFun(ByValNAsInteger)AsBoolean
IfN/2=Int(N/2)Then
Fun=Fun(N/2)
Else
IfN=1ThenFun=True
EndIf
EndFunction
解析:
本题考察的递归函数问题。
表达式“N/2=Int(N/2)”等式成立表示N能被2整除,当N能被2整除就继续递归调用,否则就终止递归调用;当N为1时,Fun返回True。
最终4、8、16这3个自然数能满足上述条件。
答案:
4816
25.用语句PrivateSubConvert(YAsInteger)定义的Sub过程时,以下不是按值传递的语句是___25___。
(A)CallConvert((X))(B)CallConvert(X*1)
(C)Convert(X)(D)ConvertX
答案:
D
分析:
在VB中,将Convert(X)视为Convert(X)。
2.执行下面的程序,单击命令按钮Command1后,文本框Text1中的内容是___c:
\ProgramFiles\DevStudio\VB___,文本框Text2中的内容是___VB5.exe___(函数InStr(Start,String1,String2)中Start参数表示每次搜索的起点)。
OptionExplicit
PrivateSubCommand1_Click()
DimPathAsString,SerachAsString
DimFpAsString,FnAsString
Path="c:
\ProgramFiles\DevStudio\VB\VB5.exe"
CallSearch_Path(Path,Fp,Fn)
text1.Text=Fp
text2.Text=Fn
EndSub
PrivateSubSearch_Path(PAsString,FpAsString,FnAsString)
DimNsAsLong,CtAsLong
Ns=0
Do
Ct=Ns
Ns=InStr(Ct+1,P,"\")
LoopUntilNs=0
Fp=Left(P,Ct-1)
Fn=Right(P,Len(P)-Ct)
EndSub
3.执行下面的程序,当单击窗体时,窗体上显示内容的第一行是132___,第二行是1__12___2_。
PrivateSubP1(xAsInteger,ByValyAsInteger)
StaticzAsInteger
x=x+z:
y=x-z:
z=10-y
EndSub
PrivateSubForm_Click()
DimaAsInteger,bAsInteger,zAsInteger
a=1:
b=3:
z=2
CallP1(a,b)
Printa,b,z
CallP1(b,a)
Printa,b,z
EndSub
a/x
b/x
z
y
z
打印
1
3
2
2
0
132
1
12
1
9
1122
3
7
分析:
略。
29.下列定义Sub过程的语句中,正确的语句是 29 。
①PrivateSubTest(StAsString*8)
②PrivateSubTest(Sarray()AsString*8)
③PrivateSubTest(Sarray()AsString)
④PrivateSubTest(StAsString)
(A)①②(B)①④(C)②③④(D)①②③④
答案:
C
分析:
参数列表。
参数列表中的参数称为形式参数,它可以是变量名或数组名。
若有多个参数时,各参数之间用逗号分隔。
VB的过程可以没有参数,但一对圆括号不可以省略。
不含参数的过程称为无参过程。
形式参数格式为:
[ByVal]变量名[()][As数据类型]
变量名[()]:
变量名为合法的VB变量名或数组名。
若变量名后无括号,则表示该形参是变量,否则是数组。
ByVal:
表明其后的形参是按值传递参数或称为“传值”(PassedbyValue)参数,若缺省或用“ByRef”替代,则表明参数是按地址传递(传址)参数或称为“引用”(PassedbyReference)参数。
As数据类型:
该选项用来说明变量类型,若缺省,则该形参是“变体变量”(Variant)。
如果形参变量的类型被说明为“String”,它只能是不定长的。
而在调用该过程时,对应的实在参数可以是定长的字符串变量或字符串数组元素。
如果形参是字符串数组,则没有这个限制。
28.下面关于过程参数的说法,错误的是___。
(A)过程的形参不可以是定长字符串类型的变量
(B)形参是定长字符串的数组,则对应的实参必须是定长字符串型数组,且长度相同
(C)若形参是按地址传递的参数,形参和实参也能以按值传递方式进行形实结合
(D)按值传递参数,形参和实参的类型可以不同,只要相容即可
答案:
B
分析:
同上。
**
5.执行下面程序,单击命令按钮Command1后,窗体上显示的第一行内容是 ,第二行内容是 ,最后一行内容是 。
PrivateSubCommand1_Click()
DimAAsInteger,KAsInteger
A=2
K=Fun((A),A)+Fun(A,A)
Print"K=";K
EndSub
PrivateFunctionFun(XAsInteger,YAsInteger)AsInteger
StaticKAsInteger
K=K+X+Y
X=X+Y
Y=Y+K
Fun=X+Y
PrintFun;X;Y
EndFunction
Fun((A),A)
A\Y
X
K
打印
2
2
0
6
4
4
1046
Fun(A,A)
A\X\Y
K
打印
2
6
16
12
28
562828
10+56
K=66
答案:
1046 562828 k=66
5.执行下面的程序,如果不选中复选框Check1,单击命令按钮Command1,则在文本框Text1中显示的变量a的值为 (9) 、b的值为 (10) 、r的值为 (11) ;如果选中复选框Check1,单击命令按钮Command1,则文本框Text1中显示为 (12) (图1为本程序设计界面)。
PrivateSubCommand1_Click()
DimaAsInteger,bAsInteger,rAsInteger
a=27:
b=12
IfCheck1.Value=0Then
r=gcd(a,b)
Text1="GCD("&CStr(a)&","&CStr(b)&")="&CStr(r)
ElseIfCheck1.Value=1Then
r=gcd((a),(b))
Text1="GCD("&CStr(a)&","&CStr(b)&")="&CStr(r)
EndIf
EndSub
PrivateFunctiongcd(xAsInteger,yAsInteger)AsInteger
DimrAsInteger
r=xMody
DoWhiler<>0
x=y:
y=r
r=xMody
Loop
gcd=y
EndFunction
图1
答案:
(9)12
(10)3
(11)3
(12)GCD(27,12)=3
分析:
这是在实现子过程被调用时参数虚实结合的问题。
gcd(a,b)中变量a和变量b按址传送,gcd((a),(b))中表达式(a)和表达式(b)按值传送。
子函数gcd的功能是求x和y的最大公约数。
5.执行下面程序,单击命令按钮Command1,则在窗体上第一行显示是 (10) ,第二行显示是 (11) ,第三行显示是 (12) 。
PrivateSubCommand1_Click()
Output_Count4
Output_Count8
Output_Count4
EndSub
PrivateSubOutput_Count(UpperLimitAsInteger)
StaticLowerLimitAsInteger
DoWhileLowerL