第5章函数与子程序本章任务内置函数时间日期函数数学函数字符串处理函数自定义过程Function过程Sub过程过程的调用调用Sub事件过程调用Sub通用过程调用Function过程参数的传递形参和实参参数按值传递参数按地址传递数组参数可选参数可变参数对象参数递归5.1内置函数5.1.1时间日期函数Now():返回当前系统日期和时间Day(Now):返回当前日期WeekDay(Now):返回当前的星期Month(Now):返回当前的月份Year(Now):返回当前的年份Hour(Now):返回当前的小时Minute(Now):返回分Second(Now):返回秒时间日期函数演示5.1内置函数5.1.2数学函数Sin(x):返回参数x的正弦值Cos(x):返回参数x的余弦值Tan(x):返回参数x的正切值Atn(x):返回参数x的反正切值Abs(x):返回参数x的绝对值Sgn(x):返回参数x的符号(负:-1;零:0;正:-1)Sqr(x):返回参数x的平方根Exp(x):返回以e为底以x为指数的幂数学函数演示5.1内置函数5.1.3字符串处理函数LTrim(s):去掉字符串左边的空格RTrim(s):去掉字符串右边的空格Trim(s):去掉字符串两边的空格Left(s,n):取字符串左边的n个字符Right(s,n):取字符串右边的n个字符Mid(s,p,n):从位置p开始取字符串中的n个字符Len(s):返回字符串的长度String(n,s):返回由n个字符组成的字符串Space(n):返回由n个空格组成的字符串InStr(s1,s2):在字符串s1中查找字符串s2UCase(s):将小写字母转换为大写字母LCase(s):将大写字母转换为小写字母5.2自定义过程5.2.1Function过程Function过程的特点独立的过程,可传递参数执行一组语句并改变参数返回一个值到调用的过程5.2自定义过程5.2.1Function过程Function语句功能:声明Function过程的名称,参数及构成其主体的代码语法:[Public|Private][Static]Functionname[(arglist)][Astype][statements][name=expression][ExitFunction][statements][name=expression]EndFunction5.2自定义过程5.2.1Function过程Function语句说明Public:表示所有模块的所有其它过程都可访问该Function过程Private:表示只有包含其声明的模块的其它过程可访问该Function过程Static:表示在调用之间将保留Function过程的局部变量值name:Function的名称;遵循标准的变量命名约定。arglist:代表在调用时要传递给Function过程的参数变量列表。多个变量应用逗号隔开。type:Function过程的返回值的数据类型,可以是Byte、布尔、Integer、Long、Currency、Single、Double、、Date、String(除定长)、Object、Variant或任何用户定义类型。statements:在Function过程中执行的任何语句组expression:Function的返回值ExitFunction:从Function过程中退出5.2自定义过程5.2.1Function过程Function语句演示p.98【例5.1】编写一个计算三角形面积的Function过程5.2自定义过程5.2.2Sub过程Sub语句功能:声明子过程的名称、参数以及构成其主体的代码语法:[Private|Public][Static]Subname[(arglist)][statements][ExitSub][statements]EndSub5.2自定义过程5.2.2Sub过程Sub语句说明Public:表示所有模块的所有其它过程都可访问这个Sub过程Private:表示只有在包含其声明的模块中的其它过程可以访问该Sub过程Static:表示在调用之间保留Sub过程的局部变量的值name:Sub的名称;遵循标准的变量命名约定arglist:代表在调用时要传递给Sub过程的参数的变量列表。多个变量则用逗号隔开。statements:Sub过程中所执行的任何语句组ExitSub:退出Sub过程5.2自定义过程5.2.2Sub过程事件过程特点:由VisualBasic声明,用户不能增加或删除;事件过程附加在窗体或控件上,通常处于空闲状态,当发生相应事件时自动调用事件过程窗体事件过程语法格式PrivateSubForm_事件名([参数表])过程体语句EndSub控件事件过程语法格式PrivateSub控件名_事件名([参数表])过程体语句EndSub5.2自定义过程5.2.2Sub过程通用过程当几个不同事件过程要执行相同操作时,为了不重复编写代码,可将这段代码独立出来,编写成一个通用过程,以供事件过程调用通用过程可保存在窗体模块或标准模块中通用过程不依附于任何对象,也不能由对象的事件来激活建立通用过程的方法:可直接在代码编辑窗口中输入过程代码5.2自定义过程5.2.2Sub过程p.101【例5.2】编写一个通用过程Reverse,将一个正整数逆序输出,例如1234输出为43215.3过程的调用5.3.1调用Sub事件过程调用方式发生事件时自动调用由同一模块中的其他过程调用调用语句语法Call过程名[(参数列表)]过程名[参数列表]注意事项调用语句的参数为实际参数,简称实参,可为常量、变量、表达式和数组使用Call语句时,参数必须包含在括号内执行调用过程时,VB将控制转移至被调用过程p.102【例5.3】检查文本框中输入的内容是否为数值5.3过程的调用5.3.2调用Sub通用过程调用方式通过语句来调用,不会自动执行p.103【例5.4】计算最大公约数5.3过程的调用5.3.3调用Function过程调用方式[变量=]函数名([参数列表])p.104【例5.5】输入三角形的三条边长,计算三角形的面积5.4参数的传递5.4.1形参和实参什么是形参和实参在过程定义的参数列表中出现的参数称为形式参数,简称形参在过程调用语句或表达式中出现的参数称为实际参数,简称实参;实参可以是常量、变量、表达式调用一个过程时,必须把实参传递给过程的形参,以完成形参和实参的结合,此过程称为参数的传递传递参数时,形参列表与实参列表中的参数名称可以不同,但要求形参列表与实参列表中参数的个数、数据类型和位置顺序必须一一对应5.4参数的传递5.4.2参数按值传递和按地址传递(默认)按值传递参数:ByVal按值传递参数时,VB给传递的形参分配一个临时内存单元,并将实参的值传递到这个临时单元中实参向形参传递是单向的,如果在被调用的过程中改变了形参值,则只是临时单元的值发生变化,不会影响实参变量当被调用过程结束返回调用过程时,VB将释放给形参分配的临时内存单元,实参变量的值保持不变p.107【例5.6】按值传递参数示例5.4参数的传递5.4.2参数按值传递和按地址传递(默认)按地址递参数:ByRef按地址传递参数时,是将实参变量的内存地址传递给形参,使形参和实参具有相同的地址,即形参和实参共享相同的存储单元若在被调用过程中改变形参的值,则相应实参的值也被改变默认的参数传递方式为按地址传递p.108【例5.7】按地址传递参数示例5.4参数的传递5.4.3数组参数如何定义参数在参数名后加空括号数组参数的特点使用数组参数时必须使用按地址传递,不能用ByVal修饰调用过程时,相应的参数必须是数组,可只写数组名,后面不加括号示例p.109【例5.8】传递数组参数示例5.4参数的传递*5.4.4可选参数与可变参数可选参数用Optional修饰参数可以对可选参数设置默认值调用过程时可以不提供相应的实参定义过程时,可选参数后面的所有其他参数也必须是可选参数可选参数示例p.112【例5.9】5.125.4参数的传递5.4.4可选参数与可变参数可变参数若过程最后一个参数使用ParamArray关键字是数组,则调用该过程时可传递任意多个实参,这些参数按顺序存储于数组中ParamArray关键字不能与ByRef或Optional同时应用于同一个形参用ParamArray关键字修饰的参数只能是Variant类型可选参数示例p.113【例5.10】5.135.4.5对象参数声明通用过程时,可使用Object、Control、Label、TextBox等来定义对象类型的形参调用上述过程时,应传递类型匹配的对象作为实参p.114【例5.11】对文本框中输入的数据进行检查