1第六章过程 (5学时) 61函数过程的定义与调用 6.2子过程的定义与调用 6.3参数传递 64变量、过程的作用域 65递归 6.6常用算法(三) 6.7重点和难点
第六章 过程 (5学时) 6.1 函数过程的定义与调用 6.2 子过程的定义与调用 6.3 参数传递 6.4 变量、过程的作用域 6.5 递归 6.6 常用算法(三) 6.7 重点和难点
除了系统提供的内部函数过程和事件过程外,用户可自定义过程 “sub"保留字开始的为子过程 “ Function"保留字开始的为函数过程 函数过程的定义 1.引例61 已知多边形的各条边的长度,要计算多边形的面积 计算多边形面积,可将多边形分解成若干个三角形。 e 计算三角形面积的公式如下 8 S3. area=vc(c-x(c-y(c-z)c=6(x+y+z) 2 X Z 定义函数过程 调用函数过程 Public Function area(x! y!, Z! As Single Sub command1 click( Dim c ∴输入若干个三角形边长 C=1/2*(x+y+2) s=area(a, b, c)+area(c, d, e)+area(e, f, g area= Sqr(c*(c-x)*(c-y*(c-z)) End function 1-n Print s End sub
除了系统提供的内部函数过程和事件过程外,用户可自定义过程: ⚫ “Sub”保留字开始的为子过程 ⚫ “Function”保留字开始的为函数过程 一、函数过程的定义 1. 引例6.1 已知多边形的各条边的长度,要计算多边形的面积。 计算多边形面积,可将多边形分解成若干个三角形。 计算三角形面积的公式如下: a b c e d f g S1 S2 S3 ( ) 2 1 area = c(c − x)(c − y)(c − z) c = x + y + z x y z 定义函数过程 Public Function area(x!, y!, z!) As Single Dim c! c = 1 / 2 * (x + y + z) area = Sqr(c * (c - x) * (c - y) * (c - z)) End Function 调用函数过程: Sub command1_click() …… 输入若干个三角形边长 S=area(a,b,c)+area(c,d,e)+area(e,f,g) Print s End Sub
1)利用“工具”菜单下的“添加过程”命令定义生成一个函数的框架1m、M 2.函数过程的定义 自定义函数过程有两种方法: 2)利用代码窗口直接定义 函数过程形式 Function函数过程名([参数列表])[As类型] 局部变量或常数定义 语句块 [Exit Function). lminspxihg 一函数名=返回值 中函数过程体 语句块 函数名=返回值 End Function 函数过程名:命名规则同变量名 参数列表形式:[ByVa变量名[As类型] 称为形参或哑元仅表示参数的个数、类型,无值。 函数名=返回值在函数体内至少对函数名赋值一次 [ Exit function]:表示退出函数过程
2.函数过程的定义 自定义函数过程有两种方法: (1)利用“工具”菜单下的“添加过程”命令定义,生成一个函数的框架 (2)利用代码窗口直接定义 函数过程形式: Function 函数过程名([参数列表])[As 类型] 局部变量或常数定义 语句块 函数名 = 返回值 函数过程体 [Exit Function] 语句块 函数名 = 返回值 End Function 函数过程名:命名规则同变量名 参数列表形式: [ByVal]变量名[()][As 类型] 称为形参或哑元,仅表示参数的个数、类型,无值。 函数名= 返回值 在函数体内至少对函数名赋值一次 [Exit Function] :表示退出函数过程
例62同标准函数 Replace一样,定义 MyReplace(SdS,NewS)函数过程 当调用 MyReplace(" abcdefgabcdecd""cd","3")时函数的返回值为"ab3egab3e3 Function MyReplace(ss, OldSS, NewSS)As String Dim i%, renoldS% renOldS Len(oldS) 取Ods字符子串长度 i=In Strs, OldS) 在字符串中找有否odsS字符子串 Do Whilei>0 找到用№ewS字符子串替换Ods字符子串 S=Left(s, i-1)+ NewS Mid(s, i+lenOldS i=InStr(s, oldS) 找下一个S字符子串 oop MyReplace =s 替换后的字符串赋值给函数过程名 End function (" abcdefgabcdecd'sut"3")第1次|=3结果“ab3 Befgabcdecd"1mb 假定S为“ abcdefgabcdec"oods为“c"News为"3" (ab3efgabcdecd"cd 3)第2次仁=9结果“ab3egab3ecr (“ab3egab3ecd""cd"“3")第3次l=11结果"ab3egab3e
例6.2同标准函数Replace一样,定义MyReplace(S,OldS,NewS)函数过程 当调用MyReplace("abcdefgabcdecd","cd","3“) 时函数的返回值为"ab3efgab3e3“ Function MyReplace(s$, OldS$, NewS$) As String Dim i%, lenOldS% lenOldS = Len(OldS) '取OldS字符子串长度 i = InStr(s, OldS) '在字符串中找有否OldS字符子串 Do While i > 0 '找到用NewS 字符子串替换OldS字符子串 s = Left(s, i - 1) + NewS + Mid(s, i + lenOldS) i = InStr(s, OldS) '找下一个OldS字符子串 Loop MyReplace = s '替换后的字符串赋值给函数过程名 End Function 假定S为“abcdefgabcdecd”,Oolds为 “cd”,News为 "3" (“abcdefgabcdecd”,“cd”,“3”) 第1 次 I=3 结果 “ab3efgabcdecd” (“ab3efgabcdecd”,“cd”,“3”) 第2 次 I=9 结果 “ab3efgab3ecd” (“ab3efgab3ecd”,“cd”,“3”) 第3 次 I=11 结果 "ab3efgab3e3
3函数过程的调用 函数过程的调用同标准函数调用,参与表达式运算,形式如下 函数过程名参数列表] 参数列表:称为实参或实元,它必须与形参个数相同,位置与类型一一对应 可以是同类型的常量、变量、表达式 执行流程: function Myreplaces(ss, oldSS, Newss) Private Sub Command1 Click( Dim i%, len OldS% Text1 My Replace(Text1, cd,3) renOldS Len(oldS) i=InStr(s, OldS) Do Whilei>0 ST=(sua|Basc程序设计教程50版”s=ef(s-1)+NeWs+Misi+| renolds Print MyReplace(S°5:0) i= InStr(s, OldS) End sub oop MyReplace End functio TextI= MyReplace(Textl, "cd,3 Public Function MyReplace(ss, oldss, NewSs)As String
3.函数过程的调用 函数过程的调用同标准函数调用,参与表达式运算,形式如下: 函数过程名([参数列表]) 参数列表:称为实参或实元,它必须与形参个数相同,位置与类型一一对应 可以是同类型的常量、变量、表达式 执行流程: Private Sub Command1_Click() Text1 = MyReplace(Text1, "cd", "3") ST= (“Visual Basic 程序设计教程5.0版” Print MyReplace(ST, "5.0", "6.0") End Sub Function MyReplace$(s$, OldS$, NewS$) Dim i%, lenOldS% lenOldS = Len(OldS) i = InStr(s, OldS) Do While i > 0 s= Left(s, i - 1) + NewS + Mid(s, i + lenOldS) i = InStr(s, OldS) Loop MyReplace = s End Function Text1 = MyReplace(Text1, "cd", "3") Public Function MyReplace(S$, OldS$, NewS$) As String
二、子过程 函数过程的不足: (1)不是为了获得某个函数值,而是为了某种功能的处理,如例11。 (2)要获得多个结果 1引例 编写一个两个数交换的过程供多次调用 Swap(xy)子过程的定义 主调程序调用Sa子过程1 Public Sub Swap(x, y) Private Sub Form Click Dim t Dim a, b t=x a=10 b=20 Call Swap(a, b End sub 1no 7lmioervilp Print"a=a, ,b=b2 End sub
二、子过程 函数过程的不足: (1)不是为了获得某个函数值,而是为了某种功能的处理,如例1.1。 (2) 要获得多个结果。 1.引例 编写一个两个数交换的过程供多次调用。 Swap (x,y)子过程的定义 主调程序调用Swap子过程 Public Sub Swap(x, y) Private Sub Form_Click() Dim t Dim a, b t = x a = 10 x = y b = 20 y = t Call Swap (a, b) End Sub Print "a=";a,",b="; b End Sub
2子过程定义 sub子过程名(参数列表川 局部变量或常数定义 语句 [Exit Sub 语句 End sub 3子过程的调用 子过程名[参数列表 或Ca子过程名(参数列表 4子过程与函数过程区别: (1)函数过程名有值,有类型,在函数体内至少赋值一次; 子过程名无值,无类型,在子过程体内不能对子过程名赋值 (2)调用时,子过程调用是一句独立的语句 反之若过程无返回值,或有多个返回值,使用子过程较直观。21b、 函数过程不能作为单独的语句加以调用,必须参与表达式运算。 (3)一般当过程有一个函数值,使用函数过程较直观
2 子过程定义 Sub 子过程名[(参数列表)] 局部变量或常数定义 语句 [Exit Sub] 语句 End Sub 3 子过程的调用 子过程名 [参数列表] 或 Call 子过程名(参数列表) 4.子过程与函数过程区别: (1)函数过程名有值,有类型,在函数体内至少赋值一次; 子过程名无值,无类型,在子过程体内不能对子过程名赋值; (2)调用时,子过程调用是一句独立的语句。 函数过程不能作为单独的语句加以调用,必须参与表达式运算。 (3)一般当过程有一个函数值,使用函数过程较直观; 反之若过程无返回值,或有多个返回值,使用子过程较直观
例64分别编一计算某级数部分和的子过程和函数过程,并调用 X X 级数为:1+x+一+∴+ +:n 精度为 =甲s) Do While(Abs(t)>=eps) s=s+t: t=t*x/n s=s+t: t=t*x/n n=n+1 n=n+1 Loop Loop jishu =s End sub End Function 调用函数过程 调用子过程 f1=jshu(2#,0.00001) Calt2(f2,2,0.00001)
例6.4 分别编一计算某级数部分和的子过程和函数过程,并调用。 级数为: ... 精度为: ! ... 2! 1 2 + + + + + n x x x n eps ! n x n
程序运行流程: Private Sub Command1 Click Dim f1#, f2# 找函数名调用ishu1② Function jishu1(x! eps#) As Doubl f1= fishy1(2#0.000001) jishu=表达式 ④函数名带了值返回 End funct 找孑过程名调用shu2 Call jishu22,2#,0.000001) Sub jishu2(s#, x!, eps#) prin1=";1,"12=";2 End sub s=表达式 End sub
程序运行流程: Private Sub Command1_Click() Dim f1#, f2# f1 = jishu1(2#, 0.000001) Call jishu2(f2, 2#, 0.000001) Print "f1="; f1, "f2 = "; f2 End Sub Function jishu1(x!, eps#) As Doubl … jishu=表达式 End Function 找函数名调用jishu1 函数名带了值返回 Sub jishu2(s#, x!, eps#) … s=表达式 End Sub ① ② ③ ④ ⑤ 找子过程名调用jishu2 ⑥ ⑦ ⑧
、参数传递 指主调过程的实参传递给被调过程的形参 1.传址与传值 传址:形参得到的是实参的地址,当形参值的改变同时也改变实参的值。 传值:形参得到的是实参的值,形参值的改变不会影响实参的值 例65两个变量的交换 Sub Swap1(ByVal X%, ByVal y%)22 Sub Swap2(x%, y%) t%=x: x=y: y=t Lt% y: y End sub dsno End Sub Private Sub Command1 Click( a%=10:b%=20:SWap1a,b"传值 By Val传值 传地址 Print A1= a.B1= b a=10:b=20:swap2a,b'传地址实参10 10 linens Print A2=a,B2-/b1 iU End sub 形参10 a的地址
三、 参数传递 指主调过程的实参传递给被调过程的形参。 1. 传址与传值 传址:形参得到的是实参的地址,当形参值的改变同时也改变实参的值。 传值: 形参得到的是实参的值,形参值的改变不会影响实参的值。 例6.5 两个变量的交换 Sub Swap1(ByVal x%, ByVal y%) t% = x: x = y: y = t End Sub Private Sub Command1_Click() a% = 10: b% = 20: Swap1 a, b '传值 Print "A1="; a, "B1="; b a = 10: b = 20: Swap2 a, b '传地址 Print "A2="; a, "B2="; b End Sub Sub Swap2(x%, y%) t% = x: x = y: y = t End Sub 10 a 的地址 10 10 a a x x 形参 实参 ByVal 传值 传地址