【VB开源代码栏目提醒】:网学会员鉴于大家对VB开源代码十分关注,论文会员在此为大家搜集整理了“VB函数过程 - 综合课件”一文,供大家参考学习
第六章 过程(5学时) 6.1 函数过程的定义与调用 6.2 子过程的定义与调用 6.3 参数传递 6.4 变量、过程的作用域 6.5 递归 6.6
常用算法(三) 6.7 重点和难点除了系统提供的内部函数过程和事件过程外,用户可自定义过程: “Sub”保留字开始的为子过程 “Function”保留字开始的为函数过程 b一、函数过程的定义 a S11. 引例6.1 c 已知多边形的各条边的长度,要计算多边形的面积。
S2 计算多边形面积,可将多边形分解成若干个三角形。
e d 计算三角形面积的公式如下: g S3 1 f area cc xc y c z c x y z 2 x y 调用函数过程: z定义函数过程 Sub command1_clickPublic Function areax y z As Single Dim c …… 输入若干个三角形边长 c 1 / 2 x y z area Sqrc c - x c - y c - z SareaabcareacdeareaefgEnd Function Print s End Sub2.函数过程的定义 自定义函数过程有两种方法: 1利用“工具”菜单下的“添加过程”命令定义生成一个函数的框架 2利用
代码窗口直接定义 函数过程形式: Function 函数过程名参数列表 As 类型 局部变量或常数定义 语句块 函数名 返回值 函数过程体 Exit Function 语句块 函数名 返回值 End Function 函数过程名:命名规则同变量名 参数列表形式: ByVal变量名As 类型 称为形参或哑元仅表示参数的个数、类型,无值。
函数名 返回值 在函数体内至少对函数名赋值一次 Exit Function :表示退出函数过程例6.2同标准函数Replace一样,定义MyReplace(SOldSNewS)函数过程当调用MyReplaceabcdefgabcdecdcd3“ 时函数的返回值为ab3efgab3e3“Function MyReplaces OldS NewS As String Dim i lenOldS lenOldS LenOldS 取OldS字符子串长度 i InStrs OldS 在字符串中找有否OldS字符子串 Do While i 0 找到用NewS 字符子串替换OldS字符子串 s Lefts i - 1 NewS Mids i lenOldS i InStrs OldS 找下一个OldS字符子串 Loop MyReplace s 替换后的字符串赋值给函数过程名 End Function 假定S为“abcdefgabcdecd”Oolds为 “cd”News为 3 “abcdefgabcdecd”“cd”“3” 第1 次 I3 结果 “ab3efgabcdecd” “ab3efgabcdecd”“cd”“3” 第2 次 I9 结果 “ab3efgab3ecd” “ab3efgab3ecd”“cd”“3” 第3 次 I11 结果 ab3efgab3e33.函数过程的调用 函数过程的调用同标准函数调用,参与表达式运算,形式如下: 函数过程名参数列表 参数列表:称为实参或实元,它必须与形参个数相同,位置与类型一一对应 可以是同类型的常量、变量、表达式 执行流程: Function MyReplaces OldS NewS Dim i lenOldSPrivate Sub Command1_Click lenOldS LenOldS Text1 MyReplaceText1 cd 3 i InStrs OldS Do While i 0 ST “Visual Basic 程序设计教程5.0版”s Lefts i - 1 NewS Mids i lenOldS Print MyReplaceST 5.0 6.0 i InStrs OldSEnd Sub Loop MyReplace s End Function Text1 MyReplaceText1 cd 3 Public Function MyReplaceS OldS NewS As String二、子过程 函数过程的不足:(1)不是为了获得某个函数值,而是为了某种功能的处理,如例1.1。
(2) 要获得多个结果。
1.引例 编写一个两个数交换的过程供多次调用。
Swap (xy)子过程的定义 主调程序调用Swap子过程 Public Sub Swapx y Private Sub Form_Click Dim t Dim a b tx a 10 xy b 20 yt Call Swap a b End Sub Print aa,b b End Sub2 子过程定义 Sub 子过程名参数
列表 局部变量或常数定义 语句 Exit Sub 语句 End Sub3 子过程的调用 子过程名 参数列表 或 Call 子过程名参数列表)4.子过程与函数过程区别:(1)函数过程名有值,有类型,在函数体内至少赋值一次; 子过程名无值,无类型,在子过程体内不能对子过程名赋值;(2)调用时,子过程调用是一句独立的语句。
函数过程不能作为单独的语句加以调用,必须参与表达式运算。
(3)一般当过程有一个函数值,使用函数过程较直观; 反之若过程无返回值,或有多个返回值,使用子过程较直观。
例6.4 分别编一计算某级数部分和的子过程和函数过程,并调用。
n x 2 x n x 1 x ... ...级数为: eps精度为: n 2 n程序运行流程:Private Sub Command1_Click Dim f1 f2 找函数名调用jishu1 ② ① Function jishu1x eps As Douf1 jishu12 0.000001 ③ … jishu表达式 ④ 函数名带了值返回 End Function ⑤ 找子过程名调用jishu2 ⑥ Sub jishu2s, x, epsCall jishu2f2 2 0.000001 ⑦…Print f1 f1 f2 f2 s表达式End Sub ⑧ End Sub三、 参数传递 指主调过程的实参传递给被调过程的形参。
1. 传址与传值 传址:形参得到的是实参的地址,当形参值的改变同时也改变实参的值。
传值: 形参得到的是实参的值,形参值的改变不会影响实参的值。
例6.5 两个变量的交换 Sub Swap1ByVal x ByVal y Sub Swap2x y t x: x y: y t t x: x y: y t End Sub End Sub Private Sub Command1_Click ByVal 传值 传地址 a 10: b 20: Swap1 a b 传值 Print A1 a B1 b a a a 10: b 20: Swap2 a b 实参 传地址 10 10 Print A2 a B2 b x x End Sub 形参 10 a 的地址2. 数组参数的传递 当参数是数组通过传址方式进行传递。
注意: 在实参和形参中写数组名,忽略维数的定义,但圆括号不能省。
被调过程可通过Lbound和Ubound函数确定实参数组的下、上界。
Lbound和Ubound函数的形式如下: LUbound数组名,维数 其中:维数指明要测试的是第几维的下标值,缺省是一维数组。
例 6.7 编一函数tim,求任意一维数组中各元素之积。
调用tim求和 5 8 t1 ∏ ai t 2 ∏ bi i 1 i 3 调用:Function tima As Integer Sub Command1_Click Dim t, i Dim a1 To 5,b3 To 8 t1 … For i Lbounda To Ubounda t1 tima t t ai t2 timb Next i Print t1, t2 tim t End SubEnd Function使用过程注意事项:1. 确定自定义的过程是子过程还是函数过程 函数过程名有值,子过程名无值。
2.过程中形参的个数和传递方式的确定 过程中参数的作用是实现过程与调用者的数据
通信。
1从主调程序获得初值,值传递。
2将结果返回给主调
程序,地址传递。
3. 实参与形参结合时对应
问题 个数、类型、位置、次序一一对应。
形参是值传递,对应实参可以是表达式、常量、数组元素。
形参是地址传递,对应实参只能是简单变量。
数组、记录类型、对象只能是地址传递。
实验6.4回文数的判断中形参的确定 1. 函数过程,形参一个,值传递对所判断的数字;函数名是否为回文数。
Function IsHByVal ss As String As Boolean 2. 子过程,形参两个,值传递对所判断的数字,地址传递是否位回文数。
Sub huiByVal ss As String Tag As Boolean实验6.2子过程DeleStrs1,s2形参的确定 s1,要处理的字符串,从主调程序得初值,删除子串后结果在S1中,所以地址传递。
s2删除的子串,值传递。
实验6.3函数过程 MaxLengths形参的确定 S要处理的字符串,值传递。
MaxLength函数名,最长的单词长度。
四、 变量、过程的作用域 作用域:变量、过程随所处的位置不同,可被访问的范围。
1.过程的作用域 窗体/模块级:加Private关键字的过程,只能被定义的窗体或模块中的过程调用。
全局级:加Public关键字(缺省)的过程,可供该应用程序的所有 窗体和所有标准模块中的过程调用。
2. 变量的作用域 局部变量:在过程内用声明的变量,只能在本过程中使用。
窗体/模块级变量:在“通用声明”段中用Dim语句或用Private语句声明的变量可被本窗体/模块的任何过程访问。
全局变量:在 “通用声明”段中用Public语句声明的变量,可被本应用程序的任何过程或函数访问。
例如在下面一个标准模块文件中不同级的变量声明: Public Pa As integer 全局变量 Private Mb As string 10 窗体/模块级变量 Sub F1 Dim Fa As integer 局部变量 … End Sub Sub F2 Dim Fb As Single 局部变量 … End Sub若在不同级声明相同的变量名
系统按局部、窗体/模块、全局次序访问如: Public Temp As integer 全局变量Sub Form_Load() Dim Temp As Integer 局部变量 Temp10 访问局部变量 Form1.Temp20 访问全局变量必须加窗体名 Print Form1.Temp Temp 显示 20 10End Sub3. 静态变量 局部变量声明: Dim声明,随过程的调用而分配存贮单元,变量的初始化;过程体结束,变量的内容自动消失,存贮单元释放。
Static声明,每次调用过程,变量保持原来的值。
声明形式:Static 变量名 AS 类型 Static Function 函数过程名参数列表 As 类型 Static Sub 子过程名参数列表 过程名前加Static,表示该过程内的局部变量都是静态变量。
例6.9 Private Sub Form_Click Private Function sumn As Integer Dim i ,isum Dim j As Integer For i 1 To 5 jjn isum sumi sum j Print isum, End Function Next i End Sub Static j As Integer,结果? 1,2,3,4,5 五、递归 过程的直接调用 Sub f1xSub Command1_Click Function f2x Function f3x ……… …… …… Call f1y xf2xx3… f2f3x3 f3xxEnd Sub End Sub End Sub End Sub 过程的递归调用 Sub Sub f1x Command1_Click … …… Call f1y Call f1y End Sub End Sub1.递归的概念 用自身的结构来描述自身就称为“递归”。
例对阶乘的定义: n n n 1 n 1 n 1 n 22. 递归过程 过程在自身定义的内部调用自己。
1 n 1 例6.10 编facnn 的递归函数 facn Function facn As Integer As Integer n facn 1 n 1 If n 1 Then fac 1 Sub Command1_Click Else Print “fac4”;fac4 fac n facn - 1 End Sub End If End Function 结果: fac424 递推 回归在递归处理中,用栈来实现。
栈中存放形参、局部变量、返回地址。
递推过程:每调用自身,当前参数压栈,直到达到递归结束条件。
回归过程:不断从栈中弹出当前的参数,直到栈空。
递归算法
设计简单,但消耗的机时和占据的内存空间比非递归大。
思考: 若上述fac函数中: If n 1 Then fac 1 即仅有语句: fac n facn - 1 或 n