




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VisualBasic程序设计教程8.1过程的定义与调用
VB的过程:
⑴系统提供的内部函数过程,其中,事件是构成VB应用程序的主体,应用设计基本上是对事件过程进行设计;⑵用户根据应用的需要而设计的过程;VB的过程分类:⑴以”Sub”保留字开始的子过程;⑵以“Function”保留字开始的函数过程;⑶以“Property”保留字开始的属性过程;⑷以“Event”保留字开始的事件过程;8.1过程的定义与调用8.1.1Sub过程的定义与调用
用户自定义子过程通常来完成一个特定的功能,其名字可由用户根据自己的习惯而定义。
VB的事件过程只在用户触发该事件后启动,而用户自定义的子过程只有在被其他过程调用时才启动。
1、用户自定义子过程的一般格式
[Static][Private|Public]Sub子过程名[(参数列表)]
语句块
[ExitSub]
语句块
EndSub
说明:
⑴格式中“Sub子过程名”和”EndSub“不可缺;子过程名的命名规则与变量命名规则相同;8.1过程的定义与调用8.1.1Sub过程的定义与调用⑻过程参数的传递默认方式为引用(地址)传递(ByRef),若只传参数(实参)的值则必须将形式参数说明为Byval,格式如下:
Byval变量名或数组名()[As数据类型]
⑼过程内部不能再定义其他过程,可以调用其他合法的过程,事件过程中也不允许定义子过程。
subcommand_click()calltest()endsubstaticsubtest()dima(2)asintegera(0)=a)(0)+1a(1)=a(1)+1printa(0);a(1)endsub8.1过程的定义与调用8.1.1Sub过程的定义与调用
定义过程的方式:⑴手工方式:在过程、事件代码窗口中,编写事件程序:
sub
过程名([参数列表])…
EndSub
⑵系统方式
①
进入模块代码窗口:系统菜单”工程“->”添加”->“新建”,则新建一个模块,在标准模块中填写子过程代码;②系统菜单”工具“->”添加过程“,确定子过程的名称以及类型后,即回到模块的代码窗口;
8.1过程的定义与调用8.1.1Sub过程的定义与调用2、子过程调用⑴Call过程名[(实参列表)];如:calltext(12,”abc”)⑵过程名[实参列表];如:test12,”abc”
例[8-1]求n!
解题思路:在标准模块中定义一个子过程n,用于实现求任意正整数的阶乘。PublicSubn(aAsInteger)DimiAsIntegerDimfAsDoublef=1Fori=1Toaf=f*iNextForm1.Label1.Caption=Str(a)&"!的阶乘的值为:"&Str(f)EndSub
Calln(Val(Text1.Text))8.1过程的定义与调用8.1.2Function过程的定义与调用
函数过程(Function)与子过程一样,可将一组完成特定功能的程序代码组织起来,作为一个相对独立的过程使用;但子过程没有值的返回,函数过程有值的返回。
1、函数过程的定义
[Static][Public][Private]Function函数过程名[(参数列表)][As类型]
语句块
…[ExitFunction]…
语句块[给函数名赋返回值]EndFuntion8.1过程的定义与调用8.1.2Function过程的定义与调用
说明:⑴格式中的Static、Public、Private的含义与作用以及参数列表的格式和使用方法,Byval传值的作用等均与子过程的定义相同;⑵ExitFunction的作用与ExitSub相同;⑶As类型,指定该函数的返回值的类型;⑷语句块为符合VB语法的一条语句或多条语句;⑸给函数名赋值:一般情况下,定义一个函数过程,就是能返回一个值给调用程序,故函数过程应有一条语句给函数名赋值即调用后的返回值;若不赋值,则默认返回值为0(数值型函数),或空值(可变类型函数)。⑹与Sub定义一样,函数过程定义的函数体内不允许定义其他的函数过程和子过程。8.1过程的定义与调用8.1.2Function过程的定义与调用
2、函数过程的定义方法⑴在代码窗口中手工输入函数过程的框架;如:
StaticPrivateFunctionAreturn(aasinteger,basinteger)asInteger…EndFunction⑵系统菜单“工具”->“添加过程”,选择相应的类型和范围属性;
3、函数过程的调用函数过程的调用如同调用VB的系统内部函数一样;程序中。函数过程的调用一般放在表达式中赋值号”=“的右边,将它看成某种类型的值而参加表达式的组成。
8.1过程的定义与调用8.1.2Function过程的定义与调用
例[8-4]编写求任意给定两个自然数的最大公约数的程序。
解题思路:⑴对于已知两个数m、n,使得m>n;⑵m除以n得余数
r;⑶若r=0,则n为所求的最大公约数,算法结束,否则执行(1);⑷n->m,r->n,再重复步骤(2);
步骤mnr=(mmodn)说明第一次36148第二次1486第三次862第四次620最大公约数为28.2函数和过程的参数传递
参数传递:在调用过程时,过程参数使用的是实际参数,它要与定义过程时的形式参数一一对应,并以适当的形式将实参传给行参,供过程使用。参数传递的方式:⑴传值;⑵传址;8.2.1传值
形参:指在定义过程时出现在参数列表中的变量名,这些变量名的使用只能在过程内部。
实参:是在调用该过程时调用过程中已组织好的准备传给形参的常量、变量、表达式或数组控件对象等,它是在调用过程(主程序或父过程)中组织好的数据,实参若是常量,则传递就相当于将该常量的值赋给形参。实参若为一个简单变量的表达式,也是与常量一样将该表达式的值赋给对应的形式参数。传递参数时,形参和实参的个数一定相同,传递时要一一对应;参数之间要用“,”隔开;每个实参的类型必须与相对应的行参类型相同;8.2函数和过程的参数传递8.2.1传值
SubtempSub(aasinteger,bassingle,casstring)…EndSub可采用调用方式:calltempsub(a%,b!,”comm”)
过程调用Calltempsub(a%,b!,“comm”)过程定义Subtempsub(aasinteger,bassingle,casstring)
过程定义中默认的参数传递是地址传递,但在定义过程中,若某个参数用Byval来说明。则该参数便是传值。传值的一个特点是将实参的值复制一份给形式参数所代表的临时内存单元,此后实参与形参之间再无任何联系,形式参数的任何变化均不会对实参产生任何影响。8.2函数和过程的参数传递8.2.1传值
例[8-6]求幂级数
解题思路:定义temp函数用于计算x的幂,需要用到2个参数,x和y,x用于传递某个数,y用于传递幂的次方数。y是传值参数,因此,函数中y值的改变不会影响它相应的实际参数。
DimiAsInteger,rAsSingleFori=1To5r=temp(5,i)PrintrNextFunctiontemp(xAsInteger,ByValyAsInteger)AsSingleDimpAsSinglep=1DoWhiley>0p=p*xy=y-1Looptemp=p
EndFunction8.2函数和过程的参数传递8.2.2传址
在过程调用过程中,参数传递的默认方式是按地址传递,故不加任何关键字就是传址调用。传址的特点是形参与对应实参用相同的内存地址,形参的改变将影响实参的改变,实际上,形参也是实参的别名。通常情况下,形式参数为传值形式,则形式参数可认为是一个局部变量;但若为传址方式,则由形参与实参连系起来,使形参为非局部变量,因为形参的改变结果直接传给了实参。
例【8-7】对于例[8-5]中的过程temp将其定义为:
subtemp(xasinteger,yasinteger)…EndSub
则Calltemp(x,y)变为了传址调用,故形参的改变会引起实参x、y的值改变。8.2函数和过程的参数传递8.2.2传址
例[8-8]传值与传址两种方式下,形参与实参的改变。8.2函数和过程的参数传递8.2.3数组及对象作为过程的参数
1、数组作为参数
例[8-9]求一个n×n方阵所有元素之和;
解题思路:利用随机函数产生一个6阶方阵a,并保存在二维数组中,将此数组作为参数传给函数suma,在函数suma中计算方阵的元素之和;在函数过程内部使用Ubound(a,1)确定数组a的第一维上界。8.2函数和过程的参数传递8.2.3数组及对象作为过程的参数
2、对象参数对于过程中的参数,可以用对象参数进行传递,如窗体、控件等。经过传递后,可以使用对象的有关属性以及方法。在使用控件作为参数时,必须考虑到作为实参的控件是否具有通过过程中所列的控件的属性,因此必须先判断控件是哪一类控件。判断格式为:
{If/Elseif}Typeof
控件名称is
控件类型其中:控件类型指各种不同的控件的关键字,如文本框的关键字为
TextBox等。
IftypeofTestctristextboxthentestctr.text=“Ms”Endif8.3变量、过程的作用域
在VB程序中我们定义的变量、过程、函数均有其作用范围,在VB系统内,该范围称为其作用域。作用域分为三个层次:过程、模块(文件)、全局(工程);
过程的作用域最小,仅局限于过程内部(针对局部变量);模块(文件)次之,仅在某个模块或文件内;全局(工程)范围最大,在整个应用工程范围内。8.3.1过程的作用域过程的作用域:模块级(文件级)和全局级;一个工程应用程序一般由三类模块构成:⑴窗体模块(*.frm):通常有:事件过程、自定义子过程和自定义函数过程⑵标准模块文件(*.bas):由若干个VB子过程和函数组成,通常为应用程序提供可调用的标准程序单元;⑶类模块文件(*.cls):包括自定义的类、为相应类设计的属性过程、自定义方法过程、自定义事件过程等;8.3变量、过程的作用域8.3.1过程的作用域
1、模块级(文件级)过程指只能在本文件或模块中被调用,此类过程(或函数)定义时在Sub或
Function前加“Private”关键字;
2、全局级过程指能在整个应用程序中被调用的过程,此类过程与模块级过程的定义过程完全相同,只是在定义前不加关键字“Private”,或加关键字“Public”。调用方式通常为:标准模块名(或窗体名).子过程或函数名(参数)。
8.3变量、过程的作用域8.3.1过程的作用域
作用范围模块级全局级窗体标准模块窗体标准模块定义方式过程名前加Private,如:privateSubmysub1(形参表)过程名前加Public或缺省如:[Public]Submy2(形参表)能否被本模块其他过程调用能能能能能否被本应用程序其他模块调用不能不能能,在过程名前加窗体名,如:Call
窗体名.my2(实参表)能,过程名必须唯一,否则要加标准模块名,如:Call
标准模块名.my2(实参表)8.3变量、过程的作用域文件1(*.Bas)(模块文件Module1.Bas)
publicaasinteger
privatebasinteger‘模块级变量
subf1()
dimcasinteger‘局部变量
…
printform1.c;c;b
endsub
文件2(*.frm)(窗体模块:Form1.frm)
publiccassingle‘全局变量
publicaasinteger‘全局变量
subcommand1_click()
dimcasinteger‘局部变量
…
printmodule1.a;c;form1.c;a
endsub注释:上面Form1.frm文件print语句中,
“Module1.a”是指“Module1.Bas”文件中定义的全局变量a;
”Form1.c“是指Form1.frm中定义的全局变量c;
”c“是指command1_click中定义的局部变量c;
“a”是指在Form1.frm中定义的全局变量a;8.3变量、过程的作用域
说明:⑴在同一模块不同过程中定义的变量可以同名;⑵在同一模块不同级别中定义的变量可以同名;⑶在不同模块中定义的全局变量可以同名;⑷在过程中直接引用的变量总是同名变量中作用域最小的那个变量;⑸在其他模块(定义全局变量所在模块)中引用全局变量时,必须在该变量前加上模块名;8.3变量、过程的作用域8.3.3静态变量
局部变量除了用Dim语句声明外,还可以用Static语句将变量声明为静态变量,它在程序运行中保留变量的值。即每次调用过程,用Static说明的变量保持原来的值;而用Dim说明的变量,每次调用过程时,重新初始化。形式:
Static变量名[As类型]StaticFunction函数名([参数列表])[As类型]StaticSub过程名([参数列表])
若函数名、过程名前加”Static“,表示该函数、过程内的局部变量都是静态变量。8.3变量、过程的作用域8.3.3静态变量例[8-10]一个窗体单击事件过程(Form_click())和一个求和函数(sum())组成的应用程序,在Form_click()过程中5次调用函数sum()
DimiAsInteger,isumAsIntegerFori=1To5isum=sum(i)Print"isum=";isum;NextPrivateFunctionsum(nAsInteger)'StaticjAsIntegerDimjAsIntegerj=j+nsum=jEndFunction8.4递归
递归是指一个自己调用自己的过程。
VB允许定义一个自定义过程或函数在过程内部自己调用自己,这样的子过程或函数叫做递归子过程或递归函数。
例[8-11]求n!的函数。
解题思路:递归就是一个自己不断调用自己的过程,直到达到递归结束条件,而后逐级返回到上一次调用过程。每一次调用自己,先把形参、局部变量、调用结束时的返回地址压栈,直到递归结束,这个过程叫做递归过程;然后一级一级从堆栈弹出参数,直到栈空,这个过程叫做回归。定义阶乘运算如下:
n!=n(n-1)!(n-1)!=(n-1)(n-2)!
若用fn(n)表示n!,则由有:8.4递归求n!的函数定义如下:
publicfunctionfn(nasinteger)asintegerifn=1thenfn=1elsefn=n*fn(n-1)endifendfunction假设n=3,则上诉函数的步骤如下:⑴fn(3)=3*fn(2),n=3时调用fn(2);⑵fn(2)=2*fn(1),n=2时调用fn(1);⑶fn(1)=1,n=1时求得fn(1)的值;⑷fn(2)=2*1,返回fn(2)的值;⑸fn(3)=3*fn(2)=3*2,返回fn(3)的值;设计一个递归过程或函数应具备的条件:⑴具备递归条件及递归的条件;⑵递归调用递归结束的条件发展;8.4递归例[8-12]在一个三角形中,取三边的中点构成一个三角形,然后在所画的三角形的边与相邻的三角形的角构成的三角形内又画一个三角形,如此循环下去直到满足给定层次为止。解题思路:本题中的递归子过程为triangle(x1,x2,x3,y1,y2,k),k的初值为三角形的层次,递归结束条件为k=1,在递归子过程中,每调用一次,k的值就减1。(x1,y1)(x2,y2)(x3,y1)(u1,v1)(x2,y1)(u2,v1)8.5常用算法与数据结构三8.5.1素数问题
求素数的方法:对于一个自然数N,用大于1小于N的各个自然数都去除N,若都除不尽,则N
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 行政法学议题探讨试题及答案
- 2025年VB考试模拟题与详细试题及答案
- 法学概论考试形式介绍试题及答案
- 突破法学概论难题的试题及答案
- 2025超市供货合同模板
- 信息处理技术员2025年试题及答案
- 前台文员如何做好多任务处理计划
- 二级VB考试分析报告试题及答案
- 行政法中的社会公平与效率的动态平衡试题及答案
- 邮员工考核评语
- 【MOOC】大学体育(二)-华中科技大学 中国大学慕课MOOC答案
- GB/T 328.5-2007建筑防水卷材试验方法第5部分:高分子防水卷材厚度、单位面积质量
- GB/T 15970.6-2007金属和合金的腐蚀应力腐蚀试验第6部分:恒载荷或恒位移下预裂纹试样的制备和应用
- 案款收款账户确认书
- 9-马工程《艺术学概论》课件-第九章(20190403)【已改格式】.课件电子教案
- 施工现场建筑垃圾处置专项方案
- 欢迎新同学幼儿园中小学开学第一课入学准备ppt
- (整理)柴油发电机的检修
- 2021年肇庆市端州区华佗医院医护人员招聘笔试试题及答案解析
- JJG 694-2009 原子吸收分光光度计-(高清现行)
- DB23∕T 482-1998 主要树种树高级立木材积表
评论
0/150
提交评论