子过程和子函数题型分析1.docx
《子过程和子函数题型分析1.docx》由会员分享,可在线阅读,更多相关《子过程和子函数题型分析1.docx(47页珍藏版)》请在冰豆网上搜索。
子过程和子函数题型分析1
第八章过程
学习要求
1、 掌握过程的定义和调用方法
2、 掌握函数的定义和调用方法
3、 掌握进行参数传递的方法
4、 熟悉不同变量的作用域
5、 掌握递归过程的使用方法
6、 掌握常用的排序算法:
选择排序法、直接排序法、冒泡排序法、改进的冒泡排序法(设置开关变量)、直接插入排序法。
7、 通过学习求最大公约数和判断素数的方法,掌握求符合条件的数的算法。
§8.1Sub过程
考点:
窗体事件过程名由“Form”、下划线和事件名结合而成;如果使用多文档界面(MDI)窗体,则由“MDIForm”、下划线和事件名构成窗体事件过程名。
示例:
(1999年秋)窗体Form1的名称属性是frm,它的Load事件过程名是。
A.Form_LoadB.Form1_LoadC.frm_LoadD.Me_Load
答案:
A
考点:
定长字符串变量不能作为形参变量;不定长字符串作为形参变量,其对应的实在参数可以是定长的字符串变量或字符串型数组元素。
但是定长字符串数组和不定长字符串数组都能作为形参变量。
示例:
(2002年秋)下列定义Sub过程的语句中,正确的语句是。
① PrivateSubTest(StAsString*8)
②PrivateSubTest(Sarray()AsString*5)
③PrivateSubTest(Sarray()AsString)
④PrivateSubTest(StAsString)
A.①②B.①④C.②③④D.①②③④
分析:
①是定长字符串做过程的形参,所以正确答案为C。
答案:
C
分析:
参数列表。
参数列表中的参数称为形式参数,它可以是变量名或数组名。
若有多个参数时,各参数之间用逗号分隔。
VB的过程可以没有参数,但一对圆括号不可以省略。
不含参数的过程称为无参过程。
形式参数格式为:
[ByVal]变量名[()][As数据类型]
变量名[()]:
变量名为合法的VB变量名或数组名。
若变量名后无括号,则表示该形参是变量,否则是数组。
ByVal:
表明其后的形参是按值传递参数或称为“传值”(PassedbyValue)参数,若缺省或用“ByRef”替代,则表明参数是按地址传递(传址)参数或称为“引用”(PassedbyReference)参数。
As数据类型:
该选项用来说明变量类型,若缺省,则该形参是“变体变量”(Variant)。
如果形参变量的类型被说明为“String”,它只能是不定长的。
而在调用该过程时,对应的实在参数可以是定长的字符串变量或字符串数组元素。
如果形参是字符串数组,则没有这个限制。
28.下面关于过程参数的说法,错误的是___。
(A)过程的形参不可以是定长字符串类型的变量
(B)形参是定长字符串的数组,则对应的实参必须是定长字符串型数组,且长度相同
(C)若形参是按地址传递的参数,形参和实参也能以按值传递方式进行形实结合
(D)按值传递参数,形参和实参的类型可以不同,只要相容即可
答案:
B
分析:
A是正确的,根据过程语法规定,形参不可以是定长字符串类型变量,但是可以是定长字符串数组;
B是错误的,虽然数组是按照地址传递,要是实参和形参数据类型一致,但是若均为定长字符串数组,长度可以不相同,即可以发生截断;
C是正确的,当给出的实参是值时,不论形参是否有byRef,均按照值传递;
D是正确的,当按照值传递时,实参和形参类型可以不同,但是必须要能够由实参类型自动转换为形参类型;当按照地址传递时,实参和形参类型必须一致。
练习
1、(2001年春)应用程序窗体的名称属性为Frm1,窗体上有一个命令按钮,其名称属性为cmd1,窗体和命令按钮的Click事件过程名分别为。
A.Form_Click()Command1_Click()
B.Frm1_Click()Command1_Click()
C.Form_Click()Cmd1_Click()
D.Frm1_Click()Cmd1_Click()
答案:
C
2、(2003年春)第一次显示某窗体时,将引发一系列事件,正确的事件系列是。
A.Load→Initialize→ActivateB.Initialize→Load→Activate
C.Load→Activate→InitializeD.Initialize→Activate→Load
答案:
B
3、(2003年春)定义了两个过程PrivateSub1(St()AsString)和PrivateSub2(Ch()AsString*6),在调用过程中用DimS(3)AsString*6,A(3)AsString定义了两个字符串数组。
下面调用语句中正确的有。
①CallSub1(S)②CallSub1(A)③CallSub2(A)④CallSub2(S)
A.①②B.①③C.②③D.②④
答案:
D
§8.2Function过程定义
考点:
Function过程之所以能由函数名有返回值是因为在函数体内有“函数名=表达式”语句给函数名赋值。
示例:
(2000年秋)改错题:
求下列数列的和,计算到第n项的值小于等于10-4为止。
Y=表达式?
式中:
f1=1,f2=2,fn=(fn-1+fn-2),n≥3。
(本程序运行结果是:
Y=2.359646)
OptionExplicit
PrivateSubForm_CLICK()
DimA()AsSingle,IAsInteger
DimYAsSingle
I=1
Do
ReDimA(I)‘改为ReDimPreserveA(I)
A(I)=1/Fib(I)
IfA(I)<=e-4ThenExitDo‘改为IfA(I)<=1e-4ThenExitDo
Y=Y+A(I)
I=I+1
Loop
Print"Y=";Y
ForI=1ToUBound(A)
PrintA(I)
NextI
EndSub
PrivateFunctionFib(IAsInteger)AsInteger
IfI=1Then
Fib=1
ElseIfI=2Then
Fib=2
Else
Fib(I)=Fib(I-1)+Fib(I-2)‘改为Fib=Fib(I-1)+Fib(I-2)
EndIf
EndFunction
分析:
本题第三个错误。
通过一个赋值语句给函数名赋值,正确的形式是“函数名=表达式”;此语句中,Fib是函数名,“Fib(I-1)+Fib(I-2)”两个递归调用相加构成表达式。
而Fib(I)是对函数的递归调用(递归调用将在后面学习)。
§8.3过程调用
考点:
Sub过程用Call语句调用(无参数时括号可省略)或作为一个语句使用,当做语句使用时实参表不需要加括号;Function过程的调用和VB内部函数的方法一样,此时有返回值,若像调用Sub过程那样调用Function过程,其返回值被放弃。
示例:
(1998年)在调用过程时,下述说明中正确的是。
A.只能使用Call语句调用Sub过程
B.调用Sub过程时,实在参数必须用括号括起来
C.在表达式中调用Function过程时,可以不用括号把实在参数括起来
D.Function过程也可以使用Call语句调用
答案:
D
§8.4参数的传递
考点:
“形实结合”遵循三条规则(不考虑过程有可选参数):
1)实参和形参个数相同;
2)对应实参和形参的数据类型相同;
3)对应形参和实参按“位置”结合(而不是按名称结合)。
另外,形参是“变量”,对应的实参可以是“数组元素”,但不能是“数组”。
(此考点也经常出现在改错题中)
示例:
(2001年秋)改错题:
密码组成是由若干个用数字8分隔的8进制数组成的字符串,每个8进制数所对应的10进制数是一个字符的ASCII码。
本程序的功能就是进行译码。
正确的结果是“BASIC”。
OptionExplicit
OptionBase1
PrivateSubForm_Click()
DimStAsString,CharAsString
Dimdata()AsString,IAsInteger,JAsInteger
St="10281018123811181038"
ForI=1ToLen(St)
IfMid(St,I,1)<>"8"Then
Char=Char&Mid(St,I,1)
Else
J=J+1
ReDimdata(J)'改为ReDimPreservedata(J)
data(J)=Char
Char=""
EndIf
NextI
CallConver(data,Char)
PrintChar
EndSub
PrivateSubConver(A()AsString,ChAsInteger)'改为A()AsString,ChAsString
DimIAsInteger,JAsInteger,NAsInteger,DecAsInteger
ForI=1ToUBound(A)
Dec=0
N=Len(A(I))
ForJ=1ToN
Dec=Dec+Val(Mid(A(I),J,1))*8^(N-J)
NextJ
Ch=Ch&Str(Dec)'改为Ch=Ch&Chr(Dec)
Next
EndSub
分析:
本题有三个地方发生错误,其中第二个错误PrivateSubConver(A()AsString,ChAsInteger)中定义的参数个数为2,第二个参数Ch是Integer型;而在调用该过程的CallConver(data,Char)语句中按位置对应的第二个参数Char是Stirng型,所以数据类型不匹配。
考点:
按值传递参数时“实参值不随形参值的改变而改变”;按地址传递参数时“实参值将随形参值的改变而改变”。
示例:
(1998年)当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
分析:
Value过程的形参前有ByVal时按数值传递,在调用后,实参x,y值没变;形参前去掉ByVal后按地址传递,实参x,y值发生改变;所以
答案为
(1)m=20n=10
(2)x=10y=15
(3)m=20n=10
(4)x=20y=10。
考点:
如果在过程调用时与之结合的实参是一个常数或者表达式,VB会用“按值传递“的方法来处理。
给按地址传递参数传递的是类型不一致的常数或表达式时,VB会按要求进行数据类型转换,然后再将转换后的值传递给参数。
示例:
(2000年秋)若在应用程序中用“PrivateSubsub1(XAsInteger,YAsSingle)”定义了子程序sub1,调用程序中的变量I,J均为Integer型,则正确调用子程序sub1的Call语句是。
① Callsub1(I,J)②Callsub1(3.1415,I)
③Callsub1(3.14,234)④Callsub1("245","231.5")
A.①③B.③④C.①②③D.无
分析:
①中实参变量J和形参变量Y数据类型不匹配;②中实参变量I和形参变量Y数据类型不匹配。
答案为B。
分析:
用I,J对应y会产生类型不匹配的错误。
PrivateSubSub1
XAsInteger
YAsSingle
①CallSub1(I,J)
IAsInteger
JInteger
②CallSub1(3.1415,I)
3.1415
IInteger
③CallSub1(3.14,234)
3.14
234
④CallSub1("245","231.5")
"245"
"231.5"
考点:
形参数组只能按地址传递,对应实参必须是与形参数组数据类型一致的数组。
与变长字符串数组形参结合的实参必须是变长字符串数组;
与定长字符串数组形参结合的实参必须是定长字符串数组(长度可以不同)。
示例:
(1998年)以下有关把数组作为形参的说明中错误的是。
A.形参数组只能按地址传递
B.调用过程时,只需把要传递的数组名填入实参表
C.使用动态树组时,可用ReDim语句改变形参数组的维界
D.在过程中也可用Dim语句对形参数组进行说明
答案:
D
练习
4、(1999年秋)在语句PublicSubSort(IAsInteger)中,I是一个按传递的参数。
A.地址B.值C.变量D.常量
答案:
A
分析:
形式参数格式为:
[ByVal]变量名[()][As数据类型]
变量名[()]:
变量名为合法的VB变量名或数组名。
若变量名后无括号,则表示该形参是变量,否则是数组。
ByVal:
表明其后的形参是按值传递参数或称为“传值”(PassedbyValue)参数,若缺省或用“ByRef”替代,则表明参数是按地址传递(传址)参数或称为“引用”(PassedbyReference)参数。
5、(2002年春)调用由语句PrivateSubConvert(YAsInteger)定义的Sub过程时,以下不是按值传递的是。
A.CallConvert((X))B.CallConvert(X*1)
C.Convert(X)D.ConvertX
分析:
在VB中,将Convert(X)视为Convert(X)。
答案:
D
6、(2001年春)在应用程序中用“PrivateFunctionFun(XAsInteger,YAsSingle)”定义了函数Fun。
调用函数Fun的过程中的变量I,J均定义为Integer型,能正确引用函数Fun的是。
① 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)
IAsInteger
JAsInteger
②CallFun(I,3.65)
IAsInteger
3.56
③Fun(3.14,234)
3.14
234
④Fun("245","231.5")
"245"
"231.5"
7、(2002年秋)在窗体Form1中用“PublicSubFun(xAsInteger,yAsSingle)”定义过程Fun,在窗体Form2中定义了变量i为Integer,j为Single,若要在Form2的某事件过程中调用Form1中的Fun过程,则下列语句中,正确的语句有个。
①CallFun(i,j)②CallForm1.Fun(i,j)
③Form1.Fun(i),j④Form1.Funi+1,(j)
A.1B.2C.3D.4
答案:
C
分析:
①CallFun(i,j)不能调用Form1中的Fun过程。
Form1
Form2DimiAsInteger,jAsSingle
PublicSubFun(xAsInteger,yAsSingle)
①CallFun(i,j)
②CallForm1.Fun(i,j)
③Form1.Fun(i),j
④Form1.Funi+1,(j)
8、(2001年秋)执行下面的程序,第一行输出结果是,第二行输出结果是。
OptionExplicit
PrivateSubForm_click()
DimMAsInteger,NAsInteger
M=1:
N=2
PrintM+N+fun1(M,N)
M=2:
N=1
Printfun1(M,N)+fun1(M,N)
EndSub
PrivateFunctionfun1(XAsInteger,YAsInteger)
X=X+Y
Y=X+3
fun1=X+Y
EndFunction
答案:
18
30
9、(2002年秋)执行下面程序,单击窗体,在立即窗口上显示的第二行是,第三行是。
OptionExplicit
DimAAsInteger
PrivateSubForm_click()
DimBAsInteger
DimDAsInteger
A=1:
B=2
D=fun(A,fun(A,B))
Debug.PrintA;B;D
EndSub
PrivateFunctionfun(KAsInteger,NAsInteger)AsInteger
Debug.PrintK;N;
K=N+A+K
N=K+A+N
fun=K+N
Debug.Printfun
EndFunction
答案:
41480
221080
10、(2001年秋)名为sort的Sub子过程的形式参数为一数组,以下的定义语句中正确的是。
A.PrivateSubsort(A()AsInteger)B.PrivateSubsort(A(10)AsInteger)
C.PrivateSubsort(ByValA()AsInteger)D.PrivateSubsort(A(,)AsInteger)
答案:
A
11、(2002年春)程序中的不同过程之间,不能通过进行数据传递。
① 全局变量②窗体或模块级变量
③形参与实参结合④静态变量
A.①②④B.①②③C.②④D.④
答案:
D
12、(2000年春)执行下面程序,第一行输出结果是,第二行输出结果是(UBound函数返回指定数组维的维上界)。
PrivateSubForm_click()
DimiAsInteger,jAsInteger
DimmAsInteger,nAsInteger
Dima()AsInteger
Callarry(a)
n=UBound(a,1):
m=UBound(a,2)
Fori=1Tom
Forj=1Ton
Printa(i,j);
Nextj
Print
Nexti
EndSub
PrivateSubarry(b()AsInteger)
DimiAsInteger,jAsInteger,kAsInteger
ReDimb(3,3)
Fori=1To3
Forj=1To3
b(i,j)=i*10+j
Nextj
Nexti
EndSub
答案:
111213
212223
13、(2001年春)改错题:
下面程序功能是找出一个正整数的所有质因子。
例如,48的质因子是2,2,2,2,3。
OptionExplicit
PrivateSubForm_click()
DimFac()AsInteger,N(3)AsInteger
DimIAsInteger,JAsInteger
N
(1)=48:
N
(2)=308:
N(3)=1155
ForI=1To3
CallFactor(Fac,N(I))
PrintN(I);"的质因子是:
";
ForJ=1ToUBound(Fac)
PrintFac(J);
NextJ
Print
ReDimFac
(1)
NextI
EndSub
PrivateSubFactor(F()AsInteger,ByValN()AsInteger)'ByValNAsInteger
DimIAsInteger,JAsInteger,IdxAsInteger
DimKAsInteger
K=2
DoUntilN=1
IfNModK=0Then
Idx=Idx+1
ReDimF(Idx)'ReDimPreserveF(Idx)
F(Idx)=K
N=N/K
Else
N=N+1'k=k+1
EndIf
Loop
EndSub
(同考点题:
2001年春VB02改错题,2001年秋VB05改错题)
14、(2002年春)改错题:
本程序的功能是求出不超过6位数的Armstrong数,所谓Armstrong数是指一个N位的正整数,它的每位数字的N次方之和等于它本身,例如153=1^3+5^3+3^3是一个3位的Armstrong数,54748=5^5+4^7+7^5+4^7+8^5是一个5位