编辑: 紫甘兰 | 2019-07-03 |
第六章 过程 Visual Basic 程序设计 引例计算100~300之间所有能被3整除的数之和 计算500~800之间所有能被5整除的数之和 已知五边形的各条边的长度,计算其面积 计算多边形面积,可将多边形分解成若干个三角形 例 多边形的面积=S1+S2+S3 多边形的面积=Triarea(a,b,c)+Triarea(c,d,e)+Triarea(e,f,g) 假设过程Triarea(x,y,z)可计算三角形的面积 [Private|Public][Static] Function 函数过程名 ([形参表]) [As 类型] …… 函数过程名=表达式 [Exit Function] …… End Function Function过程的定义 Function Triarea(x!, y!, z!) As Single c = (x+y+z)/2 Triarea = sqr(c*(c-x)*(c-y)*(c-z)) End Function Function过程的建立 Function过程可以在标准模块或窗体的通用层中建立 利用 工具 菜单下的 添加过程 命令定义 在代码窗口直接定义 Function函数过程的举例 【例】编写函数过程计算n! 【例】组合数是求如Cnm的数,组合数的大小为n!/(m!*(n-m)!) Function函数过程的举例 【例】编写函数过程计算n! 【例】组合数是求如Cnm的数,组合数的大小为n!/(m!*(n-m)!) 函数的特点 函数只能传回一个数 案例 编写实现一元二次方程求解的通用过程.
思考:一元二次方程可能有两个不同的实根, 能否用Function过程实现? 一般而言,若需多个结果, 通常使用Sub过程 Sub过程 Sub过程的定义 [Private|Public][Static] Sub 子程序过程名 [(形参表)] …… [Exit Sub] …… End Sub Sub 过程 Sub 过程名(参数列表) … [Exit Sub] End Sub 过程调用 Call 子过程名 [(实参)] 子过程名 [实参] Call test(n, 10) test n,
10 Sub过程的举例 计算一元二次方程的两个实根 Sub quad( ) End Sub Sub Command1_Click() Call quad(a, b, c, x1, x2) root1 = x1: root2 = x2 End Sub x1 = (-b + Sqr(b * b -
4 * a * c)) / (2 * a) x2 = (-b - Sqr(b * b -
4 * a * c)) / (2 * a) a!, b!, c! , x1!, x2! sub子过程的举例 【例】编写子过程计算n! 【例】组合数是求如Cnm的数,组合数的大小为n!/(m!*(n-m)!) 子过程与函数过程区别 (1)函数过程名有值,有类型,在函数体内至少赋值一次 子过程名无值,无类型,在子过程体内不能对子过程名赋值 (2)调用时,子过程调用是一句独立的语句 函数过程不能作为单独的语句加以调用,必须参与表达式运算 (3)一般当过程有一个函数值,使用函数过程较直观 反之若过程无返回值,或有多个返回值,使用子过程较直观 参数传递 参数按位置传送有两种方式: 传地址[ByRef]( 也称 引用 ) 形参得到的是实参的地址,当形参值的改变同时也改变实参的值 是默认的参数传递方法 传值ByVal 形参得到的是实参的值,形参值的改变不会影响实参的值 传地址:实参为变量、数组、数组元素及记录时,或形参用ByRef声明 传值:实参为常量、表达式、或形参用ByVal声明
4 6 a = 1: b = 2: c = 3: d =
4 Call test1(a, b, c, d) Print a;
b;
c;
d … Private Sub test1(b%, c%, d%, e%) e=b+c+d End Sub 内存单元 传地址ByRef 传地址调用:形参改变,实参发生对应变化 传地址调用:形参获得实参地址,共享存储单元 要求:行参和实参必须类型相同 Private Sub f(n%) n =
100 End Sub Private Sub Form_Click() Dim m% m =
10 Print 调用过程前m = ;
m Call f(m) Print 调用过程后m = ;
m End Sub 传地址调用 传地址ByRef a = 1: b = 2: c = 3: d =
4 Call test2(a, b, c, d) Print a;
b;
c;
d … Private Sub test2( b%, c%, d%, ByVal e%) e=b+c+d End Sub