《第5章过程.ppt》由会员分享,可在线阅读,更多相关《第5章过程.ppt(52页珍藏版)》请在课桌文档上搜索。
1、第5章 过程,第5章 过程,5.1 Sub过程5.2 函数过程5.3 参数传递5.4 变量的作用范围,引入新课,我们在前面学习过:可以通过循环结构来反复执行某种操作。循环结构只能在程序中的某个位置反复进行特定的操作,若该操作需要在程序中的多个位置出现,那么,在需要进行这种操作的地方都需要一个循环结构的出现,这样使得程序的复杂程度增加。解决上述问题的方法是使用子程序(过程)。VB提供的系统函数即是函数过程的实例。,引入新课,Visual Basic中的自定义过程分为:以Sub保留字开始的Sub过程。这种过程不直接返回值,但是可以通过参数或模块级变量、全局变量来返回多个值。以Function保留字
2、开始的函数过程,过程通过函数名可直接返回一个值。,5.1 Sub过程,在程序多个位置多次重复出现的操作:不是计算得到某个结果,而是要完成特定的操作或需要返回多个结果则可将这些操作定义为Sub过程(子过程),在程序中需要这些操作的地方,通过调用该Sub过程即可。,5.1 Sub过程,建立Sub过程的方法:利用“工具”菜单下的“添加过程”命令,生成一个Sub过程框架,然后再输入相应的代码。在代码窗口中直接定义。即:在窗体、模块等的代码窗口,在所有过程之外直接输入Sub过程。,5.1 Sub过程,自定义Sub过程的形式如下:Private|Public Sub 过程名(形参列表)局部变量或常量声明
3、语句块 Exit Sub 语句块End Sub,5.1 Sub过程,说明:Private定义过程为局部过程,即该过程只能被过程所在模块的其它过程调用。Public定义过程为全局过程,即该过程可被所有模块中的过程调用。默认为Public。过程名为过程的标识,其命名规则与变量的命名规则相同。形参列表:形式为:形参1 As 类型,形参2 As 类型,形参只能是变量名或数组名,仅表示参数的个数、类型形参两边的括号不能省略Exit Sub:表示退出Sub过程,5.1 Sub过程,调用Sub过程:Call 子过程名(实参列表)子过程名实参列表说明:用Call关键字来调用Sub过程时,若有实参,则实参需要用
4、括号括起来;用过程名方式调用子过程,则实参两边的括号可以省略若要通过实参返回结果,那么,实参只能是与形参同类型的简单变量、数组名、结构类型,而不能是常量、表达式或控件名。,5.1 Sub过程,【例5-2】编写一过程实现两个数的交换Sub Swap(x As Integer,y As Integer)Dim t As Integer t=x:x=y:y=tEnd SubPrivate Sub Form_Click()Dim a As Integer,b As Integer a=3:b=4 Print 调用前:a=&a&,b=&b Call Swap(a,b)Print 调用后:a=&a&,b=
5、&bEnd Sub,5.1 Sub过程,运行结果,5.1 Sub过程,通用过程和事件过程通用过程由用户自定义,可放在窗体模块中,也可放在标准模块中由用户在过程或函数中自行调用分为Sub过程和函数过程两大类事件过程对事件的响应代码,只可以放在窗体模块中在发生特定事件时由Visual Basic自动调用,也可以被同一模块中的其它过程调用事件过程框架由系统指定,5.1 Sub过程,事件过程的框架:Private|Public Sub 对象名_事件名(参数列表)语句块End Sub,5.1 Sub过程,关于过程的调用通用过程之间、事件过程之间、通用过程与事件过程之间,都可以互相调用。Public过程可
6、以被其它模块中的过程调用。若过程名在所有模块范围内唯一时,可以直接使用过程名调用,否则调用过程时,需要在过程名前加上模块名:模块名.过程名(实参列表),5.1 Sub过程,5.2 函数过程,函数的定义:Public|Private Function 函数名(形参列表)As 类型 局部变量或常量的声明 语句块 函数名=返回值 Exit Function 语句块 函数名=返回值End Function,5.2 函数过程,说明:函数名命名规则、形参列表形式同Sub过程中相应项的规定As 类型:函数返回值的类型函数名=返回值:在函数中至少要对函数名赋值一次,该值即是函数的运算结果,5.2 函数过程,函
7、数的调用:自定义函数的调用与内部函数的调用相同,格式如下:函数名(实参列表)函数的返回值将参与表达式的计算,5.2 函数过程,【例5-3】编写一个求最大公约数的函数过程。Function gcd(m As Integer,n As Integer)As Integer Dim r As Integer,t As Integer If m 0 m=n:n=r:r=m mod n Loop gcd=nEnd Function,5.2 函数过程,调用求最大公约数函数过程的示例:Private Sub Form_Click()Dim x As Integer,y As Integer,z As Int
8、eger x=36:y=54 Print x z=gcd(x,y)Print zEnd Sub,5.2 函数过程,【例5-4】编写一个HuiWen函数,用于判断一个字符串是否是“回文”。Function HuiWen(str1 As String)As String Dim L As Integer,k As Integer Dim Ls As String,Rs As String L=Len(str1):k=1 Do Ls=Mid(str1,k,1)Rs=Mid(str1,L-k+1,1)If Ls Rs Then Exit Do k=k+1 Loop While k L/2,是回文,不是
9、回文)End Function,5.2 函数过程,Private Sub Form_Click()Dim s As String s=InputBox(请输入任意字符串)Print s;HuiWen(s)End Sub,5.2 函数过程,函数过程与Sub过程的区别函数过程必须有返回值,函数名有类型(即是返回值的类型),必须在函数体中对函数名赋值来作为返回值Sub过程可以没有返回值,过程名没有类型,不能在Sub过程中对过程名赋值一般来说,若程序有一个返回值时,使用函数过程来设计较为直观;若没有返回值,或有多个返回值时,习惯使用Sub过程。,5.2 函数过程,参数问题形参是过程与主调程序交互的接口
10、,通过形参从主调程序中获得传递过来的初值,通过形参也能把计算结果返回给主调程序形参没有具体的值,只代表参数的个数、位置、类型;只能是简单变量、数组名,不能是常量、数组元素、表达式。,5.2 函数过程,5.3 参数传递,形参是指在定义Sub或函数过程时,在过程名后的圆括弧中出现的变量名、数组名列表。用于引用主调程序中传递过来的数据。实参是指主调程序在调用过程时,在过程名后给出的常量、变量、表达式或数组。用于把数据传递给被调用的过程。被形参引用的实参,其排列次序与形参的排列次序一致,与参数的名字没有关系。,5.3 参数传递,参数的传递有两种方式:ByRef传地址方式,也叫引用。默认的参数传递方式。
11、形参与实参共用相同的存储单元,因而,在被调函数中修改了形参的值,那么,主调函数对应的实参的值也同样发生了变化。即:可以通过参数向主调程序返回多个结果。ByVal传值方式。实参和形参对应于不同的存储单元,因而,传值方式只能把值从实参传递给形参,而不能通过形参返回结果。如果实参是常量或表达式,则默认采用传值方式。,5.3 参数传递,【例5-5】分别用传值和引用方式编写变量交换过程。Sub Swap1(ByVal x As Integer,ByVal y As Integer)Dim t As Integer t=x:x=y:y=tEnd SubSub Swap2(ByRef x As Intege
12、r,ByRef y As Integer)Dim t As Integer t=x:x=y:y=tEnd Sub,5.3 参数传递,Private Sub Form_Click()Dim a As Integer,b As Integer a=1:b=2 Swap1 a,b Print a=&a&,b=&b a=1:b=2 Swap2 a,b Print a=&a&,b=&bEnd Sub,5.3 参数传递,参数传递方式使用传值还是引用?若被调用过程需要通过形参把结果返回给主调程序,那么,参数传递方式需要使用引用方式。这时,实参必须是与形参同类的变量名(简单变量、数组、结构),而不能是常量或表
13、达式。若不希望被调过程修改实参的值,则参数传递方式应采用传值方式。,5.3 参数传递,数组参数的传递:数组作为参数传递时,总是采用引用方式传递。在形参列表中的数组只需要给出数组名,并在数组名后加上一对空的圆括号,而不需要指出数组的上、下界。在调用过程时,实参中的数组只需要给出数组名,即可传递整个数组给被调过程。数组中的一个元素可以当作是简单变量来作为实参传递给形参。通过LBound和UBound函数可以确定实参的下、上界。,5.3 参数传递,【例】编写一个过程Sort,使用选择排序算法对数组中的元素按升序排列。Option Base 1Sub Sort(x()As Integer)Dim i
14、As Integer,j As Integer Dim k As Integer,t As Integer For i=LBound(x)To UBound(x)-1 k=i For j=i+1 To UBound(x)If x(k)x(j)Then k=j Next t=x(i):x(i)=x(k):x(k)=t NextEnd Sub,5.3 参数传递,Private Sub Form_Click()Dim a(50)As Integer,b(20)As Integer Dim i As Integer Cls Randomize For i=1 To 50 a(i)=Int(Rnd*10
15、0)Print a(i);If i Mod 10=0 Then Print Next Print Sort a For i=1 To 50 Print a(i);If i Mod 10=0 Then Print Next,Print Randomize For i=1 To 20 b(i)=Int(Rnd*100)Print b(i);If i Mod 10=0 Then Print Next Print Sort b For i=1 To 20 Print b(i);If i Mod 10=0 Then Print NextEnd Sub,5.3 参数传递,对上述排序程序进行修改,使得:通过
16、第2个参数来指定要排序的元素的个数通过第3个参数来指定按升序还是降序排序取值为True:按升序排列取值为False:按降序排列,5.3 参数传递,Option Base 1Sub Sort(x()As Integer,n As Integer,d As Boolean)Dim i As Integer,j As Integer Dim k As Integer,t As Integer For i=LBound(x)To n-1 k=i For j=i+1 To n If d And x(k)x(j)Or Not d And x(k)x(j)Then k=j Next t=x(i):x(i)=
17、x(k):x(k)=t NextEnd Sub,5.3 参数传递,Private Sub Form_Click()Dim a(20)As Integer,i As Integer Cls Randomize For i=1 To 20 a(i)=Int(Rnd*100)Print a(i);If i Mod 10=0 Then Print Next Print,Sort a,10,True For i=1 To 20 Print a(i);If i Mod 10=0 Then Print Next Print Sort a,20,False For i=1 To 20 Print a(i);I
18、f i Mod 10=0 Then Print Next PrintEnd Sub,5.3 参数传递,5.4 变量的作用范围,变量的可被访问的范围称为变量的作用范围。声明变量的位置不同、语句不同,变量的作用范围也不同。,5.4 变量的作用范围,按作用范围,可变量分为:局部变量只在声明变量的过程中起作用,离开该过程则变量失效在过程内部使用Dim或Static声明模块级变量在窗体的通用声明段或标准模块中用Dim或Private语句声明的变量在声明变量模块中的任意过程均可以访问该变量全局变量用Public声明的模块级变量。可被应用程序任意模块中的过程访问。,5.4 变量的作用范围,若局部变量、模块级
19、变量和全局变量的名称发生冲突,那么,作用范围小的变量将起作用。,5.4 变量的作用范围,在过程中使用Dim定义的局部变量,每一次调用过程时,均会自动被初始化。在过程中使用Static定义的局部变量,每一次调用过程时,它都能够保留上次离开过程时的值。,5.4 变量的作用范围,例如:Sub test()Dim n As Integer n=n+1 Print nEnd SubPrivate Sub Form_Click()Call testEnd Sub,5.4 变量的作用范围,Sub test()Static n As Integer n=n+1 Print nEnd SubPrivate Su
20、b Form_Click()Call testEnd Sub,5.4 变量的作用范围,在窗体通用声明部分,声明模块级数组变量Avg,用于存储每位同学的平均分:Dim Avg()As Integer,5.4 变量的作用范围,随机产生n个同学的m门成绩:Sub InitData(a()As Integer,n As Integer,m As Integer)Dim i As Integer,j As Integer Randomize For i=1 To n a(i,0)=i For j=1 To m a(i,j)=Int(Rnd*101)Next NextEnd Sub,5.4 变量的作用范围
21、,求平均分:Sub Average(a()As Integer,n As Integer,m As Integer)Dim i As Integer,j As Integer,sum As Integer For i=1 To n sum=0 For j=1 To m sum=sum+a(i,j)Next Avg(i)=sum/m NextEnd Sub,5.4 变量的作用范围,选择排序过程:Sub Sort(a()As Integer,n As Integer,m As Integer)Dim i As Integer,j As Integer,k As Integer,t As Integ
22、er For i=1 To n-1 k=i For j=i+1 To n If Avg(k)Avg(j)Then k=j Next Call Swap(a,m,i,k)NextEnd Sub,5.4 变量的作用范围,交换过程Sub Swap(a()As Integer,m As Integer,i As Integer,j As Integer)Dim k As Integer,t As Integer For k=0 To m t=a(i,k):a(i,k)=a(j,k):a(j,k)=t Next t=Avg(i):Avg(i)=Avg(j):Avg(j)=tEnd Sub,5.4 变量的
23、作用范围,打印过程Sub PrintArray(a()As Integer,n As Integer,m As Integer)Dim i As Integer,j As Integer For i=1 To n Print Stud Avg(i)NextEnd Sub,5.4 变量的作用范围,单击窗体过程Private Sub Form_Click()Dim Score()As Integer,n As Integer,m As Integer n=Val(InputBox(请输入学生人数,输入n,5)m=Val(InputBox(请输入课程门数,输入m,4)ReDim Avg(n)As Integer ReDim Score(n,m)As Integer InitData Score,n,m Average Score,n,m,5.4 变量的作用范围,Print String(m*5,*);排序前;Print String(m*3,*);平均分 PrintArray Score,n,m Sort Score,n,m Print String(m*5,*);排序后;Print String(m*3,*);平均分 PrintArray Score,n,m Print String(m*10+4,*)End Sub,5.4 变量的作用范围,