子过程和子函数题型分析1Word文档下载推荐.docx
- 文档编号:19232312
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:47
- 大小:52.09KB
子过程和子函数题型分析1Word文档下载推荐.docx
《子过程和子函数题型分析1Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《子过程和子函数题型分析1Word文档下载推荐.docx(47页珍藏版)》请在冰豆网上搜索。
分析:
①是定长字符串做过程的形参,所以正确答案为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()
2、(2003年春)第一次显示某窗体时,将引发一系列事件,正确的事件系列是。
A.Load→Initialize→ActivateB.Initialize→Load→Activate
C.Load→Activate→InitializeD.Initialize→Activate→Load
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语句调用
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)
J=J+1
ReDimdata(J)'
改为ReDimPreservedata(J)
data(J)=Char
Char="
"
NextI
CallConver(data,Char)
PrintChar
PrivateSubConver(A()AsString,ChAsInteger)'
改为A()AsString,ChAsString
DimIAsInteger,JAsInteger,NAsInteger,DecAsInteger
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
本题有三个地方发生错误,其中第二个错误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
PrivateSubForm_Click()
DimxAsInteger,yAsInteger
x=10:
y=15
CallValue(x,y)
x="
x,"
y="
y
x
y
m
n
打印
10
15
20
m=20n=10
x=10y=15
将形参表中的ByVal关键字删除后执行程序
x/m
y/n
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("
形参数组只能按地址传递,对应实参必须是与形参数组数据类型一致的数组。
与变长字符串数组形参结合的实参必须是变长字符串数组;
与定长字符串数组形参结合的实参必须是定长字符串数组(长度可以不同)。
(1998年)以下有关把数组作为形参的说明中错误的是。
A.形参数组只能按地址传递
B.调用过程时,只需把要传递的数组名填入实参表
C.使用动态树组时,可用ReDim语句改变形参数组的维界
D.在过程中也可用Dim语句对形参数组进行说明
练习
4、(1999年秋)在语句PublicSubSort(IAsInteger)中,I是一个按传递的参数。
A.地址B.值C.变量D.常量
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.①②③④
PrivateFunctionFun
①Fun(I,J)
JAsInteger
②CallFun(I,3.65)
3.56
③Fun(3.14,234)
④Fun("
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
①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年秋)执行下面的程序,第一行输出结果是,第二行输出结果是。
PrivateSubForm_click()
DimMAsInteger,NAsInteger
M=1:
N=2
PrintM+N+fun1(M,N)
M=2:
N=1
Printfun1(M,N)+fun1(M,N)
PrivateFunctionfun1(XAsInteger,YAsInteger)
X=X+Y
Y=X+3
fun1=X+Y
18
30
9、(2002年秋)执行下面程序,单击窗体,在立即窗口上显示的第二行是,第三行是。
DimAAsInteger
DimBAsInteger
DimDAsInteger
A=1:
B=2
D=fun(A,fun(A,B))
Debug.PrintA;
B;
D
PrivateFunctionfun(KAsInteger,NAsInteger)AsInteger
Debug.PrintK;
N;
K=N+A+K
N=K+A+N
fun=K+N
Debug.Printfun
41480
221080
10、(2001年秋)名为sort的Sub子过程的形式参数为一数组,以下的定义语句中正确的是。
A.PrivateSubsort(A()AsInteger)B.PrivateSubsort(A(10)AsInteger)
C.PrivateSubsort(ByValA()AsInteger)D.PrivateSubsort(A(,)AsInteger)
11、(2002年春)程序中的不同过程之间,不能通过进行数据传递。
全局变量②窗体或模块级变量
③形参与实参结合④静态变量
A.①②④B.①②③C.②④D.④
12、(2000年春)执行下面程序,第一行输出结果是,第二行输出结果是(UBound函数返回指定数组维的维上界)。
DimiAsInteger,jAsInteger
DimmAsInteger,nAsInteger
Dima()AsInteger
Callarry(a)
n=UBound(a,1):
m=UBound(a,2)
Fori=1Tom
Forj=1Ton
Printa(i,j);
Nextj
Nexti
PrivateSubarry(b()AsInteger)
DimiAsInteger,jAsInteger,kAsInteger
ReDimb(3,3)
Fori=1To3
Forj=1To3
b(i,j)=i*10+j
Nextj
111213
212223
13、(2001年春)改错题:
下面程序功能是找出一个正整数的所有质因子。
例如,48的质因子是2,2,2,2,3。
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);
ReDimFac
(1)
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
N=N+1'
k=k+1
(同考点题:
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位
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 过程 子函数 题型 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)