第8章-过程和函数ppt课件.ppt
第8章-过程和函数第8章 过程和函数目录目录8.1 事件过程事件过程8.2 通用过程通用过程8.3 函数过程函数过程8.4 参数传递参数传递8.5 变量的作用域变量的作用域8.6 递归过程递归过程8.7 过程应用举例过程应用举例8.1 事件过程事件过程8.1.1 窗体事件过程窗体事件过程8.1.2 控件事件过程控件事件过程8.1.1 8.1.1 窗体事件过程窗体事件过程 其定义的语法格式如下:其定义的语法格式如下: Private Sub 窗体名窗体名_事件名事件名(参数列表参数列表) 局部变量和常数声明局部变量和常数声明 语句块语句块 End Sub8.1.1 8.1.1 窗体事件过程窗体事件过程 如窗体鼠标单击事件如窗体鼠标单击事件:8.1.2 8.1.2 控件事件过程控件事件过程 其定义的语法格式如下:其定义的语法格式如下: Private Sub 控件名控件名_事件名事件名(参数列表参数列表) 局部变量和常数声明局部变量和常数声明 语句块语句块 End Sub8.1.2 8.1.2 控件事件过程控件事件过程 Button1_Click过程和过程和TextBox1_TextChanged过程。过程。 控件事件过程控件事件过程8.2 通用过程通用过程Sub8.2.1 通用过程的定义和建立通用过程的定义和建立8.2.2 调用通用过程调用通用过程8.2.1 8.2.1 通用过程通用过程的定义和建立的定义和建立 通用过程的结构与事件过程的结构类似。一般格式如下:通用过程的结构与事件过程的结构类似。一般格式如下: Private | Public Sub (参数列表参数列表) 局部变量或常量等声明局部变量或常量等声明 过程体过程体 语句块语句块 Exit Sub 语句块语句块 End Sub 【例【例8-1】编写一个过程,对】编写一个过程,对Label1控件沿窗体对角线进行移动,其控件沿窗体对角线进行移动,其中通过参数中通过参数tag的值(的值(1或或-1)来决定向右下角还是左上角移动。)来决定向右下角还是左上角移动。 程序代码如下:Submymove(ByValtagAsInteger)Label1.Left=Label1.Left+tag*10Label1.Top=Label1.Top+tag*10EndSubPrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.ClickDimkAsIntegerIfRnd()0.5Thenk=1Elsek=-1EndIfCallmymove(k)EndSub 参数的格式为:参数的格式为: ByVal|ByRef | 参数名称参数名称( )As 数据类型数据类型=默认值默认值 参数名称前的参数名称前的ByVal是指定变量用是指定变量用“传值传值”的方式传送,它是的方式传送,它是VB.NET传送变量的传送变量的默认方式;默认方式;ByRef则是指定变量以则是指定变量以“传地址传地址”的方式传送。的方式传送。 建立通用过程:建立通用过程: 通用过程不属于任何一个事件过程,因此不能放在事件过程中。建立的通用过通用过程不属于任何一个事件过程,因此不能放在事件过程中。建立的通用过程要放在其他过程之外程要放在其他过程之外。8.2.2 8.2.2 调用调用通用过程通用过程 定义了通用过程后,通用过程并没有执行,它只有在被调用后才定义了通用过程后,通用过程并没有执行,它只有在被调用后才被执行。在被执行。在VB.NET中调用通用过程通常采用以下两种方式:中调用通用过程通常采用以下两种方式: 1使用使用Call关键字调用通用过程关键字调用通用过程格式:格式: Call 过程名过程名(实际参数实际参数) 2直接使用通用过程名调用通用过程直接使用通用过程名调用通用过程在调用通用过程时,省略关键字在调用通用过程时,省略关键字Call。例如:。例如: MyMove(k)8.3 函数过程函数过程Function8.3.1 函数过程的定义函数过程的定义8.3.2 调用函数过程调用函数过程8.3.1 8.3.1 函数过程的定义函数过程的定义 函数过程定义的格式如下:函数过程定义的格式如下: Private|Public Function 函数名(函数名(参数列表参数列表)As 数据类型数据类型 语句块语句块 函数名函数名=表达式表达式|Return表达式表达式 Exit Function 语句块语句块 End Function8.3.1 8.3.1 函数过程的定义函数过程的定义 【例【例8-2】编写一个计算三角形面积的函数,利用该函数计算多边】编写一个计算三角形面积的函数,利用该函数计算多边形的面积,如图形的面积,如图8-5所示。所示。 图8-5多边形海伦公式:若三角形三边长度为x、y、z,则area=sqrt(L(L-x)(L-y)(L-z))。其中L=(1/2)(x+y+z)8.3.2 8.3.2 调用函数过程调用函数过程 函数过程的调用比较简单,因此可以像使用函数过程的调用比较简单,因此可以像使用VB.NET的内部函数一的内部函数一样来调用函数过程。实际上样来调用函数过程。实际上,它与内部函数没有区别,只不过内部它与内部函数没有区别,只不过内部函数由语言系统提供,而函数过程由用户自己定义。函数由语言系统提供,而函数过程由用户自己定义。 s1=Area(a, b, c) 调用函数,利用三角形三边计算三角形面积。调用函数,利用三角形三边计算三角形面积。8.3.2 8.3.2 调用函数过程调用函数过程 【例【例8-3】编写程序,求】编写程序,求S!=a!+b!+c!,阶乘的计算分别用通用过程,阶乘的计算分别用通用过程和和Function过程两种方法来实现。过程两种方法来实现。 分析:在解决某一问题时,要确认到底是使用通用过程还是函数分析:在解决某一问题时,要确认到底是使用通用过程还是函数过程。此时,只要抓住函数过程和通用过程的区别:(函数过程过程。此时,只要抓住函数过程和通用过程的区别:(函数过程返回一个值,而通用过程不返回值)即可。返回一个值,而通用过程不返回值)即可。8.4 参数传递参数传递8.4.1 形参和实参形参和实参8.4.2 传值与传地址传值与传地址8.4.3 数组与函数的参数数组与函数的参数8.4.4 传递方式的选择传递方式的选择8.4.1 8.4.1 形参和实参形参和实参 形参是在形参是在Sub、Function过程的定义中出现在参数列表中的参数。在过程被过程的定义中出现在参数列表中的参数。在过程被调用之前,系统并未给形参分配内存,只是说明形参的类型和在过程中的调用之前,系统并未给形参分配内存,只是说明形参的类型和在过程中的作用。实参则是在调用作用。实参则是在调用Sub或或Function过程时用到的常数、变量、表达式或过程时用到的常数、变量、表达式或数组。数组。 形参表和实参表中对应的参数名可以不同,但实参和形参的个数、顺序以形参表和实参表中对应的参数名可以不同,但实参和形参的个数、顺序以及数据类型必须相同,即及数据类型必须相同,即“形参形参”与与“实参实参”的结合是按照位置一一对应的结合是按照位置一一对应结合的。结合的。8.4.1 8.4.1 形参和实参形参和实参 Sub Mysub (byval t As Integer, byval s As String, byval y As Single) 调用过程:调用过程: Call Mysub(100, computer, 1.5) (1)第)第1个实参值个实参值(100)传递给第一个形参传递给第一个形参t。 (2)第)第2个实参值个实参值(computer)传递给第二个形参传递给第二个形参s。 (3)第)第3个实参值个实参值(1.5)传递给第三个形参传递给第三个形参y。8.4.2 8.4.2 传值与传地址传值与传地址 1传值传值 按值传递使用的关键字是按值传递使用的关键字是ByVal(可以省略),是指通过传值的方式把实参(可以省略),是指通过传值的方式把实参的值传递给形参。可见,按值传递参数是一种单向传递。为了保证数据传的值传递给形参。可见,按值传递参数是一种单向传递。为了保证数据传输的安全性,在输的安全性,在VB.NET中默认的传递方式是按值传递。中默认的传递方式是按值传递。 2传地址传地址 按地址传递使用的关键字是按地址传递使用的关键字是ByRef,又称按引用传递,就是当调用一个过程又称按引用传递,就是当调用一个过程时,把实参变量的内存地址传递给被调过程对应的形参,即形参与实参使时,把实参变量的内存地址传递给被调过程对应的形参,即形参与实参使用相同地址的内存单元,如果在被调过程中改变了该形参的值,也就改变用相同地址的内存单元,如果在被调过程中改变了该形参的值,也就改变了相应实参变量的值。可见按地址传递是一种双向传递。了相应实参变量的值。可见按地址传递是一种双向传递。8.4.2 8.4.2 传值与传地址传值与传地址 【例【例8-4】比较按值传递(】比较按值传递(ByVal)和按引用传递()和按引用传递(ByRef)的区别。)的区别。Subaddnum1(ByValxAsInteger)声明传值参数通用过程x=x+5EndSubSubaddnum2(ByRefxAsInteger)声明传地址参数通用过程x=x+5EndSubPrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.ClickDimiAsIntegeri=10TextBox1.Text=i输出i的值addnum1(i)传按值调用过程addnum1TextBox2.Text=i输出i的值i=10addnum2(i)传地址调用过程addnum2TextBox3.Text=i输出i的值EndSub8.4.3 8.4.3 数组作为函数的参数数组作为函数的参数 当数组作为参数传递时,不管参数前是当数组作为参数传递时,不管参数前是ByVal还是还是ByRef,都将以传地址方,都将以传地址方式传送。式传送。【例8-5】编写一个函数过程,用来求一维数组各元素的平均值,同时把数组中的元素倒序,编写程序验证该函数过程。8.4.4 8.4.4 传递方式的选择传递方式的选择 对于参数传递的使用方式没有硬性规定,一般进行以下考虑。对于参数传递的使用方式没有硬性规定,一般进行以下考虑。 (1)若要将被调过程中的结果返回给主调过程,则形参必须是传地址方式。)若要将被调过程中的结果返回给主调过程,则形参必须是传地址方式。这时实参必须是同类型的变量名(包括简单变量、数组名、结构类型等),这时实参必须是同类型的变量名(包括简单变量、数组名、结构类型等),不能是常量、表达式。不能是常量、表达式。 (2)若不希望被调过程修改实参的值,则选择传值方式,这样可以减少各个)若不希望被调过程修改实参的值,则选择传值方式,这样可以减少各个过程的关联,增加程序的可靠性并便于调试。因为在被调过程体内对形参的过程的关联,增加程序的可靠性并便于调试。因为在被调过程体内对形参的改变不会影响实参。改变不会影响实参。 (3)如果形参是数组,则是地址传递。形参的改变都会修改实参。)如果形参是数组,则是地址传递。形参的改变都会修改实参。 (4)用)用Function过程可以通过过程名或过程可以通过过程名或Return语句返回值,但只能返回一个语句返回值,但只能返回一个值;值;Sub过程不能通过过程名返回值,但可以通过参数返回过程不能通过过程名返回值,但可以通过参数返回1个或多个值,这个或多个值,这时被调过程的相应参数要用传地址方式。时被调过程的相应参数要用传地址方式。8.4.4 8.4.4 传递方式的选择传递方式的选择 对于参数传递的使用方式没有硬性规定,一般进行以下考虑。对于参数传递的使用方式没有硬性规定,一般进行以下考虑。 (1)若要将被调过程中的结果返回给主调过程,则形参必须是传地址方式。)若要将被调过程中的结果返回给主调过程,则形参必须是传地址方式。这时实参必须是同类型的变量名(包括简单变量、数组名、结构类型等),这时实参必须是同类型的变量名(包括简单变量、数组名、结构类型等),不能是常量、表达式。不能是常量、表达式。 (2)若不希望被调过程修改实参的值,则选择传值方式,这样可以减少各个)若不希望被调过程修改实参的值,则选择传值方式,这样可以减少各个过程的关联,增加程序的可靠性并便于调试。因为在被调过程体内对形参的过程的关联,增加程序的可靠性并便于调试。因为在被调过程体内对形参的改变不会影响实参。改变不会影响实参。 (3)如果形参是数组,则是地址传递。形参的改变都会修改实参。)如果形参是数组,则是地址传递。形参的改变都会修改实参。 (4)用)用Function过程可以通过过程名或过程可以通过过程名或Return语句返回值,但只能返回一个语句返回值,但只能返回一个值;值;Sub过程不能通过过程名返回值,但可以通过参数返回过程不能通过过程名返回值,但可以通过参数返回1个或多个值,这个或多个值,这时被调过程的相应参数要用传地址方式。时被调过程的相应参数要用传地址方式。8.5 变量的作用域变量的作用域 根据变量作用域的不同可以把变量分为根据变量作用域的不同可以把变量分为: 语句块级变量语句块级变量 局部变量局部变量 模块级变量模块级变量 全局变量全局变量8.6 递归过程递归过程 递归就是一个过程自己调用自己的现象。递归调用中,一个过程执行的某递归就是一个过程自己调用自己的现象。递归调用中,一个过程执行的某一步要用到它自身的上一步(或上几步)的结果。一步要用到它自身的上一步(或上几步)的结果。 【例【例8-7】编写程序,计算】编写程序,计算n!。!。1,1!(1)! ,1nnn nnFunctionFac(ByValNAsInteger)AsDoubleIfN=1ThenFac=1ElseFac=N*Fac(N-1)EndIfEndFunction8.7 过程应用举例过程应用举例 【例【例8-8】二分法猜数。由读者想好一个介于】二分法猜数。由读者想好一个介于1,10000的整数的整数x,计算机猜,计算机猜一个数一个数y,用户根据,用户根据x和和y的关系做出提示:的关系做出提示:xy、x=y和和xx,则说明x在前半部,应把high置为mid-1继续猜中间值,即high=mid-1。若midx,则说明x在后半部,应把low置为mid+1继续猜中间值,即low=为mid+1。若mid=x,则成功8.7 过程应用举例过程应用举例 【例【例8-9】编写一个函数过程,用来实现将八进制数转换为等值的十进制数。】编写一个函数过程,用来实现将八进制数转换为等值的十进制数。8.7 过程应用举例过程应用举例 【例【例8-10】编写程序,计算】编写程序,计算100以内的所有孪生质数。质数是指除了以内的所有孪生质数。质数是指除了1和该数本身和该数本身,不能被任何整数整除的数。(孪生质数是指两个质数的差值为,不能被任何整数整除的数。(孪生质数是指两个质数的差值为2,例如:,例如:3和和5、5和和7、11和和13就是就是3对孪生质数)对孪生质数) 【例【例8-11】编写程序,实现英语单词或短语的加密、解密操作。】编写程序,实现英语单词或短语的加密、解密操作。本章小结 本章介绍本章介绍了过程和函数的定义和调用方法了过程和函数的定义和调用方法,然后,然后在参数传递中在参数传递中讲讲述述了传值和传地址的区别和选择方法了传值和传地址的区别和选择方法,最后讲述,最后讲述了变量的作用域了变量的作用域和递归过程的建立和递归过程的建立。 通过对本章的学习,从整体上通过对本章的学习,从整体上了解过程和函数的使用方法了解过程和函数的使用方法,培养,培养学生学生利用过程和函数解决实际问题的利用过程和函数解决实际问题的能力,加强学生能力,加强学生对模块化程对模块化程序设计思想的理解。序设计思想的理解。