第六章过程 (5学时) 6.1函数过程的定义与调用 6.2子过程的定义与调用 6.3参数传递 6.4变量、过程的作用域 6.5递归 6.6常用算法(三) 6.7重点和难点
第六章 过程 (5学时) 6.1 函数过程的定义与调用 6.2 子过程的定义与调用 6.3 参数传递 6.4 变量、过程的作用域 6.5 递归 6.6 常用算法(三) 6.7 重点和难点
除了系统提供的内部函数过程和事件过程外,用户可自定义过程: ● “Sub”保留字开始的为子过程 ● “Function'"保留字开始的为函数过程 一、j 函数过程的定义 1.引例6.1 已知多边形的各条边的长度,要计算多边形的面积。 计算多边形面积,可将多边形分解成若干个三角形。 . 计算三角形面积的公式如下: S3 area=c(c-x(c-y)(c-z) c-(x+y+2) 定义函数过程 调用函数过程 Public Function area(x!,y!,z!)As Single Sub command1 clickO Dim c! 输入若干个三角形边长 c=1/2*(X+y+Z) S-area(a,b,c)+area(c,d,e)+area(e,f,g area=Sqr(c *(c-x)*(c-y)*(c-z)) Print s End Function 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
2.函数过程的定义 自定义函数过程有两种方法: (1)利用“工具”菜单下的“添加过程”命令定义,生成一个函数的框架 (2)利用代码窗口直接定义 函数过程形式: Function函数过程名([参数列表])[As类型] 局部变量或常数定义 语句块 函数名=返回值 函数过程体 [Exit Function] 语句块 函数名=返回值 End Function 函数过程名:命名规则同变量名 参数列表形式:By Vall变量名[O[As类型] 称为形参或哑元,仅表示参数的个数、类型,无值。 函数名=返回值在函数体内至少对函数名赋值一次 [Exit Function:表示退出函数过程
2.函数过程的定义 自定义函数过程有两种方法: (1)利用“工具”菜单下的“添加过程”命令定义,生成一个函数的框架 (2)利用代码窗口直接定义 函数过程形式: Function 函数过程名([参数列表]) [As 类型] 局部变量或常数定义 语句块 函数名 = 返回值 函数过程体 [Exit Function] 语句块 函数名 = 返回值 End Function 函数过程名:命名规则同变量名 参数列表形式: [ByVal]变量名[()][As 类型] 称为形参或哑元,仅表示参数的个数、类型,无值。 函数名 = 返回值 在函数体内至少对函数名赋值一次 [Exit Function] :表示退出函数过程
例6.2同标准函数Replace一样,定义MyReplace(S,OldS,NewS)函数过程 当调用MyReplace("abcdefgabedecd","cd","3") 时函数的返回值为"ab3 efgab3e3" 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 yReplace=s '替换后的字符串赋值给函数过程 名 End Function 假定S为“abcdefgabcdecd',Oolds为“cd',News为"3" (abcdefgabcdecd,“cd,3)第1次=3结果“ab3 efgabcdecd” ab3 efgabcdecd,cdp,3第2次I=9 结果 “ab3 efgab.3ecd' ab3 efgab3ecdP,cd,3)第3次=l1 结果"ab3 efgab.3e3
例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 MyReplace$(s$,OldS$,NewS$) Dim i%,lenOldS% Private Sub Command1 Click( lenOldS =Len(OldS) Text1=MyReplace(TextI,"cd","3") i=InStr(s,OldS) ST=(Visual Basic程序设计教程5.0版”Do While i>q Print MyReplace(ST,"5.0","6.0") s=Left(s,i-1)+NewS Mid(s,i+lenOldS) End Sub i=InStr(s,OldS) Loop MyReplace= End Function Text1=MyReplace(Text1,"cd","3") Public Function MyReplace(S$,OldS$,NewS$)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)不是为了获得某个函数值,而是为了某种功能的处理,如例1.1。 (2)要获得多个结果。 1.引例 编写一个两个数交换的过程供多次调用。 Swap(xy)子过程的定义 主调程序调用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
二、子过程 函数过程的不足: (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)调用时,子过程调用是一句独立的语句。 函数过程不能作为单独的语句加以调用,必须参与表达式运算。 (3)一般当过程有一个函数值,使用函数过程较直观; 反之若过程无返回值,或有多个返回值,使用子过程较直观
2 子过程定义 Sub 子过程名[(参数列表)] 局部变量或常数定义 语句 [Exit Sub] 语句 End Sub 3 子过程的调用 子过程名 [参数列表] 或 Call 子过程名(参数列表 4.子过程与函数过程区别: (1)函数过程名有值,有类型,在函数体内至少赋值一次; 子过程名无值,无类型,在子过程体内不能对子过程名赋值; (2)调用时,子过程调用是一句独立的语句。 函数过程不能作为单独的语句加以调用,必须参与表达式运算。 (3)一般当过程有一个函数值,使用函数过程较直观; 反之若过程无返回值,或有多个返回值,使用子过程较直观
例6.4分别编一计算某级数部分和的子过程和函数过程,并调用。 级数为: 1+x+ 精度为 eps 2 n. 用函数过程实现求部分级数和 ·用子过程实现求部分级数和 Function jishul(x!,eps#As Double Sub jishu2(s# x, 印$掬 Dim n%,st# Dim n%,t# n=1:s=0:t=1 n=1:s=0:t=1 Do While(Abs(t)>=印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 jishul =s End Sub End Function 调用逯数过程 调用子过程 f1 iishu1(2#0 000001) Call iishu2f2 2#n n00001)
例6.4 分别编一计算某级数部分和的子过程和函数过程,并调用。 级数为: 精度为:. ! . 2! 1 2 + + + + + n x x x n eps ! n x n
程序运行流程: Private Sub Command1 Click( Dimfl#,f2# 找函数名调用ishu1 Function jishul(x!,eps#)As Doubl f1=jishu1(2#,0.000001) 函数名带了值返回 ishu=表达式 End Function 找子过程名调用jishu2⑥ Call jishu2(f2,2#,0.000001) Prin"f1=";f1,"f2=";f2 End ub 表达式 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.传址与传值 传址: 形参得到的是实参的地址,当形参值的改变同时也改变实参的值。 传值: 形参得到的是实参的值,形参值的改变不会影响实参的值。 例6.5两个变量的交换 Sub Swap1(ByVal x%,ByVal y%) Sub Swap2(x%,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:Swap1a,b'传值 a Print "A1=";a,"B1=";b 实参 10 10 a=10:b=20:Swap2 a,b 传地址 Print "A2=";a,"B2=";b X 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 传值 传地址