2世纪高等学校计算机基础教育系列教材 第9章 Visual Basic 中的过程和函 人民邮电出版社
第9章 Visual Basic 中的过程和函数 •人民邮电出版社 21世纪高等学校计算机基础教育系列教材
定义过程 分成两类:sub过程(了过程)和 unction过程(函数过程 定义子过程方法: [ private I[ static I[ public sub过程名[(参数表) 语句块 [exit subl [语句块] End sub 例如 Private sub print test ( print" this is a sub procedure! End sub 参数表:可以分为值传递和地址传递,默认情况下是地址传递,要进行值传 递,可以用byva来进行设置。详细内容在后面例子中讲解
定义过程 分成两类:sub过程(子过程)和function过程(函数过程) 定义子过程方法: [ private ][ static ][ public ] sub 过程名 [(参数表)] 语句块 [exit sub] [语句块] End sub 例如: Private sub print_test() print “this is a sub procedure!” End sub 参数表:可以分为值传递和地址传递,默认情况下是地址传递,要进行值传 递,可以用byval来进行设置。详细内容在后面例子中讲解
定义过形 Sub tryout (x as interger, byval y as interger) X=×+100 工程1 Module(ode 口x加过程 d用 tryout y=y*6 名称⑩: tryout 定 Public Sub tryout O 类型 C属性 取消 Print×y G子程序() End sub C函数① C事件) End sub 范围 建立sub过程的方法(A):1 公有的① C私有的Q 厂所有本地变量为静态变量(A) 1)工程→添加模块→新建→模块(图1) 2)工具→添加过程(如图2窗口) 3)填写名称、设置类型、适用范围,确定回到图1所示窗口 建立sub过程的方法(B) 工程→添加模块,键入过程名称(假设 china) 工程1- Module2(ode) d用 chin Sub china()‘键入内容后回车, end sub自动出现 Sub china End sub End sub(见图3) 在两行之间就可以输入代码。输入代码要用到所学的各种可能的程序语句 3 例如结构, while结构, select case结构等,以及一些语句,如 print等等
定义过程 Sub tryout(x as interger,byval y as interger) x=x+100 y=y*6 Print x,y End sub 建立sub过程的方法(A): 1)工程→添加模块→新建→模块(图1) 2)工具→添加过程(如图2窗口) 3)填写名称、设置类型、适用范围,确定回到图1所示窗口。 建立sub过程的方法(B): 工程→添加模块,键入过程名称(假设china) Sub china() ‘键入内容后回车,end sub自动出现 End Sub (见图3) 在两行之间就可以输入代码。输入代码要用到所学的各种可能的程序语句 例如if结构,while结构,select case结构等,以及一些语句,如print等等 1 2 3
调用过程 Ca语句调用 把过程作为一个语句来使用 Ca|过程名[(实际参数)] 过程名实际参数 例如 call tryout(a,b) 例如 tryout(a,b) 例如:计算矩形面积的过形 Sub recarea (ren as single, rwid as single dim area as single area=rlen米rwid msgbox" the area of this rectangle is"&area End sub Sub form click va(a)函数,将数字字符串a转化 dim a, b 成数字,如va(“123”)=123 a= inputbox(“ input the length”) b=inputbox(input the width) call recarea(va(a)va(b)也可以直接用 recarea val(a)wa(b) End sub
调用过程 Call语句调用 Call 过程名[(实际参数)] 例如 call tryout(a,b) 把过程作为一个语句来使用 过程名 实际参数 例如 tryout(a,b) 例如:计算矩形面积的过程 Sub recarea(rlen as single,rwid as single ) dim area as single area=rlen *rwid msgbox “the area of this rectangle is” & area End sub Sub form_click() dim a,b a=inputbox (“input the length”) b=inputbox (“input the width”) call recarea(val(a),val(b)) ‘也可以直接用 recarea val(a),val(b) End sub Val(a)函数,将数字字符串a转化 成数字,如val( “123” )=123
通用过程和事件过程 附加在窗体和控件上的过程就叫做事件过 例如: command1cick()、Form_load( 通用过程就是我们在前面所讲解定义的过程,可以放在标准模块中 也可以放置窗体模块中,事件过程只能放置在窗体模块中,不同的模 块中的过程可以互相调用;过程名唯一的清况下,直接用过程名称调 用,如果两个模块中含有相同名称的过程,则需要有模块名过程名 的方式来调用。 可以看出这些过程都是没有返回值的,也就是说,在运行该过程后, 就不再使用这些过程的计算结果。这种过程不返回值,只能做为语句 使用。如果一个过程要有返回值,可以出现在表达式中,那么就要用 到 function过程(在有些书中叫做函数) 比如: msgbox 在语句 msgbox“北方工业大学欢迎您!”中是简单的sub过程 而在表达式a= msgbox(“北方工业大学欢迎您!”)中则是 function过一 程 这种现象叫做多态
通用过程和事件过程 附加在窗体和控件上的过程就叫做事件过程 例如:command1_click() 、Form _ load() 通用过程就是我们在前面所讲解定义的过程,可以放在标准模块中, 也可以放置窗体模块中,事件过程只能放置在窗体模块中,不同的模 块中的过程可以互相调用;过程名唯一的清况下,直接用过程名称调 用,如果两个模块中含有相同名称的过程,则需要有模块名.过程名 的方式来调用。 可以看出,这些过程都是没有返回值的,也就是说,在运行该过程后, 就不再使用这些过程的计算结果。这种过程不返回值,只能做为语句 使用。如果一个过程要有返回值,可以出现在表达式中,那么就要用 到function过程(在有些书中叫做函数) 比如: msgbox 在语句 msgbox “北方工业大学欢迎您!” 中是简单的sub过程 而在表达式 a=msgbox(“北方工业大学欢迎您!” )中则是function过 程 这种现象叫做多态*
Function过程(函数 建立 function过程 [ private[ static I[ public] function过程名[(参数表) 名=表达式] [exit function] [语句块] End function ↑例如:求最大公约数的函数 Function gcd(byval x as integer, byval y as integer) as integer do while y<>0 reminder=x mod y y=reminder Loop Gcd a Form1 x End function 25和65的最大公约数是5 Sub- Form- click dim a as integer, b as integer ,C a=inputbox(a b=inputboX(B Print a&"和"&b&"的最大公约数是"&c End sub 运行输入25和65得到如图结果
Function过程(函数) 建立function过程 [ private ][ static ][ public ] function 过程名 [(参数表)] 语句块 [过程名=表达式] [exit function] [语句块] End function 例如:求最大公约数的函数过程: Function gcd (byval x as integer, byval y as integer) as integer do while y<>0 reminder=x mod y x=y y=reminder Loop Gcd=x End function Sub Form_click() dim a as integer, b as integer ,c a=inputbox(a) b=inputbox(B) C= gcd(val(a),VAL(b)) Print a & "和 " & b & "的最大公约数是" & c End sub 运行输入25和65得到如图结果
Function过程(函数 个调用 function过程作为 句 可以放在赋值语句中,也可以放在打印语句 中,也可以放在函数中作为参数,例如: 求123,564,1002,以及321的最大公约数 可以通过以下方法来实现: Sub form activate dim a, b, c,d,ab,cd a=123:b=564:C=1002:d=321 6. FormI x ab=gcd( 3 cd=gcd(, d) 124和587的最大公约数是1 print gcd(ab, co) End sub
调用function过程作为一个语句 可以放在赋值语句中,也可以放在打印语句 中,也可以放在函数中作为参数,例如: 求123,564,1002,以及321的最大公约数 可以通过以下方法来实现: Sub form_activate() dim a,b,c,d,ab,cd a=123:b=564:c=1002:d=321 ab=gcd(a,b) cd=gcd(c,d) print gcd(ab,cd) End sub Function过程(函数)
参数 ↑形参和实参 形参是在sub或 function过程定义中出现的参数表,实参 则是在调用过程中给定的参数表。例如: Function gcd(byval x as integer, byval y Sub recarea (rien as single, as integer) as integer rid as single do while y<>0 dim area as single reminder=x mod y area= ren * rid X=Y msgbox the area of this y=reminder rectangle is"& area LOop End sub Gcd=x Sub form click End function dim a, b Sub form-clickol a=inputbox(" input the dim a as integer, b as integer,c length”) a=inputbox (a) b=inputbox (input the b=inputbox (B) width C= gcd( call recarea(val(a),val(b)) Print a&"和"&b&"的最大公约数是"&c End sub End sub 上面绿色字符是形参,蓝色字符是实参,以及前而例子中的参数
形参和实参 形参是在sub或function过程定义中出现的参数表,实参 则是在调用过程中给定的参数表。例如: 参数 Function gcd (byval x as integer, byval y as integer) as integer do while y<>0 reminder=x mod y x=y y=reminder Loop Gcd=x End function Sub Form_click() dim a as integer, b as integer ,c a=inputbox(a) b=inputbox(B) C= gcd(val(a),VAL(b)) Print a & "和 " & b & "的最大公约数是" & c End sub Sub recarea(rlen as single, rwid as single ) dim area as single area=rlen *rwid msgbox “the area of this rectangle is” & area End sub Sub form_click() dim a,b a=inputbox (“input the length”) b=inputbox (“input the width”) call recarea(val(a),val(b)) End sub 上面绿色字符是形参,蓝色字符是实参,以及前面例子中的参数
一参数传递方式 按位置传递 实际参数和形式参数的次序必须相匹配,即位置必须一致 传送时,名称不要求一致,但是参数个数必须相同,位置也必须相同(主要是类型 形参各变量间用逗号隔开,变量可以是 字符串,数组名(带有左右括号) 实际参数可以是 常数、表达式、变量名、数组名(带有左右括号) ix: sub testsub(a as integer, array as single, recvar as rectype, c as string) ype rectype rand as string *12 serialnum as long End type Dim recv as rectype Call testsub(x, a, recv, dephone") 指名传递 就是把实参显式地指定给形参,用:=将形参和实参连接起来。例如: Sub adsum(first, second third) C=(first+second)*third print c End sub addsum first: =4 second: =6, third: =8 Adsum468与 adsum second:=6,frst:=4 third:=8中的任何依据等价 adsum third: =8 second: =6 first: =4
按位置传递 实际参数和形式参数的次序必须相匹配,即位置必须一致 传送时,名称不要求一致,但是参数个数必须相同,位置也必须相同(主要是类型) 形参各变量间用逗号隔开,变量可以是: 字符串,数组名(带有左右括号) 实际参数可以是: 常数、表达式、变量名、数组名(带有左右括号) 设:sub testsub(a as integer,array() as single,recvar as rectype,c as string) Type rectype rand as string*12 serialnum as long End type Dim recv as rectype Call testsub(x,a(),recv,”dephone”) 指名传递 就是把实参显式地指定给形参,用:=将形参和实参连接起来。例如: Sub addsum(first,second,third) c=(first+second)*third print c End sub Addsum 4,6,8 与 参数传递方式 addsum first:=4,second:=6,third:=8 addsum second:=6,first:=4,third:=8 中的任何依据等价 addsum third:=8,second:=6, first:=4
参数传递 参数按照两种方法传递(传地址和传值 传地址也叫做引用,默认情况下均为传地址:传值只传递实际参数,这种情况下,系统把要传递的变 临时单元中,然后该临时单元的地址被传递给过程,保证原 看下面例子 sub power (x as integer, byval y as integer X=×+100 y=y*6 print“×=“;X,"y=";y .函数使用方法 回 end sub Sub command2 click(一 80 dim a as integer, b the powers x=200 y=138 a=100:b=23 the command print the powers a=20 b=23 power a, b print“ the command: print“a=”;a,"b=";b 指名传递参数传递 End sub
参数按照两种方法传递(传地址和传值) 传地址也叫做引用,默认情况下均为传地址;传值只传递实际参数,这种情况下,系统把需要传递的变量 复制到一个临时单元中,然后该临时单元的地址被传递给过程,保证原实参地址中的值不发生改变。 看下面例子: sub power (x as integer, byval y as integer) x=x+100 y=y*6 print “x=“;x, ”y=”;y end sub Sub command2_click() dim a as integer, b a=100:b=23 print “the powers:” power a, b print “the command:” print “a=”;a, ” b=”;b End sub 参数传递