首页 vb课件之第7章 过程

vb课件之第7章 过程

举报
开通vip

vb课件之第7章 过程null第7章 过程第7章 过程过程 第8章过程 第8章在设计一个规模较大、复杂的程序时,需要按功能将程序分解成若干个相对独立的部分,即程序段。这些程序段称为程序的逻辑部件。它可以简化程序设计任务。这种逻辑部件称为过程。 null有三种过程: SUB过程:不返回值 FUNCTION过程:返回一个值 PROPERTY过程Sub过程Sub过程 在Visual Basic中有两种Sub过程,即事件过程和通用过程。 事件过程 通用过程 7...

vb课件之第7章 过程
null第7章 过程第7章 过程过程 第8章过程 第8章在设计一个规模较大、复杂的程序时,需要按功能将程序分解成若干个相对独立的部分,即程序段。这些程序段称为程序的逻辑部件。它可以简化程序设计任务。这种逻辑部件称为过程。 null有三种过程: SUB过程:不返回值 FUNCTION过程:返回一个值 PROPERTY过程Sub过程Sub过程 在Visual Basic中有两种Sub过程,即事件过程和通用过程。 事件过程 通用过程 7.1事件过程事件过程 所谓事件就是能被对象(窗体和控件)所识别的动作。为一个事件编写程序代码,就是使对象按程序指定的方式作用。将事件处理代码放在过程中就形成了事件过程。一个事件发生后,对象能自动地利用和该事件对应的名称引导事件过程。事件名称建立了对象和代码之间的联系。 7.1.1定义事件过程定义事件过程窗体事件过程的一般形式是: Private Sub Form_事件名(〔参数列表〕) 〔局部变量和常数声明〕 语句块 Eud Sub 说明 说明说明窗体事件过程名由词“Form”、下划线和事件名结合而成。尽管窗体有各自的名称,但在窗体事件过程名中不使用窗体自己的名字。 每个窗体事件过程名前都有一个“Private”的前缀,这表示该事件过程不能在它自己的窗体模块之外被调用。它的使用范围是模块级的,在该窗体之外是不可见的,也就是说是私有的或局部的; 事件过程有无参数,完全由Visual Basic所提供的具体事件本身所决定,用户不可以随意添加。 窗体的若干事件窗体的若干事件Initialize(初始化)事件是在窗体被加载之前,窗体被配置的时候触发 Load(加载)事件,VB把窗体从磁盘或从磁盘缓冲区读入内存时发生 Activate(激活)事件是在窗体已经被装入内存,变成被激活的窗体时触发 GotFocus事件在窗体成为当前焦点时触发窗体各事件的发生次序窗体各事件的发生次序建立窗体装入内存窗体被激活Load语句InitializeLoadActivate所触发的事件New关键字或VB自动建立定义控件事件过程定义控件事件过程控件事件过程的一般形式是: Private Sub 控件名__事件名([参数列表]) 〔局部变量和常数声明〕 语句块 End Sub 说明 说明说明控件事件过程名由控件名、下划线和事件名组成。组成控件事件过程名的控件名必须与窗体中某个控件相匹配,否则Visual Basic将认为它是一个通用过程; 控件事件过程也是私有过程,属于包含它的窗体模块。 例如:在窗体中设置了一个名为Cmdend的命令按钮控件,它的对应事件过程如下: Private Sub Cmdend_Click() End End Sub 建立事件过程建立事件过程打开代码编辑器窗口 在代码编辑窗口的对象列表框中选择一个对象,在过程列表框中选定一个事件过程后,就会在代码框中显示选定的事件过程模板; 在Private Sub与End Sub之间键入代码; 使用“文件”菜单中的“保存工程”命令分别保存窗体文件和工程文件。 通用过程通用过程具有一定功能的独立程序段称为通用过程 通用过程是一个必须从另一个过程(事件过程或其它通用过程)显式调用的程序段 通用过程分为公有(Public)过程和私有(Private)过程两种。公有过程可以被应用程序中的任一过程调用,而私有过程只能被同一模块中的过程调用。可以将通用过程放入窗体模块、 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 模块或类模块中。 通用Sub过程的定义 建立通用Sub过程 7.1.2通用Sub过程的定义通用Sub过程的定义通用Sub 过程的一般形式是: [Private | Public] [Static] Sub 过程名 ([参数列表])     [局部变量和常量声明]     语句块     [Exit Sub]     语句块  End Sub Sub过程不能嵌套定义,即在Sub过程中不可以再定义Sub过程或Function过程。但可以嵌套调用。 Private | Public选项Private | Public选项以Private为前缀的Sub过程是模块级的(私有的)过程,只能被本模块内的事件过程或其它过程调用。以Public为前缀的Sub过程是应用程序级的(公有的或全局的)过程,在应用程序的任何模块中都可以调用它。若缺省 Private | public选项,则系统默认值为Public。若在一个窗体模块调用另一个窗体模块中的公有过程时,必须以那个窗体名字作为该公有过程名的前缀,即以某窗体名.公有过程名的形式调用公有过程 Static选项:Static指定过程中的局部变量为“静态”变量 Sub 关键字,过程名 Sub 关键字,过程名 Sub 过程以Sub语句开头,结束于End Sub语句。在Sub和End Sub之间是描述过程操作的语句块,称为子程序体或过程体。在Sub语句之后,是过程的声明段,可以用Dim或Static语句声明过程的局部变量和常量 过程名的命名规则与变量命名规则相同。在同一个模块中,过程名必须唯一。过程名不能与模块级变量同名,也不能与调用该过程的调用程序中的局部量同名 参数列表 参数列表 参数列表中的参数称为形式参数,它可以是变量名或数组名。若有多个参数时,各参数之间用逗号分隔。Visual Basic的过程可以没有参数,但一对圆括号不可以省略。不含参数的过程称为无参过程。 形式参数的格式为: [Optional][ByVal][ByRef] 变量名[()] [As数据类型] Optional Optional 表示参数是可选参数的关键字,缺省Optional前缀的参数是必选参数。可选参数必须放在所有的必选参数的后面,而且每个可选参数都必须用Optional关键字声明。所谓的可选参数就是在调用过程时,可以没有实在参数与它结合。本书不涉及可选参数 ByVal , ByRef,变量名[()] ByVal , ByRef,变量名[()] ByVal:表明其后的形参是按值传递参数或称为“传值”(Passed by Value)参数 ByRef:表明其后的参数是按地址传递(传址)参数或称为“引用”(Passed by reference)参数,若形式参数前缺省ByVal 和ByRef关键字,则这个参数是一个引用参数 变量名为合法的Visual Basic变量名或数组名。若变量名后无括号则表示该形参是变量,否则是数 组As数据类型 As数据类型 该选项用来说明变量类型,若缺省,则该形参是“变体变量”(Variant)。如果形参变量的类型被说明为“String”,它只能是不定长的。而在调用该过程时,对应的实在参数可以是定长的字符串变量或字符串数组元素。如果形参是字符串数组,则没有这个限制 过程体,End Sub语句过程体,End Sub语句过程体由合法的Visual Basic语句组成,过程体中可以含有多个Exit Sub语句,程序执行到Exit Sub语句时提前退出该过程,返回到调用该过程语句的下一条语句 标志Sub过程的结束,当程序执行到End Sub语句时,退出该过程,并立即返回执行调用该过程语句的下一条语句 建立通用Sub过程建立通用Sub过程创建通用过程的第一种方法是: 打开代码编辑器窗口; 选择“工具”菜单的“添加过程”; 首先在“添加过程”对话框中输入过程名,接着在类型选项中选定过程类型是子程序还是函数,然后在过程的应用范围选项中选定公有还是私有,最后单击“确定” 创建通用过程的第二种方法是: 在代码窗口中的对象列表框中选“通用”,再在代码窗口的文本编辑区空白行处键入“Private Sub过程名”或“Public Sub过程名”; 按Enter键,即可创建一个Sub过程样板 Private Sub printxing(n As Integer) Print String(n, "*") End Sub Function过程Function过程定义Function过程的形式是: [Private| Public] [Static] Function函数名([参数列表]) [AS数据类型]     [局部变量和常数声明]     [语句块]     [函数名 = 表达式]     [Exit Function]     [语句块]     [函数名 = 表达式] End Function7.2函数体Function,函数名,As 数据类型Function,函数名,As 数据类型Function过程应以Function语句开头,以End Function语句结束。中间是描述过程操作的语句,称为函数体或过程体。语法格式中的Private、Public、Static以及参数列表等含义与定义Sub过程相同 函数名的命名规则与变量名的命名规则相同。在函数体内,可以象使用简单变量一样使用函数名 As 数据类型:Function过程要由函数名返回一个值。使用As数据类型选项,指定函数的类型。缺省该选项,函数类型默认为“Variant”类型 函数体函数体在函数体内通过“函数名 = 表达式”语句给函数名赋值,若在Function过程中缺省给函数名赋值的语句。则该Function过程返回对应类型的缺省值,例如数值型函数返回0值,而字符串函数返回空字符串 在函数体内可以含有多个Exit Function语句,程序执行Exit Function语句将退出Function过程返回调用点 Function过程与Sub过程一样在其内部不得再定义Sub过程或Function过程 [例7-1] 编写一个求 n! 的函数过程[例7-1] 编写一个求 n! 的函数过程算法说明: 求阶乘可通过累乘实现。定义函数过程时,要考虑到其通用性,要根据自变量的取值范围与函数值的大小设置适当的数据类型 程序代码nullPrivate Function Fact(ByVal N As Integer) As Long Dim K As Integer Fact = 1 If N = 0 Or N = 1 Then Exit Function Else For K = 1 To N Fact = Fact * K Next K End If End Function 过程调用过程调用事件过程的调用 Sub过程调用 调用Function过程 调用其它模块中的过程 7.3事件过程的调用事件过程的调用事件过程由一个发生在Visual Basic中的事件来自动调用或者由同一模块中的其它过程显式调用 一个说明事件过程调用情况的示例 本例的界面对象有窗体、一个命令按钮与一个标签。窗体的Name设置为Frmevent、Caption属性设置为“事件过程调用”;命令按钮的Name属性设为Cmdend、Caption属性设为“结束”;标签的Name属性设为Lalmsg、Caption为空 7.3.1界面界面Sub过程调用Sub过程调用 7.3.2调用过程的执行流程调用过程的执行流程每当程序调用一个Sub过程或Function过程时,Visual Basic就将程序的返回地址(断点)、参数、以及局部变量等压入栈内。被调用的过程运行完后,Visual Basic 将回收存放变量和参数的栈空间。然后返回断点继续程序的运行。 null用两种方式调用Sub过程。一种是把过程名放在Call语句中,一种是把过程名作为一个语句来使用用Call语句调用Sub过程用Call语句调用Sub过程调用形式是: Call <过程名> (实在参数表) <过程名>是被调用的过程名字。执行Call语句,VB将控制传递给由“过程名”指定的Sub过程,并开始执行这个过程; 实在参数是传送给被调用的Sub过程的变量,常数或表达式。实在参数的个数,类型和顺序,应与被调用过程的形式参数相匹配。有多个参数时各实在参数之间用逗号分隔。如果被调用过程是一个无参过程,则括号可省略。 [例7-2] 找出任意一个正整数的因子的程序[例7-2] 找出任意一个正整数的因子的程序 Sub过程Factor是找出任一个正整数的所有因子的过程,它有两个形式参数,一个是传值参数N,一个是传址参数S。在事件过程Command_click中,从文本框Text1输入数据给变量Inta赋值,并以Inta和St作为实参调用Factor过程;因字符型变量St是与传址参数S结合,所以St接受过程返回的计算结果,并将结果显示在文本框Text2中。 nullPrivate Sub Command1_Click() Dim Inta As Integer, St As String Inta = Text1.Text Call Factor(Inta, St) Text2.Text = St End Sub Private Sub Factor(ByVal N As Integer, S As String) Dim I As Integer For I = 1 To N- 1 If N Mod I = 0 Then S = S & Str(I) Next I End Sub把过程名作为一个语句来用把过程名作为一个语句来用调用过程的形式是: 过程名 [实参1[,实参2,……]] 与第一种方式相比,它有两点不同: 1) 不需要关键字Call; 2) “实在参数表”不需要加括号。 例如:在上面例子中可用下面的形式调用Factor过程,执行结果与用Call语句完全相同: Factor Inta,St 调用Function过程调用Function过程调用Function过程的形式是: Function 过程名([实在参数表]) 调用函数过程与调用Sub过程不同,必须给参数加上括号,即使调用无参函数,括号也不能缺省 VB也允许象调用Sub过程那样调用Function过程、 例如,设用Private Function Exam ( A AS Integer ) 定义了一个Function过程,也可以用下面两种方式调用这个函数: Call Exam (Inx)或 Exam Inx 用这两种方法调用函数时VB放弃函数的返回值 7.3.3[例7-3] 求二个正整数的最大公约数的程序[例7-3] 求二个正整数的最大公约数的程序本程序在Form_Click事件过程中用赋值语句G = Gcd(N,M) 调用Gcd 函数过程,函数返回值存放在变量G中,由于在定义函数Gcd时,它的两个形式参数A和B被指定为“传值”参数。所以尽管A、B两个形参在函数Gcd中它们的值被改变,但返回调用程序时,它们对应的实在参数N和M仍保持原值不变 程序代码nullPrivate Sub Form_Click() Dim N As Integer, M As Integer, G As Integer N = InputBox("输入 N ") M = InputBox("输入 M ") G = Gcd(N, M) Print N; " 和 "; M; " 的最大公约数是:"; G End Sub Private Function Gcd(ByVal A As Integer, ByVal B As Integer) Dim R As Integer R = A Mod B Do While R <> 0 A = B B = R R = A Mod B Loop Gcd = B End Function 调用其它模块中的过程调用其它模块中的过程在应用程序的任何地方都能调用其它模块中的公有(全局)过程,如何调用其它模块中公有过程,完全取决于该过程是属于窗体模块、类模块还是属于标准模块 调用窗体模块中的公有过程 调用标准模块中的公有过程 类模块中的过程 7.3.4调用窗体模块中的公有过程调用窗体模块中的公有过程从窗体模块的外部调用窗体中的公有过程,必须用窗体的名字作为被调用的公有过程名的前缀,指明包含该过程的窗体模块。假定在窗体模块Form1中含有一个公有Sub过程ExamSub。则在窗体Form1以外的模块中用下面语句就可以正确地调用该过程: Call Form1.ExamSub([实参表]) 即用 <包含该过程的窗体模块名>.<过程名> 作为调用名来调用对应的过程 调用标准模块中的公有过程调用标准模块中的公有过程如果标准模块中的公有过程的过程名是唯一的,则调用该过程时不必加模块名。如果在两个以上的模块中都含有同名过程,那么调用同一模块内的公有过程时,可以不加模块名,假定在标准模块Module1和Module2中都含有同名过程CommonSub,在Module1中用下面语句 Call CommonSub (实在参数) 调用的是当前模块Module1中的CommonSub过程,而不会是Module2的CommonSub过程。如果在其它模块中调用标准模块中公有过程则必须指定它是那一个模块的公有过程。例如在Module1调用Module2中的CommanSub则可用下面语句实现 Call Module2.CommonSub([实参表]) 参数的传递参数的传递 在调用一个有参数的过程,首先进行的是“形实结合”,即按传值传递或按地址传递方式,实现调用程序和被调用的过程之间的数据传递。通过参数传递,Sub过程或Function过程就能根据不同的参数执行同种任务。7.4形参与实参形参与实参形参 实参 “形实结合”时形参与实参形态的对应关系 7.4.1形参形参出现在Sub过程和Function过程的形参表中的变量名、数组名称之为形式参数,过程被调用之前,并未为其分配内存,其作用是说明自变量的类型和形态以及在过程中所“扮演”的角色。形参表中的各变量之间要用逗号分隔,形参可以是: 1) 除定长字符串变量之外的合法变量名; 2) 后面跟有左、右圆括号的数组名。实参实参实参是在调用Sub或Function过程时,传送给相应过程的变量名,数组名、常数或表达式,它们包含在过程调用的实参表中。在过程调用传递参数时,形参表与实参表中的对应变量名,可以不必相同,因为“形实结合”是按对应“位置”结合即第一个实参与第一形参结合,第二个实参与第二个形参结合,依此类推,而不是按“名字”结合。 示例程序示例程序Private Sub Examsub(X AS integen,Y AS single)     …… End Sub Private Sub Form_Click()   Dim X AS single,Y AS Integes     ……   Call Examsub(Y,X)     …… End Sub“形实结合”时形参与实参形态的对应关系“形实结合”时形参与实参形态的对应关系示例程序示例程序Private Sub Test (A AS single,Loc AS Boulean,Array1() AS Integez,Chr1 AS String)     …… End Sub Private Sub Form_Click ( )     Dim X AS Single St AS sting*5     Dim A (5) AS Integez     Call Test (X^2,True, A,St)  End Sub 按值传递参数按值传递参数过程调用时VB给按值传递参数在栈中分配一个临时存储单元。将实参变量的值复制到这个临时单元中去。也就说,按值传递参数时,传递的只是实参变量的副本(图7-5)。当采用值传递时,过程对参数的任何改变实际上都是对栈中值的改变,仅在过程内部有效,而不会影响实参变量本身。 示例程序7.4.2图7-5, 7-6图7-5, 7-6示例程序示例程序Private Sub Command1_Click() Dim M As Integer, N As Integer M = 15: N = 20 Call Value_Change(M, N) Print "m="; M, "n="; N End Sub Private Sub Value_Change(ByVal X As Integer, ByVal Y As Integer) X = X + 20 Y = X + Y Print "X="; X, "Y="; Y End Sub 按地址传递参数按地址传递参数按地址传递参数时,过程所接受的是实参变量(简单变量、数组元素、数组以及记录等)的地址,过程可以改变特定内存单元中的值,这些改变在过程运行完成后依然保持。也就是说形参和实参共用内存的“同一”地址,即共享同一个存储单元,形式参数值在过程中的一旦被改变,相应的实参值也跟随着被改变了。 图7-7 示例程序 7.4.3图7-7图7-7示例程序示例程序Private Sub Command1_Click() Dim M As Integer, N As Integer M = 15: N = 20 Call Value_Change(M, N) Print "m="; M, "n="; N End Sub Private Sub Value_Change(X As Integer, ByVal Y As Integer) X = X + 20 Y = X + Y Print "X="; X, "Y="; Y End Sub 数组参数数组参数定义过程时VB允许把数组作为形式参数,格式是: 形参数组名() [As 数据类型] 形参数组只能是按地址传递的参数 对应实参必须也是数组且数据类型与形参相一致 调用过程时只要把数组名放在实参表中即可,后面不跟括号 在过程中不可以用Dim语句对形参数组进行声明 在使用动态数组时,可以用ReDim语句改变形参数组的维界,重新定义数组的大小 示例程序(P142)7.4.4对象参数对象参数在Visual Basic中也可以把对象作为参数向过程传递。在形参表中,把形参变量的类型声明为“Control”就可以向过程传递控件。若把类型声明为“Form”则可向过程传递窗体。对象的传递只能是按地址传递。 7.4.5nullnull窗体1的窗体文件名为Frmfirst.frm,程序代码是: Private Sub Cmd1_Click() Call Objarg(Lab1) End Sub Private Sub Cmd2_Click() Call Frmarg(frmsecond) End Sub Private Sub Form_Load() frmfirst.Left = 2000 frmfirst.Top = 1500 Lab1.Caption = "学习使用 VB6.0" End SubnullPrivate Sub Objarg(Lad As Control) Lad.BackColor = &HFF0000 Lad.ForeColor = &HFFFF& Lad.Font = 14 Lad.FontItalic = True Lad.Caption = " 对象参数的传递" End Sub Private Sub Frmarg(F As Form) F.Left = (Screen.Width8- F.Width) / 2 F.Top = (Screen.Height8- F.Height) / 2 frmfirst.Hide F.Show End Subnull窗体2的窗体文件名为Frmsecond.frm,程序代码是: Private Sub Cmd1_Click() Unload Me frmfirst.Show End Sub  程序示例程序示例7.7例7-5:求三个正整数的最小公倍数例7-5:求三个正整数的最小公倍数例7-6:找最大凸点,并进行交换例7-6:找最大凸点,并进行交换例7-7:利用级数法编程求arcsin函数值 例8-5例7-7:利用级数法编程求arcsin函数值 例8-5要求用户通过InputBox函数输入自变量x及允许误差值。若输入“0.5,1e-5”,程序将自动把输入的数据分解为两部分并分别赋给x与eps;函数过程afun则用于求解级数第n项的值 null例7-8冒泡法排序的算法例7-8冒泡法排序的算法将待排序的数存放在Sort数组中,首先比较 Sort(1) 和Sort(2),如果 Sort(1) > Sort(2), 则交换这两个元素的值,接着比较 Sort(2) 和 Sort(3),(此时的 Sort(2) 可能是刚交换来的值)若 Sort(2) > Sort(3),则交换这两个元素的值。重复此过程,直到处理完 Sort(n-1) 和 Sort(n) 这两个元素的比较。经过n-1 次比较处理,最大的数被传到数组最后一个元素中,而较小的数就会象气泡一样上浮。 null 程序中设置变量Switch,在比较过程中,若发生数据交换,将其设置为真,否则将开关设为假。当一轮比较处理结束后,都要检测Switch ,如果Switch 的值为True就需进行新一轮的比较。 在第二轮比较中,依次比较Sort(1)和 Sort(2), Sort(2)和 Sort(3),…… 直到对Sort(8-2)和 Sort(8-1)进行比较处理后,次大数存放在元素Sort(8-1)中了。如此重复地一轮一轮地比较,直到第I轮比较时没有发生数据交换,即Switch 的值为False时,则说明数据已排好序。 程序代码 nullOption Explicit Option Base 1 Private Sub Command1_Click() Dim Number(10) As Integer, I As Integer Randomize For I = 1 To 10 Number(I) = Int(Rnd * 100) + 1 Text1 = Text1 & Str(Number(I)) Next I Call Bubble_Sort(Number) For I = 1 To 10 Text2 = Text2 & Str(Number(I)) Next I End SubnullPrivate Sub Bubble_Sort(Sort() As Integer) Dim I As Integer, Tem As Integer Dim Ub As Integer, Switch As Boolean Ub = UBound(Sort) Switch = True Do While Switch Switch = False Ub = Ub8- 1 For I = 1 To Ub If Sort(I) > Sort(I + 1) Then Switch = True Tem = Sort(I) Sort(I) = Sort(I + 1) Sort(I + 1) = Tem End If Next I Loop End Sub例7-9:任意十进制正整数转换成 N 进制数7例7-9:任意十进制正整数转换成 N 进制数7程序中所使用的对象及属性设置 程序代码 程序中所使用的对象及属性设置程序中所使用的对象及属性设置nullPrivate Sub Cmd1_Click() Dim Ch As String, I As Integer Dim Char(15) As String Dim Bin() As String For I = 0 To 9 Char(I) = Str$(I) Next I For I = 0 To 5 Char(10 + I) = Chr$(Asc("A") + I) Next I Print ReDim Bin(1) Call Trans(Bin, Char) For I = UBound(Bin) To 1 Step8-1 Ch = Ch + Bin(I) Next I Text3.Text = Ch End Sub Private Sub Cmd2_Click() End End SubnullPrivate Sub Text1_Change() N = Val(Text1.Text) Lal4.Caption = Str$(N) + "进制数" End Sub Private Sub Text2_Change() Num = Val(Text2.Text) End Sub Private Sub Trans(Vary() As String, St() As String) Dim R As Integer Dim K As Integer K = 0 Do Until Num = 0 R = Num Mod N K = K + 1 ReDim Preserve Vary(K) Vary(K) = St(R) Num = Num / N Loop End Sub例7-12:验证大于5的奇数可表成三素数和 例8-10例7-12:验证大于5的奇数可表成三素数和 例8-10给定一个大于5的奇数N,调用Prime过程求出N以内的所有素数,放在一个数组内,再通过穷举法,从该组素数中找出满足验证条件的三个素数 程序代码 nullOption Explicit Option Base 1 Private Sub Command1_Click() Dim P() As Integer, N As Integer, L As Integer Dim I As Integer, J As Integer, k As Integer, Flg As Boolean N = InputBox("输入一个大于5的整数!") Call Prime(P, N) L = UBound(P)nullPrivate Sub Prime(A() As Integer, N As Integer) Dim I As Integer, Idx As Integer Dim J As Integer For I = 2 To N For J = 2 To Sqr(I) If I Mod J = 0 Then Exit For Next J If J > Sqr(I) Then Idx = Idx + 1 ReDim Preserve A(Idx) A(Idx) = I End If Next I End SubnullFor I = 1 To L For J = 1 To L For k = 1 To L If P(I) + P(J) + P(k) = N Then Debug.Print N; "="; P(I); "+"; P(J); "+"; P(k) Flg = True Exit For End If Next k If Flg Then Exit For Next J If Flg Then Exit For Next I End Sub例7-13:找出5000以内的亲密对数例7-13:找出5000以内的亲密对数递归过程递归过程递归过程是在过程定义中调用(或间接调用)自身来完成某一特定的任务的过程。 很多的数学模型和算法设计方法本来就是递归的。 用递归过程描述它们比用非递归方法简洁易读。 可理解性好,算法的正确性证明也比较容易。 示例7.5示例示例数学中求n!可表示为: 利用上式可定义一个名为Fact(n)的函数,若使用该函数求n!,即要求出函数Fact(n)的值,在求解过程中则必须要调用函数本身去求出Fact(n-1)的值。也就是说要在函数定义中调用了函数本身。因此它是一个递归定义的函数。 根据上面的递归表达式可编写出求n!的函数过程 递归函数Fact的调用和返回过程如图7-11所示 1 (当n=0或n=1) n! = n* (n-1)! (当n>1时) 函数过程函数过程Private Function Fact(Byval N As Integer) As Long If N = 0 Or N = 1 Then Fact = 1 Else Fact = N * Fact(N- 1) End If End Function Private Sub Form_Click() Dim N As Integer, F As Long N = InputBox("输入一个正整数") F = Fact(N) Print N; "!="; F End Sub 图7-10图7-10F=Fact(3)Fact(2)Fact(1)返回函数值1返回函数值2返回函数值6例7-11:用递归函数求两整数的最大公约数例7-11:用递归函数求两整数的最大公约数程序中的Function过程Gcd 是按照欧几里德算法(也称为辗转除法)设计的一个递归函数,其边界条件(终止条件)是:当R = 0时,函数赋值返回 本例使用的对象及属性设置 程序代码 对象及属性设置 对象及属性设置 nullDim M As Long, N As Long Private Sub Cmd1_Click() Dim Gcdvalue As Long If M <> 0 And N <> 0 Then Gcdvalue = Gcd(M, N) Text3.Text = Str$(Gcdvalue) End If End SubnullPrivate Function Gcd(ByVal X As Long, ByVal Y As Long) Dim R As Long R = X Mod Y If R = 0 Then Gcd = Y Else X = Y Y = R Gcd = Gcd(X, Y) End If End FunctionnullPrivate Sub Cmd2_Click() Cls End End Sub Private Sub Text1_Change() M = Val(Text1.Text) End Sub Private Sub Text2_Change() N = Val(Text2.Text) End Sub变量的作用域变量的作用域 变量和过程的作用域是用来标明在程序的哪些地方,变量名和过程名才有意义。根据定义变量的位置和使用变量定义的语句不同,变量可以分为过程级变量(局部变量)、模块级变量和全局变量。7.6过程级变量过程级变量在过程中声明的变量是过程级的变量,其作用范围仅限于该过程。也就是说在包含它们的过程中才能访问或改变这些变量的值;而这些变量仅存在于这个过程之中才有意义。过程级变量又称为局部变量。例如下面的函数Local_Variable定义了三个局部变量X、Y和Z。 函数Local_Variable 程序每次调用此函数,Visual Basic 都为局部变量X、Y、Z分配栈空间,当函数运行结束,Visual Basic释放分配给该过程的栈空间,局部变量X、Y和Z的值不在起作用。 7.6.1函数Local_Variable函数Local_VariablePrivate Function Local_Variable(N As Integer) _ As Integer Dim X As Integer, Y As Integer, Z As Integer  X = N * 3 Y = X + 4   Z = X + Y Local_Variable = X + Y- Z End Function 模块级变量模块级变量若要使一个变量可作用于同一个模块内的多个过程,则应在程序的窗体模块或标准模块的通用声明段(General Declarations)用Private或Dim语句说明这个变量,由此说明的变量就是模块级的变量。其作用范围是定义它的模块,模块内的所有过程都可以引用它们,但其它模块却不能访问这些变量。 模块级变量的例子 7.6.2模块级变量的例子模块级变量的例子Dim TestString As String Private Sub Form_ Activate () Debug.Print "在Foram_ Activate 事件过程中"; TestString Call ShowTestString End Sub Private Sub Form_Load() TestString = "测试变量作用域" End Sub Private Sub ShowTestString() Debug.Print "在过程ShowTestString 中"; TestString End Sub 全局变量全局变量凡是在窗体模块或标准模块的通用声明段用Public语句声明的变量,都是全局变量。全局变量的变量名和变量值在整个程序中都是有意义的。换句话说一个VB程序中的任何一个代码段都可以引用全局变量。说明全局变量的通常做法是添加一个标准模块(Module),在标准模块的通用声明段集中声明程序中要使用的全局变量。 7.6.3p147p147Option Explicit Public Gba As String Public Sub Main() Gba = "Gba 是在Module1.Bas中定义的全局变量" Load Form1 Load Form2 Form1.Show ‘显示窗体1 End Subnull 本程序还包括有两个窗体模块,一个名为Form1.frm,其代码为: Option Explicit Public Gbf As String Private Sub Form_Load() Gbf = "Gbf 是在窗体模块中定义的全局变量" Call Main End Sub Private Sub Form_Click() Debug.Print "在Form1中打印:" Debug.Print "Gba 的内容:"; Gba Debug.Print "Gbf 的内容:"; Gbf Debug.Print Form2.Show ‘显示窗体2 End Subnull另一个窗体模块名为Form2.frm,代码为: Option Explicit Private Sub Form_Click() Debug.Print "在Form2中打印:" Debug.Print "Gba 的内容:"; Gba Debug.Print "Gbf 的内容:"; Form1.Gbf End Sub关于同名变量关于同名变量当变量的作用域不同时,变量的名字可以相同。为了避免因变量名相同而造成的引用上的混乱,可以用模块名加以限定。 例如,两个标准模块Module1 和Module2分别定义了一个全局变量Password。若在窗体中访问Module1中定义的全局变量Password,就应以Module1.Password形式来调用它。若在Module1中引用本模块中的Password变量,则可用变量名直接引用,而使用Module2中全局变量Password,必须用模块名“Module2”作为Password的前缀。 示例程序 7.6.4null下面程序中,在窗体模块中定义了的全局变量X、Y和Z。 而子过程Conflict_X中使用局部变量X和全局变量Y和Z 当不同作用域的同名变量发生冲突时,优先访问局限性大的变量。  Option Explicit Public X As Integer, Y As Integer, Z As Integer Private Sub Form_Activate() Conflict_X Debug.Print "X,Y 和 Z 是", X, Y, Z End Sub Private Sub Form_Load() X = 10 Y = 20 Z = 35 End SubnullPrivate Sub Conflict_X() Dim X As Integer X = 135 Debug.Print "X,Y 和 Z 是", X, Y, Z End Sub 运行结果是: X,Y 和 Z 是 135 20 35 X,Y 和 Z 是 10 20 35 静态变量静态变量静态变量是程序开始运行时创建的变量。同全局变量一样,静态变量在程序的数据区分配存储空间,过程运行结束时静态变量的存储空间仍然保留,所以静态变量的值可以保持,并从一次调用传递到下一次调用。尽管如此,静态变量的作用范围仍然限于包含它的过程内。 使用静态变量的程序示例一 7.6.5nullOption Explicit Private Sub Command1_Click() Dim K As Integer K = 5 Call Static_Variable(K) Debug.Print "第一次调用:K ="; K K = 5 Call Static_Variable(K) Debug.Print "第二次调用:K ="; K End SubnullPrivate Sub Static_Variable(ByRef N As Integer) Static Sta As Integer Sta = N + Sta N = Sta + N End Sub 程序运行结果是: 第一次调用:K = 10 第二次调用:K = 15null在编写程序时,必须警惕存在于代码内的逻辑错误,这类错误经常发生在数字运算和循环语句的应用中,很难被发现。 使用静态变量的程序示例二 nullOption Explicit Private Sub Form_Click() Debug.Print "4!= ";Fact_Error(4) Debug.Print "5!= ";Fact_Error(5) End Sub Private Function Fact_Error(ByVal N As Integer) As Integer Static Count As Integer Fact_Error = 1 Do While Count < N Count = Count + 1 Fact_Error = Fact_Error * Count Loop End Function程序示例程序示例7.7例7-4:函数调用的“形实结合”程序示例例7-4:函数调用的“形实结合”程序示例例7-14:直接插入排序 例7-14:直接插入排序 程序代码 nullOption Base 1 Private Sub Form_Click() Dim A(10) As Integer, I As Integer, N As Integer Randomize For I = 1 To 10 A(I) = Int(Rnd * 20) + 1 Debug.Print A(I); Next I Debug.Print Call Insertion(A) For I = 1 To 10 Debug.Print A(I); Next I Debug.Print End SubnullPrivate Sub Insertion(Sort() As Integer) Dim K As Integer, I As Integer, Temp As Integer Dim Ub As Integer Ub = UBound(Sort) For I = 2 To Ub Temp = Sort(I) K = I - 1 Do While Temp < Sort(K) Sort(K + 1) = Sort(K) K = K - 1 If K <= 0 Then Exit Do Loop Sort(K + 1) = Temp Next I End Sub例7-15从1~9之间,… 找出所有满足要求的等式例7-15从1~9之间,… 找出所有满足要求的等式创建与设置启动过程创建与设置启动过程 7.8设置启动窗体设置启动窗体 多窗体程序是由多个窗体构成。在缺省情况下,VB在应用程序执行时,把设计时的第一个窗体,指定为启动窗体。如果希望在程序运行时,首先显示其它的窗体而不是设计时的第一个窗体,那么我们就应该指定某一个窗体作为启动窗体。 指定一个启动窗体 指定一个
本文档为【vb课件之第7章 过程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_492376
暂无简介~
格式:ppt
大小:658KB
软件:PowerPoint
页数:0
分类:其他高等教育
上传时间:2011-07-08
浏览量:35