过程与函数讲稿.ppt
关于过程与函数关于过程与函数第一页,讲稿共四十三页哦 Visual Basic函数分为函数分为内部函数内部函数和和自定义函数自定义函数,自定义函数自定义函数是用户是用户根据需要用根据需要用Function关键字定义的函数过程关键字定义的函数过程。6.1.1 函数过程函数过程(Function过程过程)的定义的定义Public|PrivateStaticFunction 函数名函数名()As 函数名函数名=返回值返回值 Exit Function 函数名函数名=返回值返回值 End Function函数体6.1 Function过程过程第二页,讲稿共四十三页哦Function定义定义示例示例(两种方式两种方式)第三页,讲稿共四十三页哦调用形式:调用形式:函数名函数名(实参列表实参列表)说说明明:在在调调用用时时实实参参和和形形参参的的数数据据类类型型、顺顺序序、个个数数必必须须匹匹配配。函数调用只能出现在表达式中,其功能是求得函数的返回值。函数调用只能出现在表达式中,其功能是求得函数的返回值。6.1.2 函数的调用函数的调用Private Sub Form_Click()Dim x%,y%,z%x=Val(InputBox(输入一个正整数输入一个正整数x:)y=Val(InputBox(输入一个正整数输入一个正整数y:)z=gcd(x,y)Print x&与与&y&的最大公约数为的最大公约数为:&zEnd Sub第四页,讲稿共四十三页哦例例6.2 打印出打印出100到到200之间的所有素数之间的所有素数 Function IsPrime(n%)As Boolean Dim k%IsPrime=True 先假定先假定n是素数是素数 For k=2 to n-1 If n mod k=0 Then IsPrime=False 确定确定n是是不不素数,返回素数,返回False Exit Function 退出函数退出函数,也可用也可用Exit For或或k=n End If Next k For循环正常结束时,循环正常结束时,n是素数,返回是素数,返回TrueEnd FunctionPrivate Sub Form_Click()Dim i%,k%k=0 k用来记录素数的个数,初始值为用来记录素数的个数,初始值为0 For i=100 to 200 If IsPrime(i)Then Print i;k=k+1 If k Mod 10=0 Then Print 书中印刷错误 End If Next iEnd SubFor i=101 to 199 Step 2 偶数不可能是素数偶数不可能是素数 第五页,讲稿共四十三页哦 在在程程序序中中调调用用一一个个函函数数,而而在在函函数数中中又又调调用用另另外外的的函函数数,这这种种程程序序结结构构称称为为函函数数的的嵌嵌套套调调用用。嵌嵌套套调调用用的的执行过程如下图所示:执行过程如下图所示:6.1.3 函数的函数的嵌套调用嵌套调用第六页,讲稿共四十三页哦例例6.3 牛顿迭代法牛顿迭代法求解高次方程的根求解高次方程的根Function Funx#(ByVal x#)Funx=3*x*x*x-4*x*x-5*x+13 求函数的值求函数的值End FunctionFunction Fun1x#(ByVal x#)Fun1x=9*x*x-8*x-5 求导函数的值求导函数的值End FunctionFunction Newton#()Dim x x=8 随意指定一个初值随意指定一个初值 Do x=x-Funx(x)/Fun1x(x)牛顿迭代公式牛顿迭代公式 Loop Until abs(Funx(x)=0.000001 Newton=xEnd FunctionPrivate Sub Form_Click()Print 方程方程3*x3-4*x2-5*x+13=0的根为的根为:;Newton()End Sub第七页,讲稿共四十三页哦6.1.4 函数的函数的递归调用递归调用第八页,讲稿共四十三页哦递归函数的递归函数的三个要点三个要点 要有一个要有一个结束结束递归的递归的条件条件。递归递归结束时结束时,要有一个,要有一个明确的值明确的值。要有一个求值的要有一个求值的递归公式递归公式,且递归能,且递归能向向结束条件结束条件 的的方向方向发展发展。例例6.4 用递归算法求一个正整数的阶乘。Private Function fac(n As Integer)As Long If n=1 Or n=0 Then 结束递归的条件结束递归的条件 fac=1 结束递归时,函数的值为结束递归时,函数的值为1 Else fac=n*fac(n-1)递归公式递归公式 End IfEnd FunctionPrivate Sub Command1_Click()Dim k%k=Val(InputBox(输入一个正整数输入一个正整数k)Print k&!=&fac(k)End Sub第九页,讲稿共四十三页哦递归函数的执行过程第十页,讲稿共四十三页哦递归程序递归程序示例示例能够用能够用递推算法递推算法解决的问题,大多数都能用解决的问题,大多数都能用递归算法递归算法来实现来实现!猴子吃桃问题猴子吃桃问题Private Function tao(m As Integer)As Integer If m=7 Then 第第7天只剩下一个桃天只剩下一个桃 tao=1 结束递归时,函数的值为结束递归时,函数的值为1 Else tao=2+2*tao(m+1)递归公式递归公式 End IfEnd Function 求求最大公约数的函数最大公约数的函数Private Function gcd2%(ByVal m%,ByVal n%)If m Mod n=0 Then gcd2=n Else gcd2=gcd2(n,m Mod n)End IfEnd Function第十一页,讲稿共四十三页哦6.2 Sub过程过程6.2.1 Sub过程的定义过程的定义 Public|PrivateStatic Sub 过程名过程名(形参表形参表)语句语句块块 1 Exit Sub 语句语句块块 2End Sub 说说明明:的的命命名名规规则则与与变变量量名名规规则则相相同同。过过程程名名不不返返回值,回值,不不能能当变量使用当变量使用。第十二页,讲稿共四十三页哦Sub过程的调用形式:过程的调用形式:子过程名子过程名 参数列表参数列表 Call 子过程名子过程名(参数列表参数列表)说明:说明:(1)参数列表参数列表称为实参或实元,它必须与形参保持个称为实参或实元,它必须与形参保持个数相同,位置与类型数相同,位置与类型一一对应一一对应。(2)调用时把)调用时把实参值实参值传递给传递给对应的对应的形参形参。6.2.2 过程的调用过程的调用或或Private Sub Swap(ByRef x%,y As Integer).Call swap(a,b)Swap a,b第十三页,讲稿共四十三页哦例例6.5 交换两个变量值的Sub过程Private Sub Swap(x%,y As Integer)Dim temp As Integer temp=x:x=y:y=tempEnd SubPrivate Sub Command1_click()Dim a%,b%a=15 :b=20 Print Before Swap(a,b):a=;a,b=;b Call swap(a,b)Print After Swap(a,b):a=;a,b=;bEnd SubBefore Swap(a,b):a=15 b=20After Swap(a,b):a=20 b=15第十四页,讲稿共四十三页哦1、形式参数、形式参数 在在定义定义过程过程时时,出现在,出现在Sub或或Function语句中的语句中的过程名过程名或或函数名函数名后面的园括号内的后面的园括号内的参数参数,只能只能是简单是简单变量变量或或数组名数组名,它,它没有没有值,值,等待等待传传递递。6.3 过程过程之间之间参数的参数的传递传递2、实际参数、实际参数 在在调调用用Sub或或Function过过程程时时,写写在在过过程程名名或或函函数数名名后后括括号号内内的的参参数数。实参实参可以是可以是常量常量、变量名、表达式变量名、表达式或或数组名数组名。Private Sub Swap(x%,y As Integer).End SubCall swap(a,b)实参实参的的个数个数与与类型类型,要,要按顺序按顺序与与形参一一对应形参一一对应匹配匹配!第十五页,讲稿共四十三页哦6.3.1 单向的传值方式第十六页,讲稿共四十三页哦6.3.2 双向的传地址方式 实参实参必须是必须是变量变量。如果实参是。如果实参是常量常量或或表达式表达式,只能只能实现实现单向的值传递单向的值传递!Call swap(a,b+0)Call swap(a),b)第十七页,讲稿共四十三页哦例例6.6 传值与传地址的区别Private Function fx(ByVal x As Integer)x=x+x fx=xEnd FunctionPrivate Function fy(ByRef y As Integer)y=y+y fy=yEnd SubPrivate Sub command1_click()Dim a%,b%a=10 :b=15 print fx(fx(a);fy(fy(b);a;bEnd Function程序的运行结果为:程序的运行结果为:40 60 10 30第十八页,讲稿共四十三页哦6.3.3 数组数组参数的传递参数的传递 Private Sub Sort(x()As Intefer)Dim i%,j%,m%,t%For i=LBound(X)To UBound(X)-1 m=i For j=i+1 To UBound(X)If X(m)X(j)Then m=j Next j t=X(i):X(i)=X(m):X(m)=t Next iEnd SubDim A%(1 To 10)Call Sort(A()或或 Sort A()Call Sort(A)或或 Sort AByVal?不能指定形参数组的维数及其下标不能指定下标第十九页,讲稿共四十三页哦6.3.4 可选参数可选参数与与可变参数可变参数的传递的传递 Private Function max1%(a%,b%,c%,Optional d)max1=a If max1 b Then max1=b If max1 c Then max1=c If Not IsMissing(d)Then If max1 d Then max1=d End IfEnd FunctionPrivate Sub Command1_Click()Print 可可选选参数的参数的应应用用 Print max1(7,5,8)=;max1(7,5,8)Print max1(7,2,3,9)=;max1(7,2,3,9)End Sub变体类型变体类型的可选参数可选参数d只能只能有有三个三个或或四四个个实参实参1.可选参数可选参数 测试函数测试函数第二十页,讲稿共四十三页哦2.可变参数可变参数Private Function max2(ParamArray d()max2=d(LBound(d)For Each x In d If max2 x Then max2=x Next xEnd FunctionPrivate Sub Command2_Click()Print 可可变变参数的参数的应应用用 Print max2(1,3,8,7,2,3,9,7,5,8)=;_ max2(1,3,8,7,2,3,9,7,5,8)Print max2(1,3,9,7,2,3,9,7,7,7,58)=;_ max2(1,3,9,7,2,3,9,7,7,7,58)End Sub变体类型变体类型的数组数组d可以可以有任意有任意多个多个实参实参续行标志续行标志“_”第二十一页,讲稿共四十三页哦6.3.5 对象参数的对象参数的传递传递 Private Sub ReObject(c As Object)If TypeOf c Is Form Then c.Cls:c.Caption=窗体参数的窗体参数的传递传递 c.Print 窗体参数的窗体参数的类类型型 ElseIf TypeOf c Is Label Then c.Caption=Label控件参数的控件参数的传递传递 ElseIf TypeOf c Is TextBox Then c.Text=文本框控件参数的文本框控件参数的传递传递 ElseIf End IfEnd SubPrivate Sub Form_Click()Call ReObject(Form1)Call ReObject(Label1)End Sub可以是可以是Control、Form、Label、TextBox等等类型名类型名测试对象的测试对象的类型类型第二十二页,讲稿共四十三页哦6.4 工程与工程资源管理6.4.1 VB应用程序应用程序的的结构结构 应用程序应用程序 (工程工程)窗体模块窗体模块 标准模块标准模块 类模块类模块 控件对象控件对象 通用声明部分通用声明部分 通用过程部分通用过程部分 事件过程部分事件过程部分窗体设计器 代码窗口 通用声明部分通用声明部分 通用过程部分通用过程部分 两个两个特殊的过程:特殊的过程:每个窗体都可以有一个每个窗体都可以有一个Form_Load过程;过程;整个工程只能在某个标准模块中有一个整个工程只能在某个标准模块中有一个Main过程。过程。第二十三页,讲稿共四十三页哦6.4.2 工程资源管理1.工程资源管理器工程资源管理器窗口窗口 先先选定选定某个模块某个模块查看代码查看代码 查看对象查看对象 右键菜单右键菜单 第二十四页,讲稿共四十三页哦2.为工程添加模块3.从工程中从工程中移除移除指定的指定的模块模块 选定模块的选定模块的右键菜单右键菜单右击右击“工程工程1”第二十五页,讲稿共四十三页哦4.为工程指定启动对象 第二十六页,讲稿共四十三页哦5.工程的编译 第二十七页,讲稿共四十三页哦Private .End Sub 过过程程的的作作用用域域就就是是该该过过程程在在工工程程中中能能够够被被调调用用的的范范围围。分分模块级模块级和和工程级工程级两种。两种。Public Sub Sub1(x%,y%,z%)6.4.3 过程的作用域过程的作用域窗体窗体/模块模块级级过程过程 工程工程级级过程过程 调用调用其它模块中的其它模块中的工程级工程级过程过程 Call Form2.Sub1(a,b,c)Form2.Sub1 a,b,c Call Module1.Sub2(a,b,c)Call Sub2(a,b,c)Sub2 a,b,c无同名过程无同名过程 第二十八页,讲稿共四十三页哦 在在VB中中,可可以以在在某某个个过过程程中中定定义义变变量量,也也可可以以在在模模块块的的通通用用段段定定义义变变量量。根根据据定定义义变变量量的的位位置置和和定定义义变变量量的的语语句句不同不同,变量变量可以可以分为分为:6.4.4 变量的作用域变量的作用域局部变量局部变量(过程级变量过程级变量,只能在本过程中使用只能在本过程中使用)窗窗体体/模模块块级级变变量量(私私有有的的模模块块级级变变量量,能能被被本本模模块块的的所有过程和函数使用所有过程和函数使用)全局变量全局变量(公有的公有的模块级变量模块级变量工程工程级级变量变量)。第二十九页,讲稿共四十三页哦过程级变量过程级变量局部变量局部变量 局部变量:局部变量:在在过程内过程内声明的变量,只能在本过程中声明的变量,只能在本过程中使用。使用。1、过程级变量、过程级变量Private Sub Form_Load()Dim n%n=10End SubPrivate Sub From_Click()Dim n%n=n+10 Print n=;nEnd Sub结结果:果:n=10第三十页,讲稿共四十三页哦Dim n%Private Sub Form_Load()n=10End SubPrivate Sub From_Click()n=n+10 Print n=;nEnd Sub2、窗体窗体/模块模块级级变量变量Private n%结结果:果:n=20 在在窗体模块窗体模块或或标准模块标准模块的的通用段通用段用关键字用关键字Dim 或或Private定义的变量定义的变量都称为模块级变量或称私有的模块级变量。都称为模块级变量或称私有的模块级变量。模块级变量模块级变量的的作用域作用域是它所在的是它所在的整个模块整个模块。第三十一页,讲稿共四十三页哦3、全局变量、全局变量在在模块的模块的通用段通用段用用Public定义的定义的变量变量 第三十二页,讲稿共四十三页哦Public Temp As Integer 定义全局变量定义全局变量Private Sub Form_Load()Temp=1 将全局变量将全局变量Temp 的值设置成的值设置成 1End SubPrivate Sub Command1_Click()Dim Temp As Integer 定义局部变量定义局部变量 Temp=2 将局部变量将局部变量Temp 的值设置成的值设置成 2 Print temp=;Temp;Form1.TempEnd SubPrivate Sub Command2_Click()Print temp=;Temp End Sub多变量同名多变量同名示例示例第三十三页,讲稿共四十三页哦6.4.5 变量的存储方式与生存期 Windows操作系统操作系统对对存储器存储器采用的是采用的是动态动态存储管理方式存储管理方式第三十四页,讲稿共四十三页哦1.动态变量动态变量及其及其生存期生存期 动态变量动态变量就是就是采用采用动态存储方式动态存储方式的的变量变量,在应用程序中用关键,在应用程序中用关键字字Dim或或Private定义的定义的变量变量都是都是动态变量动态变量。变量的变量的生存期生存期是指是指从从变量变量获取存储空间获取存储空间开始开始,到到该变量所占据该变量所占据的的存储空间存储空间被被Windows操作系统操作系统回收回收时结束的一段时间。时结束的一段时间。模块级模块级动态变量动态变量是在模块被是在模块被装入内存装入内存运行时运行时创建创建的,在的,在退出退出该该模块时模块时释放释放其所占据的其所占据的存储空间存储空间。过程级过程级动态变量动态变量是在是在该过程该过程被调用时被调用时创建创建,在该过程,在该过程运行结束运行结束时时释放释放其所占据的其所占据的存储空间存储空间。第三十五页,讲稿共四十三页哦2.静态变量静态变量及其及其生存期生存期 静态变量静态变量就是就是采用采用静态存储方式的静态存储方式的变量变量,在应用程序,在应用程序中用关键字中用关键字Static或或Public定义的变量定义的变量都是都是静态变量静态变量。所。所有的有的全局变量全局变量都是都是静态变量静态变量。静态变量的静态变量的生存期生存期就是整个程序(工程)的生存期,就是整个程序(工程)的生存期,也就是说也就是说静态变量静态变量在整个在整个程序运行期间程序运行期间都是都是存在的。存在的。第三十六页,讲稿共四十三页哦 例例6.12 阅读以下程序,当用户连续阅读以下程序,当用户连续3次在窗体中单击鼠标时,程次在窗体中单击鼠标时,程序运行结果如何?序运行结果如何?3.静态静态局部变量局部变量 Private Sub Form_Click()Dim a%Static b%a=a+1 b=b+1 Print a=;a;b=;bEnd Sub 第一次运行:第一次运行:a=1 b=1 第一次运行:第一次运行:a=1 b=2 第一次运行:第一次运行:a=1 b=3第三十七页,讲稿共四十三页哦6.5 用户自定义数据类型6.5.1 记录类型记录类型 1用Type语句创建用户自定义数据类型数据类型Public|PrivateType As As End TypePrivate Type Student Xh as long Name as string*10 English as integer Math as integer Computer as integerEnd Type 第三十八页,讲稿共四十三页哦2.用自定义的数据类型定义变量 3.自定义类型变量的引用自定义类型变量的引用 例如:例如:Dim Stu As Student,Sa(1 to 10)As StudentStu.Xh=20110808Stu.Name=孙孙吴空吴空Stu.English=90Stu.Math=95Stu.Computer=98Print Stu.Xh;Stu.Name;Stu.English;Print Stu.Math;Stu.ComputerWith Stu .Xh=20110808 :.Name=孙孙吴空吴空 .English=90 :.Math=95 .Computer=98 Print .Xh;.Name;.English;.Math;.ComputerEnd With第三十九页,讲稿共四十三页哦6.5.2 枚举类型 1枚举类型枚举类型的定义的定义 Public|Private Enum =End EnumPrivate Enum Week Sun=7 Mon=1 Tue=2 Wed Thu=4 Fri=5 Sat=6End Enum自动自动取取比比上一项上一项大大1的的值值,即,即Wed的的值为值为3第四十页,讲稿共四十三页哦2枚举型变量的定义与引用 Private Enum Week Sun=7:Mon=1:Tue=2 Wed Thu=4 :Fri=5 :Sat=6End EnumPrivate Sub Form_Click()Dim w1 As Week,w2 As Week w1=Mon:w2=w1+3 Print w1=;w1,w2=;w2End Sub第四十一页,讲稿共四十三页哦 本章主要介绍了本章主要介绍了Sub过程过程和和Function过程过程。对一个对一个较大的程序较大的程序,最好最好的处理方法就是的处理方法就是将其分解将其分解成成若干个若干个小的功能小的功能模块模块,然后编写,然后编写一个个一个个过程过程去去实现实现每一个模块的每一个模块的功能功能,最终通过一个,最终通过一个主主程序程序调用调用这些这些过程过程来实现总体目标。来实现总体目标。过程调用过程调用时的时的数据传递数据传递主要是通过主要是通过形参形参与与实参实参相结合来实现的。相结合来实现的。单单向向传值传值(ByVal),双向双向传地址传地址(ByRef)。过程过程分分模块级模块级过程过程与与工程级工程级过程过程两种。两种。变量变量分分过程级过程级、模块级模块级与与工程级工程级三种;三种;变量变量还有还有动态动态与与静态静态两种不同两种不同的的存储方式存储方式。用户自定义数据类型有记录类型记录类型与与枚举类型枚举类型两种。两种。本章小结本章小结作业作业(Pg.160)习题六习题六 一、二、三题一、二、三题 做在作业本上做在作业本上 四、编程题四、编程题 1,2、3、4题需题需上机验证上机验证 第四十二页,讲稿共四十三页哦感谢大家观看第四十三页,讲稿共四十三页哦