VB第8章 过程_第1页
VB第8章 过程_第2页
VB第8章 过程_第3页
VB第8章 过程_第4页
VB第8章 过程_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、教案授课时间5 月 26 日 至 6 月 3 日课时数3+2授课方式理论课 讨论课 习题课 实验课 上机课 技能课 其他授课单元第8章 过程目的与要求1)掌握函数过程的概念2)掌握sub过程的概念3)掌握参数传递4)掌握变量的作用域和生产周期重点与难点1)过程和函数的调用2)变量的作用域和生产周期主要内容8.1过程概述8.2函数过程*8.3 sub过程8.4参数传递*8.7变量的作用域和生产周期教学方法手段(教具)理论课采用板书与多媒体相结合实践课采用上机实践操作参考资料Visual Basic程序设计教程 人民邮电出版社 Visual Basic程序设计实验教程 人民邮电出版社思考题、作业8

2、.2习题一一、4、5、10、11、15、16、17二、1、2、4、5讲稿第八章 过程旧课复习:复习内容:1.常用控件的使用,个人信息2.计时器Interval属性,Timer事件复习目的:加强控件和计时器的使用复习时长:大约5分钟新课导入:导入方式:通过调用函数引入函数的概念导入目的:增强学生的学习主动性导入时长:大约5分钟新课讲授:重点:掌握函数过程的概念,掌握sub过程的概念难点:变量的作用域和生产周期方法:运用多媒体辅助教学,采用案例教学和任务驱动等教学法。8.1 过程概述VB应用程序是由各种过程组成的,但在为一个实际问题编写代码的过程中,会遇到一些比较复杂的问题,而利用简单的内部函数过

3、程和事件过程往往不能解决此类问题。此时根据应用的复杂程度,往往需要将应用程序按功能或目的划分为若干个模块,而根据具体情况又可将各个模块继续划分为子模块,直到一个适当的难度为止,即将问题自上而下逐步细化,分层管理。将模块划分为子模块主要有如下优点:(1)便于调试和维护。将一个复杂的问题分解为若干个子问题,降低每一个子问题的复杂程度,使每一个子问题的功能相当稳定,便于程序的调试和维护。(2)提高了代码的利用率。当多个事件过程都需要使用一段相同的程序代码时,可将这段代码独立出来,作为一个独立的过程。它可以单独建立,也可以被其他事件过程调用,成为一个可重复使用的独立的过程,提高代码的使用率。一个VB工

4、程包括工程文件(.Vbp)、窗体文件(.Frm)、窗体的二进制数据文件(.Frx)、标准模块(.Bas)、类模块(.Cls)、资源文件(.Res)、ActiveX控件文件(.Ocx)、用户控件(.Ctl)和属性页模块(.Pag)、其他ActiveX控件文件、设计器可插入对象等部件和引用。VB大致的应用程序模块结构如图8-1 所示图8-1VB应用程序模块结构8.2 函数过程8.2.1函数过程的定义Function函数过程的定义与Sub子过程的定义类似,但不同的是Function 函数过程的定义语句中需要有返回函数值的语句。其语法格式为:Public | PrivateStatic Functio

5、n <函数名> (<形参表>) As <类型><语句列><函数名>=<表达式>Exit Function<语句列><函数名>=<表达式>End Function说明:(1)Public | PrivateStatic 的含义同Sub子过程定义。(2)函数过程的定义由Function开始,由End Function结束。(3)<函数名>即Function过程的名字,其命名规则与变量名的命名规则相同。(4)<形参表>即形式参数列表,给出其他过程与本过程进行参数传递和交

6、换的形式参数,若有多个形式参数,则参数之间必须用“,”隔开。形参只能是变量名或数组名,在函数过程定义时,它们无值,只代表了参数的个数、类型、顺序;在调用时才获得相应的值。函数过程可以无参数,即使无参数,函数名后的括号“( )”也不能省略,括号是函数的标志。在<形参表>中,可通过在参数前加关键字Byval定义此参数的传递为值传递,加关键字ByRef定义此参数的传递为地址传递,参数传递的默认方式为地址传递(ByRef可省略)。(5)As <类型>指定该函数的返回值的类型,缺省时默认为Variant型。(6)Exit Function的作用是在函数过程中的任意位置终止函数的运

7、行而退出该函数。(7)<语句列>为符合VB语法的一条语句或多条语句。(8)<函数名>=<表达式>语句,是将<表达式>的值通过函数名返回给调用者,函数过程必须返回函数值,而函数名就代表了函数值。在函数体内至少为函数名赋值一次,若缺省<函数名>=<表达式>语句,值则默认返回值为0(数值型函数)或空串(字符串型函数)。(9)函数过程定义的函数体内不允许定义其他的函数过程和子过程,即不允许嵌套定义,但可以调用其他的过程。8.2.2 函数过程调用函数过程定义完成后,要使用这些函数过程就必须调用它,只有调用才能使函数过程启动执行,完成

8、函数功能。函数过程的调用很简单,与调用系统内部函数一样。函数过程的调用一般放在表达式中或赋值号“=”的右边,其语法格式为:变量名=函数过程名(<实参表>)或print 函数过程名(<实参表>)说明:(1)<实参表>,是指与形参相对应的需要传递给函数过程的值或变量的引用地址,当参数多于2个时,它们之间与形参一样用逗号“,”隔开。(2)实参的个数、类型、顺序应与相应的形参保持一致。此外,Function过程还可以像Sub过程一样进行调用,其语法格式为:Call 函数名(<实参表>)或:函数名 <实参表>当使用这种方式时,VB放弃函数的返回

9、值。例8.1 写求两个数中最大数的Function过程。在主程序中输入3个数字,调用Function过程求出3个数中最大数。设计步骤如下:(1)建立应用程序界面并设置其相关属性,见图8-1。图8-1 求最大数(2)编写代码:编写求出两个数中最大数的Max函数过程,代码如下:Function Max(m As Single, n As Single) As SingleIf m > n Then s = m Else s = nMax = sEnd Function单击“求最大数”键后,调用Max函数过程,代码如下:Private Sub Command1_Click()Dim a As

10、Single,b As Single,c As Singlea = Val(Text1.Text)b = Val(Text2.Text)c = Val(Text3.Text)Label1.Caption = "3个数字中最大的是:" & Max(Max(a, b), c)End SubMax(Max(a, b), c)表达式运算,先求出a与b中最大的数,然后再用得到的值与c进行比较,从而得到三个数中的最大数。【例8.2】编写一个函数过程,统计一串字符中某个字符的出现次数,并在事件过程中调用函数,显示结果。分析:编写两个过程:(1)通用的函数过程。此函数可以通过参数接

11、收任意一串字符和一个待查找的字符,用函数过程实现查找和统计功能,并将查找结果赋给函数名。(2)按钮的单击事件过程。在事件过程中调用函数过程,将需要查找的字符和字符串传递给函数过程,由函数过程进行查找和统计,并将调用结果带回事件过程并进行显示。设计步骤如下:(1)建立应用程序界面。在新建的窗体上添加三个标签,3个文本框,1个命令按钮,调整各控件间的相对位置和大小,并设置各对象的属性,见图8-2。图8-2 运行界面(2)定义函数过程tongji,编写程序代码如下:Public Function tongji(str$, s$) As IntegerDim k%, i%k = 0For i = 1

12、To Len(str) If Mid(str, i, 1) = s Then k = k + 1 End IfNext itongji = kEnd Function编写事件过程代码如下:Private Sub Command1_Click()Dim c1 As String, c2 As String, m As Integerc1 = Text1.Textc2 = Text2.Textm = tongji(c1, c2)Text3.Text = mEnd Sub运行程序,用户输入字符串和查找字符,单击“统计”按钮,程序统计查找字符在输入字符串中的出现次数,结果显示在Text3中,结果如图8

13、-2所示。8.3 sub过程Sub子过程的调用有两种格式:l 使用Call语句,其语法格式为:Call <过程名> (<实参列表>)l 直接使用过程名,其语法格式为:<过程名> <实参列表>说明:(1)<实参列表>是实际参数列表,参数与参数之间用逗号“,”分隔。实参的个数、类型、顺序应与相应的形参保持一致。(2)当用Call语句调用时,带有参数时其过程名后必须要添加括号“()”。(3)直接使用过程名调用过程时,参数与过程名之间用空格隔开,若有多个参数,参数之间也是用逗号“,”分隔,但绝对不能添加括号。例如:以下两个语句都调用了名为St

14、ars的过程:Call Stars(30)Stars 30【例8.3】在一个窗口中打印输出如图8-3所示图形。图8-3 打印图形设计步骤如下:(1)建立如图所示的界面,添加控件后设置其相应属性。(2)编写代码:单击“图形1”键,则激发按钮Command1的Click事件:Private Sub Command1_Click()Call stars1 '调用打印上半三角形子过程stars2 '调用打印下半三角形子过程End Sub单击“图形2”键,则激发按钮Command2的Click事件:Private Sub Command2_Click()stars2 '调用打印下

15、半三角形子过程Call stars1 '调用打印上半三角形子过程End Sub编写stars1与stars2过程代码:Private Sub stars1()For i = 1 To 5Print Spc(20 -2 * i); String(4 * i - 3, "*")Next iEnd SubPrivate Sub stars2()For j = 1 To 5Print Spc(2 * j + 8); String(21 - 4 * j, "*")Next jEnd Sub单击“图形1”键和“图形2”键,打印出的图形都是由“*”组成的两个三

16、角形,只是执行的顺序不同,因而打印输出的图形不同。本例使用了两种调用子过程的语句,但该例中的子过程没有使用参数的传递。8.4 参数传递8.4.1 传址与传值方式形参和实参的传递方式有两种:按地址传递和按值传递。1按地址传递在过程调用时,参数传递的默认方式是按地址传递,即形参前不加关键字“Byval”就是按地址传递。按地址传递的特点是形参与对应实参使用相同的内存地址,共享同一内存单元,因此,当被调用过程的形参值改变时,主调过程中的实参值也将发生同样的变化。这里须注意以下几点:(1)实参若是常量,则传递就相当于将该常量的值赋给形参,相当于传值方式。(2)当形参被默认为传地址方式,而实参却用一个表达

17、式时,此时传地址无效,只是将表达式的值赋给形参,相当于传值方式。(3)当形参被默认为传地址方式,实参若是一个变量名或数组名,则实参与形参共用相同的内存地址,这样就实现了双向的地址传递。(4)合理地利用双向的地址传递既可以实现调用过程向被调用过程传递参数,也可以实现被调过程向调用过程返回结果,因此,当需要带回大量数据时,可考虑利用此种传递方式。(5)如果形参是数组,实参也必须是相同类型的数组,且只能使用传地址方式。(6)如果形参不是数组和自定义类型,应尽量使用传值方式,以尽量减少各过程之间的关联,增加程序的可靠性。【例8.4】按地址传递调用Sub子过程,检查输出结果。分析:设置关键字ByRef,

18、参数的传递方式变成传地址,即双向传递。通过程序代码和运行结果可见,回到调用过程后,在被调用过程中对形参的修改,也影响了实参。Private Sub Form_Click()主调过程Dim x1 As Integer, y1 As Integerx1 = 15: y1 = 25Print "x1=" x1; "y1=" y1 '打印变量的值Call lizi(x1, y1) '调用子过程Print "x1=" x1; "y1=" y1End SubPublic Sub lizi(ByRef x2 As

19、 Integer, y2 As Integer) '定义子过程Print , "x2=" x2; "y2=" y2 '打印形参变量的值x2 = 18: y2 = 28Print , "x2=" x2; "y2=" y2 '再打印形参变量的值End Sub运行结果见图8-4。图8-4 按地址传递结果2 按值传递通常情况下,过程定义中默认的参数传递是地址传递,但在定义过程时,如果参数用关键字Byval来定义,则该参数是值传递。值传递的特点是,主调过程的实参与被调过程的形参有各自的存储单元,主调过

20、程将实参数的值复制一份给形式参数,此后实参与形参之间再也无任何联系,形式参数的任何变化均不会对实参产生任何影响。这种传递是调用过程向被调模块的单向传递。【例8.5】按值传递调用Sub子过程,检查输出结果。分析:将【例8.4】中形参x2改为按值传递,其他不变。程序代码如下:Private Sub Form_Click()Dim x1 As Integer, y1 As Integerx1 = 15: y1 = 25Print "x1=" x1; "y1=" y1 '打印变量的值Call lizi(x1, y1) '调用子过程Print &q

21、uot;x1=" x1; "y1=" y1End SubPublic Sub lizi(ByVal x2 As Integer, y2 As Integer) '定义子过程Print , "x2=" x2; "y2=" y2 '打印形参变量的值x2 = 18: y2 = 28Print , "x2=" x2; "y2=" y2 '再打印形参变量的值End Sub运行结果见图8-5。图8-5 按值传递结果说明:图8-5显示了单向传递与双向传递的区别。在单向的传值方

22、式中,形参和实参各自占有自己的内存单元,只是在传递时将实参的值赋给形参,此外便没有了关系;而双向的地址传递是形参和实参共享内存单元,其中一方对值的修改将影响另一方。8.7变量的作用域与生存期VB程序是由若干个过程组成,如单击事件过程、函数过程、子过程等。过程一般保存在窗体文件或标准模块文件中。过程中使用了大量的变量,且过程之间需要传递一些参数,这就导致一些问题:如一个模块内部定义的变量,其他模块可否使用?一个过程可否被其他过程使用?如果可以使用,其使用范围如何?如果所处的位置不同,是否会带来使用范围的不同?这一系列问题称为变量、过程、函数的作用域。8.7.1 变量的作用域变量的作用域,是指哪些子过程和函数过程可以使用该变量,即一个变量在什么范围内有效。变量的作用域通常分为三级:局部级变量、窗体/模块级变量、全局级变量。1. 局部变量(过程级)局部变量是指在过程内部定义且只能在本过程内使用的变量,其他的过程不能使用。局部变量随过程的调用而产生,即本过程被调用时,才为局部变量分配内存单元,并将随过程调用的结束而结束,即过程一旦执行完毕局部变量的内存单元被释放。2. 窗体/模块级变量窗体/模块级变量是指在所有过程之外定义的变量,但仍在窗体/模块文件之内,即在窗体文件中的“通用声明”段中用Dim或Private语句声明的变量,该变量可被窗体文件中任何过程访问,但不能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论