首页计算机计算机软件VB程序设计 08 第8章 过程.pptx

08 第8章 过程.pptx

页数:51页文件大小:292.7 KB来源: VB程序设计ppt课件

本课件讲解VB中的过程,先说明通用过程的概念与作用,分别介绍Function函数过程与Sub过程的定义、创建与调用方式,重点分析形参与实参的按值传递与按地址传递,随后说明过程的嵌套调用与递归,并梳理VB工程结构及变量的作用域与生存期。

第8章 过程章节封面,标示本章主题与所讲授的主要内容
引例:求解阶乘组合,演示该题的界面设计与代码实现过程
8.1 Function过程讲解页,说明Rnd、Int、InputBox的定义、调用与返回值处理
查看本课件的文字版(共 51 页,供检索与复制)

第1页:第8章 过程

第8章 过程

第8章过程§8.1 Function(函数过程)§8.2 Sub过程(Sub过程)§8.3过程之间参数的传递§8.4过程嵌套的调用§8.5过程的递归调用§8.6 VB的工程结构§8.7变量的作用域

第2页:引例:求解阶乘组合

引例:求解阶乘组合

  • (1)Sub过程调用后无返回值;
  • (2)Function过程调用后返回一个值;
  • (3)Property、Event过程调用后可以返回和设置属性的值,也可以设置对象的引用,本章不予介绍。分类:Visual Basic中有四种过程:子程序(Sub)过程、函数(Function)过程、属性(Property)过程和Event事件过程

第3页:8.1 Function过程

8.1 Function过程

/函数前面用过Rnd、Int、InputBox等许多内部函数,它们能够根据提供的参数,执行了某些操作后返回一个函数值。这里可以通过Function过程来建立自己的函数8.1.1Function过程的定义Function过程定义的语法为:[Public|Private|Static]Function函数名([形参列表])[As类型][局部变量和常数声明][语句组][函数名=表达式]EndFunction

第4页:Function过程的说明

Function过程的说明

  • 2)Public、Private、Static、形参列表及变量和常量声明与前一节Sub过程定义相同。
  • 3)函数名:是Function过程的名称,在同一个模块中的Sub过程和Function过程不能有相同的名称。
  • 4)As类型:为可选项,表示函数的类型,决定函数返回值的数据类型。如果缺省则系统默认为Variant类型。8.1.1Function过程的定义8.1 Function过程/函数

第5页:函数返回值的写法

函数返回值的写法

5)函数名=表达式:为可选项,给函数名赋值语句,表达式的值就是函数的返回值,在Function过程内可以有多次给函数名赋值的语句,但返回值只有一个(即最后一个被执行的给函数名赋值的表达式的值)。

如果没有函数名赋值的语句,则根据该函数的类型不同返回不同的默认值:若是数值类型的,则返回“0”;若是字符串类型的,则返回空字符串。

但通常情况下,在过程结束语句“EndFunction”之前都有一条函数名赋值语句。6)EndFunction:定义Function过程的结束标志。

8.1.1Function过程的定义

第6页:8.1.2 Function过程

8.1.2 Function过程

  • 常量、变量或表达式
  • 各参数之间用逗号分隔
  • 如果是数组,在数组名之后要跟一对空括号。

第7页:求解阶乘组合示例

求解阶乘组合示例

例:求解阶乘N!/(M!*(N-M)!)

Private Sub Command1_Click() Dim n As Integer, m As Integer Dim doufact As DoubleDon = Val( InputBox("n:")): m = Val( InputBox(“m:")) Loop While n >= mdoufact =jc(n) /jc(m)(jc(n-m))text3 = Str(doufact) End Sub Private Functionjc(ByVal x As Integer) As Double Dim i As Integer, result As Doubleresult = 1Fori = 1 To xresult = result * i Next ijc= result End Function

第8页:8.2.1 Sub过程

8.2.1 Sub过程

一、Sub过程的概念Sub用过程不与任何事件过程相联系,也不依附于任何对象,只能由别的过程来调用。它即可以存储在窗体模块中,也可以存储在标准模块中。

在程序中使用Sub过程是结构化程序设计的一个重要思想。对于那些与事件没有直接关系而且又要在多个过程中引用的程序段,最好的方式是将其定义为Sub过程,这样既可以简化程序,同时又可以提高程序的可读性和可维护性。

8.2 Sub过程与事件过程

第9页:Sub过程的创建

Sub过程的创建

  • ①若没有指定Private等关键字,则默认的是Public;即在其它模块中也能调用此过程;
  • ②由Static定义后,过程体中所有的局部变量都相当于静态变量;
  • ③过程名的长度不超过40个字符,命名规则与变量名的命名规则相同;
  • ④要提前退出Sub可用ExitSub。
  • ⑤使用“添加过程”对话框建立过程的首尾两行!方法:进入代码窗口后打开“工具”菜单中的“添加过程”对话框。8.2.1 Sub过程

第10页:形式参数列表的定义

形式参数列表的定义

  • ①类型可以是Byte、Integer、Long、Single、Double、Boolean、Date、String(变长)、Variant、Object等类型。
  • ②形参可以是数组。[Private | Public] [Static]Sub <过程名>([形式参数表])8.2.1 Sub过程

第11页:Sub过程的调用

Sub过程的调用

  • ①使用Call语句:Call<过程名>([<实参表>])
  • ②直接使用过程名:<过程名>[(实参表)]2.注意事项:在调用子过程语句中,不仅要求实参个数与被调用子过程形参个数一致,而且要求实参表的参数类型与被调用子过程形参表中的参数类型完全一致。3.调用实例:例题8-11、8-12(1
  • 43)8.2.1 Sub过程

第12页:8.2.2 事件过程

8.2.2 事件过程

  • ①控件的事件过程语法:[Private|Public]Sub<控件名>_<事件名>([形参表])语句组(过程体)EndSub
  • ②窗体的事件过程语法:[Private|Public]SubForm_<事件名>([形参表])语句组(过程体)EndSub
  • ③注意事项:
  • 若没有指定Private或Public,则默认的是Public!
  • 不要自己输入事件过程的首尾两行,用模板建立!!!
  • 默认事件的首尾两行也可以在窗体中直接双击对象即可得到。
  • 如果控件名称改变,则对应的事件过程名称也要作相应调整。8.2 Sub过程与事件过程

第13页:通用过程与事件过程的关系

通用过程与事件过程的关系

事件过程1事件过程2Sub过程、函数过程事件过程对Sub过程和函数过程的调用:事件过程和通用子过程具有相同的格式和调用方法。

8.2.2事件过程8.2 Sub过程与事件过程

第14页:模块间数据传递的方式

模块间数据传递的方式

  • 通过过程调用实参与形参的结合实现;
  • 使用全局变量来实现各过程中共享数据。8.3.1形式参数与实际参数1、形式参数是指在定义Sub过程时,出现在Sub或Function语句中的变量名后面园括号内的数,是用来接收传送给子过程的数据,形参表中的各个变量之间用逗号分隔。8.3过程之间的参数传递

第15页:2、实际参数

2、实际参数

实际参数的定义
在调用Sub或Function过程时,写入子过程名或函数名后括号内的参数,其作用是将它们的数据(数值或地址)传送给Sub或Function过程与其对应的形参变量。实参可由常量、表达式、有效的变量名、数组名(后加左、右括号,如A())组成,实参表中各参数用逗号分隔。3参数传递(虚实结合)参数传递指主调过程的实参(调用时已有确定值和内存地址的参数)传递给被调过程的形参,参数的传递有两种方式:按位置传送和指名传送。

第16页:8.3.1形式参数

8.3.1形式参数

与实际参数按位置传送:指名传送:用“:=”把形参和实参连接起来。过程调用:Call TestSub( A% , B!,"Test")过程定义:Sub TestSub( P1 %, p2 !, p3 As String)Sub Add_num( var1%,var2%,var3%)c=(var1+var2)*var3print c

End SubAdd_num 4, 6,8Add_num var2:=6,var1 :=4, var3:=88.3过程之间参数的传递

第17页:8.3.2 传值与传址

8.3.2 传值与传址

8.3.2传值与传址传址:形参得到的是实参的地址,当形参值的改变同时也改变实参的值。传值:形参得到的是实参的值,形参值的改变不会影响实参的值。

8.3过程之间参数的传递形参前缺省或加“ByRef”关键字的为按地址传递,加“ByVal”关键字的是按值传递,

第18页:8.3.2 传值与传址(代码)

8.3.2 传值与传址(代码)

Private Sub CmdOK_Click()a% = 10: b% = 20: Swap1 (a, b) '传值 Print "A1="; a, "B1="; ba % = 10: b % = 20: Swap2(a, b)‘传址 Print "A2="; a, "B2="; b End Sub Sub Swap1(ByValx%, ByValy%) Dim Temp%Temp = x: x = y: y = Temp EndSub Sub Swap2(Byrefx%, y%) Dim Temp%Temp = x: x = y: y = Temp End Sub

第19页:按值与按地址传递的对比

按值与按地址传递的对比

通过值传递的执行过程如下图:通过地址传递数据的执行过程

第20页:8.3.3可选参数

8.3.3可选参数

在过程参数列表中,可以指定一个或多个参数为可选参数,在调用时可有选择的向指定的可选参数传送或不传送数值。使用方法为可选参数前加Optional及使用Ismissing函数测试是否传送可选参数。

Sub Multi (fir %,sec%,OptionalThird)N=fir*secIf NotIsmissing(Third) thenN=N*Third

End If Print n End Sub Private Sub Form_Click()Multi 10,20End sub Private Sub Form_Click()Multi 10,20,30End sub8.3过程之间参数的传递

第21页:可选参数的IsMissing测试

可选参数的IsMissing测试

8.3.3可选参数可选参数过程通过Optional指定可选的参数,其类型必须是Variant,通过Ismissing函数测试是否可选参数传送实参值。

Ismissing函数有一个参数,它就是由Optional指定的形参的名字,其返回值为Boolean类型。在调用过程时,如果没有向可选参数传送实参,则Ismissing函数的返回值为True,否则返回值为False。

8.3过程之间参数的传递

第22页:8.3.4不定数量的参数

8.3.4不定数量的参数

在过程调用时可向过程传送任意个数、任意类型的参数。格式:Sub过程名(ParamArray数组名)Sub Multi (ParamArrayNumber())n=1For EachxInNumbersn=n*xNext xPrint n

End Sub Sub Form_Click( )Multi 2,3,4,5,6 End Sub可变参数过程实际上把所有的参数传递给了一个数组,该数组为动态数组。8.3过程之间参数的传递

第23页:8.3.5 对象参数

8.3.5 对象参数

8.3.5对象参数将窗体或控件作为Sub过程的参数进行传递和使用。Sub FormSet ( Formnum AsForm)Formnum.left=2000Formnum.Top=3000Formnum.Width=5000Formnum.Height……

End Sub Sub Form_ClickForm Set Form1Form Set Form2…… End Sub(1)窗体参数8.3过程之间参数的传递

第24页:(2)控件参数

(2)控件参数

Sub Fontout ( TestContrlAs Control)TestContrl.FontSize=四号TestContrl.FontName="隶书"……TestContrl.Text=“VB6.0"

End Sub Sub Form_ClickFontout Text1Fontout Text2 End Sub8.3过程之间参数的传递8.3.5对象参数

第25页:参数传递方式小结

参数传递方式小结

1.参数的数据类型2.按值传递参数:形参是实参的一个副本3.按地址传递参数:形参实参公用内存单元4.子过程执行一系列操作,函数过程返回一个值5.如果实参是常量(系统常量、符号常量)或者表达式,则无论定义时使用值传递还是地址传递,都是按值传递将常量或者表达式的计算值传递给形参。

参数传递的几点说明:8.3过程之间参数的传递

第26页:8.4 过程的嵌套调用

8.4 过程的嵌套调用

在程序中调用一子过程,而在子过程中又调用另外的子过程,这种程序结构称为过程的嵌套。过程的嵌套调用执行过程如下图:8.4过程的嵌套调用

第27页:8.5 递归的概念

8.5 递归的概念

用自身的结构来描述自身,称递归。例如,对阶乘的定义
Visual Basic允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。8.5过程的递归调用

第28页:8.5 递归的概念(代码)

8.5 递归的概念(代码)

  • 1)EndIfEndFunctionPrivateSubForm_Click()Print“fac
  • (4)=”;fac
  • (4)EndSub例编求阶乘fac(n)=n!的递归函数8.5过程的递归调用

第29页:递归的执行过程

递归的执行过程

  • (4) = 4 * f
  • (3)f
  • (3) = 3 * f
  • (2)f
  • (2) = 2 * f
  • (1)f
  • (1) = 1回归过程:然后从栈中弹出当前参数,直到栈空。f
  • (1) =1f
  • (2) =2 * f
  • (1) = 2 * 1f
  • (3) =3 * f
  • (2) = 3 * 2*1f
  • (4) =4 * f
  • (3) = 4 * 3*2*1

第30页:递归的两个必要条件

递归的两个必要条件

  • (1)存在递归结束条件及结束时的值;
  • (2)能用递归形式表示,且递归向终止条件发展。程序的递归过程:递归算法设计简单,解决同一问题,使用递归算法消耗的机时和占据的内存空间要比使用非递归算法大。

第31页:例:用递归求最大公约数

例:用递归求最大公约数

例利用递归求最大公约数

Public Functiongcd(m As Integer, n As Integer) As Integer If (m Mod n) = 0 Thengcd= n Elsegcd=gcd(n, m Mod n) End If End Function Private Sub Form_Click() Print gcd(10, 4) End Sub

第32页:8.6 VB工程结构

8.6 VB工程结构

VB应用程序由三种模块组成:窗体模块(Form) (文件扩展名.frm)标准模块(Module) (文件扩展名.bas)类模块(Class) (文件扩展名.cls)应用程序工程文件(.vbp)窗体模块(.frm)文件类模块(.cls)文件标准模块(.bas)文件事件过程Function过程Sub过程Property过程

第33页:1.窗体模块

1.窗体模块

  • 事件过程
  • 通用过程
  • 通用声明(常量、变量、数组、外部过程)2.可以用文本编辑器查看窗体模块查看方法:右击.frm文件,选择打开方式为记事本显示:描述信息及程序代码8.6.1窗体模块

第34页:标准模块的引入

标准模块的引入

当一个应用程序含有多个窗体时,可能其中的几个窗体都需要调用某一段公共代码,如果在每个窗体内都包含这些代码,就会造成大量的代码冗余,这时就可以在标准模块内建立一个包含此公共代码的通用过程,实现代码的共享。

标准模块不对应于某个窗体、是纯代码模块。标准模块可以包含:全局常量、变量、全局过程标准模块级常量、变量、通用过程注:不能包含事件过程添加:工程→添加模块→选“新建”标签→打开“添加模块”对话框。

默认名字:ModuleX8.6.2标准模块

第35页:类模块的概念

类模块的概念

类是具有相同或相似特征的事物的集合,类封装了对象的属性(数据成员)和方法(处理数据的函数或过程)。程序员一般不对类进行操作,而只能对类的实例——对象进行操作。

Visual Baisc所使用的每种控件都对应着一个类,如Button按钮控件对应着Button类,它们支持封装和多态性,但它们不支持继承,即不能从现有的类(控件)来创建新的类(控件)。

有时用户需要创建自己的类以实现特定的功能,则可以通过类模块创建自己的类。类模块文件的的扩展名为.cls。*8.6.3类模块

第36页:设置启动窗体

设置启动窗体

缺省情况下,应用程序中的第一个窗体为启动窗体,如果想在应用程序启动时首先显示其它窗体,那么就得在“工程属性”对话框中改变启动窗体的名称。

有时,有些应用程序启动时需要先做一些初始化工作,如装入数据文件,然后再根据数据文件的内容决定显示哪个窗体;有时应用程序根本就不需要加载窗体(比如一些监控程序)。

为此,可以在标准模块中编写一个main过程,作为应用程序的入口。定义sub main过程为启动程序的步骤:“工程”→“工程属性”→选择“通用”选项卡→在“启动对象”下拉列表框中选择“SubMain”。

8.6.4 Sub Main过程

第37页:过程的作用域

过程的作用域

过程的建立位置不同,允许被访问的范围也不同。作用域:模块级、全局级1.模块级过程:在过程前如果加Private关键字,则这种过程只能被其所在的模块中的其他过程所调用。

2.全局过程:在过程前如果加Public关键字(或省略),则这种过程可以被其他模块中的过程所调用。调用格式:模块名.过程名(参数表)注意:标准模块中的全局过程名如果唯一,则调用时可以省略模块名8.6.5过程的作用域

第38页:全局过程调用示例

全局过程调用示例

例:设窗体Form1中有按钮: Command1、Command2

Public Sub aa()' aa为全局过程 MsgBox ("这是窗体Form1中的过程") End Sub Private Sub Command1_Click() Call aa End Sub Private Sub Command2_Click()Form2. Show End Sub可以省略添加标准模块Module1,编写以下过程: Public Sub bb()' bb为全局过程 MsgBox ("这是标准模块中的过程bb") End Sub可以省略

第39页:跨窗体调用示例

跨窗体调用示例

设窗体Form2中有按钮: Command1、Command2

Private Sub Command1_Click() Call Form1.aa End Sub Private Sub Command2_Click() Call Module1.bb End Sub不可以省略可以省略

第40页:8.7变量的作用域

8.7变量的作用域

与生存期变量的作用域:指变量的有效范围。变量的生存期:指变量的作用时间。8.7.1变量的作用域将变量分为:局部变量模块级变量全局变量模块级变量……全局变量局部变量…………模块过程

第41页:1.局部变量

1.局部变量

•声明不声明DimA As Integer' A每次执行过程时被初始化StaticC As Single' C在应用程序执行期间保持不变•作用范围仅在声明的过程中起作用其他过程中即使有同名变量,也不是指同一变量。

第42页:局部变量示例

局部变量示例

例:Sub S()X = 1Y = 2Z = X + YPrint X, Y, Z

End Sub Private Sub C1_Click()X = 2Y = 3Z = X + Y Call S Print X, Y, Z End Sub单击C1后运行结果:1 2 32 3 5局部变量局部变量

第43页:2.模块级变量

2.模块级变量

  • 作用范围在该模块的所有过程中都起作用其他模块不能访问这些变量3.全局变量
  • 声明在模块的通用声明段中用以下方法声明的变量Public'应用程序运行时被初始化
  • 作用范围:应用程序的所有过程

第44页:模块级变量示例

模块级变量示例

例:Dim Z As IntegerSub S()Z = Z + 2Print Z

End Sub Private Sub C1_Click()Z = Z + 2 Call S Print Z End Sub第一次单击C1结果:44第二次单击C1结果:88第三次单击C1结果:1212模块级变量模块级变量

第45页:同名局部变量示例

同名局部变量示例

例:Dim Z As IntegerSub S()Dim ZZ = Z + 2Print Z

End Sub Private Sub C1_Click()Z = Z + 2 Call S Print Z End Sub第一次单击C1结果:22第二次单击C1结果:24第三次单击C1结果:26模块级变量局部变量

第46页:8.7.2 变量的生存期

8.7.2 变量的生存期

8.7.2变量的生存期静态变量:在应用程序执行期间保留不变动态变量:在所在的模块(过程)运行时被初始化单击按钮打印结果:55110StaticSub SS1()'局部变量I,S为静态变量For I = 1 To 10S = S + INext IPrint S

End Sub Private Sub Command1_Click() Call SS1 Call SS1 End Sub

第47页:静态变量示例

静态变量示例

例:Sub S()Static Z As IntegerZ = Z + 2Print Z

End Sub Private Sub C1_Click() Dim Z As IntegerZ = Z + 2 Call S Print Z End Sub第一次单击C1结果:22第二次单击C1结果:42第三次单击C1结果:62静态变量动态变量

第48页:本章小结

本章小结

1.函数过程的定义
和调用定义:[Public | Private ] [Static] Function<函数名>[(<形参表>)][As<类型>]……[函数名=表达式]……
End Function形参表:变量、数组名()调用:函数名(<实参表>)出现在表达式可以出现的位置

第49页:第8章 小结(续)

第8章 小结(续)

2. Sub过程的定义
和调用定义:[Private | Public ] [Static] Sub <过程名>([<形参表>])……
End Sub调用:(1)Call<过程名>([<实参表>])(2)<过程名> [<实参表>]注意:Sub过程调用与函数过程定义与调用的区别

第50页:第8章 小结(续2)

第8章 小结(续2)

3.过程之间的参数传递按值传递:实参为常数、表达式;实参为变量,形参为ByVal变量按地址传递:实参为变量、数组;形参用ByRef定义的变量、数组(或省略ByRef)4.过程的嵌套调用*5.过程的递归调用6. VB工程结构窗体模块(Form) (文件扩展名.frm)标准模块(Module) (文件扩展名.bas)Sub Main过程类模块(Class) (文件扩展名.cls)

第51页:第8章 小结(续3)

第8章 小结(续3)

7.过程的作用域模块级过程;全局级过程8.变量的作用域局部变量(过程级);模块级变量;全局变量9.变量的生存期动态变量;静态变量

顶部目录