您好,欢迎访问三七文档
当前位置:首页 > 法律文献 > 理论/案例 > VB教程 全套课件 vb-6
第六章过程(5学时)6.1函数过程的定义与调用6.2子过程的定义与调用6.3参数传递6.4变量、过程的作用域6.5递归6.6常用算法(三)6.7重点和难点除了系统提供的内部函数过程和事件过程外,用户可自定义过程:“Sub”保留字开始的为子过程“Function”保留字开始的为函数过程一、函数过程的定义1.引例6.1已知多边形的各条边的长度,要计算多边形的面积。计算多边形面积,可将多边形分解成若干个三角形。计算三角形面积的公式如下:abcdefgS1S2S3)(21))()((zyxczcycxccareaxyz定义函数过程PublicFunctionarea(x!,y!,z!)AsSingleDimc!c=1/2*(x+y+z)area=Sqr(c*(c-x)*(c-y)*(c-z))EndFunction调用函数过程:Subcommand1_click()……输入若干个三角形边长S=area(a,b,c)+area(c,d,e)+area(e,f,g)PrintsEndSub2.函数过程的定义自定义函数过程有两种方法:(1)利用“工具”菜单下的“添加过程”命令定义,生成一个函数的框架(2)利用代码窗口直接定义函数过程形式:Function函数过程名([参数列表])[As类型]局部变量或常数定义语句块函数名=返回值函数过程体[ExitFunction]语句块函数名=返回值EndFunction函数过程名:命名规则同变量名参数列表形式:[ByVal]变量名[()][As类型]称为形参或哑元,仅表示参数的个数、类型,无值。函数名=返回值在函数体内至少对函数名赋值一次[ExitFunction]:表示退出函数过程例6.2同标准函数Replace一样,定义MyReplace(S,OldS,NewS)函数过程当调用MyReplace(abcdefgabcdecd,cd,3“)时函数的返回值为ab3efgab3e3“FunctionMyReplace(s$,OldS$,NewS$)AsStringDimi%,lenOldS%lenOldS=Len(OldS)'取OldS字符子串长度i=InStr(s,OldS)'在字符串中找有否OldS字符子串DoWhilei0'找到用NewS字符子串替换OldS字符子串s=Left(s,i-1)+NewS+Mid(s,i+lenOldS)i=InStr(s,OldS)'找下一个OldS字符子串LoopMyReplace=s'替换后的字符串赋值给函数过程名EndFunction假定S为“abcdefgabcdecd”,Oolds为“cd”,News为3(“abcdefgabcdecd”,“cd”,“3”)第1次I=3结果“ab3efgabcdecd”(“ab3efgabcdecd”,“cd”,“3”)第2次I=9结果“ab3efgab3ecd”(“ab3efgab3ecd”,“cd”,“3”)第3次I=11结果ab3efgab3e33.函数过程的调用函数过程的调用同标准函数调用,参与表达式运算,形式如下:函数过程名([参数列表])参数列表:称为实参或实元,它必须与形参个数相同,位置与类型一一对应可以是同类型的常量、变量、表达式执行流程:PrivateSubCommand1_Click()Text1=MyReplace(Text1,cd,3)ST=(“VisualBasic程序设计教程5.0版”PrintMyReplace(ST,5.0,6.0)EndSubFunctionMyReplace$(s$,OldS$,NewS$)Dimi%,lenOldS%lenOldS=Len(OldS)i=InStr(s,OldS)DoWhilei0s=Left(s,i-1)+NewS+Mid(s,i+lenOldS)i=InStr(s,OldS)LoopMyReplace=sEndFunctionText1=MyReplace(Text1,cd,3)PublicFunctionMyReplace(S$,OldS$,NewS$)AsString二、子过程函数过程的不足:(1)不是为了获得某个函数值,而是为了某种功能的处理,如例1.1。(2)要获得多个结果。1.引例编写一个两个数交换的过程供多次调用。Swap(x,y)子过程的定义主调程序调用Swap子过程PublicSubSwap(x,y)PrivateSubForm_Click()DimtDima,bt=xa=10x=yb=20y=tCallSwap(a,b)EndSubPrinta=;a,,b=;bEndSub2子过程定义Sub子过程名[(参数列表)]局部变量或常数定义语句[ExitSub]语句EndSub3子过程的调用子过程名[参数列表]或Call子过程名(参数列表)4.子过程与函数过程区别:(1)函数过程名有值,有类型,在函数体内至少赋值一次;子过程名无值,无类型,在子过程体内不能对子过程名赋值;(2)调用时,子过程调用是一句独立的语句。函数过程不能作为单独的语句加以调用,必须参与表达式运算。(3)一般当过程有一个函数值,使用函数过程较直观;反之若过程无返回值,或有多个返回值,使用子过程较直观。例6.4分别编一计算某级数部分和的子过程和函数过程,并调用。级数为:精度为:...!...!212nxxxneps!nxn程序运行流程:PrivateSubCommand1_Click()Dimf1#,f2#f1=jishu1(2#,0.000001)Calljishu2(f2,2#,0.000001)Printf1=;f1,f2=;f2EndSubFunctionjishu1(x!,eps#)AsDoubl…jishu=表达式EndFunction找函数名调用jishu1函数名带了值返回Subjishu2(s#,x!,eps#)…s=表达式EndSub①②③④⑤找子过程名调用jishu2⑥⑦⑧三、参数传递指主调过程的实参传递给被调过程的形参。1.传址与传值传址:形参得到的是实参的地址,当形参值的改变同时也改变实参的值。传值:形参得到的是实参的值,形参值的改变不会影响实参的值。例6.5两个变量的交换SubSwap1(ByValx%,ByValy%)t%=x:x=y:y=tEndSubPrivateSubCommand1_Click()a%=10:b%=20:Swap1a,b'传值PrintA1=;a,B1=;ba=10:b=20:Swap2a,b'传地址PrintA2=;a,B2=;bEndSubSubSwap2(x%,y%)t%=x:x=y:y=tEndSuba的地址101010aaxx形参实参ByVal传值传地址2.数组参数的传递当参数是数组通过传址方式进行传递。注意:•在实参和形参中写数组名,忽略维数的定义,但圆括号不能省。•被调过程可通过Lbound和Ubound函数确定实参数组的下、上界。Lbound和Ubound函数的形式如下:{L|U}bound(数组名[,维数])其中:维数指明要测试的是第几维的下标值,缺省是一维数组。例6.7编一函数tim,求任意一维数组中各元素之积。调用tim,求和Functiontim(a()AsInteger)Dimt#,i%t=1Fori=Lbound(a)ToUbound(a)t=t*a(i)Nextitim=tEndFunction511iiat832iibt调用:SubCommand1_Click()Dima%(1To5),b%(3To8)…t1#=tim(a())t2#=tim(b())Printt1,t2EndSub使用过程注意事项:1.确定自定义的过程是子过程还是函数过程函数过程名有值,子过程名无值。2.过程中形参的个数和传递方式的确定过程中参数的作用是实现过程与调用者的数据通信。(1)从主调程序获得初值,值传递。(2)将结果返回给主调程序,地址传递。3.实参与形参结合时对应问题个数、类型、位置、次序一一对应。形参是值传递,对应实参可以是表达式、常量、数组元素。形参是地址传递,对应实参只能是简单变量。数组、记录类型、对象只能是地址传递。实验6.4回文数的判断中形参的确定1.函数过程,形参一个,值传递对所判断的数字;函数名是否为回文数。FunctionIsH(ByValssAsString)AsBoolean2.子过程,形参两个,值传递对所判断的数字,地址传递是否位回文数。Subhui(ByValssAsString,TagAsBoolean)实验6.2子过程DeleStr(s1,s2)形参的确定s1,要处理的字符串,从主调程序得初值,删除子串后结果在S1中,所以地址传递。s2删除的子串,值传递。实验6.3函数过程MaxLength(s)形参的确定S要处理的字符串,值传递。MaxLength函数名,最长的单词长度。四、变量、过程的作用域作用域:变量、过程随所处的位置不同,可被访问的范围。1.过程的作用域窗体/模块级:加Private关键字的过程,只能被定义的窗体或模块中的过程调用。全局级:加Public关键字(缺省)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。2.变量的作用域局部变量:在过程内用声明的变量,只能在本过程中使用。窗体/模块级变量:在“通用声明”段中用Dim语句或用Private语句声明的变量,可被本窗体/模块的任何过程访问。全局变量:在“通用声明”段中用Public语句声明的变量,可被本应用程序的任何过程或函数访问。例如在下面一个标准模块文件中不同级的变量声明:PublicPaAsinteger'全局变量PrivateMbAsstring*10'窗体/模块级变量SubF1()DimFaAsinteger'局部变量…EndSubSubF2()DimFbAsSingle'局部变量…EndSub若在不同级声明相同的变量名,系统按局部、窗体/模块、全局次序访问如:PublicTempAsinteger'全局变量SubForm_Load()DimTempAsInteger'局部变量Temp=10'访问局部变量Form1.Temp=20'访问全局变量必须加窗体名PrintForm1.Temp,Temp'显示2010EndSub3.静态变量局部变量声明:Dim声明,随过程的调用而分配存贮单元,变量的初始化;过程体结束,变量的内容自动消失,存贮单元释放。Static声明,每次调用过程,变量保持原来的值。声明形式:Static变量名[AS类型]StaticFunction函数过程名([参数列表])[As类型]StaticSub子过程名[(参数列表)]过程名前加Static,表示该过程内的局部变量都是静态变量。例6.9PrivateSubForm_Click()Dimi%,isum%Fori=1To5isum=sum(i)Printisum,NextiEndSubPrivateFunctionsum(nAsInteger)DimjAsIntegerj=j+nsum=jEndFunctionStaticjAsInteger,结果?1,2,3,4,5Subf1(x)…x=f2(xx)*3…EndSubSubCommand1_Click()……Callf1(y)EndSubFunctionf2(x)……f2=f3(x)+3EndSubFunctionf3(x)……f3=x*xEndSubSubf1(x)…Callf1(y)EndSub过程的直接调用SubCommand1_Click()……Callf1(y)EndSub过程的递归调用五、递归1.递归的概念用自身的结构来描述自身就称为“递归”。例对阶乘的定义:)!2()1()!1()!1(!nnnnnn2.递归过程过程在自身定义的内部调用自己。例6.10编fac(n)=n!的递归函数Functionfac(nAsInteger)AsIntegerIfn=1Thenfac=1Elsefac=n*fa
本文标题:VB教程 全套课件 vb-6
链接地址:https://www.777doc.com/doc-3264667 .html