null第七章 过程
第七章 过程
7.1过程的概念及其分类7.1过程的概念及其分类过程的概念 :
过程是用来执行一个特定任务的一段程序代码
这一程序段按一定的格式独立出来并被赋予相应的名字
将一些常用的功能编写成过程,可供多个不同的程序过程多次调用,从而可以减少重复编写代码的工作量,实现代码重用,使程序简练、便于调试和维护。
VB的程序结构VB的程序结构7.2函数过程的定义和调用7.2函数过程的定义和调用函数过程的定义
[Static][Private][Public] Function 函数过程名([参数列表]) [As 类型]
局部变量或常数定义
语句块
[函数名 = 返回值(函数值)]
End Function
Public Function Circle_area (ByVal r As single) As single
CONST Pi=3.14159 '定义一圆周率常量Pi
Circle_area = Pi*r*r '把结果赋给函数名
End Function
null函数过程的定义
[Static][Private][Public] Function 函数过程名([参数列表]) [As 类型]
局部变量或常数定义
语句块
[函数名 = 返回值(函数值)]
End Function
Private Function jiecheng (ByVal x As integer) As long
dim jc as long, i as integer
jc=1
for i=1 to x
jc=jc*i
next
Jiecheng=jc
End Function
7.2.3 函数过程的调用7.2.3 函数过程的调用Private Sub Form_Click()
Dim x As Integer, mj as single
x = Val(InputBox("请输入半径x"))
mj = circle_area(x) ‘此语句是函数过程的调用
print mj
End Sub
Public Function Circle_area (ByVal r As single) As single
CONST Pi=3.14159 '定义一圆周率常量Pi
Circle_area = Pi*r*r '把结果赋给函数名
End Function7.2.3 函数过程的调用7.2.3 函数过程的调用Private Sub Form_Click()
Dim n As Integer, m As Integer
n = Val(InputBox("请输入n"))
m= Val(InputBox("请输入m"))
Print jiecheng(n) / (jiecheng(m) * jiecheng(n - m))
End Sub
Private Function jiecheng(ByVal x As Integer) As Long
Dim jc As Long, i As Integer
jc = 1
For i = 1 To x
jc = jc * i
Next
jiecheng = jc
End FunctionExit Function 语句Exit Function 语句用来退出函数过程
一般配合分支结构(if 或者select case)使用Exit Function 语句Exit Function 语句求100至999之间的最大的三个素数。其中判断一个数是否为素数的部分用函数过程实现。
设计函数过程的思路:
函数名 isprime( )
函数形参表 isprime(x as integer)
函数返回值 isprime(x as integer)as booleannullPrivate Sub Form_Click()
Dim i As Integer, count As Integer
count = 0
For i = 999 To 100 Step -1
If isprime(i) Then
Print i;
count = count + 1
If count = 3 Then Exit For
End If
Next
End Sub
Public Function isprime(ByVal x As Integer) As Boolean
Dim j As Integer
For j = 2 To x - 1
If x Mod j = 0 Then
isprime = False
Exit Function
End If
Next
isprime = True
End Function7.3 SUB过程(子程序)的定义和调用7.3 SUB过程(子程序)的定义和调用7.3.1 子程序过程的定义
[Static] [Public] [Private] Sub 子过程名[(参数列表)]
[局部变量或常数定义]
[语句序列]
[Exit Sub]
End Sub
下面就是一个简单的子程序过程:
Private Sub Subexp( )
Print "This is a Sub procedure"
End sub子程序过程的定义子程序过程的定义[Static] [Public] [Private] Sub 子过程名[(参数列表)]
[局部变量或常数定义]
[语句序列]
[Exit Sub]
End Sub
Private Sub max(ByVal x As Single, ByVal y As Single)
If x > y Then
Print x
Else
Print y
End If
End Sub7.3.3 子程序过程的调用7.3.3 子程序过程的调用1、使用call 语句:
格式:call 子程序过程名[(实在参数)]
2、把子程序过程名作为一个语句来使用:
格式:子程序过程名 [实在参数]
注意:此种方式里,没有关键字 call ,实在参数外没有小括号。子程序过程的调用子程序过程的调用Private Sub max(ByVal x As Single, ByVal y As Single)
If x > y Then
Print x
Else
Print y
End If
End Sub
Private Sub Form_Click()
Dim a As single, b As single
a = Val(InputBox("请输入a"))
b = Val(InputBox("请输入b"))
Call max(a, b) ‘第一种方法
max a,b ‘第二种方法
End Sub7.4参数传递7.4参数传递7.4.1 形参和实参
形参是定义Sub、Function过程时参数列表中的变量;
实参是指在调用Sub、Function过程时使用的常数、变量、表达式等 参数传递的方式
参数传递的方式
参数传递就是“实参”和“形参”的结合
参数传递分为两种:
传值(byval……)
传地址(byref ……)或者(……)
传地址还是传值是由形参表中的关键字决定的传值传值Private Sub swap1(ByVal x%, ByVal y%)
Dim t%
t = x: x = y: y = t
End Sub
Private Sub swap2(ByRef x%, ByRef y%)
Dim t%
t = x: x = y: y = t
End Sub
Private Sub Form_Click()
Dim a As Integer, b As Integer
a = Val(InputBox("请输入a"))
b = Val(InputBox("请输入b"))
Print “调用前a, b的值是:", a, b
Call swap1(a, b)
Print “调用swap1后的a, b的值是:", a, b
Call swap2(a, b)
Print “调用swap2后的a, b的值是:", a, b
End Sub传地址传值和传地址传值和传地址传值
把实参的值复制给形参,对形参的的操作不会影响到实参
传地址
把实参的地址传递给形参,即子过程的形参与父过程的相应实参共用了相同的内存单元。对形参的操作等价于实参的操作7.4.4数组参数的传递7.4.4数组参数的传递⑴在过程定义时,形参列表中的数组名后要有一对空的圆括号(若是二维数组可在圆括号中加一个“,”号),以免与其它变量混淆。例如,假定定义了如下过程:
Sub S(a() as Integer , b as single)
……
End Sub
该过程有两个形参,一个是数组a(后有一对空的圆括号),而另一个是单精度变量b。
⑵当用数组作为过程的参数时,一定要用“传地址”方式。
⑶在过程调用时,实际参数表中的数组可以只用数组名表示,省略圆括号也可以不省。所以,可以用下面的语句调用上述过程:
call s(p(),x) 或 Call s(p,x)例7.6:用数组作参数,求一维数组中的所有负元素之和。
例7.6:用数组作参数,求一维数组中的所有负元素之和。
Function sum%(b%( )) Dim i% For i = LBound(b) To UBound(b)
If b(i)< 0 Then sum = sum + b(i) End If Next i
End Function
Private Sub Form_Click() Dim a%(10),s%,i% For i = 1 To 10 A(i)= Int(Rnd * 100)- 50 Print a(i); Next i Print s = sum(a( )) Print "数组中的负元素之和为:";s
End Sub7.5变量与过程的作用域7.5变量与过程的作用域变量、过程可被访问的范围。
主要取决于其所在位置及声明的方式 7.5.1 变量的作用域7.5.1 变量的作用域根据作用域的大小可以把变量分成三类:
局部变量:在过程内用dim或static声明的变量,只能在本过程中使用。
窗体/模块级变量:在“通用声明”段中用Dim语句或用Private语句声明的变量,可被本窗体/模块(它所在的窗体)的任何过程访问。
全局变量:在“通用声明”段中用Public语句声明的变量,可被本应用程序的任何过程访问。 变量的声明和作用域变量的声明和作用域局部变量局部变量Private Sub Command1_Click()
Dim x%
x = x + 10
Print x
End Sub
Private Sub Command2_Click()
Dim x%
Print x
End Sub局部变量和窗体模块级变量局部变量和窗体模块级变量Dim temp As Integer
Private Sub Command1_Click()
temp = 20
Print temp
End Sub
Private Sub Command2_Click()
Dim temp
temp = 1
Print temp
End Sub局部变量和全局变量局部变量和全局变量public temp As Integer
Private Sub Command1_Click()
temp = 20
Print temp
End Sub
Private Sub Command2_Click()
Dim temp
temp = 1
Print temp
print form1.temp
End Sub局部变量局部变量Private Sub Command1_Click()
dim n As Integer
n = n + 1
Print "command1被按下了" & n & "次"
End Sub
7.5.3静态变量
。
7.5.3静态变量
。静态变量是指:
用Static 声明的变量
或过程名前加关键字Static的过程内用Dim声明的局部变量
Private Sub Command1_Click()
Static x%
x = x + 10
Print x
End Substatic Sub Command1_Click()
dim x%
x = x + 10
Print x
End Sub静态变量静态变量Private Sub Command1_Click()
static n As Integer
n = n + 1
Print "command1被按下了" & n & "次"
End Sub
还有其它
办法么?局部变量和静态变量局部变量和静态变量局部变量:
调用过程时给其分配存贮空间,(数值型变量置0,字符串型变量置成空串)。
随着过程的调用完毕,存贮空间被释放每次调用都被初始化
静态变量
在编译期间分配空间,直到最后整个程序运行完毕,才释放空间,所以每次调用过程时保留原来的值。例7.10 静态变量的应用 例7.10 静态变量的应用 Private Sub Form_Click()
Dim i% ,k%
For i = 1 To 5
k = f(i)
Print k;
Next i
End Sub
Private Function f(Byval n As Integer) As Integer
Static j As Integer
j = j + n
f = j
End Function7.5.4 变量使用原则7.5.4 变量使用原则使用优先级:
局部变量>窗体模块级变量>全局变量7.5.2 过程的作用域7.5.2 过程的作用域按过程的作用域的大小可以把过程分成两类:窗体/模块级过程和全局级过程。
窗体/模块级:加Private关键字的过程,只能被定义该过程的窗体模块或
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
模块中的过程调用。
全局级:加Public关键字(或缺省)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用 顺序查找顺序查找哈,找到了!例7.17 顺序查找例7.17 顺序查找Option Base 1
Private Sub Command1_Click()
Dim a(), X%, K%
a = Array(23, 54, 65, 34, 45, 87, 97, 61)
X = InputBox("请输入一关键字:")
K = SEARCH(a, X)
If K > 0 Then '找到,则输出其位置及关键字
Print K, a(K)
Else
Print "NOT FOUND!“ '没找到,则输出 NOT FOUND!
End If
End Sub
Public Function SEARCH ( a(), ByVal KEY%)
SEARCH = -1 '假定数组A中无所查关键字
For i = LBound(a) To UBound(a) '从第一个数组元素到最后一个进行顺序查找
If a(i) = KEY Then
SEARCH = i
Exit Function
End If
Next
End Function二分法查找(有序数组)二分法查找(有序数组)第1次第2次第3次二分法查找(有序数组)二分法查找(有序数组)第1次第2次第3次第4次二分法查找(折半查找)二分法查找(折半查找)Option Base 1
Private Sub Command1_Click()
Dim A(), KEY%
A = Array(21, 43, 56, 65, 79, 90, 92, 97, 98, 99)
KEY = InputBox("请输入待查关键字:")
k = SEARCH(A, KEY)
If k > 0 Then
Print "关键字"; KEY; "所在位置为:"; k
Else
Print "关键字"; KEY; "NOT FOUND!"
End If
End SubnullFunction SEARCH(A(), X%) As Integer
Rem 在数组a中查找关键字x,若查到则返回其位置,否则返回-1
Dim LOW%, HIGH%, MID%
SEARCH = -1
LOW = LBound(A) : HIGH = UBound(A) : MID = (LOW + HIGH) \2
Do While LOW <= HIGH
If A(MID) = X Then '查到,返回其位置并结束
SEARCH = MID
Exit Do
ElseIf A(MID) > X Then '若待查的关键字在mid的左边,移动指针high
HIGH = MID - 1
Else '若待查的关键字在mid的右边,移动指针low
LOW = MID + 1
End If
MID = (LOW + HIGH) \ 2 '再次求出中间位置重复上述过程
Loop
End Function例7.16 将一个十进制整数m转换成 r (2-16)进制数字。例7.16 将一个十进制整数m转换成 r (2-16)进制数字。将数m转换为r进制将数m转换为r进制Function TranDec$(ByVal m%, ByVal r%)
Dim StrDtoR$
Dim iB%, mr%
StrDtoR = "“
Do While m <> 0
mr = m Mod r '求出M 除R的余数
m = m \ r '修正M的值
If mr >= 10 Then
StrDtoR = Chr(mr - 10 + 65) & StrDtoR
Else
StrDtoR = mr & StrDtoR
End If
Loop
TranDec = StrDtoR
End Function
null
Private Sub Command1_click()
Dim mm%, rr%, k%
Label3.Caption = "转化成" & Trim(Text2) & "进制数为:"
mm = Val(Text1.Text)
rr = Val(Text2.Text)
If rr < 2 Or rr > 16 Then
k = MsgBox("输入的R进制数超出范围", vbRetryCancel)
If k = vbRetry Then
Text2.Text = ""
Text2.SetFocus
Else
End
End If
End If
Label3.Caption = "转换成" & rr & "进制数"
Text3.Text = TranDec(mm, rr)
End Sub