1、Visual Basic.NET 程序设计,主讲人:蒋忠中 东北大学工商管理学院,第 4 章 过 程,教学目的,教学要求,重点难点,教学内容,教学目的,学习本章的目的是了解模块化程序设计的思想,通过学习和上机实践,掌握Sub过程和Function过程的定义和调用方法。参数传递是学习本章的重要内容之一,通过本章的学习掌握形参与实参的作用,传值调用和引用调用的特点和区别,数组作为参数在过程定义中的意义和作用。学习本章还需了解变量的作用域和生存期、递归过程的特点以及其执行过程。学习本章的重要目标是在程序设计中合理的定义Sub过程和Function过程。,BACK,教学要求,了解模块化程序设计的概念、
2、“自顶向下、逐步求精”的程序设计方法。 掌握Sub过程的定义和调用方法,会将某一功能用Sub过程来实现。 掌握Function过程的定义和调用方法,能正确区分Sub过程和Function过程之间的区别,会将某一功能利用Function过程来实现。 掌握形参和实参的意义和作用,形参与一般变量的区别。掌握形参与实参之间传值调用和引用调用的特点,在程序设计中能合理的使用形参与实参之间的传值调用和引用调用,能正确理解数组参数在过程定义中的作用。 正确理解变量的作用域以及变量的生存期。 了解递归的概念,会顺利的阅读递归程序,了解递归程序的特点。 会举一反三,正确的定义和调用Sub过程和Function过
3、程。,BACK,重点难点,重点: Sub过程和Function过程的定义格式和调用方法,区分这两种过程的异同点。 形参与实参的作用,传值调用和引用调用的特点及其区别,数组作为参数在过程定义中的作用。 变量的作用域。 递归过程的特点及其执行过程。 理解Sub过程和Function过程的执行流程。 在程序设计中,正确使用Sub过程和Function过程。,重点难点,难点: 模块化分的原则,将一个复杂的问题分解为多个程序模块来实现。 形参的作用,形参与实参之间的关系。 Sub过程与Function过程之间的异同。 传值调用和引用调用的特点,在过程设计中合理的选用形参与实参之间的传值调用和引用调用。
4、静态变量的特点。 递归过程的执行流程,其中的递归执行条件的正确选用。,BACK,教学内容,4.1 模块化程序设计概述,4.2 Sub过程,4.3 Function过程,4.4 参数传递,4.5 变量的作用域与生存期,4.6 递归,过程可分为事件过程和通用过程。事件过程是当某个事件发生时,对该事件做出响应的程序段。将这一段代码抽象出来,建立一个独立的、可供其它过程调用的过程,这样的过程称为通用过程。通用过程主要包括Sub过程和Function过程两类,前者也被称作子过程,后者称作函数过程。,4.1 模块化程序设计概述,过程,事件过程,通用过程,Sub过程,Function过程,4.1 模块化程序
5、设计概述,4.1 模块化程序设计概述,4.1.1 程序的模块化,模块化程序设计是分而治之策略在程序设计中的应用。人们在解决复杂问题时往往采用分而治之的策略。,4.1 模块化程序设计概述,4.1.1 程序的模块化,4.1 模块化程序设计概述,4.1.2 模块间的层次结构,具有严密的正确的层次结构; 具有合理的隶属关系; 上层模块可以调用所有隶属于它的下层模块; 下属模块只能通过唯一的出口返回到调用它的上层模块; 整个程序按隶属关系分成若干层次,每一层次由若干个模块组成。,4.1 模块化程序设计概述,4.1.3“自顶向下、逐步求精”的程序设计方法,强调的是程序总体结构,即要求程序设计人员首先确定主
6、控模块。 分层向下细化,即按照上一层模块已确定的功能,把它再细化为一些子模块。如此继续下去,直到所有模块功能能够很容易地用计算机语言实现。,4.1 模块化程序设计概述,4.1.3“自顶向下、逐步求精”的程序设计方法,MENU,4.2 Sub过程,4.2.1 Sub过程的定义,Sub过程的定义形式:Public|Private Static Sub 过程名(形式参数列表)Exit SubEnd Sub,4.2 Sub过程,4.2.1 Sub过程的定义,【例4.1】实现两个浮点型变量值之间的交换。,Private Sub Swap(ByRef A As Single,ByRef B As Sing
7、le),Dim T As Single,T=A,End Sub,:,A=B,:,B=T,4.2 Sub过程,4.2.1 Sub过程的定义,Sub过程以Sub开头,以End Sub结束,两者之间称为“过程体”。 过程名的命名规则与变量名相同。 Sub过程通过形参与实参的传递得到结果,调用时可返回多个值。Exit Sub的功能是退出Sub过程,其目的是用于提前结束本次过程调用。,4.2 Sub过程,4.2.1 Sub过程的定义,ByVal|ByRef 变量名( ) As 类型, 仅表示形式参数的类型、个数和次序; 在过程定义时并无具体值,也不分配存储空间; 在过程被调用时,通过与实际参数结合获得具
8、体的值。 ByVal表示当该过程被调用时,参数是按值传递的; ByRef表示当该过程被调用时,参数是按地址传递的。 形式参数也可以是数组。在例4.1中,也可以将形式参数写成如下形式:Private Sub Swap(ByRef A!,ByRef B!),4.2 Sub过程,4.2.2 Sub过程的调用,Sub过程的调用格式如下:过程名(实参列表)为形参分配临时的存储单元; 将实参的值传递给形参对应的临时单元; 执行过程体中的语句; 当过程运行结束后把临时单元释放掉; 执行调用语句的下一条语句。,4.2 Sub过程,4.2.2 Sub过程的调用,Private Sub _ Button1_Cli
9、ck(ByVal sender _ As System.Object, ByVal e _ As System.EventArgs) _ Handles Button1.Click,Swap(X,Y),TxtOutput.Text = “X=” + _ X.ToString( ) + “ Y=” + _ Y.ToString( ),End Sub,Dim X,Y As SingleX=3.95 :Y=-12.2,Private Sub Swap(ByVal _ A As Single,ByVal B As _ Single),Dim T As Single,End Sub,Swap(X,Y),
10、3.95,-12.2,3.95,-12.2,T=A:,A=B:,B=T,3.95,3.95,-12.2,传值过程,调用过程,实参: X Y,形参:A B,T,MENU,4.3 Function过程,4.3.1 Function过程的定义,Function过程的定义形式:Public|Private Static Function 过程名(形式参数列表)As 类型Exit FunctionEnd Function,4.3 Function过程,4.3.1 Function过程的定义,Function过程以Function开头,以End Function结束,两者之间称为“过程体”。 过程体中至少
11、有一条Return语句: Return 表达式。调用时,过程的返回值即该表达式的值。 “As 类型”指定Function过程返回值的数据类型。,4.3 Function过程,4.3.1 Function过程的定义,计算阶乘的Function过程。Function Fact(ByVal N As Integer) As LongDim i As IntegerDim Result As LongResult=1For i=1 to NResult = Result * iNext iReturn ResultEnd Function,4.3 Function过程,4.3.2 Function过程
12、的调用,Function过程可以作为表达式的一个运算分量来使用。它的调用形式为:过程名 (实际参数表),4.3 Function过程,4.3.1 Function过程的定义,例如,调用计算阶乘的Function过程的程序段代码:Dim X As Integer,Y As LongX=Val(InputBox(“请输入一个不大于10的自然数:”)Y=Fact(X),MENU,4.4 参数传递,设计过程时要指定形式参数,包括形式参数的个数及其类型; 在调用过程时,必须提供实际参数; 完成实际参数与形式参数的结合,称为参数传递。 参数传递分传值和引用两种方式。,4.4 参数传递,4.4.1 形参与实
13、参,形式参数是指在定义通用过程时,出现在过程名后一对圆括号的变量。实际参数是指在调用通用过程时,出现在过程名后一对圆括号内的变量、常量或表达式。 实参可以是常量、变量、表达式或数组名等形式。 形、实参表中的各个参数用逗号分隔。 在过程调用时,实际参数应在个数、类型和次序上与形式参数保持一致。,4.4 参数传递,4.4.1 形参与实参,Function Fact(ByVal N As Integer) As LongDim i As IntegerDim Result As LongResult=1For i=1 to NResult = Result * iNext iReturn Resul
14、tEnd Function,Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim X As Integer,Y As LongX=Val(InputBox(“请输入一个不大于10的自然数:”)Y=Fact(X) End Sub,形参,实参,4.4 参数传递,4.4.2 传值,ByVal表明调用过程时对应的实参与形参之间按传值方式传递数据。 系统为形参分配临时存储单元,并将实参的值传送给形参; 在过程内部改变形参的值时,并不
15、会影响到实参的值。 实参可以是常量、变量或表达式,而变量必须有确定的值。,4.4 参数传递,4.4.2 传值,【例4.2】Private Function fun1(ByVal x%,ByVal y%) As IntegerDim sum As Integerx=x*xy=y*ysum=x+yReturn sumEnd Function Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.ClickDim A ,B ,C As Intege
16、rA=5B=8C=fun1(A,B)TxtOutPut.Text = “A=“ + A.ToString() + “ “ + “B=“ + _ B.ToString() + “ 计算结果=“ + C.ToString() End Sub,Private Function fun1(ByVal x%,ByVal y%) As IntegerDim sum As Integerx=x*xy=y*ysum=x+yReturn sumEnd Function,Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As Sy
17、stem.EventArgs) Handles Button1.ClickDim A ,B ,C As IntegerA=5B=8C=fun1(A,B)TxtOutPut.Text = “A=“ + A.ToString() + “ “ + “B=“ + _ B.ToString() + “ 计算结果=“ + C.ToString() End Sub,4.4 参数传递,4.4.3 引用,ByRef表明调用过程时对应的形参与实参之间按引用方式传递数据。 参数的传递是将实参的地址传递给形参,即形参与实参共享相同的存储单元。 当过程中对形参的值更改时,将更改相应实参的值。 实参可以是变量或数组,而不
18、能是常量或表达式。,4.4 参数传递,4.4.3 引用,Private Sub _ Button1_Click(ByVal sender _ As System.Object, ByVal e _ As System.EventArgs) _ Handles Button1.Click,Swap(X,Y),TxtOutput.Text = “X=” + _ X.ToString( ) + “ Y=” + _ Y.ToString( ),End Sub,Dim X,Y As SingleX=3.95 :Y=-12.2,Private Sub Swap(ByRef _ A As Single,By
19、Ref B As _ Single),Dim T As Single,End Sub,Swap(X,Y),3.95,-12.2,3.95,-12.2,T=A:,A=B:,B=T,3.95,3.95,-12.2,引 用 过 程,调 用 过 程,调 用 后,实参: X Y,形参:A B,T,4.4 参数传递,4.4.4 数组参数,数组作为过程的参数,称为数组参数。 不需指出数组的下标上界; 需要指明数组的维数; 数组名后的括号不能省略; 参数传递只能是引用。 例如,定义以下过程:Private Sub fun2(ByRef a() As Integer)End Sub,4.4 参数传递,4.4.4
20、 数组做参数(例4.3),Private Function ArrSum(ByRef X() As Integer) As IntegerDim Sum,i As IntegerSum = 0For i = 1 To X.GetUpperBound(0) Sum = Sum + X(i)Next iReturn Sum End Function Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.ClickDim a(12) As Inte
21、gerDim i, b As IntegerFor i = 1 To 12a(i) = Val(InputBox(“请收入“ + i.ToString() + “月份的收入:“)Next ib = ArrSum(a) MsgBox(“该职工的年输入为:“ + b.ToString() End Sub,Private Function ArrSum(ByRef X() As Integer) As IntegerDim Sum,i As IntegerSum = 0For i = 1 To X.GetUpperBound(0) Sum = Sum + X(i)Next iReturn Sum E
22、nd Function,Private Sub Button1_Click(ByVal sender As System.Object, ByVal _ e As System.EventArgs) Handles Button1.ClickDim a(12) As IntegerDim i, b As IntegerFor i = 1 To 12a(i) = Val(InputBox(“请收入“ + i.ToString() + “月份的收入:“)Next ib = ArrSum(a) MsgBox(“该职工的年输入为:“ + b.ToString() End Sub,MENU,4.5 变量
23、的作用域与生存期,4.5.1 变量的作用域,1块范围,块是由End、Else、Loop或Next语句终止的语句集合。例如:ForNextIfThenElseEnd If在某块内声明的变量只能在该块内使用。例如:If XYThenDim T As IntegerT=X : X=Y : Y=TEnd If,T的作用域,4.5 变量的作用域与生存期,4.5.1 变量的作用域,2过程范围,在某过程内声明的变量只能在该过程内部使用,该变量称为“局部变量”。例如:Private Sub Button1_Click(ByVal sender As _ System.Object, ByVal e As Sy
24、stem.EventArgs) _ Handles Button1.ClickDim AA As IntegerEnd Sub,AA的作用域,4.5 变量的作用域与生存期,4.5.1 变量的作用域,Private Sub S1( )Dim a, b As Integera = 11 : b = 22: a = a + 1: b = b + 1TxtOutPut.Text = “a=“ + a.ToString() + “ b=“ + b.ToString() End Sub Private Sub S2( )Dim a, c As Integera = 33 : c = 44: a = a 1
25、: c = c 1TxtOutPut.Text = “a=“ + a.ToString() + “ b=“ + b.ToString() End Sub Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.ClickCall S1()MsgBox(“按任意键继续!“)Call S2() End Sub,2过程范围,Private Sub S1( )Dim a, b As Integera = 11 : b = 22: a = a + 1:
26、b = b + 1TxtOutPut.Text = “a=“ + a.ToString() + “ b=“ + b.ToString() End Sub,Private Sub S2( )Dim a, c As Integera = 33 : c = 44: a = a 1: c = c 1TxtOutPut.Text = “a=“ + a.ToString() + “ b=“ + b.ToString() End Sub,Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs
27、) Handles Button1.ClickCall S1()MsgBox(“按任意键继续!“)Call S2() End Sub,4.5 变量的作用域与生存期,4.5.1 变量的作用域,2过程范围,全局变量在过程外部定义,可以被该模块的所有过程调用。【例4.5】局部变量与全局变量的区别。,Dim a As Integer Private Sub S1()Dim b As Integerb = 20a = a + 1b = b + 1TxtOutPut.Text = “a=” + a.ToString() + “ b=” + b.ToString() End Sub Private Sub
28、S2()Dim b As Integerb= 30a = a +1b = b +1TxtOutPut.Text = “a=“ + a.ToString() + “ b=“ + b.ToString() End Sub Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Clicka=10 Call S1()MsgBox(“按任意键继续!“)Call S2() End Sub,Dim a As Integer,Private Sub S1()
29、Dim b As Integerb = 20a = a + 1b = b + 1TxtOutPut.Text = “a=” + a.ToString() + “ b=” + b.ToString() End Sub,Private Sub S2()Dim b As Integerb= 30a = a +1b = b +1TxtOutPut.Text = “a=” + a.ToString() + “ b=” + b.ToString() End Sub,Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As S
30、ystem.EventArgs) Handles Button1.Clicka=10 Call S1()MsgBox(“按任意键继续!“)Call S2() End Sub,4.5 变量的作用域与生存期,4.5.1 变量的作用域,3模块范围,包括VB.NET中的模块、类和结构。可以通过将声明语句放在模块、类或结构中的任一过程或块的外部来声明该级别的元素。,4命名空间范围,Friend或Public声明模块级变量,则该变量可用于整个命名空间(在其中声明该变量)内的所有过程。,4.5 变量的作用域与生存期,4.5.2 静态变量,在过程结束时仍保留值的变量为静态变量。定义格式为:Static 变量名
31、 As 类型在过程中定义的静态变量也是一种局部变量,只能在该过程中使用。 过程结束时,静态变量的值仍然保留。 只有在第一次调用该过程时系统对静态变量进行初始化。,4.5 变量的作用域与生存期,4.5.2 静态变量,【例4.6】记录并显示某按钮的点击次数的代码:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickStatic Count As IntegerCount = Count + 1TextBox1.Text = “第“ + C
32、ount.ToString() + “次点击!“ End Sub,MENU,4.6 递归,Function Fac(ByVal x As Integer) As LongIf x = 1 Then Return 1 Else Return (x * Fac(x - 1) End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As_ System.EventArgs) Handles Button1.ClickDim m As IntegerDim n As Longm = Val(TextBox1.Text)n = Fac(m)TextBox2.Text = Str(m) & “!=“ & Str(n) End Sub,递归算法求n!,4.6 递归,Fac(5),Fac(4),Fac(3),Fac(2),Fac(1),返回1,返回2,返回6,返回24,返回120,BACK,Thank you!,