第六章 过程过程是VB的基本组成单位,一些复杂的任务可以分解成为基本的过程来负责完成!过程的作用•当需解决的问题规模较大、复杂时,可以按功能细分成一个一个小的功能模块,这样的小程序段,在VB中被称为过程;•过程是VB程序的基本组成单位任务事件过程子过程函数过程过程的分类•VB过程分为子过程(Sub)、函数过程(Function)、属性过程(Property)三种•本书我们主要学习子过程和函数过程•考试时,要严格区分子过程和函数过程的用法 引例6.1 定义Sub子过程•我们早就使用过子过程,因为在VB中每一个事件过程都是子过程;•VB程序是从某个事件过程首先驱动开始的•本章主要学习用户自定义子过程的定义方法6.1.1 事件过程•Private Sub 对象名_事件名([参数列表])[局部变量和常量的声明]语句块[Exit Sub]语句块End Sub•事件过程原型用户不能改变;•事件过程是私有的6.1.2 通用子过程(用户自定义过程)•[Private|Public] [Static] Sub 过程名([形参列表])[局部变量和常量的声明]语句块[Exit Sub]语句块End Sub•通用子过程的作用在于将重复出现的程序段或功能较复杂的程序段独立或细分出来的小的程序段,即为通过子过程。
6.1.2 通用子过程(用户自定义)•子过程定义说明:子过程定义说明:1)子过程以Sub开始,End Sub结束,中间可以利用Exit Sub中途退出过程;2)以Private定义的子过程是私有的,只允许本模块内的过程调用;用Public定义的子过程是公有的,允许被整个工程中的任意过程调用;系统缺省为Public;3)Static表示静态“局部”变量,变量一经定义,在整个程序运行期间不会被重新初始化,不能使用在“通用”-“声明”字段中;6.1.2 通用子过程(用户自定义)4)过程名的命名规则与变量名一样,即第一个字符必须是字母或汉字,后面由字母、汉字、数字或下划线组成,不能使用VB中的关键字;过程名不要重名;5)形参列表:这个列表的功能再于接收必要的数据信息,建立与主调程序之间的关系;参数的个数可以为零个、1个甚至多个;参数间用逗号分隔;括号不可省略;6)形参列表的形式:(ByVal a As Integer, ByRef b As Integer)6.1.2 通用子过程(用户自定义)7)End Sub标志Sub过程执行结束,程序将返回调用该Sub过程的语句处继续执行;8)过程不能嵌套定义。
Private Sub Command1_Click()……Call P()……End SubPrivate Sub P()Print “输出结果为:”End Sub6.1.2 通用子过程(用户自定义)•Sub子过程的建立方法1)利用命令建立(不常用)–进行“代码窗口”;–执行“工具”菜单中的“添加过程”命令;–在出现的对话框中进行设置6.1.2 通用子过程(用户自定义)•Sub子过程的建立方法2)直接在代码窗口中生成–进行“代码窗口”;–选择“通用”-“声明”,光标停留在所有过程外面的空白行处;–按Sub子过程的定义规则输入Private Sub 过程名(参数)–按回车键,即可创建一个空的Sub子过程6.1.2 通用子过程(用户自定义)•Sub子过程的过程体代码:•子过程的功能主要是在过程体内完成的,过程名主要是为找到这个过程而提供路线的;•子过程的代码和事件过程的代码类似;如:Private Sub Change(x1 As Integer,x2 As Integer)Dim Temp As IntegerTemp = x1x1 = x2x2 = TempEnd Sub6.2 定义Function过程•Function过程又称函数过程;•在第三章中,我们学习了大量的VB系统函数,这些函数用户只可以使用,不可以修改;•VB提供的Function过程,就是让用户可以自己创建特殊功能的函数,用户自定义函数。
6.2 定义Function过程•定义Function过程的形式如下:[Private|Public][Static] Function 函数名([参数列表])[As 数据类型][局部变量和常数声明]语句块函数名=表达式[Exit Function]语句块函数名=表达式End Function6.2 定义Function过程•定义Function过程说明:1)Function过程以Function语句开头,以End Function结束;中间代码部分为函数体;2)函数名有返回值,其值类型由As 数据类型指定;3)函数名不同于子过程名,在VB中,为函数名赋予了存储值的功能,而过程名不可以,所以函数体内一般都会至少为函数名赋值一次;如果不赋值,函数返回值默认为0或空;4)函数中途可以利用Exit Function退出6.2 定义Function过程•例如,求n!Private Function fac%(ByVal n As Integer) Dim i As IntegerIf n<0 Then fac = -1:Exit FunctionElsefac = 1For i = 1 To nfac = fac*iNext iEnd IfEnd Function6.2 定义Function过程•例如,求gcd(m, n)最大公约数Private Function gcd%(ByVal m%,ByVal n%) Dim r%,t%If m0m = nn = rr = m Mod nLoopgcd = nEnd FunctionPrivate Sub Change(x1%, x2%)Dim Temp As IntegerTemp = x1x1 = x2x2 = TempEnd Sub6.3 过程调用•除了事件过程是由使用者发出动作触发外,多数过程都是要间接的由事件过程或其他过程调用才能够使用。
6.3.2 Sub过程调用•Sub子过程调用方法:1)用Call语句调用Sub过程Call 过程名(实参表)说明:过程名为被调用过程的名字;实参与形参是对应的,个数、类型一一对应;在过程定义的列表中为形参,在调用时,为实参;实参可以是具体的值、或有值的变量、属性,而形参则是负责接收实参值的2)直接将过程写成语句形式:过程名 实参表说明:这种调用形式,不用加Call;同时要将实参表的括号去掉并与过程名之间加一个空格6.3.2 Sub过程调用•编写一个子过程,打印杨辉三角形Private Sub YH(n As Integer) Dim a() As Integer, i%, j% Redim a(1 To n, 1 To n) For i = 1 To n For j = 1 To i If j=1 Or i=j Then a(i,j) = 1 Else a(i,j) = a(i-1,j)+a(i-1,j-1) End If Print Tab(6*j-Len(Cstr(a(i,j)))+1);a(i,j); Next j Print Next iEnd Sub6.3.3 调用Function过程•调用Function过程的方法比较简单,与VB内部函数的调用方法一样,即在表达式中写出它的名称和相应的参数;•v = 函数名(实参列表)•Print 函数名(实参列表)•当然也可以用Call语句形式,此时将放弃函数名返回值的功能,功能与子过程一致6.3.4 调用其他模块中的过程•当一个过程可以被其他模块调用时,首先要求这个过程为Public公有的。
1)调用窗体模块中的公有过程Call 窗体名.子过程名(实参表)2)调用标准模块中的公有过程,在没有重名的前提下,可直接调用:Call 子过程名(实参表)否则,Call Module1.子过程名(实参表)例题•编写一个求任意三角形面积的函数Private Function Area!(a!, b!, c!)Dim t!t = (a+b+c)/2Area = Sqr(t*(t-a)*(t-b)*(t-c))End Function例题•编写一个求任意三角形面积的子过程Private Sub Area (a!, b!, c!, s!)Dim z!z = (a+b+c)/2s = Sqr(z*(z-a)*(z-b)*(z-c))End Sub6.4.1 形参与实参•形参:置于过程定义时,参数列表中的变量或数组;在过程被调用前,系统不对其分配空间;•实参:当程序中想调用某过程时,所提供的实际值;•当实参和形参结合的时候,形参才被分配空间,接收由实参传递过来的值;•形参、实参个数、类型、位置要一致6.4.1 形参与实参•常见的错误Private Sub F1(a%,b%)...End SubPrivate Sub Command1_Click()Dim x!,y!x = 3.14:y = 123Call F1(x,y) ‘Call F1(x)End Sub6.4.2~3 参数传递方式•传值(ByVal)•传址(ByRef或省略默认)•区别1:形参定义前面放的关键字不一样;•区别2:形参接收到的值不一样;•区别3:形参对实参的影响不一样6.4.2~3 参数传递方式• 例如:(两个数的交换)Private Sub Exchange(ByVal a%, ByVal b%)Dim t%t = aa = bb = tPrint a,bEnd SubPrivate Sub Command1_Click()Dim x%,y%x = 12y = 21Call Exchange(x,y)Print “主过程中:“;x,yEnd Sub6.4.2~3 参数传递方式•说明:•形参前加ByVal时表示传值•不加或加ByRef时表示传址•传值是单方向的•传址是“双方向的”6.4.2~3 参数传递方式Private sub add(x as integer, y as integer, z as integer)z=x+yx=x+1y=y+1print “子过程中子过程中” & x & y & zEnd subPrivate sub Form_Click()dim a as integer, b as integer, c as integera=3::b=2::c=1add a, b, c ‘或者写成或者写成Call add(a,b,c)print “外部过程中外部过程中” & a & b & cEnd sub6.4.2~3 参数传递方式Private sub add( ByVal x as integer, ByVal y as integer, ByVal z as integer)z=x+yx=x+1y=y+1print “子过程中子过程中” & x & y & zEnd subPrivate sub Form_Click()dim a as integer, b as integer, c as integera=3::b=2::c=1add a, b, cprint “外部过程中外部过程中” & a & b & cEnd sub6.4.2~3 参数传递方式下列程序运行后,单击下列程序运行后,单击Command1结果为:结果为:Private Sub Command1_Click( ) a = 10:b = 20 Call xy1(a, b) Print a,b xy2 a, b Print a,bEnd SubPublic Sub xy1(x, ByVal y) x = x+y y = x-y x = x-yEnd SubPublic Sub xy2(ByVal x, y) x = x+y y = x-y x = x-yEnd sub6.4.4 数组(元素)参数•在某些问题中,会将数组中的某个值或者全部元素传递给形参•编写一个子过程:求任意一维数组中存放数据的乘积 程序6.4.4 数组(元素)参数•编写一个函数求任意数组中的最大值Private Function Max%(a%())Dim i%,m%m = a(LBound(a))For i = LBound(a)+1 To UBound(a)If m
6.5.1 嵌套过程(书中的例子自己看)•求任意三角形面积 程序Sub Command1_Click()…… Call F1(y) Print yEnd SubSub F1 (x)…… x=4*F2(x-1)End SubFunction F2 (x)…… F2=3*F3(x-1)End SubFunction F3 (x)…… F3=2*xEnd Sub6.5.2 递归过程•递归过程属于嵌套调用过程的一种特殊情况;在VB中,允许某过程自己调用自己,这样调用被称为递归调用,递归包括递推式和终止值两个缺一不可的条件 程序6.5.2 递归过程Function fac%(n%) If n=1 then fac = 1 Else fac=n*fac(n-1) End IfEnd functionFunction fac%(n%) If n=1 then fac = 1 Else fac=n*fac(n-1) End IfEnd functionFunction fac%(n%) If n=1 then fac = 1 Else fac=n*fac(n-1) End IfEnd function①①②②③③④④递推递推回归回归Sub Form_Click() k% = 3 x = fac(3)End Sub6.5.2 递归过程•求最大公约数求最大公约数Private Function gcd(ByVal m%,ByVal n%)If m Mod n=0 Thengcd = nElsegcd = gcd(n, m Mod n)End IfEnd Function6.5.2 递归过程记住:记住: 若上述求阶乘的函数中少了若上述求阶乘的函数中少了 :: If n = 0 or n = 1 Then fac = 1 即仅有语句:即仅有语句:fac = n * fac(n - 1) 程序运行将造成何结果?程序运行将造成何结果?由此可见构成递归的结构如下:由此可见构成递归的结构如下:l递归递归结束条件结束条件及及结束时的值结束时的值;;l能用递归形式表示,并且能用递归形式表示,并且递归向终止条件发展递归向终止条件发展。
6. 6 变量的作用域•变量的作用域,即变量起作用的范围和生存期•变量的作用域在VB中分三个级别:过程级、模块级、工程级6. 6 变量的作用域•过程级:指在某过程内定义的变量,定义时可以利用Dim和Staic两个关键字,这种级别的变量又称为局部变量•模块级:指在窗体的通用声明和标准模块中用Dim和Private定义的变量•工程级:指在窗体的通用声明和标准模块中用Public定义的变量,这个级别的变量又称为全局变量6. 6 变量的作用域•过程级的作用域:仅在定义它的过程中起作用•模块级的作用域:对定义它的窗体或标准模块中的全部过程都起作用•工程级的作用域:对整个程序中的任意窗体任意模块中的过程都起作用6. 6 变量的作用域•同名变量的使用:当变量的级别不一样时,可以同名•同名在使用上以最内层为主•特殊情况下,需要指出属于哪个窗体或模块•Form1.x•Module1.y6. 7 综合应用a(1)a(2)a(3)a(4)a(5)a(6)a(7)a(8)1122334455667788若n = 3 --a(1)a(2)a(3)a(4)a(5)a(6)a(7)a(8)6677881122334455Private Sub RightMove(xx%())Dim t%t = xx(UBound(xx))For i = UBound(xx)-1 To LBound(xx) Step -1 xx(i+1) = xx(i)Next ixx(LBound(xx)) = tEnd SubPrivate Sub Command1_Click()Dim a%(1 To 10),n%,i%For i = 1 To 10a(i) = iNext in = InputBox(“输入要向右移动的位数n:”)For i = 1 To nCall RightMove(a())Next iFor each e In aPrint e;Next End Sub6. 7 综合应用•十进制向其他进制转换遵循除r取余法(倒着取),直到商为0Private Function T$ (m%, n%)Dim s$, r%Do While m<>0 r = m Mod nIf r>10 Then s = Chr(65+r-10) & sElses = r & sEnd If m = m \ nLoopT = sEnd Function6. 7 综合应用加密和解密加密和解密简单加密的思想是:简单加密的思想是:• 将每个字母将每个字母C加一序数加一序数K,,式子式子 c=chr(Asc(c)+k),• 例如序数例如序数k为为5,这时,这时 “A”“F”,, “a”“f”,,“B”“G”…• 当加序数后的字母超过当加序数后的字母超过“Z”或或“z”则则 c=chr(Asc(c)+k -26)• 解密为加密的逆过程。
解密为加密的逆过程 程序6. 7 综合应用•字符串处理 HELLO PASSENGER! welcome TO My taxi.Hello passenger! Welcome to my taxi. 程序。