《第5章过程.ppt》由会员分享,可在线阅读,更多相关《第5章过程.ppt(55页珍藏版)》请在三一文库上搜索。
1、第5章 过程,第5章 过程,5.1 Sub过程 5.2 函数过程 5.3 参数传递 5.4 变量的作用范围,引入新课,我们在前面学习过: 可以通过循环结构来反复执行某种操作。 循环结构只能在程序中的某个位置反复进行特定的操作,若该操作需要在程序中的多个位置出现,那么,在需要进行这种操作的地方都需要一个循环结构的出现,这样使得程序的复杂程度增加。 解决上述问题的方法是使用子程序(过程)。 VB提供的系统函数即是函数过程的实例。,引入新课,Visual Basic中的自定义过程分为: 以Sub保留字开始的Sub过程。这种过程不直接返回值,但是可以通过参数或模块级变量、全局变量来返回多个值。 以Fu
2、nction保留字开始的函数过程,过程通过函数名可直接返回一个值。,引入新课,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 子过程名(实参列表) 子过程名实参列表
4、说明: 用Call关键字来调用Sub过程时,若有实参,则实参需要用括号括起来;用过程名方式调用子过程,则实参两边的括号可以省略 若要通过实参返回结果,那么,实参只能是与形参同类型的简单变量、数组名、结构类型,而不能是常量、表达式或控件名。,5.1 Sub过程,【例5-2】编写一过程实现两个数的交换 Sub Swap(x As Integer,y As Integer) Dim t As Integer t=x:x=y:y=t End Sub Private Sub Form_Click() Dim a As Integer, b As Integer a=3:b=4 Print “调用前:a=
5、“ & a & “,b=“ & b Call Swap(a, b) Print “调用后:a=“ & a & “,b=“ & b End Sub,5.1 Sub过程,运行结果,5.1 Sub过程,通用过程和事件过程 通用过程 由用户自定义,可放在窗体模块中,也可放在标准模块中 由用户在过程或函数中自行调用 分为Sub过程和函数过程两大类 事件过程 对事件的响应代码,只可以放在窗体模块中 在发生特定事件时由Visual Basic自动调用,也可以被同一模块中的其它过程调用 事件过程框架由系统指定,5.1 Sub过程,事件过程的框架: Private|Public Sub 对象名_事件名(参数列表
6、) 语句块 End Sub,5.1 Sub过程,关于过程的调用 通用过程之间、事件过程之间、通用过程与事件过程之间,都可以互相调用。 Public过程可以被其它模块中的过程调用。若过程名在所有模块范围内唯一时,可以直接使用过程名调用,否则调用过程时,需要在过程名前加上模块名: 模块名.过程名(实参列表),5.1 Sub过程,5.2 函数过程,函数的定义: Public|Private Function 函数名(形参列表) As 类型 局部变量或常量的声明 语句块 函数名=返回值 Exit Function 语句块 函数名=返回值 End Function,5.2 函数过程,说明: 函数名命名规
7、则、形参列表形式同Sub过程中相应项的规定 As 类型:函数返回值的类型 函数名 = 返回值:在函数中至少要对函数名赋值一次,该值即是函数的运算结果,5.2 函数过程,函数的调用: 自定义函数的调用与内部函数的调用相同,格式如下: 函数名(实参列表) 函数的返回值将参与表达式的计算,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 = n End Fun
8、ction,5.2 函数过程,调用求最大公约数函数过程的示例: Private Sub Form_Click() Dim x As Integer, y As Integer, z As Integer x = 36: y = 54 Print x z = gcd(x, y) Print z End 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 Stri
9、ng 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, “是回文“, “不是回文“) End Function,5.2 函数过程,Private Sub Form_Click() Dim s As String s = InputBox(“请输入任意字符串“) Print s;HuiWen(s) End Sub,5.2 函数过程,函数过程与Sub过程的区别 函数过程必须有返回值,函数名有类型(即是返回值的类型),必须在函数体中对
10、函数名赋值来作为返回值 Sub过程可以没有返回值,过程名没有类型,不能在Sub过程中对过程名赋值 一般来说,若程序有一个返回值时,使用函数过程来设计较为直观;若没有返回值,或有多个返回值时,习惯使用Sub过程。,5.2 函数过程,参数问题 形参是过程与主调程序交互的接口,通过形参从主调程序中获得传递过来的初值,通过形参也能把计算结果返回给主调程序 形参没有具体的值,只代表参数的个数、位置、类型;只能是简单变量、数组名,不能是常量、数组元素、表达式。,5.2 函数过程,5.3 参数传递,形参是指在定义Sub或函数过程时,在过程名后的圆括弧中出现的变量名、数组名列表。用于引用主调程序中传递过来的数
11、据。 实参是指主调程序在调用过程时,在过程名后给出的常量、变量、表达式或数组。用于把数据传递给被调用的过程。 被形参引用的实参,其排列次序与形参的排列次序一致,与参数的名字没有关系。,5.3 参数传递,参数的传递有两种方式: ByRef 传地址方式,也叫引用。默认的参数传递方式。 形参与实参共用相同的存储单元,因而,在被调函数中修改了形参的值,那么,主调函数对应的实参的值也同样发生了变化。即:可以通过参数向主调程序返回多个结果。 ByVal 传值方式。 实参和形参对应于不同的存储单元,因而,传值方式只能把值从实参传递给形参,而不能通过形参返回结果。 如果实参是常量或表达式,则默认采用传值方式。
12、,5.3 参数传递,【例5-5】分别用传值和引用方式编写变量交换过程。 Sub Swap1(ByVal x As Integer, ByVal y As Integer) Dim t As Integer t = x: x = y: y = t End Sub Sub Swap2(ByRef x As Integer, ByRef y As Integer) Dim t As Integer t = x: x = y: y = t End Sub,5.3 参数传递,Private Sub Form_Click() Dim a As Integer, b As Integer a = 1: b
13、= 2 Swap1 a, b Print “a=“ & a & “,b=“ & b a = 1: b = 2 Swap2 a, b Print “a=“ & a & “,b=“ & b End Sub,5.3 参数传递,参数传递方式使用传值还是引用? 若被调用过程需要通过形参把结果返回给主调程序,那么,参数传递方式需要使用引用方式。这时,实参必须是与形参同类的变量名(简单变量、数组、结构),而不能是常量或表达式。 若不希望被调过程修改实参的值,则参数传递方式应采用传值方式。,5.3 参数传递,数组参数的传递: 数组作为参数传递时,总是采用引用方式传递。 在形参列表中的数组只需要给出数组名,并在
14、数组名后加上一对空的圆括号,而不需要指出数组的上、下界。 在调用过程时,实参中的数组只需要给出数组名,即可传递整个数组给被调过程。 数组中的一个元素可以当作是简单变量来作为实参传递给形参。 通过LBound和UBound函数可以确定实参的下、上界。,5.3 参数传递,【例】编写一个过程Sort,使用选择排序算法对数组中的元素按升序排列。 Option Base 1 Sub Sort(x() As Integer) Dim i As Integer, j As Integer Dim k As Integer, t As Integer For i = LBound(x) To UBound(x
15、) - 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 Next End 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 * 100) Print a(i); If i Mod 10 = 0 Then Print Next Pr
16、int 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 Next End Sub,5.3 参数传递,对上述排序程序进行修改,使得: 通过第2个参数来指定要排序的元素的个数 通过第3个
17、参数来指定按升序还是降序排序 取值为True:按升序排列 取值为False:按降序排列,5.3 参数传递,Option Base 1 Sub 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)
18、: x(i) = x(k): x(k) = t Next End 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, 2
19、0, False For i = 1 To 20 Print a(i); If i Mod 10 = 0 Then Print Next Print End Sub,5.3 参数传递,5.4 变量的作用范围,变量的可被访问的范围称为变量的作用范围。 声明变量的位置不同、语句不同,变量的作用范围也不同。,5.4 变量的作用范围,按作用范围,可变量分为: 局部变量 只在声明变量的过程中起作用,离开该过程则变量失效 在过程内部使用Dim或Static声明 模块级变量 在窗体的通用声明段或标准模块中用Dim或Private语句声明的变量 在声明变量模块中的任意过程均可以访问该变量 全局变量 用Publ
20、ic声明的模块级变量。 可被应用程序任意模块中的过程访问。,5.4 变量的作用范围,若局部变量、模块级变量和全局变量的名称发生冲突,那么,作用范围小的变量将起作用。,5.4 变量的作用范围,在过程中使用Dim定义的局部变量,每一次调用过程时,均会自动被初始化。 在过程中使用Static定义的局部变量,每一次调用过程时,它都能够保留上次离开过程时的值。,5.4 变量的作用范围,例如: Sub test() Dim n As Integer n = n + 1 Print n End Sub Private Sub Form_Click() Call test End Sub,5.4 变量的作用范
21、围,Sub test() Static n As Integer n = n + 1 Print n End Sub Private Sub Form_Click() Call test End Sub,5.4 变量的作用范围,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 R
22、andomize For i = 1 To n a(i, 0) = i For j = 1 To m a(i, j) = Int(Rnd * 101) Next Next End Sub,5.4 变量的作用范围,求平均分: 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 Next
23、End 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 Integer 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) Next End Sub,5.4 变量的作用范围,交换过程 Sub Swap(a() As Integer, m As I
24、nteger, 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) = t End Sub,5.4 变量的作用范围,打印过程 Sub PrintArray(a() As Integer, n As Integer, m As Integer) Dim i As Integer, j As Integer For i = 1 To n
25、 Print “Stud “ Avg(i) Next End 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 变量的作用范围,作业,P88 一 P89 二 P93 三:2、3、4,
链接地址:https://www.31doc.com/p-2974535.html