《过程的建立和使用.ppt》由会员分享,可在线阅读,更多相关《过程的建立和使用.ppt(26页珍藏版)》请在三一办公上搜索。
1、第4章 过程的建立和使用,过程是用于完成特定任务的一组指令代码。使用过程编写程序,可以提高编程效率、优化程序结构。VB程序设计,就是编写一个个过程,实现复杂的功能。VB中的过程包括事件过程、子过程和函数过程。在过程的调用中,涉及参数的传递、变量的作用范围等问题。本章包括以下知识点。概述过程的功能和特点。事件过程响应代码的编写方法。子过程的创建、调用和退出技术。函数过程的创建、调用方法。过程调用时,涉及形参和实参两种参数类型。参数传递方式有按值传递和按地址传递两种。按地址传递参数,实参有可能在程序运行的时候会被修改。过程的嵌套与递归调用技术。变量的使用受其作用域与生存周期限制。如果将控件比作VB
2、的骨架,那么过程就是VB的肌肉。通过本章的学习,读者可以掌握VB程序设计的实质性内容,可以快速提高编程能力。,4.1 过程概述,过程是为了完成特定任务而编写的功能相对独立的代码段。每个过程都有自己的过程名,其他程序可以通过过程名调用该过程。对于读者来说,VB中的过程其实并不陌生,从第1章开始,读者就已经接触到了过程,只是笔者并未提及这一概念。事件驱动是VB程序设计的一大特色,而事件就是一个过程。下面的代码就是一个常用的窗体加载过程。Private Sub Form_Load()End Sub,4.2 事件过程,事件是VB控件的三大要素之一,事件驱动是VB的特点。当对象接收到外部操作(如单击鼠标
3、、按下键盘等),就触发相应的事件,并调用该事件过程。一个完整的事件过程包括过程名和过程响应代码。过程名由窗体或控件的名称、下划线和事件名组成。窗体或控件的事件过程名由自动VB创建,事件过程的响应代码由程序员编写。例如,在下面的窗体事件过程中,从立即窗口中输出“Visual Basic 6.0”。Private Sub Form_Load()Dim strSample As StringstrSample=“Visual Basic 6.0”Debug.Print strSampleEnd Sub,4.3 通用过程,通用过程是为了完成一些特定功能而编写的代码块。通用过程不是由事件触发的,而是由其
4、他过程调用的。例如,多个事件过程需要执行相同的任务,那么可以将该任务做成通用过程,供这些事件过程调用,避免重复书写代码。通用过程有子过程和函数过程两种类型。,4.3.1 子过程,在VB程序设计中,要使用子过程完成特定的功能,需要完成创建子过程、调用子过程和退出子过程三个操作。1创建子过程:子过程使用关键字Sub和过程名创建,按回车键系统会自动添加End Sub语句。程序员在Sub与End Sub之间编写过程代码。子过程的语法格式如下。Sub subname(argumentlist)InstructionsEnd Sub2调用子过程:子过程的调用可以使用Call语句调用,也可以直接使用过程名调
5、用。其语法格式如下。使用Call语句调用子过程Call subname(argumentlist)直接使用过程名调用子过程subname argumentlist3退出子过程:在子过程中,可以通过Exit Sub语句改变程序的控制流程,从该过程中立即退出。Exit Sub与前一章中的Exit For和Exit Do用法是一样的,都是用于强制改变程序控制流的。只是Exit Sub强制跳出子过程,返回并执行调用语句后面的程序。而Exit For和Exit Do跳出当前循环,执行当前过程中该循环后面程序。,4.3.2 函数过程,如果想在表达式中使用过程,或者希望获得过程的返回值,那么可以使用函数过程
6、。函数过程的创建与使用与子过程基本上是一样的。1创建函数过程函数过程使用关键字Function和函数名创建。其语法格式如下。Function functionname(argumentlist)As typeInstructionsfunctionname=expressionEnd Sub2调用函数过程函数过程的调用与子过程的调用稍有差异。调用函数过程既可以返回函数值,也可以像调用子过程一样,不必返回函数值。,4.4 参数传递,在上面的子过程调用和函数过程的调用中,都存在着被调过程与调用过程之间的参数传递。参数形式有形参与实参两种,参数传递方式有按地址传递和按值传递两种。,4.4.1 形参与
7、实参,形参是形式参数的缩写,是声明过程中使用的参数,用于接收数据。程序员可以定义形参的数据类型。形参变量的有效范围局限于该过程内部。当过程调用结束,形参变量就被释放。实参是实际参数的缩写,是调用过程时使用的参数。实参是传递给过程的参数。实参的类型较多,可以是常量、变量或表达式等。实参与形参的变量名称可以相同,也可以不同。在窗体加载事件Form_Load中,c=cir(r)中的变量r是实参;s=area(5)中的常量5也是实参。在函数过程Function cir(r As Single)As Single和Function area(r As Single)As Single中,变量r是形参。,
8、4.4.2 按值传递和按地址传递,在调用过程的时候,通常存在两种参数传递方式,即按值传递参数和按地址传递参数。1按值传递参数按值传递参数,就是将变量的拷贝值传递给被调用的过程,而该变量本身不会发生变化。在过程调用中,实参为常量、表达式或者在定义过程时使用ByVal关键字时,参数的传递方式就是按值传递。2按地址传递参数按地址传递参数,实际上就是把变量的内存地传递给过程的形参。此时,形参与实参共用同一个内存单元,当形参的值发生变化时,实参的值也随之发生变化。在过程调用中,实参为变量或者定义过程中使用ByRef关键字时,参数的传递方式就是按地址传递。3参数传递示例,4.5 过程的嵌套与递归调用,VB
9、允许过程的嵌套调用和过程的递归调用。过程的嵌套调用,是指在一个过程的定义中调用另一个过程。过程的递归调用,是指在一个过程内部直接或者间接地调用该过程自身。,4.5.1 过程的嵌套调用,过程嵌套可以简化程序结构,提高编程效率。在VB中,各过程之间是平行的,不存在上一级过程和下一级过程的问题。因此,VB不允许在一个过程的定义中,再定义另一个过程。但是,在VB程序设计中,可以使用过程的嵌套调用。函数cnm()中三次调用函数s(),避免三次输入相同的代码,使得程序的结构比较简洁清晰。,4.5.2 过程的递归调用,过程的嵌套调用,是在一个过程中调用另一个过程。而过程的递归调用,是过程调用过程自身。递归调
10、用同样可以简化程序代码,提高编程效率,并使得程序结构较为清晰。使用过程递归调用方法,求,并从立即窗口输出计算结果。示例代码如下所示。,4.6 变量的作用域与生存周期,变量的作用域是指变量在一个工程中的有效使用范围。变量只在其作用域中有效。变量的生存周期是指变量的值在程序中被保存的时间。按照变量的作用域不同,可以将变量分为局部变量、模块变量和全局变量三种类型。,4.6.1 局部变量,局部变量是在过程内部声明和使用的变量。因此,局部变量也称为过程级变量。局部变量只能被其所属过程的内部代码访问和修改,其他过程不能获得该变量的值,更不能修改该变量。当局部变量所属的过程运行结束后,该变量就会消失。局部变
11、量使用关键字Dim声明,这在前面的示例中用到过很多次。另外,关键字Static也可以声明静态局部变量。,4.6.2 模块变量,常用的代码模块有窗体模块Form和标准模块Module。在这些代码模块的通用代码段中,可以使用关键字Private或者Dim声明模块级变量。模块变量的作用域是其所属的整个模块,模块中的所有过程都可以访问和修改该变量。但是,一个模块的代码是不能访问另一个模块的模块变量的。当模块运行结束后,模块变量就被释放消失。,4.6.3 全局变量,全局变量是所有模块都可以访问和修改的变量。全局变量由关键字Public声明。全局变量增加了程序使用这些变量的灵活性,也增加了程序无意中修改全
12、局变量的风险。因此,在使用全局变量时要注意这些问题。,4.7 实例:求1000以内2、3、5、7的倍数,将通用的功能编写为一个过程,供其他过程调用,完成相似的操作,能够提高编程效率、优化程序结构。【实例4-1】本实例要使用计算机自动求出1000以内2、3、5、7的倍数。事实上,求4个质数的倍数的操作是相同的。因此,可以通过编写通用过程实现求解。,4.7.1 界面设计,本实例主要使用了Label控件、TextBox控件和CommandBox控件。图是求1000以内2、3、5、7的倍数的程序运行界面图。,4.7.2 实例结构,创建一个新工程,该工程包括一个Form窗体。在窗体上添加上述控件,控件布
13、局如图4.8所示。,4.7.3 程序流程,以2的倍数为例,程序的流程如图所示。,4.7.4 代码实现,求1000以内2、3、5、7倍数的实例代码如下所示。在程序运行界面中,使用TextBox控件输出各质数的倍数。将各TextBox控件的Name属性设置为相同的名称,Index属性分别设置为2、3、5、7。这事实上是创建了控件数组,在下一章中将详细介绍。此处,读者只要知道,设置了Index属性,就可以使用公用的语句,如txtMultiple.Item(Num).Text,输出对应与2、3、5、7的倍数数据。,4.8 综合练习,编写一个求3个数中最大值Max和最小值Min的过程,然后用这个过程分别
14、求5个数、7个数中的最大值和最小值。编写一个求3个数中最大值Max和最小值Min的过程是比较简单的。但是要用这个过程解决5个数、7个数,甚至更多的数就不易实现。对于一个过程来说,允许若干个参数可选,但是,参数的总个数是一定的。,4.9 常见问题,1 VB过程参数传递方式按值和按地址有什么区别?按值传递时,实参将其复制给形参,形参在过程运算中改变时,对实参没有任何影响。当实参为常量、表达式或者在定义过程时使用ByVal关键字时,过程参数传递方式都是按值传递。按地址传递时,实参将其存储地址传递给形参,形参与实参共享同一个内存地址。形参在过程运算中改变时,实参也会一起变化。当实参为变量或者定义过程中
15、使用ByRef关键字时,过程参数传递方式都是按地址传递。当实参为下一章中所介绍的数组时,过程参数的传递方式也是按地址传递。当实参为变量时,可以给变量名加括号“()”来改变参数传递方式,将按值传递改为按地址传递。2 为什么在定义Function过程要在下面给过程名赋值,调用的时候才能使用?原理是什么?VB的函数值返回方式与C语言是不同的。在VB中,如果使函数能够返回正确的值,就必须在函数过程的最后,将需要返回的数据赋给函数名。这与C语言中使用Return语句返回函数值的功能是一样的,只是形式不同。比如如下代码:Function Caculate(ByVal x As Integer,ByVal
16、y As Integer)As IntegerCaculate=x*yEnd Function必须使用Caculate=x*y才能返回正确的函数值。而不能像C语言中,定义z=x*y实现函数值的返回。,4.9 常见问题,3 VB子过程中能否有两个数组作为形参?VB子过程的参数个数可以有多个,当然可以将多个数组作为参数。数组的概念和使用将在下一章中详细介绍。但是,值得提醒的是,无论参数是变量还是数组,对应形参和实参的数据类型一定要相同,否则系统会提示类型不匹配的错误信息。4 下列代码运行时,单击窗体4次,其运行结果是什么?Private Sub Form_Click()Static a As In
17、teger Dim b As Integer b=a+b+1 a=a+b Debug.Print a=;a,b=;bEnd Sub5 编一个函数过程HtoD(H),将十六位进制字符串H转换成十进制数。主调程序用HtoD函数,再调用内部函数Hex(number)进行逆向验证。,4.10 小结,本章主要介绍VB中的过程,过程调用、过程中的参数传递,以及过程中的变量作用范围。本章的难点是通用过程的编写和调用,以及参数的传递。读者在编写通用过程时,要明确其功能,所需要的参数,是否需要返回值,调用的格式等。参数的传递包括按值传递和按地址传递。按地址传递时,程序可能会无意中修改实参的数据,读者在使用时要注意。下一章将介绍数组的创建和使用。数组是VB程序设计中十分常用,使用数组可以大大提高编程效率。,4.11 习题,1 Sub过程和Function过程有什么不同?2 什么是形参?什么是实参?两者在参数传递过程中的关系如何?3 下列递归函数Sum()的功能是计算连续自然数的和。找出代码的错误,说明原因,并加以改正。4 说明下列代码的功能,并给出执行结果。,
链接地址:https://www.31ppt.com/p-6208065.html