过程与函数 (2).ppt
《过程与函数 (2).ppt》由会员分享,可在线阅读,更多相关《过程与函数 (2).ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、关于过程与函数(2)现在学习的是第1页,共45页根据结构化程序的设计思想,在程序设计过程中,通常应根据程序实现的主要功能,将复杂的应用问题,分解成一个个相对简单的问题去解决,每一个简单问题通过一段相对独立的程序段实现,或者将程序中需要多处调用的程序段独立出来,编写为一个独立的子程序,以简化程序对某部分功能的引用。子程序一旦定义好,就可以被程序任意调用。调用程序与被调用程序之间的数据交换通过参数传递实现。在VB中,子程序被称为过程。VB的整个应用程序是由过程组成的。VB中的过程分为事件过程和通用过程两大类。VB程序设计的特点就是采用了事件驱动机制,事件过程构成VB应用程序的主体。当发生某个事件(
2、如Click,Load,Change)时,对该事件做出响应的程序段,就是事件过程。有时,多个不同的事件过程可能需要使用同一段程序代码,就可以将这段代码独立出来,这样的过程叫做“通用过程”,它独立于事件过程之外,供事件过程或通用过程调用。VB根据过程是否返回值,将通用过程分为子程序(Sub)过程和函数(Function)过程两类。函数过程通常要返回值。现在学习的是第2页,共45页7.1 通用过程7.1.1 事件过程与通用过程1.事件过程事件过程由VB系统自行声明的过程,用户不能增加或删除。当用户对某个对象发出一个动作时,Windows会通知VB产生了一个事件,VB会自动地调用与该事件相关的事件过
3、程。控件事件过程的语法为:Private Sub控件名控件名_事件名事件名(形参列表形参列表)语句组语句组End Sub窗体事件过程的语法为:Private Sub Form_事件名事件名(形参列表形参列表)语句组语句组End Sub2.通用过程通用过程不与任何特定的事件相联系,只能由别过程来调用,它可以存储在窗体或标准模块中。现在学习的是第3页,共45页7.1.2 通用过程的定义过程定义的一般格式:StaticPrivatePublicSub 过程名过程名(参数列表参数列表)语句块语句块 Exit Sub 语句块语句块End Sub说明:过程名:命名规则与变量名相同。参数列表:过程被调用时传
4、送给该过程的形式参数表,可以是简单变量名或数组名,各名字之间用逗号隔开。“参数列表”指明了调用时传给该过程的参数类型和个数。每个参数的格式为:ByVal变量名 As 数据类型ByVal表明该参数是“传值”(Passed by Value)参数,不加此项,则该参数是“传址”(Passed by reference)参数。过程可以有参数也可以不带任何参数。没有参数的过程称为无参过程。Sub过程以Sub开头,以End Sub结束,在其间的语句块称为“过程体”。Static:是指过程中的局部变量在内存中的存储方式。Private:表示Sub过程是私有过程,它只能被本模块中的其它过程访问,而不能被其他模
5、块中的过程访问。Public:表示过程是公有过程,可以在程序的任何地方调用它。过程体可以用一个或多个Exit Sub语句从过程中退出。现在学习的是第4页,共45页7.1.3 创建通用过程 Sub过程不属于任何一个事件过程,独立于事件过程之外,因此不能放在事件过程中,必须在模块中定义。可以在标准模块中建立,也可以在窗体模块中建立。1.在标准模块中创建Sub过程 选择【工程】/【添加模块】,打开“添加模块”对话框。在“添加模块”对话框中选择【新建】选项卡,选择“模块”,打开模块代码窗口。在窗口内键入Sub和过程名Display,然后按回车键,VB系统会自动在过程名后加一对圆括号并将End Sub语
6、句写入下一行,如图 7-1所示。在Sub和End Sub之间即可输入该过程中的语句。或在“添加模块”对话框中或选择【现存】选项卡,打开“打开文件”对话框,可以用此方法将已存在的模块加载进来。图7-1 模块代码窗口现在学习的是第5页,共45页2.在窗体模块中创建Sub过程 双击窗体进入代码窗口,在“对象”列表中选择“通用”,此时“过程”列表中出现“声明”。在代码窗口内键入Sub和过程名,然后按回车键,系统会自动在过程名后加一对圆括号并将End Sub语句写入下一行,如图7-2所示。则Sub和End Sub之间即是过程体所在。图7.2 模块代码窗口现在学习的是第6页,共45页7.1.4 调用Sub
7、过程调用过程即引起过程的执行。Sub过程的调用有两种方式:用Call语句调用SUB过程Call 过程名(实际参数列表)把过程名作为一个语句来使用过程名 实际参数列表调用Sub过程必须是一个独立的语句,不能在表达式中调用Sub过程。例例7.1 编写一个计算矩形面积的Sub过程,然后调用该过程计算矩形面积。设计步骤如下:(1)建立应用程序用户界面并设置对象属性,如图7-3所示。图7-3 建立计算矩形面积的用户界面现在学习的是第7页,共45页(2)在代码窗口中直接输入通用事件代码。Sub recarea(rlen,rwid)Dim area area=rlen*rwid 计算矩形面积 MsgBox
8、矩形的面积是:&area 用消息框输出矩形面积End Sub(3)编写窗体Form的单击Click事件代码。Private Sub Form_Click()Dim a,b a=InputBox(“请输入矩形面积的长度:”)用输入框输入矩形的长 b=InputBox(“请输入矩形面积的宽度:”)用输入框输入矩形的宽 recarea a,b 调用recarea过程,也可以改为Call recarea(a,b)End Sub如图7-4所示,编写子过程与窗体的事件过程代码。现在学习的是第8页,共45页图7-4 子过程与窗体的事件过程代码现在学习的是第9页,共45页(4)运行工程。单击标准工具栏中的“启
9、动”按钮,运行工程,单击窗体,依次输入矩形的长、宽求得矩形面积。图7-5显示了最终结果。图7-5 矩形面积的计算结果现在学习的是第10页,共45页7.2 函数过程在数学中,函数(function)是一个因变量与一些自变量的函数对应关系。Visual Basic中的函数同样表达了这种关系。函数需要用户用一个过程来定义该函数,且需要一个返回值,可以说函数是一种带有返回值的过程。函数值可以用在表达式中。7.2.1 函数的定义函数的定义格式:StaticPrivatePublicFunction 过程名(参数表)As 类型 语句块 Exit Function 语句块过程名=表达式End Functio
10、n说明:若Function过程中省略“过程名=表达式”,则该过程返回一个默认值:数值函数过程返回一个0值,字符串函数过程返回空字符串。函数定义不能嵌套。现在学习的是第11页,共45页7.2.2 函数的调用由于Function过程能返回一个值,因此完全可以把它看成是用户定义的一个类似于VB内部函数的函数。Function过程的调用与调用VB内部函数方法相同。其格式为:函数过程名(参数表)函数若不使用返回值,可以使用Call来调用。例例7.2 编写求矩形面积的自定义函数。在代码窗口中直接输入下面的代码:Public Function area(a As Integer,b As Integer)A
11、s Long area=a*b 计算并返回函数值End Function例例7.3 计算任意整数n的阶乘的Function过程fact:Function fact(x As Integer)As Long Dim p As Long,i As Integer p=1 For i=1 To xp=p*i 累乘 Next i fact=p 返回函数值End Function例例7.4 利用Function函数求矩形面积。直接调用例7.2的area函数,代码如下:现在学习的是第12页,共45页Private Sub Form_Load()Show Label3.Caption=area(5,6)通过
12、实参,调用area函数,输出End Sub图7-6 函数过程及调用现在学习的是第13页,共45页7.3 过程调用中的参数传送形参与实参之间的数据传递是调用过程和返回过程运算结果的桥梁。在过程被调用之前,所有形参既没有具体的存储地址也无具体的值,只是起到模板的作用。当程序流程转向执行过程时,实参和形参按一定方式结合,形参获取了相应的值后执行过程体,过程的运算结果还可通过形参带回到主程序。在调用一个过程时,必须把实际参数传送给过程,完成形式参数与实际参数的结合,用实际参数执行调用的过程。形参与实参形式参数是在Sub或Function过程的定义中出现的变量名,实际参数则是在调用Sub或Functio
13、n过程时传送给Sub或Function过程的常数、变量、表达式或数组。在定义通用过程时,形式参数为实际参数预留位置,而在调用过程时,实际参数则按位依次传给形式参数。形参表与实参表对应的变量名不必相同,但变量个数必须相等,相应的类型必须相同。传值与传址在VB中,参数通过两种方式传送,即传地址和传值。传地址(默认方式,可以使用关键词ByRef)习惯上称为“引用”,就是让过程根据变量的内存地址去访问变量的内容,即形参与实参共用相同的单元地址。这意味着,如果过程中改变了变量值,就会将结果带回到调用它的上级程序或过程,引起实参值的改变。此时过程中使用的变量是实际传送的变量本身,当通过引用来传送实参时,有
14、可能改变传送给过程的变量的值。传值方式用关键词ByVal。它将变量或表达式的值复制一份,并将值传送给过程。因为所有的变化都是在变量的副本上进行的,所以不会改变原来变量的值。现在学习的是第14页,共45页7.3.1 参数传递1.传地址方式传地址是VB默认的参数传递方式。在这种方式下,将实参的存储地址传给形参,使形参与实参共用同一存储单元,因此在过程中对形参的任何操作实质都是对相应实参的操作。要实现传地址方式可体现在过程定义和过程调用中。在过程定义时,形参前省略关键字ByRef(或加ByRef显式说明);在过程调用时,对应位置的实参是相同类型的变量或数组名。实参为常数或表达式是无法实现地址传递的。
15、采用传地址方式进行参数传递时需要注意以下问题:当实参为变量时,参数传递时是把变量的地址传递给形参,使实参与形参共享同一存储单元。当实参为数组时,参数传递时是把数组的存储地址传递给形参,使实参数组与形参数组共享同一存储区域。编写过程定义时,形参中数组名只须带括号,不指定元素个数;编写过程调用语句时,实参数组名既无括号,也不能指定元素个数。实际编程中,可以利用传地址方式获得过程中处理的结果,例如:例例8.5 s=5!+10!+14!,编程求s的值。分析:完成累加过程,需要求不同数的阶乘3次,可以编写一个Sub过程,求任意个整形数n的阶乘,以供主程序中多次调用。定义过程时需要设置2个形参,一个用于传
16、入N值,另一个用于存放计算结果。程序代码如下:现在学习的是第15页,共45页Sub fact(n As Integer,f As Double)Dim i As Integer f=1 For i=1 To n f=f*i Next iEnd Sub Private Sub Command1_Click()Dim m As Integer,s As Double,x As Double m=5:Call fact(m,x)s=s+x m=10:Call fact(m,x)s=s+x m=14:Call fact(m,x)s=s+x Print 5!+10!+14!=&sEnd Sub利用传地址
17、方式可以很方便地获得过程的处理结果。例例8.6 编写求两个整数的最大公约数过程,并在主程序中调用该过程求两个数的最大公约数,并根据最大公约数求最小公倍数。分析:要求两个整数的最大公约数,需要过程在过程定义中设置2个形参用于接收这两个整数,再设置1个参数用于存放过程中得到的最大公约数。代码如下:现在学习的是第16页,共45页Sub gys(m As Integer,n As Integer,t As Integer)Dim r As Integer Do r=m Mod n If r=0 Then Exit Do m=n n=r Loop t=nEnd Sub在Command1_Click单击调
18、用gys,代码如下:Private Sub Command1_Click()Dim a As Integer,b As Integer,x As Integer,y As Integer a=16:b=12 Call gys(a,b,x)y=a*b/x Print 最大公约数为:&x Print 最小公倍数为:&yEnd Sub运行结果“最大公约数为:4”,“最小公倍数为:12”。现在学习的是第17页,共45页这个结果显然不对,为什么呢?下面进行分析:在本例中,过程gys定义时形参个数为3个,其中前2个形参用于接受运算对象,第3个形参用于返回运算结果,所有的形参前均省略了关键字ByRef;过程
19、调用时实参为变量,因此在过程调用时,参数传递方式为传地址方式,过程中对形参m、n和t的处理,实际上就是对实参a、b和x的处理。过程中m、n的值发生了变化,就造成了调用过程前a和b的值与调用过程后a和b的值是不相同的。根据最大公约数和调用过程结束后的a、b值,计算得到的最小公倍数是错误的。如何使形参改变了的值不会影响对应位置的实参?VB提供了另一种传递参数的方式传值方式。2.传值方式当以传值方式调用一个过程时,形参拥有独立的存储单元,实参只是将值复制给形参。被调过程的操作是在形参自己的存储单元中进行,如果形参的值被改变了,对应位置的实参值不会受任何影响。当过程调用结束时,形参所占用的存储单元也同
20、时被释放。实现传值方式也可体现在过程调用和过程声明中。(1)在过程调用时,如果实参为常量、表达式或为带括号的变量,参数传递是按传值方式进行的。(2)定义过程时,如果形参前加ByVal关键字。调用过程时,不管实参以何种形式,参数传递均采用传值方式。现在学习的是第18页,共45页在例8.6 中,如果过程定义为格式2:Sub gys(ByVal m As Integer,ByVal n As Integer,t As Integer)Dim r As Integer Do r=m Mod n If r=0 Then Exit Do m=n n=r Loop t=nEnd Sub调用该过程时,无论实参
21、是何种形式,形参m和n接受的是实参的值,过程调用时参数传递方式为传值方式,过程中m和n值的改变都不会影响相应位置的实参。例例8.7 分别用传地址方式和传值方式编写交换两个整数的过程并调用。Sub swap1(ByVal x As Integer,ByVal y As Integer)Dim t As Integer t=x:x=y:y=tEnd SubSub swap2(x As Integer,y As Integer)Dim t As Integer t=x:x=y:y=tEnd SubPrivate Sub Command1_Click()现在学习的是第19页,共45页Dim a As
22、Integer,b As Integer a=3:b=4 swap1 a,b 调用传值方式过程 Print a=&a&,b=&b a=5:b=6 swap2 a,b 调用传地址方式过程 Print a=&a&,b=&bEnd Sub运行程序可以看到,过程swap1不能实现变量值的交换,这是因为它采用的是传值方式,过程中交换的是形参x和y的值,交换的结果不会影响实参a和b;而过程swap2采用的是传地址方式,形参与实参共用同一存储单元,过程中对形参的交换实际上就是在交换实参,所以可以完成对两个变量值的交换。现在学习的是第20页,共45页7.4 变量、过程的作用域VB的应用程序由若干个过程组成,这
23、些过程一般保存在窗体文件(.frm)或标准模块文件(.bas)中。变量是过程代码中必不可少的,一个变量、过程所处的位置不同,可被访问的范围也不同。变量、过程可被访问的范围称为变量、过程的作用域。7.4.1模块模块(Module)是相对独立的程序单元。在VB中主要有三种模块,即窗体模块(Form)、标准模块(Module)和类模块(Class)。所有的过程都放在模块之内。每一个模块都存入一个文件。窗体模块(.frm)窗体模块是大多数应用程序的主体。窗体模块包含窗体及其控件的属性设置、有关窗体的事件处理过程、通用过程,窗体级的常量、变量、类型定义以及外部过程的声明。标准模块(.bas)标准模块由程
24、序代码组成,它包含一些通用的过程,可以包含公有或模块级的变量、常数、类型、外部过程和全局过程的全局声明或模块级声明。类模块(.cls)类模块是用来定义类对象的,这些新对象可以包含自定义的属性和方法,可以在应用程序的过程内使用。现在学习的是第21页,共45页7.4.2 过程的作用域一个VB的应用程序由若干个窗体和标准模块组成,每一个窗体可由若干个事件过程和自定义过程组成;每一个标准模块也可由若干个自定义过程组成,其结构如图7-7所示。过程的作用域分为窗体(又称模块)级和全局级两种。1窗体(模块)级过程窗体级过程是指在窗体或标准模块通用声明段定义的、用Private关键字限制的过程,这类过程只能在
25、所属的窗体或标准模块中被其它过程调用。例如:在窗体1的通用段中定义一个窗体级过程fact,分别被窗体下的Command1_Click()和Form_Click()所调用。Private Function fact(ByVal n As Integer)As Double图7-7 VB应用程序组成有一个或若干个标准模块(.bas)文件自定义Sub过程自定义Function过程若干个窗体模块(*.frm)文件事件过程(Sub)自定义Sub过程自定义Function过程应用程(.vbp)现在学习的是第22页,共45页 Dim p!,i%p=1 For i=1 To n p=p*i Next i fa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 过程与函数 2 过程 函数
限制150内