子过程和子函数题型分析1.docx

上传人:b****5 文档编号:6226808 上传时间:2023-01-04 格式:DOCX 页数:47 大小:52.09KB
下载 相关 举报
子过程和子函数题型分析1.docx_第1页
第1页 / 共47页
子过程和子函数题型分析1.docx_第2页
第2页 / 共47页
子过程和子函数题型分析1.docx_第3页
第3页 / 共47页
子过程和子函数题型分析1.docx_第4页
第4页 / 共47页
子过程和子函数题型分析1.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

子过程和子函数题型分析1.docx

《子过程和子函数题型分析1.docx》由会员分享,可在线阅读,更多相关《子过程和子函数题型分析1.docx(47页珍藏版)》请在冰豆网上搜索。

子过程和子函数题型分析1.docx

子过程和子函数题型分析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位

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1