VB第6章 复习资料教学教材.docx
- 文档编号:12546779
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:25
- 大小:25.94KB
VB第6章 复习资料教学教材.docx
《VB第6章 复习资料教学教材.docx》由会员分享,可在线阅读,更多相关《VB第6章 复习资料教学教材.docx(25页珍藏版)》请在冰豆网上搜索。
VB第6章复习资料教学教材
第6章补充资料
习题解答
1.简述子过程和函数过程的共同点和不同之处.
解答:
子过程和函数过程的共同点:
函数过程和子过程都是功能相对独立的一种子程序结构,
它们有各自的过程头、变量声明和过程体。
在程序中使用它们不但可以避免书写重复的程序
语句,缩短代码,而且可以使程序条理清晰,容易阅读。
子过程和函数过程的不同点:
(1)过程声明的关键字不同,子过程用的是Sub,函数过程用的是Function。
(2)子过程名无值就无类型声明,函数过程名有值就有类型声明。
(3)函数过程名兼作结果变量,因此在函数过程体内至少对函数过程名赋值;而子过程名在
过程体内不能赋值。
(4)调用方式不同,子过程是一条独立的语句,可用Call子过程名或省略Call直接以子过程
名调用;函数过程不是一条独立的语句,是一个函数值,必须参与表达式的运算。
(5)一般来说,一个函数过程可以被一个子过程代替,代替时只要改变函数过程定义的形式,
并在子过程的形参表中增加一个地址传递的形参来传递结果。
2.什么是形参,什么是实参?
什么是值引用?
什么是地址引用?
地址引用时,对应的实参
有什么限制?
解答:
形参是在定义过程时的一种形式虚设的参数,只代表了该过程参数的个数、类型、位
置、形参的名字并不重要,也没有任何值,只表示在过程体内进行某种运算或处理。
实参是调用子过程时提供给过程形参的初始值或通过过程体处理后获得的结果。
调用时用实参代替形参,实参与形参在个数、类型、位置一一对应,实参与形参名相同与否
无关。
实参与形参的结合有两种方法,即传地址(ByRef)和传值(ByVal),或称地址引用和值引
用,缺省为地址引用。
值引用时,系统将实参的值传递给对应的形参,实参与形参断开了联系。
如果在过程体中改
变形参的值,不会影响到实参。
地址引用时,实参与形参变量共用同一个存储单元,如果在过程中改变了形参的值,对应的
实参也将发生改变。
地址引用时,实参只能是变量,不能是常量或表达式。
3.指出下面过程语句说明中的错误:
(1)Subf1(n%)AsInteger
(2)Functionf1%(f1%)
(3)Subf1(ByValn%())
(4)Subf1(x(i)asInteger)
解答:
(1)错误为Sub子过程名无返回值,也就没有类型。
(2)函数名与形参名相同。
(3)形参n为数组,不允许声明为ByVal值传递。
(4)形参x(i)不允许为数组元素。
4.已知有如下求两个平方数和的fsum子过程:
PublicSubfsum(sum%,ByValm%,ByValn%)
sum=a*a+b*b
EndSub
在事件过程中若有如下变量声明:
PrivateSubCommand1_Click()
Dima%,b%,c!
a=10:
b=20
则指出如下过程调用语句的错误所在:
(1)fsum3,4,5
(2)fsumc,a,b
(3)fusma+b,a,b
(4)Callfsum(Sqr(c),Sqr(a),Sqr(b))
(5)Callfsumc,a,b
解答:
(1)fsum子过程的第一个形参是地址传递,因此对应的实参3不应该是常量。
(2)fsum子过程的第一个形参是整形而且是地址传递,对应的实参c是单精度,类型不
匹配。
(3)fsum子过程的第一个形参是地址传递,因此对应的实参a+b不应该是表达式。
(4)fsum子过程的第一个形参是地址传递,因此对应的实参Sqr(c)不应该是表达式。
(5)用Call语句调用fsum子过程,必须加圆括号括起实参。
5.利用迭代法求方程x^2-a=0的近似根,要求精度为10^-5,迭代公式为Xi+1=
1/2(Xi+a/Xi)。
编制三个过程:
迭代函数过程、迭代子过程和递归法函数过程。
解答:
假定a为10,三种过程的执行效果如图6.6所示,程序代码如下:
PrivateSubCommand1_Click()
Print"函数过程";f1(10)
Calls1(x!
,10)
Print"子过程";x!
Print"递柜调用";dgf(x,10)
EndSub
PublicFunctionf1!
(a!
)'函数过程
DimX!
X1!
x1=a
Do
x=(x+a/x)/2
IfAbs(x-x1)<0.00001ThenExitDo
x1=x
Loop
EndSub
PublicFunctiondgf!
(x,a!
)'递归调用
x1=(x+a/x)/2
IfAbs(x-x1)<0.00001Then
dgf=x
Else
dgf=dgf(x1,a)
EndIf
EndFunction
6.要使变量在某事件过程中保留值,有哪几种变量声明的方法?
解答:
声明变量为全局(Public)、通用声明段或标准模块声明的模块级变量、局部过程声明的
静态变量(Static)。
7.为了使某变量在所有的窗体中都能使用,应在何处声明该变量?
解答:
在标准模块声明为全局变量。
8.在同一模块、不同过程中声明的相同变量名,两者是否表示同一个变量?
两者间有没有联系?
解答:
表示不同的变量,没有任何关系。
常见错误和难点分析
1.程序设计算法的问题
该章程序编写难度较大,主要是算法的构思有困难,这也是程序设计中最难学习的阶段。
但
是对每一位程序设计的初学者,没有捷径可走,一定要多看、多练、知难而进。
上机前一定要先编
写好程序,仔细分析、检查,才能提高上机调试的效率。
2.确定自定义的过程是子过程还是函数过程
实际上过程是一个具有某种功能的独立程序单位,可供多次调用。
子过程与函数过程的区
别是前者子过程名无值;后者函数过程名有值。
若过程有一个返回值,则习惯使用函数过程;若
过程无返回值,则使用子过程;若过程返回多个值,一般使用子过程,通过实参与形参的结合返回
结果,当然也可通过函数过程名返回一个,其余结果通过实参与形参的结合返回。
3.过程中确定形参的个数和传递方式
对初学者,在定义过程时较难确定形参的个数和传递方式。
过程中参数的作用是实现过程与调用者的数据传递。
一方面,调用者为子过程或函数过程
提供初值,这是通过实参传递给形参实现的;另一方面,子过程或函数过程将结果传递给调用者,
这是通过地址传递方式实现的。
因此,决定形参的个数就是由上述两方面决定的。
对初学者,往往喜欢把过程体中用到的所有变量全作为形参,这样就增加了调拥者的负担和
出错概率;也有的初学者全部省略了形参,因此无法实现数据的传递,既不能从调用者得到初值,
也无法将计算结果传递给调用者。
VB中形参与实参的结合有传值和传地址两种方式。
区别如下:
(1)在定义形式上前者在形参前加ByVal关键字,后者在形参前加ByRef关键字或缺省。
(2)在作用上值传递只能从外界向过程传入初值,但不能将结果传出;而地址传递既可传入
又可传出。
(3)如果实参是数组、自定义类型、对象变量等,形参只能是地址传递。
4.实参与形参类型对应的问题
在地址传递方式时,调用过程实参与形参类型要一致。
例如:
函数过程定义如下:
PublicFunctionf!
(x!
)
f=x+x
EndFunction
主调程序如下:
PrivateSubCommand1_Click()
Dimy%
y=3
Printf(y)
EndSub
上例形参x是单精度型、实参y是整形,程序运行时会显示"ByRef参数类型不符"的编译提
示信息。
在值传递时,若是数值型,则实参按形参的类型将值传递给形参,例如:
函数过程定义如下:
PublicFunctionf!
(x!
)
f=x+x
EndFunction
主调程序如下:
PrivateSubCommand1_Click()
Dimy%
y=3.4
Printf(y)
EndSub
程序运行后显示的结果是6。
5.变量的作用域问题
局部变量,在对该过程调用时,分配该变量的存储空间,当过程调用结束时,回收分配的存储
空间,也就是调用一次,初始化一次,变量值不保留;窗体级变量,当窗体装入时,分配该变量的存
储空间,直到该窗体从内存卸掉,才回收该变量分配的存储空间。
例如,要通过文本框输入若干个值,每输入一个按Enter键,直到输入的值为9999,输入结束,
求输入数的平均值。
PrivateSubText1_KeyPress(KeyAsciiAsInteger)
Dimsum!
n%
IfKeyAscii=13Then
IfVal(Text1)=9999Then
sum=sum/n
Printsum
Else
sum=sum+Val(Text1)
n=n+1
Text1=""
EndIf
EndIf
EndSub
该过程没有语法错,运行程序可输入若干个数,但当输入9999时,程序显示“溢出”的错误。
因为sum和n是局部变量,每按一个键,局部变量初始化为0,所以会有上述错误产生。
改进方法:
将要保值的局部变量声明为Static静态变量,也可将要保值的变量在通用声明段
进行声明为窗体级变量。
6.递归调用出现“栈溢出”
如下求阶乘的递归函数过程:
PublicFunctionfac(nAsInteger)AsInteger]
Ifn=1Then
fac=1
Else
fac=n*fac(n-1)
EndIf
EndFunction
PrivateSubCommand1_Click()'调用递归函数,显示出fac(5)=120
Print"fac(5)=";fac(5)
EndSub
当主调程序调用时,n的值为5时,显示结果为120;当n的值为-5时,显示“溢出堆栈空
间”的提示信息。
实际上每递归调用一次,系统将当前状态信息(形参、局部变量、调用结束时的返回地址)压
栈,直到到达递归结束条件。
上例中当n=5时,每递归调用一次,参数n-1,直到n=1时递归
调用结束,然后不断从栈中弹出当前参数,直到栈空。
而当n=-5时,参数n-1为-6,压栈,
再递归调用n-1永远到不了n=1的终止条件,直到栈满,产生栈溢出的提示信息。
所以设计递归过程时,一定要考虑过程中有终止的条件和终止时的值或某种操作,而且每递
归调用一次,其中的参数就要向终止方向收敛,否则就会产生栈溢出。
测试题
一、选择题
1.设有如下程序段:
PublicSubF1(n%)
...
n=3*n+4
...
EndSub
Private SubCommand1_Click()
Dimn%,m%
n=3
m=4
...
'调用F1语句
...
EndSub
则在Command1_Click事件中有效的调用语句是______。
(A)CallF1(n+m)(B)CallF1(m)(C)CallF1(5)(D)CallF1(m+5)
2.下面子过程语句说明合法的是______。
(A)Subf1(ByValn%())(B)Subf1(n%)AsInteger
(C)Functionf1%(f1%)(D)Funtionf1(ByValn%)
3.要想从子过程调用后返回两个结果,下面子过程语句说明合法的是______。
(A)Subf2(ByValn%,ByValm%)
(B)Subf1(n%,ByValm%)
(C)Subf1(n%,m%)
(D)Subf1(ByValn%,m%)
4.在过程中定义的变量,若希望在离开该过程后,还能保存过程中局部变量的值,则应使用
______关键字在过程中定义局部变量。
(A)Dim(B)Private(C)Public(D)Static
5.下面过程运行后显示的结果是______。
PublicSubF1(n%,ByValm%)PrivateSubCommand1_Click()
n=nMod10Dimx%,y%
m=m\10x=12:
y=34
EndSubCallF1(x,y)
Printx,y
EndSub
(A)234(B)1234(C)23(D)123
6.如下程序,运行的结果是______。
Dima%,b%,c%
PublicSubp1(x%,y%)
Dimc%
x=2*x:
y=y+2:
c=x+y
EndSub
PublicSubp2(x%,ByValy%)
Dimc%
x=2*x:
y=y+2:
c=x+y
EndSub
PrivateSubCommand1_Click()
a=2:
b=4:
c=6
Callp1(a,b)
Print"a=";a;"b=";b;"c=";c
Callp2(a,b)
Print"a=";a;"b=";b;"c=";c
EndSub
(A)a=2b=4c=6(B)a=4b=6c=10
a=4b=6c=10a=8b=8c=6
(C)a=4b=6c=6(D)a=4b=6c=14
a=8b=6c=6a=8b=8c=6
7.如下程序的运行结果是______。
PublicSubProc(a%())
Statici%
Do
a(i)=a(i)+a(i+1)
i=i+1
LoopWhilei<2
EndSub
PrivateSubCommand1_Click()
Dimm%,i%,x%(10)
Fori=0To4:
x(i)=i+1:
Nexti
Fori=1To2:
CallProc(x):
Nexti
Fori=0To4:
Printx(i);:
Nexti
EndSub
(A)34756(B)35745(C)23445(D)45678
二、填空题
1.传地址方式是当过程被调用时,形参和实参共享_
(1)__。
2.按照如下要求书写函数过程定义的首语句,即Function__
(2)___定义语句,要求为:
形参
有两个a为整形,b为一维整形数组,函数过程名为MyF,函数返回值为逻辑型。
3.当形参是数组时,在过程体内对该数组操作时,为了确定数组的下界和上界,应分别用
___(3)_和__(4)___函数。
4.VB中的变量按其作用域分为全局变量、模块变量和_(5)____变量。
5.窗体中的模块级变量应在__(6)___段声明,它作用与该窗体__(7)___。
6.如下程序,运行的结果是_(8)____,函数过程的功能是__(9)___。
PublicFunctionf(m%,n%)
DoWhilem〈〉n
DoWhilem>n:
m=m-n:
Loop
DoWhilen>m:
n=n-m:
Loop
Loop
f=m
EndFunction
PrivateSubCommand1_Click()
Printf(24,18)
EndSub
7.将100~150之间的偶数,拆分成两个素数之和(只要一对即可),最后输出格式如图6.7
所示。
其中,prime函数判断参数x是否为质数。
PrivateFunctionprime(ByValxAsInteger)AsBoolean
prime=__(10)____
Fori=2ToSqr(x)
If__(11)____Then
prime=False
ExitFunction
EndIf
Nexti
EndFunction
PrivateSubForm_Click()
i=1
Forn=__(12)____
Fork=3Ton/2
Ifprime(k)_(13)_____Then
Printi;":
";n;"=";k;"+";n-k
ExitFor
EndIf
Nextk
__(14)____
Nextn
EndSub
8.子过程MoveStr()是把字符数组移动m个位置,当Tag为True时左移,则前m个字符
移到字符数组尾,例如,"abcdefghij"左移3个位置后,结果为"defghijabc";当Tag为False
时右移,则后m个字符移到字符数组前,如"abcdefghij"右移3个位置后,结果为"hi-
jabcdefg"。
子过程如下:
PublicSubMoveStr(a$(),m%,TagAsBoolean)
Dimi%,j%,t$
If__(15)____Then'左移
Fori=1Tom
__(16)_____
Forj=0To__(17)____
a(j)=a(j+1)
Nextj
__(18)____
Nexti
Else
Fori=1Tom'右移
_(19)_____
Forj=Ubound(A)__(20)____
a(j)=a(j-1)
Nextj
__(21)____
Nexti
EndIf
EndSub
9.子过程CountN用来统计字符串中各数字字符("0"~"9")出现的个数;主调程序对在
TextBox1框输入的文本,每次单击"统计"按钮,调用该子过程,在Label1框显示结果,如
图6.8所示。
PrivateSubCommand1_Click()
Dimn(9)AsInteger,i%
CallCountN(n(),Text1.Text)
List1.Clear
Fori=0To9
Ifn(i)Then_(22)_____"字符"&i&"出现的次数为"&n(i)
Next
EndSub
SubCountN(_(23)_____)
DimcAsString*1,i%,m%,j%
Fori=0To9
num(i)=0
Nexti
m=Len(s)
Fori=1Tom
c=__(24)____
Ifc>="0"Andc<="9"Then
j=Val(c)
num(j)=_(25)_____
EndIf
Nexti
EndSub
10.子过程F(n,m,t)对一个四位数n整数判断:
已知该整数n,逆向排列获得另一个4位
数m是它自身的倍数(2倍以上),则t为True表示满足上述条件。
主调程序用该函
数,显示1000~9999中所有满足该条件的数,如图6.9所示。
提示:
根据一个数n,逐一分离得到它的反序数m,然后判断m是否是n的倍数。
PrivateSubCommand1_Click()
DimtAsBoolean,i%,k%
Text1=""
Text2=""
Fori=1000To9999
Callf(_(26)_____)
IftThen
Text1=Text1&i&vbCrLf
Text2=Text2&k&"="&i&"*"&k\i&vbCrLf
EndIf
Next
EndSub
Subf(ByValn%,ByRefm%,ByReftagAsBoolean)
Dimi%
tag=False
m=0
i=n
DoWhilei>0
m=_(27)_____'求得n的逆序
i=__(28)____
Loop
IfmMOdn=0Andm\n>1Then'是否是倍数
tag=______
EndIf
EndSub
11.下列程序中的子过程MySplit(s,sAarray(),n)用于实现Split函数的功能(字符分离到
数组),即将数字字符串s按分隔符“,”分离到sArray数组中,分离的个数为n。
主调程
序将文本框中输入的数字字符串按回车键后进行分离,结果在List1控件显示,如图6.10
所示。
PrivateSubText1_KeyPress(KeyAsciiAsInteger)
Dimstr1AsString,num(100)AsInteger,n%,i%
If_(30)_____Then
str1=Trim(Text1.Text)
CallMySplit(__(31)____)
List1.Text=""
Fori=0Ton
List1.AddItemnum(i)
Next
EndIf
EndSub
SubMySplit(ByValstr1AsString,ByRefsn()AsInteger,ByRefnAsInteger)
Dimi%,j%,ch$
i=0
j=InStr(str1,",")
DoWhilej>0
sn(i)=Val(__(32)____)
str1=Mid(str1,j+1)
i=i+1
j=__(33)____
Loop
sn(i)=Val(str10
n=__(34)_____
EndSub
12.以下过程将一个有序数组中重复出现的数进行压缩,删除后只剩一个.主调程序运行
后结果如图6.11所示。
Subp(a())
Dimn%,m%,k%
n=UBound(a)
m=n
DoWhile(_(35)_____)'从右往左比较、压缩
Ifa(m)=a(m-1)Then
Fork=__(36)____
a(k-1)=a(k)
Nextk
__(37)____
EndIf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB第6章 复习资料教学教材 VB 复习资料 教学 教材