ch4函数与过程_第1页
ch4函数与过程_第2页
ch4函数与过程_第3页
ch4函数与过程_第4页
ch4函数与过程_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、主要介绍:v函数过程(Function)v子过程(SUB过程)v参数传递规则 v多模块程序设计(变量作用域)第一章:事件驱动、对象/控件三要素第二章:数据类型、变量、运算及内部函数第三章:选择结构、循环结构、数组Private sub Form_click() 给数组a赋随机数 打印数组a 给数组b赋随机数 打印数组b a、b两数组相加结果放数组c 打印数组cEnd sub涉及三种操作/功能 给一个数组赋随机值 打印一个数组1.两个数组相加第一章:事件驱动、对象/控件三要素第二章:数据类型、变量、运算及内部函数第三章:选择结构、循环结构、数组第四章:第四章:自定义自定义函数、子过程函数、子过程

2、两个问题:如何编写编写函数过程/子过程?如何在主程序里面调用调用它们?函数/子过程:具有某特定功能的子程序 VB VB系统函数系统函数( (标准函数或内部函数标准函数或内部函数) ):三角函数三角函数( (sin/cos/tansin/cos/tan) )、指数函数、指数函数( (expexp) )、对数函数、对数函数( (loglog) )平方根函数平方根函数( (sqrsqr) )、绝对值函数、绝对值函数( (ABSABS) )、符号函数、符号函数( (sgnsgn) )字串函数字串函数( (left,mid,right,trim,Ltrim,Rtrim,Len,spaceleft,mid

3、,right,trim,Ltrim,Rtrim,Len,space等等) )日期函数日期函数( (date,time,now,minute,second,hour,yeardate,time,now,minute,second,hour,year等等) )随机函数随机函数( (Rnd/RandomizeRnd/Randomize) )、printprint函数、函数、tabtab函数等等函数等等VB用户自定义过程Function过程(返回函数值)Sub过程(不返回函数值)Function sumTwo(n as integer, m as integer) as long sumTwo = n

4、+mEnd function Function Function ( ( 形参列表形参列表 ) )AsAs 函数体函数体 函数名函数名= =返回值返回值 End FunctionEnd Function形参列表形参列表: : 形参形参1 as 1 as 数据类型,形参数据类型,形参2 as 2 as 数据类型数据类型,返回值类型若省略,则为变体类型(Variant)。Private sub Command1_click() dim a as integer, b as integer, s as long a=3:b=4:s = sumTwo(a,b) Print sEnd sub调用处调用处

5、函数的声明过程被调用时参数传递实参实参 形参形参( (主程序主程序) ) ( (子程序子程序) )ByVal(按值:实参的值- 形参)ByRef(按地址:实参的内存地址-形参使得两者其实为同一内存空间)2字节2字节2字节2字节2字节2字节abnmanbm主程序函数/子过程主程序函数/子过程按地址传递(ByRef)按值传递(ByVal)Private sub Command1_click() dim n as integer, s as long n = val(inputbox(“n=”) s s = sumup( = sumup(n n) ) Print “从1加到”;n; “的和为 ”;

6、sEnd subFunction sumup(x as integer) as long Dim i as integer For i=1 to x sumup =sumup+i next iEnd function调用处调用处函数的声明把需要主程序/被调用处传过来的变量放在形参列表如x, 其他用到的变量在函数里面定义如i(1)定义为Public或缺省的函数可以被工程中其它窗体中的过程调用窗体名.函数名(实参列表);定义为Private的函数只能被其所在窗体的过程调用 函数名(实参列表)。(2)在函数体内,函数名可以当变量使用,函数的返回值通过对函数名的赋值语句来实现的。 (3) 函数名:命名

7、规则与变量名规则相同。不能与系统的内部函数或其它通用子过程同名,也不能与已定义的全局变量和本模块中模块级变量同名。(4)形参列表:仅表示形参的类型、个数、位置,定义时无值,只有在过程被调用时才从实参获得相应的值。(5)Exit Function:表示退出函数过程。 函数过程调用说明: 在调用时应以实际的参数(即实参)替换函数括号内的形参;实参和形参的数据类型、顺序、个数必须匹配。函数调用只能出现在表达式中,其功能是求得函数的返回值。 要注意函数声明的时候,函数名后的括号内接的是形参声明列表,且函数声明有且只能一次,如同变量的声明一样;而调用函数时应在函数名后的括号内代入实参,可以多次调用,功能

8、仅是获得函数的返回值。(1)过程可以无形式参数,但括号必须有。(2)形参的声明形式:ByValByRef变量名( )As 类型,,(3)过程被调用时参数传递 实参实参 形参形参(主程序调用)(主程序调用) (子程序接收)(子程序接收)ByVal表示按值传递:实参的内容传给形参,实参的值不随形参的值变化而改变;缺省或ByRef表示按地址传递:实参和形参指向同一内存空间,实参的值随形参值的改变而改变。编程:编程:输出序列输出序列1 1,1 1,1 1,1 1,2 2,1 1,1 1前前5555项项输出数列: 1, 1,1, 1,2,1, 1,3,3,1, 1,4,6,4 1, 1,5,10,10,

9、5,1, ., 的前55项。 数据数据(每行总数每行总数)每行数据特点每行数据特点第第0行行1 (1)1=0!/0!/0!第第1行行1,1 (2)1=1!/0!/1! 1=1!/1!/0!第第2行行1,2,1 (3)1=2!/0!/2! 2=2!/1!/1! 1=2!/2!/0!第第3行行1,3,3,1 (4)1=3!/0!/3! 3=3!/1!/2! 3=3!/2!/1! 1=3!/3!/0!第第4行行1,4,6,4,1 (5)1=4!/0!/4! 4=4!/1!/3! 6=4!/2!/2! 4=4!/3!/1! 1=4!/4!/0!第第5行行1,5,10,10,5,1 (6)1=5!/0!

10、/5! 5=5!/1!/4! 10=5!/2!/3! 10=5!/3!/2! 5=5!/4!/1!1=5!/5!/0!第第i行行 (i) for j=0 to i xj=i!/j!/(i-j)!确定:自定义函数过程为求阶乘Private Function fact(ByVal k As Byte) As Long Dim i as bytefact=1 For i = 2 To k fact = fact * i Next iEnd Function Private Sub Form_click()Dim x As Long, i as integer, j as integerFor i=

11、0 To 9 For j = 0 To i x = fact(i)/fact(j)/fact(i-j) Print Tab(j * 5 + 1); x; Next j PrintNext iEnd SubPrivate Sub Form_click()Dim zh As Long ,i as integer,j as integerFor i = 0 To 9 For j = 0 To i x = fact(i)/fact(j)/fact(i-j) Print Tab(j * 5 + 1); x; Next j PrintNext iEnd SubPrivate Function zh(m A

12、s Byte, n As Byte) As Long zh = fact(m) / fact(n) / fact(m - n)End FunctionX=zh(i,j)编程:编程:编写一个函数,求数组中全体元素的和编写一个函数,求数组中全体元素的和思路:思路:主程序中产生数组,子函数要返回数组中主程序中产生数组,子函数要返回数组中全体元素的和全体元素的和知识点:知识点:1 1、如何将数组传递给子函数(、如何将数组传递给子函数(数组名及数组长度数组名及数组长度)2 2、参数传递过程中的、参数传递过程中的类型必须一致类型必须一致3 3、函数、函数缺省定义缺省定义时为时为按地址传递参数按地址传递参数

13、,函数过程,函数过程中改变参数值将导致中改变参数值将导致函数结果变化函数结果变化。一维数组把数组名和数组长度分别作为形式参数Private Function sum(x() As Single, byval m As integer) As Single Dim i As Byte sum = 0 For i = 1 To m sum = sum + x(i) Next iEnd FunctionPrivate Sub Form_click()Dim m As Byte, i As Bytem = val(inputBox(“输入数组元素个数)ReDim a(m) As SingleFor i

14、 = 1 To m a(i) = val(InputBox(a( + Str(i) + )=“)Next iPrint sum(a, m)End Sub编程:编程:编写函数求二维数组全体元素的和编写函数求二维数组全体元素的和思路:思路:二维数组在主程序中定义及输入,二维数组在主程序中定义及输入, 调用求和过程调用求和过程知识点:知识点:1 1、掌握二维数组形参和实参传递的方法、掌握二维数组形参和实参传递的方法2 2、二维数组的元素和的计算需要、二维数组的元素和的计算需要二重循环二重循环二维数组把数组名、行数、列数分别作为形参Private Function sum(a() As Single,

15、 byval m As Byte, byval n As Byte) As Single Dim i As Byte, j As Byte For i = 1 To m For j = 1 To n sum = sum + a(i, j) Next j, i End FunctionPrivate Sub Form_click()Dim m As Integer, n As Integer, i As Integer, j As Integerm =val( InputBox(“输入行数)n = val(InputBox(“输入列数)ReDim a(m, n) As Integer 定义动态二

16、维数组For i = 1 To m For j = 1 To n a(i, j) = val(InputBox(“ a(“ & i & “,” & j & “)”) Print a(i, j); Next j Print 一行打印完换行Next iPrint 打印空行Print sum(a(), m, n)sum(a(), m, n)End Sub3、确定形参(自变量)的个数、类型和传递方式。2、确定函数的返回值的类型。1、确定函数类型(public/private)和函数名。4、编写函数体。 Public|PrivateStaticPublic|Private

17、StaticFunction Function ()AsAs 函数体函数体 函数名函数名= =返回值返回值 End FunctionEnd FunctionPublic|PrivateStaticPublic|PrivateStatic Sub Sub () sub sub 过程体过程体End subEnd subFunction 和sub的区别:Function 返回函数值,必须在函数体中给函数名赋值SUB过程用于完成某个操作,过程名不能被赋值,不能用于返回一个值。private sub printstar(flag as Boolean) if flag then Print “*”End

18、 subPrivate sub form_click() dim f as boolean: f = true call printstar(f) printstar fend sub 间接调用 : Call 窗体.子过程名(实参列表) 直接调用: 窗体.子过程名 实参列表 注意:不用call时实参列表外面没有括号括号比较函数的调用: 窗体.函数过程名(实参列表)编程:编程:显示小房子图案显示小房子图案知识点知识点: :1 1、SubSub过程嵌套调用(直接调用或用过程嵌套调用(直接调用或用callcall函数间接函数间接调用)调用)2 2、学习、学习stringstring(n n,s s)

19、函数()函数(n n个字符为个字符为s s的字串)的字串) (P55P55填空题填空题3 3) 1 1、数值、数值(实参) 数值(形参) 实参实参 形参形参 结果结果 整型整型 浮点型浮点型 形参实参形参实参 浮点型浮点型 整型整型 形参四舍五入的实参形参四舍五入的实参2 2 字符串字符串(实参) 数值(形参) 以实参字符的数字赋值给形参以实参字符的数字赋值给形参,即:,即: 实参实参 形参形参 结果结果 字符字符“28” 28” 数值数值 A AA A28 28 字符字符“28abc” 28abc” 数值数值 A A 出错出错3 3、数值(实参) 字符串字符串(形参) 数值直接转换成字符串数

20、值直接转换成字符串 1.表达式和常量只能按值传递2. 整个数组只能按地址传递注意编程:编程:数组元素排序(降序)数组元素排序(降序)思路:思路:数组的输入与降序输出由主程序完成数组的输入与降序输出由主程序完成 排序过程由排序过程由subsub过程完成过程完成知识点:知识点:1 1、数组的参数传递、数组的参数传递数组名数组名和和数组长度数组长度2 2、数组只有按地址传递,不能按值传递数组只有按地址传递,不能按值传递3 3、形参中缺省传递方式就是按地址传递、形参中缺省传递方式就是按地址传递过程编写时的形参数组名后面一定要有括号Sort(a()a() as single, n as integer)

21、调用处实参可以只写数组名call sort(a(),n) 或 call sort(a, n)编程:编程:比较按值传递和按地址传递的区别比较按值传递和按地址传递的区别知识点:知识点:1 1、了解、了解byvalbyval与与byrefbyref的区别的区别2 2、缺省传递形式时为、缺省传递形式时为byrefbyref(按地址传递)(按地址传递)只有当实参为只有当实参为变量变量时,按地址传递才能实现时,按地址传递才能实现双向传递双向传递例如:例如: 主程序主程序 子函数子函数 call swap(10,50) sub swap(x%,y%)call swap(10,50) sub swap(x%,

22、y%)这样的调用没有意义这样的调用没有意义 call swap(a,b) sub swap(x%,y%)call swap(a,b) sub swap(x%,y%)当当x x及及y y在子过程中改变时,主程序中的在子过程中改变时,主程序中的a a和和b b跟着变化跟着变化Function Function ()AsAs 函数体函数体 函数名函数名= =返回值返回值 End FunctionEnd FunctionSub Sub () sub sub 过程体过程体End subEnd sub注意函数和子过程调用时的不同通过调用处判断以下uu, aa,bb,cc分别是函数过程还是子过程?Priva

23、te sub form_clickPrivate sub form_click Dim x as single, y as single, z as single Dim x as single, y as single, z as single,s as doubles as double x=3: y=4:z=5 x=3: y=4:z=5 s= uu(x) s= uu(x) print aa(x) print aa(x) call bb(y) call bb(y) cc z cc zEnd subEnd sub编程:编程:编写函数过程求最大公约数编写函数过程求最大公约数思路:思路:设定两个

24、数设定两个数mm、n n,并且,并且mnmn,则最大公,则最大公约数约数p p一定满足:一定满足: 1=p=n1=p=n,且:,且: m mod p=0 and n mod p=0m mod p=0 and n mod p=0方法:方法:将将n n赋值给赋值给p p,验证是否满足上式,不满足,验证是否满足上式,不满足就将就将p p减减1 1继续验证上式,直至满足为止。继续验证上式,直至满足为止。知识点:知识点:1 1、掌握最大公约数的求解方法、掌握最大公约数的求解方法2 2、学习两数求最大公约数的另一种方法、学习两数求最大公约数的另一种方法3 3、另一种交换两个数的方法(不借用第三个变量)、另

25、一种交换两个数的方法(不借用第三个变量)方法二:辗转求余方法二:辗转求余Function gys(m as integer, n as integer) as integerFunction gys(m as integer, n as integer) as integerDim r as integerDim r as integerr= m mod nr= m mod nDo while r 0Do while r 0 m=n: n=r: r= m mod n m=n: n=r: r= m mod nLoopLoop循环结束时循环结束时 n n为求得的最大公约数为求得的最大公约数gys=

26、ngys=nEnd functionEnd function方法一:在n和1之间找function gys(m as integer, n as integer) as integerFor gys = n to 1 step -1 if m mod gys =0 and n mod gys=0 then exit forNext gysEnd functionu全局变量在窗体通用部分用public声明u模块级变量在窗体通用部分用dim或private声明u过程级变量 在过程里面(如事件过程private subend sub) dim 动态变量 static 静态变量public a as

27、integerprivate b as single dim c as doublePrivate sub form_click()dim g as boolean End subPrivate sub command1_click()static x as integer End sub三. 变量作用域 在VB中,由于可以在过程中和模块中声明变量,根据定义变量的位置和定义变量的语句不同,变量可以分为:局部变量(过程级变量)窗体/模块级变量(私有的模块级变量,能被本模块的所有过程和函数使用)全局变量(公有的模块级变量,夸模块作用)。 定义:变量的作用范围是指变量被某一过程识别的范围或者指该变量

28、能够使用的程序代码范围局部量: 在过程内声明的变量或符号常量是局部量,其只能在本过程中使用。 在过程内部使用 Dim| Static 关键字来声明的变量,或者使用Const语句声明的符号常量,其只在声明它们的过程中才能被访问,别的过程不可访问。所以可以在不同的过程中声明相同名字的局部量而互不影响。 例:Private Sub Form_Load()Dim n%n= 10End SubPrivate Sub From_Click()Dim n%Print “n=“;nEnd Sub程序运行后单击窗体,其输出结果是什么? 在“通用声明”段中用Dim|Private语句声明的变量,或者用Privat

29、e const声明的符号常量,其可被本窗体/模块的任何过程访问。但其他模块却不能访问该量。例如:在“通用声明”段声明如下变量Private s As StringDim a As Integer,b As Single Const x%Private s As String, sr As StringPrivate s As String, sr As StringDim a As Integer, b As IntegerDim a As Integer, b As IntegerPrivate Sub Form_click()Private Sub Form_click() Dim s A

30、s String, a As IntegerDim s As String, a As Integer s = abc: sr = aaas = abc: sr = aaa a = 123: b = 456a = 123: b = 456 Print s, srPrint s, sr Print a, bPrint a, bEnd SubEnd SubPrivate Sub command1_click()Private Sub command1_click() Print s, srPrint s, sr Print a, bPrint a, bEnd SubEnd Sub通用声明模块级量这

31、个过程中的s、a被定义为局部量,sr、b为模块级量这个过程中的所有变量均为模块级量特点:过程内若定义了局部量就不能引用同名的模块级量 全局量也称公有的模块级变量,在窗体模块或标准模块的顶部的“通用”声明段用Public关键字声明的变量或用Public Const语句声明的符号常量,它的作用范围是整个应用程序,即可被本应用程序的任何过程或函数访问。例如: Public a As Integer,b As single Public Const PI As Double全局量可以在整个工程中被引用。 1 1、如果在窗体、如果在窗体2 2中声明中声明public m as integerpublic

32、 m as integer,那么要,那么要在窗体在窗体1 1中引用时,必须在变量中引用时,必须在变量mm前指出窗体名,即:前指出窗体名,即:a aform2.mform2.m2 2、如果要定义全局量的、如果要定义全局量的数组或定长字符串数组或定长字符串,必须在,必须在标准模块的通用声明部分标准模块的通用声明部分声明,不可以在其他窗体声明,不可以在其他窗体模块中声明。模块中声明。3种变量声明及使用规则如下表:3种符号常量的声明及使用规则与其对应的变量一致,只是常量只能读取而不能更改观察同名但不同定义的变量的输出值Public Temp As Integer 定义全局变量Private Sub F

33、orm_Load()Temp = 1 将全局变量Temp 的值设置成 1End SubPrivate Sub Command1_Click()Dim Temp As Integer 定义局部变量Temp = 2 将局部变量Temp 的值设置成 2 Print temp=; Temp Print temp=; Form1.TempEnd SubPrivate Sub Command2_Click() Print temp=; Temp End Sub 除作用域之外,变量还有存活期,在这一期间变量能够保持它们的值。 在应用程序的存活期内一直保持模块级变量和全局变量的值。但是,对于Dim声明的局部变

34、量仅当过程执行期间存在,当一个过程执行完毕,它的局部变量的值就已经不存在,而且变量所占据的内存也被释放。当下一次执行该过程时,它的所有局部变量将重新初始化。概念局部变量按存活期分为动态变量和静态变量;局部变量的存活期由其定义的关键词(Static 或Dim)来决定。 动态变量是指程序运行进入变量所在的过程时,才分配给该变量内存空间,退出该过程时,变量所占的内存空间自动释放,其值消失。 使用Dim语句在过程中声明的局部变量就属于动态变量,在过程执行结束后,变量的值不被保留,在每一次重新执行过程时,变量重新声明。 程序中使用的绝大部分变量都属于动态变量。 静态变量是指程序运行期间虽然退出变量所在的

35、过程,其值仍被保留的变量,即变量所占的内存空间没有释放。当以后再次进入该过程时,原来变量的值可以继续使用。 使用Static语句在过程中声明的局部变量就属于静态变量。静态变量只能在过程中声明,而不能在通用对象声明部分声明。 函数过程、自定义过程均可以在过程头部加上关键字Static,表示该过程内的局部变量都是静态变量。 声明形式: Static 变量名 AS 类型Static Function 函数过程名(参数列表) As 类型Static Sub 子过程名(参数列表)例12:阅读下列程序,写出当点击两次命令按钮后的运行结果。Function sum(Byval n as integer) a

36、s integer static s as integer for I%=0 to n-1 s=s+I% next I% sum=sEnd functionPrivate Sub Command1_Click() Print sum(2)+sum(3)End SubDim a As IntegerPrivate Sub Command1_Click() Static b As Integer Dim c As Integer a = a + 1 b = b + 1 c = c + 1 Print a=; a, b=; b, c=; cEnd SubPrivate sub command2_cl

37、ick() a= a+2End sub连续单击Command1按钮三次,窗体上的输出结果?单击Command1后再单击Command2再单击Command1出现什么结果?例 有一个人编了下面一段程序,想用变量n记录单击窗体的次数。Private Sub Form_Click() Dim n As Integer n = n + 1 Print 已单击次数:; n & 次End Sub分析程序运行后多次单击窗体的输出结果: 要记录单击窗体次数,如何实现?并比较使用模块变量和静态变量的差别。Private Sub Form_Click() Dim i% ,isum% For i = 1 T

38、o 5isum = sum(i)Print isum, Next i End Sub Private Function sum(n As Integer) Dim j As Integer j = j + n sum = jEnd Function1 2 3 4 5Static j As Integer 结果如何? VBVB中的三种类型模块中的三种类型模块窗体模块(窗体模块(.frm.frm)标准模块(标准模块(.bas.bas) 类模块(类模块(.cls.cls)问题:问题:在应用程序中出现多个窗体时,如何实现在在应用程序中出现多个窗体时,如何实现在 窗体窗体1 1中调用窗体中调用窗体2 2

39、中的某个过程中的某个过程方法:方法:(1 1)窗体)窗体2 2的被调用过程必须用的被调用过程必须用publicpublic定义,如:定义,如: publicpublic function tongyong function tongyong()()as longas long end function end function(2 2)窗体)窗体1 1中调用中调用tongyongtongyong()这个函数时必须()这个函数时必须 写明窗体名称,如:写明窗体名称,如: X X form2.tongyong()form2.tongyong()特点:特点: 标准模块中用标准模块中用publicpu

40、blic定义的过程可以在任何窗体定义的过程可以在任何窗体中都被调用而不需要标注窗体名的前缀中都被调用而不需要标注窗体名的前缀方法:方法: 在下拉菜单在下拉菜单“工程工程”中选择中选择“添加模块添加模块”二. 标准模块能夸模块调用的过程:1. 写在标准模块的public 过程,用过程名调用2. 写在某个窗体的通用部分的public过程,在其他窗体调用为:窗体名.过程名比较比较标准标准模块与模块与窗体窗体模块的过程定义及调用模块的过程定义及调用知识点:知识点: 掌握不同模块中掌握不同模块中publicpublic与与privateprivate定义的过程的调定义的过程的调用方法用方法完成第三章、第

41、四章课后习题完成第三章、第四章课后习题礼拜四(11月19号)上机(题目1)题目1:主程序定义主程序定义动态动态数组,给数组各元素通过数组,给数组各元素通过inputboxinputbox赋值赋值调用调用子过程子过程按一行按一行mm列来打印数组,列来打印数组,mm为该子过程形式参数为该子过程形式参数调用调用函数过程函数过程判断各个元素是否为素数,把是素数的元素按判断各个元素是否为素数,把是素数的元素按3 3个一行打印在窗体上个一行打印在窗体上调用调用函数过程函数过程求数组个元素的最小公倍数求数组个元素的最小公倍数Function aaaFunction aaa()as booleanas boolean aaa aaa相当于一个变量,有返回值相当于一个变量,有返回值Sub bbbSub bbb() bbbbbb只是调用时被识别的一个名称,没有返回值只是调用时被识别的一个名称,没有返回值形参的传递过程中有两种方式:形参的传递过程中有两种方式:(byval a as integerbyval a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论