第六章 过程与模块_第1页
第六章 过程与模块_第2页
第六章 过程与模块_第3页
第六章 过程与模块_第4页
第六章 过程与模块_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章过程与模块6.1过程6.2模块6.1过程一、函数过程的定义和调用二、子过程的定义和调用三、参数传递四、变量、过程的作用域五、递归六、SubMain过程在前面几章中,已经使用了系统提供的内部函数和事件过程。在程序的编写中,对于较复杂的问题,按照结构化程序设计的原则,可把问题逐步细化,分成若干个功能模块,通过VB提供的自定义过程将功能模块定义成一个个过程,供事件过程多次调用。在VB中自定义过程有4种:以SUB保留字开始的子过程以Function保留字开始的函数过程以Property保留字开始的属性过程以Event保留字开始的事件过程本章介绍子过程和函数过程一、函数过程的定义和调用1.函数过程的定义:自定义函数过程有两种方法:★利用“工具”菜单下的“添加过程”命令定义,步骤为:代码窗口工具添加过程名称框函数过程名类型框函数范围公有的★利用代码窗口直接定义在窗体/标准模块的代码窗口把插入点放在现有过程之外,直接输入函数过程。自定义函数过程的形式如下:Function函数过程名([参数列表])[As类型] 局部变量或常数定义 语句块 [ExitFunction]

语句块

函数名=返回值EndFunction说明:☆函数过程名—与变量命名规则相同。但不要和VB中的关键字、API函数及同一级别的变量重名。☆

As类型—函数返回值的类型☆参数列表—形式为:[ByVal]变量名[()][As类型][,…]参数也称为形参或哑元,只能是变量或数组名(要加()),在定义时没有值。

ByVal—表示该过程被调用时,参数是值传递(传值),否则是引用传递(传址)。函数过程无参数时,函数过程名后面的括号不能省略。☆在函数体内函数名至少要赋值一次。☆[ExitFunction]—表示退出函数过程☆[Static(静态)][Public(全局)][Private(局部)]—分别声明了函数的作用域2.函数过程的调用函数过程的调用和标准函数的调用相同,形式如下:

变量=函数过程名([参数列表])注意:☆由于函数过程名返回一个值,故函数过程不能作为单独的语句加以调用,必须作为表达式或表达式中的一部分,再配以其他的语法成分构成语句。

☆“参数列表”称为实参或实元,它必须与形参保持个数、类型与位置一一对应。实参可以是同类型的常数、变量、数组元素或表达式。

☆调用时把实参的值传递给形参,称为参数传递。其中,值传递(形参前面有ByVal)时实参的值不随形参的值变化而改变,而引用传递(又称地址传递)的实参的值随形参的值一起变化。

☆当参数是数组时,形参与实参在参数声明时应省略其维数,但必须保留括号。3.函数过程的应用举例例li6-1已知5边形的各条边的长度和2条对角线的长度,计算5边形的面积。s3abcdefgs2s1计算三角形面积的公式为:计算3个三角形,使用的公式相同,不同的仅仅是边长,因此先定义一个求三角形面积的函数过程,然后调用该函数求5边形的面积。 二、子过程的定义和调用子过程的定义 子过程定义的方法和函数过程相同,形式如下: Sub子过程名[(参数列表)] 局部变量或常数定义 语句块 [ExitSub]

语句块EndSub其中,子过程名、参数列表规定与函数过程相同,但当形参没有时,括号也不保留。2.子过程的调用子过程的调用是一句独立的调用语句,有两种形式:

Call子过程名[实参列表]

子过程名[实参列表]前者用Call关键字时,若有实参,则实参必须加圆括号括起来;若无实参,圆括号省略。后者无Call关键字,故圆括号也省略。注意:如果实参要获得子过程的返回值,则实参只能是变量,不能是常数、表达式,也不能是控件名。例li6-3:分别编写计算某级数部分和的函数过程和子过程,并分别调用,求级数精度为3.子过程与函数过程的区别及注意事项:

★把某功能定义为函数过程还是子过程,没有严格的规定,但只要能用函数过程定义的,肯定能用子过程定义;反之则不一定。★当过程有一个返回值时,使用函数过程直观;当过程有多个返回值时,习惯用子过程。

★函数过程有返回值,过程名也就有类型,在函数过程体内必须对函数过程名赋值;子过程没有值,函数名也就没有类型。

★形参是过程与主调程序交互的接口,从主调程序获得初值,或将计算结果返回给主调程序。★形参没有具体的值,只代表了参数的个数、位置、类型,形参只能是简单变量,不能是常数、数组元素、表达式。三、参数传递1.传址与传值 在VB中,实参与形参的结合有两种方法:即传址(ByDef)和传值(ByVal),其中传址也称为引用,是默认的方法。区分两种结合的方法是在要使用传值的形参前加上“ByVal”关键字。

传址的结合过程是:当调用一个过程时,将实参的地址传递给形参。因此在被调过程体中对形参的任何操作都变成了对相应实参的操作,实参的值就会随过程体内对形参的改变而改变。

传值的结合过程是:当调用一个过程时,系统将实参的值复制给形参,实参与形参断开了联系。被调过程中的操作是在形参自己的存储单元中进行,当过程调用结束时,这些形参所占用的存储单元也同时被释放。因此在过程体内对形参的任何操作不会影响到实参。选用传值还是传址的使用规则:★形参是数组、自定义类型时,只能用传地址方式★如果要将过程中的结果返回给主调程序,则形参必须是传址方式。★除上述情况外,一般应选用传值方式。例li6-4:编写一个两个数交换的过程。为了弄清传址、传值的区别,这里swap1用传值传递,swap2用传址传递。哪个过程能真正实现两个数的交换?为什么?例li6-5:编写函数过程求N!,调用该过程计算

C=R!/((R-K)!*K!))的值2.数组参数的传递在VB中允许参数是数组,数组只能通过传址方式进行传递。在传递数组时要注意以下事情:☆在实参列表和形参列表中放入数组名,忽略维数的定义,但圆括号不能省略。☆如果被调过程不知道实参数组的上下界,可使用Lbound和Ubound函数确定实参数组的上下界。例li6-6:编一函数,求任意一维数组中各元素之积,再分别调用该函数。求和的值。四、变量、过程的作用域1.过程的作用域 这里我们只介绍窗体/模块级和全局级的过程。★

窗体/模块级—指在某个窗体或标准模块内定义的过程,定义的子过程或函数过程前加Private关键字,过程只能被本窗体或本标准模块中的过程调用。VB的应用程序由若干个过程组成,这些过程一般保存在窗体文件(.frm)或标准模块文件(.bas)中。一个变量、过程随所处的位置不同,可被访问的范围也不同。变量、过程可被访问的范围称为变量、过程的作用域。★全局级—指在窗体或标准模块中定义的过程,其默认是全局的,也可加Public进行说明。过程可供该应用程序的所有窗体和所有标准模块中的过程调用,但根据过程所处的位置不同,其调用方式有所区别:(1)在窗体定义的过程,外部过程要调用时,必须在过程名前加该过程所处的窗体名。(2)在标准模块定义的过程,外部过程均可调用,但过程名必须唯一,否则要加标准模块名。2.变量的作用域变量的作用域决定了那些子过程和函数过程可访问该变量。变量的作用域分为局部变量、窗体/模块级变量和全局变量。(1)局部变量—指在过程内用Dim语句声明的变量或不加声明直接使用的变量,该变量只能在本过程中使用,别的过程不可访问。局部变量随过程的调用而分配存储单元,并进行变量的初始化,在此过程体内进行数据的存取,一旦该过程体结束,变量的内容自动消失,占用的存储单元释放。(2)窗体/模块级变量—指在一个窗体/模块的任何过程外,即在“通用声明”段中用Dim语句或用用Private语句声明的变量,可被本窗体/模块的任何过程访问。(3)全局变量—在“通用声明”段中用Public语句声明的变量,可被应用程序的任何过程或函数访问。全局变量的值在整个应用程序中始终不会消失和重新初始化。只有当整个应用程序执行结束时,才会消失。例如,在下面一个标准模块文件中进行不同级的变量声明。PublicPaAsinteger'全局变量PrivateMbAsString*10'窗体/模块级变量SubF1() DimFaAsinteger'局部变量 ……EndSubSubF1() DimFbAsSingle'局部变量 ……EndSub如果在不同级别声明了相同的变量名,如;PublicTempAsInteger'全局变量SubForm_Click() DimTempAsInteger'局部变量

Temp=10'访问局部变量

Form1.Temp=20'访问全局变量必须加窗体名

PrintForm1.Temp,TempEndSub

上例中定义了全局变量和局部变量都为Temp,在定义局部变量的过程Form_Click内访问Temp,则局部变量优先级高,把全局变量Temp“屏蔽”掉;若想访问全局变量,必须在全局变量名前加模块名。(4)静态变量 用Static语句声明,在程序运行过程中可保留变量的值。定义形式有下面几种:

Static变量名[As类型]

StaticFunction函数名([参数列表])[As类型]

StaticSub过程名[(参数列表)]若函数名、过程名前加Static,表示该函数、过程内的局部变量都是静态变量。五、递归用自身的结构来描述自身就称为“递归”。例如:对阶乘的运算可定义为:n!=n(n-1)!(n-1)!=(n-1)(n-2)!这样,用阶乘本身来定义阶乘,就称为递归定义。VB允许在自定义函数过程和子过程的内部调用自己,这样的函数过程或子过程称为递归函数过程或递归子过程。编写程序计算N!。算法分析:负数的阶乘没有意义,0的阶乘为1,正数N的阶乘为n!=n*(n-1)*(N-2)*…*1,则阶乘的计算表示为:N!=1n=1N*(n-1)!n>1求N的阶乘可以转换为求N*(N-1)!Fac(4)=4*fac(3)Fac(3)=3*fac(2)Fac(2)=2*fac(1)Fac(1)=1Fac(2)=2*1Fac(3)=3*2*1Fac(4)=4*3*2*1用递归方法求4!示意图递推过程回归过程Li6-8单击进入六、SubMain过程在一个含有多个窗体或多个工程的应用程序中,有时需要在显示多个窗体之前对一些条件进行初始化,这就需要在启动程序时执行一个特定的过程。在VB中,这样的过程称为启动过程,并命名为SubMain过程。在一般情况下,整个应用程序从设计时的第一个窗体开始执行,需要首先执行的程序代码放在Form_Load事件中。如果需要从其他窗体开始执行应用程序,则可通过“工程”菜单中的“工程属性”命令指定启动窗体。但是,如果有SubMain过程,则可以首先执行SubMain过程。SubMain过程只能有一个,它在标准模块窗口中建立。其方法是:执行“工程”菜单中的“添加模块”命令,打开标准模块窗口,在该窗口中键入: SubMain然后按回车键,将显示该过程的开头和结束语句,然后在期间输入程序代码。SubMain过程常用来设定初始化条件,例如:Submain

初始化 ……

form2.showEndsub6.2模块模块(module)是相对独立的程序单元。在VB中主要有三种模块:2.窗体模块1.标准模块3.类模块这里只介绍窗体模块和标准模块1.标准模块

★标准模块的作用标准模块也称为全局模块或总模块,由全局变量声明、模块层声明和过程几部分组成。其中全局声明放在标准模块的首部,它总是在程序启动时执行。当需要声明的全局变量或常量较多时,可以把全局声明放在一个单独的标准模块中,这样的标准模块只含有全局声明不含任何过程,这样的模块在所有基本指令开始之前处理。标准模块不属于任何窗体,但可以指定窗体的内容,可以在标准模块中建立新的窗体,然后在窗体模块中对窗体进行处理。在大型应用程序中,主要操作在标准模块中执行,窗体模块用来实现与用户之间的通信。但在只有一个窗体的应用程序中,全部操作通常用窗体模块就能实现,在这种情况下,标准模块不是必需的。★标准模块的建立通过“工程”菜单中的“添加模块”命令来建立。执行该命令后,显示“添加模块”对话框。利用该对话框可以:

☆建立新模块

☆将已有模块添加到当前工程中

☆打开标准模块代码窗口进行编辑标准模块作为独立的文件存盘,扩展名为.bas一个工程文件可以有多个标准模块,也可以把原有的标准模块加入工程中。VB程序启动时首先执行标准模块的声明部分,然后通常从启动窗体指令开始执行。而标准模块中的SUB或FUNCTION过程,只能在窗体指令中通过调用才能执行。2.窗体模块窗体模块包括三部分:声明部分、通用过程部分和事件过程部分。在声明部分,用DIM语句声明窗体模块所需要的变量,其作用域为整个窗体模块,包括该模块内的每个过程。在声明部分执行之后,VB在事件过程部分查找subForm_Load过程,它是在把窗体装入内存时所发生的事件。如果存在这个过程,则自动启动它。在执行完SubForm_Load过程之后,如果窗体模块

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论