版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章过程
VisualBasic程序是由过程组成的,使用过程是实现结构化程序设计思想的重要方法。
结构化程序设计思想的要点之一就是把一个较大的程序划分为若干个模块,每个模块只完成一个或若干个功能。这些模块可通过执行一系列的语句来完成一个特定的操作,即被实现为过程。
第6章过程6.1过程的概念及引例6.2Sub过程6.3函数过程6.4Sub过程与函数过程应用举例6.5参数的传递6.6过程的嵌套与递归6.7变量和过程的作用域6.1过程的概念及引例6.1.1过程的概念6.1.2过程引例返回6.1.1过程的概念过程是为了完成一个特定的任务,由一组独立的程序代码组成。VisualBasic中根据是否有返回值,将过程分为:子过程(Sub过程),Sub过程又分为:事件过程是当某个事件发生时,对该事件做出响应的程序代码段,它是应用程序的主体。事件过程名及参数是由系统预先定义的,用户只需编写事件过程的内容。通用过程是由用户自定义的过程。如果多个不同的事件过程需要执行一段相同的程序代码,完成相同或相似的任务,为了避免程序代码的重复以及方便程序的修改,可以把这一段代码独立出来,作为一个过程,这样的过程称为通用过程。函数过程(Function过程)。返回6.1.2过程引例【例6-1】Sub过程示例。编写程序实现计算5和8的阶乘,界面如图6-1所示。返回图6-1过程引例6.2Sub过程6.2.1Sub过程的声明及建立6.2.2Sub过程的调用返回6.2.1Sub过程的声明及建立1.声明格式如下:[Private|Public][Static]Sub<过程名>([参数表])过程体[ExitSub]EndSub说明:(1)Private和Public用于限定过程的作用范围,详细见6.7节。如未指明,则默认为Public。(2)Static表示该过程中的所有局部变量都是静态变量。(3)过程名的命名规则与变量相同,注意过程名必须唯一。(4)参数表用于指明调用该Sub过程时需要传递给该过程的参数及类型。参数表内的参数又称为形式参数(简称形参)。Sub过程可以定义零个或多个形参。没有形参时小括号不能省略。有多个形参时,形参之间用逗号隔开。Sub过程形参的语法格式如下:(形参数名1[As类型],形参数名2[As类型],…)形参的命名规则与变量相同。“As类型”用于指定形参的数据类型,如果省略则默认为Variant型。(5)ExitSub用于在过程体中提前退出过程。6.2.1Sub过程的声明及建立2.Sub过程的建立在模块的通用段,根据Sub过程的语法规则声明过程,并在过程体内编写过程需要完成任务的代码。通过菜单命令“工具”->“添加过程”命令加入。
注意:在过程内部,不能定义新的过程,只能调用过程。返回6.2.2Sub过程的调用1.使用Call语句格式:Call<过程名>(<实参表>])说明:(1)当用Call语句调用过程时,必须使用小括号把所有的实际参数(简称实参)括起来。如果声明Sub过程时没有形参,则调用时括号内无需实参,此时可把括号省略。(2)实参个数与形参个数必须相等,实参与对应形参的数据类型应该相容。6.2.2Sub过程的调用2.直接使用过程名格式:<过程名>[<实参表>]说明:这种调用方式相当于把过程名作为一个语句来使用。Sub过程举例【例6-2】编写一个Sub过程用于在窗体指定位置输出符号“*”,并调用过程在鼠标单击位置输出“*”。返回6.3函数过程
函数(Function)过程也是由独立的程序段代码组成,与Sub过程不同在于,函数过程具有返回值。声明函数之后,便可以像调用VB内部函数一样调用,并可参与表达式运算。
6.3.1函数过程的声明及建立6.3.2函数过程的调用
返回6.3.1函数过程的声明及建立函数过程的声明格式如下:[Private|Public][Static]Function函数名([参数表])[As类型][函数体][<函数名>=<表达式>][ExitFunction]EndFunction注意:(1)声明函数过程要指明数据类型,即返回值的数据类型,默认为Variant型。(2)[<函数名>=<表达式>]中,<表达式>的值是函数返回的结果,通过赋值语句将值赋给<函数名>,该值就是函数过程的返回值。如果在函数过程中省略“[<函数名>=<表达式>]”,则该过程返回一个默认值,其默认值和函数声明的数据类型相关,若为数值型函数过程返回0,若为字符串函数过程返回空字符串。返回6.3.2函数过程的调用1.直接使用函数名直接使用函数名的调用方法有两种形式:(1)如果要获得函数的返回值,一般按如下形式调用:被赋值对象=函数名(实际参数1,实际参数2,…)(2)如果放弃函数的返回值,一般按如下形式调用:函数名实际参数1,实际参数2,…6.3.2函数过程的调用2.使用Call语句调用格式如下,这种方法放弃了函数的返回值:Call函数名(参数1,参数2,…)举例【例6-3】验证哥德巴赫猜想:任意一个大于2的偶数都可以表示成两个素数之和。编程将6~100之间的所有偶数表示为两个素数之和,结果显示在列表框中。返回6.4Sub过程与函数过程应用举例6.4.1过程声明注意事项6.4.2过程应用举例返回6.4.1过程声明注意事项Sub过程和函数过程最根本的区别在于其是否具有返回值。由此决定了它们在定义和调用时有如下不同:
(1)定义时,函数过程具有返回值,因此定义时需要用As语句说明函数过程的返回值类型,以及在代码段中给函数名赋值。当然VB也允许不说明函数过程的返回值类型,此时函数过程返回值的类型变为默认的Variant,如果代码段中没有给变量名赋值的语句,则调用函数过程时的值为默认值。而Sub过程由于无返回值,则定义时无需考虑这些问题。
(2)在调用时,由于函数过程具有返回值,因此可以像变量一样参与表达式运算,但是Sub过程却不可以。在定义过程时有如下问题需要考虑:(1)如何确定选择Sub过程还是函数过程实际上Sub过程和函数过程是可以互换的,但是通常为了简便,对于过程的程序段代码有多个返回值(此处的返回值是指返回到调用此过程的主程序的值,相当于程序段的输出结果),或者无返回值时定义为Sub过程,如果只有一个返回值时则定义为函数过程。(2)过程参数的确定过程是一个独立的程序代码,因此有输入和输出。而过程的参数则是由输入和输出决定的。声明过程的参数时,根据过程实现的程序段决定需要几个输入值,几个输出值,根据其类型将这些值作为参数定义在过程头即可,由于函数本身具有返回值,因此在声明函数头时,将其中一个输出作为函数的返回值,其余作为参数。返回6.4.2过程应用举例【例6-4】五彩星空的模拟。编写一个过程在窗体的随机位置输出n个随机颜色的五角星,调用此过程实现静态五彩天空以及闪烁五彩天空的模拟。图6-4五彩天空模拟运行结果6.4.2过程应用举例【例6-5】编写一个计算n!的过程,并调用此过程计算2!+4!+6!+…+20!。图6-5求阶乘之和的运行结果6.4.2过程应用举例【例6-6】编写一个过程,判断给出的三边是否构成三角形,如果构成三角形则计算出三角形的面积。调用编写的过程根据用户输入三边计算三角形的面积,如果不构成三角形,则给出提示。图6-6求三角形面积的运行结果返回6.5参数的传递6.5.1实参与形参6.5.2按值传递参数6.5.3按地址传递参数6.5.4参数传递应用举例6.5.5数组作为参数传递返回6.5.1实参与形参形式参数简称形参,是指定义过程时在过程名后圆括号中出现的变量名,多个形参之间用逗号分割。实际参数简称实参,是指在主程序中调用过程时在过程名后的参数,其作用是将它们的数据(值或地址)传给被调用过程对应的形参变量。实参可以是常量、变量、表达式、数组,各实参之间用逗号分隔。6.5.1实参与形参实参和形参的传递可以实现调用过程(主程序)和被调用过程(子程序)之间的信息交换。参数传递时是按位置传递,和参数名无关,要求参数个数相等、对应位置参数数据类型相容。
调用过程:Area(3,4,5,sjx,mj)定义过程:Area(aAsSingle,bAsSingle,cAsSingle,flagAsBoolean,sAsSingle)实参表形参表返回6.5.2按值传递参数按值传递参数是指在过程被调用时,传递给形参的内容是对应实参的值。形参与实参各占用不同位置的存储空间,被调用过程在执行过程中,对形参变量值的改变不会影响调用过程对应实参的值。通常为了保护实参不受被调用过程的影响,则选用按值传递参数方式。如果在声明过程时,形式参数名前加上关键字“ByVal”,表示在调用该过程时,该参数是按值传递的。例如:
SubprintA(ByValaAsString)
……EndSub6.5.2按值传递参数【例6-7】阅读下列程序,思考程序运行后,单击窗体,窗体上显示什么内容。体会按值传递参数时,形参值的改变不会影响实参。PrivateSubForm_Click()Dimx%x=10Print"调用add过程前x的值为:"&xCalladd(x)Print"调用add过程后x的值为:"&xEndSubSubadd(ByValn%)n=n+10 Print"在过程add中n的值为:"&nEndSub返回6.5.3按地址传递参数按地址传递参数是指在过程被调用时传递给形参的是对应实参的内存地址,即形参与实参使用相同地址的内存单元。因此当在被调用过程中对形参值的修改就等于修改了实参的值。按地址传递参数时实参传递给形参的是地址,由于不同类型数据占用的内存单元字节数是不同的,因此实参与形参的数据类型应相匹配。如果在声明过程时,形式参数名前加上关键字“ByRef”,或者什么都不加,则表示在调用该过程时,该参数是按地址传递的。例如:
SubFac(ByRefnAsInteger,fAsDouble)
…… EndSub注意:并不是所有被关键字ByRef修饰的形参在过程被调用时一定是按地址传递参数,只有当实参是变量或数组时才能按地址传递。如果实参是常量或表达式时,实际上是按值传递。6.5.3按地址传递参数【例6-8】阅读下列程序,思考程序运行后单击窗体,窗体上显示什么内容。体会按地址传递参数时形参值的改变会影响实参的值。PrivateSubForm_Click()Dimx%x=10Print"调用add过程前x的值为:"&xCalladd(x) Print"调用add过程后x的值为:"&xEndSubSubadd(ByRefn%)n=n+10Print"在过程add中n的值为:"&nEndSub返回6.5.4参数传递应用举例【例6-9】编写一个过程求一个字符串中“最长的子串”和“最长子串的长度”。返回6.5.5数组作为参数传递在形参表中以数组名加圆括号表示,不要给出维数上界。多维数组,每维以逗号分隔。在过程中通过Ubound函数确定每维的上界。在实参表中给出数组名(可以省略圆括号)。注意:数组作为参数传递时,传递方式是按地址传递,系统将实参数组的起始地址传给过程,使形参数组也具有与实参数组相同的起始地址,因此数组作参数时是按地址传递参数的,不能使用关键字“ByVal”修饰形参。6.5.5数组作为参数传递【例6-10】编写程序要求产生n个两位随机整数,并按指定方式排序。要求分别编写一个产生n个两位随机整数和对n个数按指定方式进行排序的过程。返回6.6过程的嵌套与递归6.6.1过程的嵌套6.6.2过程的递归
返回6.6.1过程的嵌套在一个过程中再调用另外一个过程,称为过程的嵌套调用。在VisualBasic中允许过程的嵌套调用,但是不允许嵌套定义,即在一个过程里面不能定义另外一个过程。对于过程的嵌套调用首先要能理解其执行过程。
图6-12过程嵌套调用执行流程举例PrivateSubForm_Click()……CallsA…………EndSubSubsA()……CallsB…………EndSubSubsB()……CallsC…………EndSubSubsC()……………………EndSub⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀6.6.1过程的嵌套【例6-11】编写程序求输入整数m的所有组合数之和,即求
其中6.6.2过程的递归一个过程调用过程自身称为过程的递归调用。若是直接地调用自身称为直接递归调用,若是间接地调用自身称为间接递归调用。过程的递归实际是一种特殊的过程嵌套。对于一些递归的定义,如下面阶乘的定义,比较适合用递归调用的方法解决。返回6.6.2过程的递归【例6-12】用递归的方法求解n!。
Functionfac(n%)AsInteger Ifn>1Then
fac=n*fac(n-1) ElseIfn=1Then
fac=1 EndIfEndFunctionPrivateSubForm_Click() Dimf% Print"4!="&fac(4)EndSubn=4,fac(4)=4*fac(3) n=3,fac(3)=3*fac(2)n=2,fac(3)=2*fac(1)n=1,fac=1主程序fac(3)fac(2)fac(1)递推回归形参和局部变量返回地址图6-14过程递归调用执行流程演示6.6.2过程的递归【例6-13】用递归调用的方法求x2-a=0的解,要求精度为10-5,计算公式为:返回6.7变量和过程的作用域6.7.1VisualBasic应用程序的组成及模块6.7.2过程的作用域6.7.3变量作用域6.7.4变量生命周期与静态变量返回6.7.1VisualBasic应用程序组成及模块应用程序工程文件(.vbp)窗体模块文件(.frm)类模块文件(.cls)标准模块文件(.bas)声明部分事件过程函数过程Sub过程声明部分SubMain过程函数过程Sub过程类的定义返回6.7.2过程的作用域作用域是指变量和过程的作用范围。根据过程的作用域可:窗体/模块级:在过程声明前加Private关键字的过程,只能被定义的窗体或模块中的过程调用。全局级:在过程声明加Public关键字或缺省(什么都不加)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。6.7.2过程的作用域作用范围模块级全局级窗体模块标准模块窗体模块标准模块声明方式过程前加Private,例:PrivateSubM1(形参表)过程名前加Public或者缺省,例:PublicSubM2(形参表)是否能被本模块的其它过程调用能能能能是否能被本应用程序的其它模块中的过程调用不能不能能,但必须在过程明前加窗体名,例:Call窗体名.M2(实参表)能,但在所有标准模块中过程名必须唯一,否则要加标准模块名,例:Call标准模块名.M2(实参表)6.7.2过程的作用域【例6-14】过程作用域举例。返回6.7.3变量作用域根据变量的作用范围可分为:局部变量:在过程内声明的变量,只能在本过程中使用。窗体/模块级变量:在“通用声明”段中用Dim语句或用Private语句声明的变量,可被本窗体/模块的任何过程访问。全局变量:在“通用声明”段中用Public语句声明的变量,可被本应用程序的任何过程访问。
6.7.3变量作用域作用范围局部变量窗体/模块级变量全局变量窗体标准模块声明位置过程内部窗体/模块“通用声明”段窗体/模块“通用声明”段声明方式Dim或StaticDim或PrivatePublic能否被本模块的其它过程访问不能能能能否被其它模块中的过程访问不能不能能,但要在变量明前加窗体名能6.7.3变量作用域【例6-15】变量作用域举例。返回6.7.4变量生命周期与静态变量变量的生命周期是指变量的作用时间,即为变量分配内存空间到回收其内存空间的这段时间。在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度场营销分公司智慧城市项目合作协议3篇
- 二零二五版商业街区场地租赁合作协议书6篇
- 2025年度高新技术产业常年法律顾问聘用协议3篇
- 二零二五年度企业税收筹划与税收筹划实施合同3篇
- 二零二五年度出口退税证明开具及国际金融服务合同3篇
- 二零二五年度港口码头租赁及港口货物装卸、仓储及配送服务协议8篇
- 二零二五年度土地承包经营权纠纷调解合同-@-2
- 2025草原禁牧与水资源保护管理协议合同3篇
- 2025年度个人个人借款合同信用评估标准3篇
- 二零二五食用油产品包装设计与印刷合同
- 中考模拟考试化学试卷与答案解析(共三套)
- 新人教版五年级小学数学全册奥数(含答案)
- 风电场升压站培训课件
- 收纳盒注塑模具设计(论文-任务书-开题报告-图纸)
- 博弈论全套课件
- CONSORT2010流程图(FlowDiagram)【模板】文档
- 脑电信号处理与特征提取
- 高中数学知识点全总结(电子版)
- GB/T 10322.7-2004铁矿石粒度分布的筛分测定
- 2023新译林版新教材高中英语必修一重点词组归纳总结
- 苏教版四年级数学下册第3单元第2课时“常见的数量关系”教案
评论
0/150
提交评论