您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 第8章 子程序和函数
结构化程序主要采用自上而下、逐步细化的设计方法,即先全局后局部、先整体后细节、先抽象后具体的设计方法。自顶向下、逐步求精:其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;各模块之间的关系尽可能简单,在功能上相对独立;每一个模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计思想8.1子程序和函数的定义8.1.1模块化的程序设计主模块(主功能)模块A(较小功能)模块B模块C模块A1(小功能)模块A2(小功能)B1B2C1C2C3C4程序模块化分图结构化程序的组织结构:在结构化程序中常用模块化结构来组织程序一个应用程序的组成应用程序(.vbp文件)窗体模块(.frm文件)标准模块(.bas文件)类模块(.cls文件)声明段事件过程通用过程全局声明段模块级声明部分通用过程在VB中子过程分为通用过程和事件过程两类,通常将Sub过程、Function过程称为通用过程。在一些重复性的应用中,把共享的代码定义成过程往往使程序更容易调试和理解。通用过程:一般由应用程序来调用,不与特定的事件相关联。一般存储在窗体或标准模块中。通用过程的主要目的之一就是对于经常调用的操作不必重复代码,也容易维护应用程序。主过程调用子过程后,程序进入子过程执行,完成后返回主程序接着执行下面的语句。事件过程:事件过程通常和窗体相关联,当某个事件发生时调用对应的事件过程,如命令按钮的Click()过程等。事件过程是VB自动生成的,在“代码编辑器”中从“对象框”中选择一个对象,从“事件框”中选择一个事件,系统就会自动生成对应的事件过程。1.Sub子过程以Sub保留字开始的过程称为子过程,子过程通常是为了完成某种特定的功能而编写的(1)子过程的语法是:[Private|Public][Static]Subname[(arglist)][过程语句][ExitSub][过程语句]EndSub可选。决定此过程的作用域。与变量的声明是相同的,若没有指定则默认是公用的。子过程名要传递给子过程的参数列表。多个参数用逗号隔开可选。决定此过程内的变量的生命周期,若没有指定则在过程执行完毕后,过程内的局部变量会消失8.1.2子程序和函数Arglist中的参数的语法是:[ByVal|ByRef]varname[()][Astype]…Arglist中的参数的语法参数说明:ByVal:表示该参数按值传递。即在调用该过程时,传递给过程的是参数的值。ByRef:表示该参数是按地址传递,即在调用该过程时,传递给过程的是参数在内存中的存放地址,也就是参数本身。ByRef是VisualBasic的默认选项。varname:参数的名称。type:可选项。传递给该过程的是参数的数据类型,可以是Byte,Boolean,Integer,Long,Currency,Single,Double,Date,String(只支持变长),Object或Variant。(2)子过程中所使用的变量(分为两类):子过程中使用的第一类变量是在过程内显式定义的局部变量;另一类是没有显式定义的变量(除非这一类变量在该过程外更高级别的位置有显式定义,否则也是局部的)。特别注意:若过程内显式定义的变量和高于其级别的模块级别中定义的变量名称相同,则过程会优先使用过程内定义的变量。特别注意:不能使用GoSub,GoTo或Return来进入或退出Sub过程。例8.1:变量定义演示变量定义演示程序2.函数过程类似于系统的内部函数。VB还提供了以Function保留字开始的函数过程,以实现特定的功能。函数过程的语法是:[Private|Public][Static]Functionname[(参数列表)][Astype][过程语句][name=返回值][ExitFunction][过程语句][name=返回值]EndSub函数过程使用的说明:在函数过程的语法中,可选的Public,Private以及Static和变量的修饰意义相同。规定了此过程的有效区间和生存周期。函数过程名以及参数列表的规定和子过程相同。函数过程中的变量和子过程相同,在函数过程中可以使用外部显示定义的变量,但应注意改变它的值对整个程序造成的影响。函数过程与子程序最大的区别:函数在其代码执行完退出时返回给调用者一个结果值,调用者能够得到该值并利用它进行其它运算,而子过程只是去做一件不事情,不提供返回值。8.1.3过程的创建与调用1.创建和修改过程,创建过程的方法:选中要添加过程的代码窗口,通过“工具”菜单中的“添加过程”选项来完成新过程的创建。对于熟练的编程人员,可以直接在代码窗口内按照规定的语法格式输入过程名和参数,系统会自动使用“EndSub”或“EndFunction”来补充全过程。要在当前模块中查看现有的通用过程,可以在“代码”窗口的“对象框”中选择“通用”,然后在“过程框”中选择对应的程序;查看事件过程,可以在“代码”窗口的“对象框”中选择适当的对象,然后在“过程框”中选择现有的过程;如果想查看其它模块的过程,可以使用“对象浏览器”。2.调用过程调用Sub子过程的两种方法:直接使用过程名调用:使用Call语句调用:Call过程名(参数列表)注意:当用Call调用语句时,参数必须在括号内。若省略Call关键字,则必须省略参数两边的括号。过程名参数列表注意:因为子过程不返回值,所以以上两种调用方法都是单独的可执行语句,不能作为表达式的一部分参与运算或者赋值。求长方形面积时间延时示例程序调用函数过程的方法:除了可以使用调用子过程的两种方法调用函数过程之外,还可以像调用VB内部函数的方法一样,直接书写函数作为表达式的一部分。注意:若需要调用其它模块内的过程,只需在过程名前加上模块名和“.”即可:模块名.过程名(参数列表)例8.2:编写函数求解1!+2!+3!+4!+…+N!,其中N由程序输入例8.2程序求最大公约数函数伪随机数的生成方法再次强调子过程和函数过程的区别:通常子过程可以完成用户指定的功能,但子过程不返回值;利用函数过程即可以得到一个值的返回,在程序的任何地方都可以用“函数过程名=返回值”来给函数过程名赋值。[Astype]参数规定了过程返回值的类型,默认为变体类型。例8.3:编写过程完成两个整数的互换与求和例8.3示例程序8.1.4参数传递通常过程和调用它的主过程之间都存在着数据传递,这在使用函数过程的时候更为明显,VB使用参数列表这一形式来完成这个传递过程。过程本身使用的参数列表称为“形参”,而主程序传递给过程的真正参数称为“实参”,过程在被调用的时候,用实参代替本身的形参,从而完成对真正数据的操作。在“实参”代替“形参”的传递过程中,VB提供了两种传递方式:按数值传递和按地址传递,通过ByVal和ByRef参数来指定。ByRef即按地址传递为默认传递方式。1.按数值传递参数在以ByVal参数指定的参数列表中,参数使用的是按值传递,系统会为变量作一个副本,把副本作为真正的参数传递过去,若过程里面改变了这个变量的值,则所作的变动只影响副本而不会影响变量本身。即是单向传递。例8.4:演示调用前和调用后的变量的变化例8.4示例程序P99按值传递参数示例程序2.按地址传递参数与按值传递相反。若参数采取的是ByRef传递,那么传递给过程的将是真正实参本身,过程中对形参的改变都将永远改变实参的值。此种参数传递方式在VB中比较少用。特别说明:为什么按地址传递参数将永远改变实参的值?因为此种参数传递方式,实质是过程在被调用的瞬时,形参和实参共同占用内存单元,这样,若在过程中形参的值被改变,即是实参的值改变。例8.5:与例8.4类似,改变AddX子过程的参数传递方式,观察程序运行的结果例8.5示例程序3.数组在参数传递和返回值中的应用数组作为函数参数示例1程序VB中允许数组作为实参和形参,但数组只能通过传址方式传递,且数组不能使用变体类型数组,在形参和实参列表中,只能放入数组的名称(但括号不能省略),不能放入维数。过程可以使用Lbound和Ubound函数来得到参数数组的上下界。数组作为函数参数示例2程序求定积分程序P100例8-1示例程序P101例8-2示例程序P102例8-3示例程序P103例8-4示例程序P105例8-5示例程序P105例8-6示例程序定义函数时如果参数前加上Optional关键字,就代表此参数是可选的。并且此参数后的所有参数都必须定义为可选的。对于可选参数的使用,常用的方法是给可选参数指定一缺省值。一般而言,过程中调用的参数个数应该等于过程定义的参数个数。但若在参数前加上ParamArray关键字,过程将可以接受任意个数的参数。4.SubMain过程在VB中,SubMain为一个特殊的过程,在缺省情况下,应用程序的第一个窗体被指定为启动窗体,程序运行的表现即由启动窗体显示出来。若需要在显示之前进行一些操作或程序根本就不需要窗体,则可用SubMain过程来实现。调用SubMain过程的方法:在“启动对象”下拉列表中,选取SubMain作为启动对象。从“工程”菜单中,选取“工程属性”中的“通用”选项卡。在标准模块中书写一个名称为Main的子过程,这样,程序启动后将会第一个执行Main过程,在这个过程里面可以装入需要显示的窗体或进行数据的输入、用户的认证等操作。特别说明:SubMain过程只有创建在标准模块中才能被指定为启动过程,在其它模块中都不能启动程序。例8.6:SubMain过程示例(下面代码根据用户名称的不同打开不同的窗体例8.6示例程序8.2常用内部函数在程序中,函数的概念与数学中函数的概念类似。函数是一种特定的运算,能完成特定的操作。例如:用于求一个数的平方根、正弦值等。由于这些运算或操作中程序中会经常用到,为此,VisualBasic提供了大量的内部函数供用户在编程时调用。内部函数按功能可分为数学函数、转换函数、字符串函数和日期函数和格式函数等。8.2.1数学函数数学函数用于完成一些基本的数学计算,其中一些函数的名称与数学中相应函数的名称相同。关于数学函数的一些说明:在三角函数中,参数以弧度表示。如,函数Sin(30)中的30是指弧度,而不是30º。为了将我们熟悉的角度转换为弧度,可以将角度乘以PI/180;若将弧度转换成角度,则将弧度乘以180/PI。其中PI是数学常数,值为3.141592653897932。Int函数和Fix函数的不同之处在于,若参数n为负数,则Int返回小于或等于该参数的第一个负整数,而Fix则会返回大于或等于该参数的第一个负整数。如Int(-8.4)=-9,而Fix(-8.4)=-8。函数说明举例结果Abs(n)返回参数的绝对值Abs(-6.5)6.5Atn(n)返回参数的反正切值Atn(0)0Cos(n)返回参数的余弦值Cos(0)1Exp(n)返回e(自然对数的底)的某次方Exp(2)7.389Fix(n)返回参数的整数部分Fix(8.2)8Hex(n)返回给定整数的16进制字符串Hex(10)AInt(n)返回参数的整数部分Int(-8.4)-9Log(n)返回参数的自然对数值Log(10)2.3Oct(n)返回给定整数的8进制字符串Oct(8)10Rnd(n)返回一个随机值Rnd()0~1Round(n,decimal)返回函数四舍五入后的结果Round(3.68)4Sgn(n)返回参数的正负号Sgn(-5)-1Sin(n)返回参数的正弦值Sin(0)0Sqr(n)返回参数的平方根Sqr(25)5Tan(n)返回参数的正切值Tan(0)0常用数学函数函数Sgn将根据参数n的不同取值,返回不同的值。若n0,则Sgn(n)=1;若n=0,则Sgn(n)=0;若n0,则Sgn(n)=-1。随机函数Rnd(n)返回一个介于0~1之间(不包括0和1)的单精度随机数。参数n的值决定了Rnd生成随机数的方式:(1)若n0,则根据n的值,返回一个特定的随机数。(2)若n0或省略,则返回随机序列中的下一个随机数。(3)若n=0,则返回与上一次产
本文标题:第8章 子程序和函数
链接地址:https://www.777doc.com/doc-3823214 .html