《2019年监理工程师考试建设工程合同管理试卷》由会员分享,可在线阅读,更多相关《2019年监理工程师考试建设工程合同管理试卷(44页珍藏版)》请在金锄头文库上搜索。
1、VB应用程序.VBP窗体模块.Frm类模块.Cls标准模块.Bas函数过程Sub过程事件过程函数过程Sub过程第一页4.2 Visual Basic4.2 Visual Basic的的过过程程第二页1. 引例4-2已知多边形的各条边的长度,要计算多边形的面积。计算多边形面积,可将多边形分解成若干个三角形。计算三角形面积的公式如下: xyzS=S1+S2+S3传统方法:下面的公式写三次第三页4.2.1 函数过程的创建和调用除了系统提供的内部函数过程和事件过程外,用户可自定义过程:l 以Sub保留字开始的为子过程(通用过程);l 以Function保留字开始的为函数过程。第四页1函数过程的创建 函
2、数过程形式: Function 函数过程名(参数列表(形参) As 类型 局部变量或常数定义 语句块 函数名 = 返回值 函数过程体 Exit Function 语句块 函数名 = 返回值 End Function 自定义函数过程有两种方法: (1)利用“工具”菜单下的“添加过程”命令定义,生成一个函数的框架。 (2)利用代码窗口直接定义。第五页2.函数过程的调用 函数过程调用同标准函数调用,形式:函数过程名(参数列表) 参数列表:称为实参,它必须与形参个数相同,位置与类型一一对应。可以是同类型的常量、变量、表达式。Private Sub Command1_Click()A=val ( Inp
3、utbaox(“”) )End sub第六页定义一个函数:多次调用xyz定义函数过程area:Public Function area(x!, y!, z!) As Single Dim c! c = 1 / 2 * (x + y + z) area area = Sqr(c * (c - x) * (c - y) * (c - z)End Function调用函数过程:Sub command1_click() 输入若干个三角形边长 S=area(a,b,c)+area(c,d,e) S=S+area(e,f,g) Print SEnd Sub第七页例4-3 编写定义计算任意整数a阶乘的函数过
4、程fac(n).参考代码:Public Function fac(a as Integer) as Longdim p as Long, i as Integerp=1 累乘初值为1For i=1 to a p=p * iNext ifac=p 程序中对函数名赋值End Function调用:a=fac(10)第八页4.2.2 子 过 程的创建和调用第九页2.子过程创建 Sub 子过程名(参数列表) 局部变量或常数定义 语句 Exit Sub 语句 End Sub3.子过程的调用 子过程名 参数列表 或 Call 子过程名(参数列表)第十页 1.引例 编写一个两个数交换的过程供多次调用。Swa
5、p (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第十一页例4-1,编写一个能找出两个数中大数的子过程,然后在应用程序中调用它。第十二页4.2.3 参数传递 指主调过程的实参传递给被调过程的形参。形参和实参对应关系:1)对应变量名不必相同,但变量个数相等;2)各实参的书写顺序必须和对应的形参顺序一致,且类型相符
6、。1. 传址与传值 传址: 形参得到的是实参的地址,当形参值的改变同时也改变实参的值。 传值:ByVal 形参得到的是实参的值,形参值的改变不会影响实参的值。第十三页4.2.3 参数传递。例4-5 两个变量的交换。Sub Swap1(ByVal x%, ByVal y%) t% = x: x = y: y = tEnd SubPrivate 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=; bEnd
7、SubSub Swap2(x%, y%) t% = x: x = y: y = tEnd Sub第十四页4.3 变量、过程的作用域作用域:变量、过程随所处的位置不同,可被访问的范围。 1.过程的作用域(了解) 窗体/模块级:加Private关键字的过程,只能被定义的窗体或模块中的过程调用。 全局级:加Public关键字(缺省)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。第十五页2. 变量的作用域 局部变量:在过程内用声明的变量,只能在本过程中使用。 窗体/模块级变量:在“通用声明”段中用Dim语句或用Private语句 声明的变量,可被本窗体/模块的任何过程访问。 全局变量:在
8、“通用声明”段中用Public语句声明的变量,可被本应用程序的任何过程或函数访问。第十六页例如在下面一个标准模块文件中不同级的变量声明:option explicitPublic Pa As integer 全局变量Private Mb As string *10 窗体/模块级变量Sub F1( ) Dim Fa As integer 局部变量可以访问Pa,Mb,不能访问FbEnd SubSub F2( ) Dim Fb As Single 局部变量可以访问Pa,Mb,不能访问FaEnd Sub第十七页第十八页Sub f1(x) x=f2(xx)*3End SubSub Command1_Cl
9、ick() Call f1(y)End SubFunction f2(x) f2=f3(x)+3End SubFunction f3(x) f3=x*xEnd SubSub f1(x) Call f1(y)End Sub过程的直接调用Sub Command1_Click() Call f1(y)End Sub过程的递归调用4.4 递归第十九页1.递归的概念 用自身的结构来描述自身就称为“递归”。例对阶乘的定义: 2. 递归过程 过程在自身定义的内部调用自己。 例4-8 编fac(n)=n! 的递归函数 Function fac(n As Integer) As Integer If n = 1
10、 Then fac = 1 Elsefac = n * fac(n - 1) End If End FunctionSub Command1_Click() Print “fac(4)=”;fac(4)End Sub结果: fac(4)=24第二十页递推回归fac(2)=2*fac(1)fac(1)=1fac(4)=4*6fac(3)=3*2fac(2)=2*1fac(3)=3*fac(2)fac(4)=4*fac(3)问题: 递归方程:写出递归函数第二十一页思考若上述fac函数中少了 : If n = 1 Then fac = 1 即仅有语句:fac = n * fac(n - 1) 程序运
11、行将造成何结果?由此可见构成递归的结构如下: 1、递归结束条件及结束时的值;2、自身的调用,并且递归向终止条件发展。第二十二页第二十三页若在不同级声明相同的变量名如: Public Temp As integer 全局变量 Sub Form_Load() Dim Temp As Integer 局部变量 Temp=10 访问局部变量 Form1.Temp=20 访问全局变量必须加窗体名 Print Form1.Temp, Temp 显示 20 10 End Sub第二十四页第二十五页第二十六页2. 数组参数的传递 当参数是数组通过传址方式进行传递。注意: 在实参和形参中写数组名,忽略维数的定义
12、,但圆括号不能省。 被调过程可通过Lbound和Ubound函数确定实参数组的下、上界。Lbound和Ubound函数的形式如下:L|Ubound(数组名)第二十七页例 6.7 编一函数tim,求任意一维数组中各元素之积。 调用tim,求 和 Function tim(a() As Integer) Dim t#, i% t = 1 For i = Lbound(a) To Ubound(a)t = t * a(i) Next i tim = tEnd Function调用:Sub Command1_Click() Dim a%(1 To 5),b%(3 To 8) t1# = tim(a()
13、 t2 #= tim(b() Print t1, t2 End Sub第二十八页4.子过程与函数过程区别:(1)函数过程名有值,有类型,在函数体内至少赋值一次; 子过程名无值,无类型,在子过程体内不能对子过程名赋值;(2)调用时,子过程调用是一句独立的语句。 函数过程不能作为单独的语句加以调用,必须参与表达式运算。(3)一般当过程有一个返回值,使用函数过程较直观; 反之若过程无返回值,或有多个返回值,使用子过程较直观。第二十九页4.4 用户自定义类型自定义数据类型一组不同类型变量的集合。相当于C语言中的结构(Struct)类型;当遇到简单数据类型不能表示问题的时候,使用复合数据类型来表示 由若
14、干基本数据类型组成。第三十页1.自定义类型的定义 形式如下: Type 自定义类型名元素名(下标) As 类型名 元素名(下标) As 类型名 End Type 例如,以下定义了一个有关学生信息的自定义类型 Type StudType No As Integer 学号 Name As String * 20 姓名 Sex As String * 1 性别 Mark(1 To 4) As Single 4门课程成绩 Total As Single 总分 End Type元素名:表示自定义类型中的一个成员下标:表示是数组类型名:为标准类型第三十一页2自定义类型变量的声明和使用(1) 声明形式: D
15、im 变量名 As 自定义类型名 例 Dim Student As StudType (2) 引用 形式:变量名.元素名 例 表示Student变量中的姓名,第4门课程的成绩,则表示如下:Student.Name,Student.Mark(4)3自定义类型数组的应用 例4-12 利用自定义类型数组,编写一个输入、显示程序。第三十二页例 打印分形图 二叉树第三十三页加密和解密简单加密的思想是: 将每个字母C加一序数K,式子 c=chr(Asc(c)+k), 例如序数k为5,这时 “A”“F”,“a”“f”,“B”“G” 当加序数后的字母超过“Z”或“z”则 c=chr(Asc(c)-k)。 解密
16、为加密的逆过程。常用算法第三十四页 1.数制转换 例 将一个十进制整数m转换成 r (216)进制字符串。 方法:将m不断除 r 取余数,直到商为零,以反序得到结果。4.5常用算法 (三)第三十五页3.查找 (1)顺序查找 例。 顺序查找根据查找的关键值与数组中的元素逐一比较(数组可无序)Public Sub Search(a() As Variant, ByVal key As Variant, index%) Dim i% For i = LBound(a) To UBound(a) If key = a(i) Then 找到,元素的下标在index中,结束查找 index = i Exit Sub End If Next i index = -1 找不到, index形参的值为-1End Sub平均查找次数 n/2第三十六页Keya(mid) low=mid+1 查找区域缩小一半,继续直到找到或查找区域中无元素.本例用递归实现6.16 Sub birsearch(a(), low%, high%, key , index%)(2)二分法查找要查找的数组必须有序。 思想:要查找的关