配色: 字号:
《Visual Basic程序设计(第4版)》第8章 过 程
2023-05-25 | 阅:  转:  |  分享 
  
单元八 过 程 在VB程序设计中,除进行界面设计和算法设计外,主要工作是编写程序代码,而编写代码时根据应用的复杂程度,往往要将应
用按功能及其他目的划分为若干个模块,而对每个模块按照情况还可以继续细分为子模块,通过VB提供的自定义过程将模块定义为一个个过程,供
事件过程多次调用。 在前面的各章节中,我们已多次使用了事件过程,这样的过程构成了VB应用程序的主体。而用户自定义的过程(也称
为通用过程),可以单独建立,供事件过程或其他过程调用。 在VB中根据过程是否有返回值,可把通用过程分为两类,即子过程和函数过
程。 单元八 过 程事 件 过 程 1子 过 程 2函 数 过 程 3过程间参数的传递 4过程的嵌套与递归 5常 用 算
法 实 例 68.1 事件过程1. 事件过程的运行机制 事件过程由VB自行声明,用户不能增加或删除。当用户对某个对象发出一
个动作时,Windows会通知VB产生了一个事件,VB会自动地调用与该事件相关的事件过程。即当对象对一个事件的发生做出认定时,VB
便自动用相应于事件的名字调用该事件的过程。由于名字在对象和代码之间建立了联系,所以说事件过程是依附于窗体和控件上的。2. 事件过程
的语法格式 控件事件过程的语法格式为:Private Sub〈控件名〉_〈事件名〉([ 形参表 ]) [ 语句组 ]End
Sub 窗体事件过程的语法为:Private Sub Form_〈事件名〉([ 形参表 ]) [ 语句组 ]End Su
b8.2 子过程 当有几个不同的事件过程需要执行相同的操作时,为了简化程序,可以将公共语句放入分离开的子过程(通用过程)中,并
由事件过程来调用它。这样不必重复编写代码,维护程序也较容易。 子过程不与任何特定的事件相联系,只能由别的过程来调用,它可以存储在
窗体或标准模块中。8.2.1 子过程的程序设计实例分别计算阶乘5!, 6!, 8!,以及它们的和5! + 6! + 8!。
Sub fact(m As Integer, total As Long) Dim i As Integer
total = 1 For i = 1 To m total = total i Next iEnd SubPriv
ate Sub Command1_Click(Index As Integer) Dim a As Integer, b As
Integer, c As Integer, s As Long, tot As Long n = Index Select
Case n Case 0 a = 5 Call fact(a, tot) Label1.Ca
ption = a & "! = " & tot Case 1 a = 6 Call fact(a, t
ot) Label1.Caption = a & "! = " & tot Case 2 a = 8
Call fact(a, tot) Label1.Caption = a & "! = " & tot C
ase 3 a = 5: b = 6: c = 8 Call fact(a, tot) s = to
t Call fact(b, tot) s = s + tot Call fact(c, tot)
s = s + tot Label1.Caption = a & "! + " & b & "! + " &
c & "! = " & s End SelectEnd Sub8.2.2 子过程程序设计的相关知识1. 建立子过程的两种方法
(1) 使用“添加过程”对话框。 打开代码编辑窗口,单击“工具”菜单→“添加过程”命令,打开“添加过程”对话框。在“
名称”文本框中输入过程名“fact”,从“类型”组中选中“子程序”项,从“范围”组中选中“公有的”项,单击“确定”按钮。 (
2) 在“代码”编辑窗口中输入。 [ Private | Public ][ Static ] Sub〈过程名〉( [ 形参表
] ) [ 语句组 ] [ Exit Sub ] [ 语句组 ]End Sub2. 调用子过程的两种方法 (1) 使用Cal
l语句Call〈过程名〉( [ 实参表 ] ) (2) 直接使用过程名〈过程名〉[〈实参表〉] 例如,下面两个语句都调用fact子
过程:Call fact(5)fact 58.3 函数过程 函数是过程的另一种形式,当过程的执行要返回一个值时,使用函数过程
更方便。VB中包含了许多内部函数,如Int、Sqr等。用户在编写程序时,只需写出一个函数名并给定参数就能得出函数值。但是,如果在程
序中需要多次用到某一公式或要处理某一函数关系,而又没有现成的内部函数可用时,可以自己编写Function(函数)过程。8.3.1
函数过程的程序设计实例利用函数过程,求1!+2!+3!+4!+5!+6! Function fact(x As Integer)
As Long Dim p As Long, i As Integer p = 1 For i = 1 To x p
= p i Next i fact = p End FunctionPrivate Sub Command1_
Click() Dim sum As Long, i As Integer For i = 1 To 6
sum = sum + fact(i) Next i Label2.Caption = sum En
d Sub8.3.2 函数过程程序设计的相关知识1. 定义函数过程的两种方法 (1) 使用“添加过程”对话框。 打开
“添加过程”对话框,在“类型”中选择“函数”,单击“确定”按钮。 (2) 在“代码”编辑窗口输入。[ Private | P
ublic ][ Static ] Function〈函数名〉( [ 形参表 ] ) [ As 类型 ] [ 语句组 ] [〈
函数名〉=〈表达式〉] [ Exit Function ] [ 语句组 ] [〈函数名〉=〈表达式〉]End Functio
n2. 调用函数过程的两种方法 (1) 直接调用 在表达式中直接写上它的名字。例如,已编有计算圆面积的函数过程cir(
),调用方法为: MsgBox "圆面积为:" & cir(10) (2) 用Call语句调用利用下面的代码都调用
同一个函数过程: Call cir (10) area 103. 调用无参函数的方法 函数可以没有参数,在调用无参函
数时不发生虚实结合。调用无参函数得到一个固定的值,如下述无参函数:Function a a = "ABCD"End Functi
on 可如下调用: Print a8.4 过程间参数的传递8.4.1 参数的基本概念1. 参数的分类 在VB中根
据参数所在的过程,将参数分为形式参数和实际参数。 形式参数是在子过程和函数过程的定义中出现的变量名;实际参数则是在调用子过程
和函数过程时,传送给子过程和函数过程的常数、变量、表达式或数组。 在VB中,通常把形式参数叫做“形参”,把实际参数叫做“实参
”。2. 形参表形参表中的各个变量之间用逗号分隔,表中的变量可以是: (1) 后面跟有左、右圆括号的数组名。 (2)
除定长字符串之外的合法变量名。3. 实参表 实参表中的各项用逗号隔开,实参可以是: (1) 常量; (2) 表达式;
(3) 合法的变量名; (4) 后面跟有左、右括号的数组名。4. 形参与实参的对应关系
实参调用过程: Call ts( 50 , avrg() ,
"hello" , a , b )
↓ ↓ ↓ ↓ ↓定义过程: Sub ts(
n As Integer, a() As Single, b As rectype, c As String, d As Sin
gle ) 形参 8.4.2 传址与传
值1. 传址 (1) 传址就是让过程根据变量的内存地址去访问实际变量的内容,即形参与实参使用相同的内存地址单元,这样通过子过程
就可以改变变量本身的值。 (2) 在传址调用时,实际参数必须是变量,常量或表达式无法传址。 (3) 系统缺省按地址传递
参数。Sub try(x As Integer, y As Integer) x = x + 2 y =
y + 3 Print "x="; x, "y="; y End SubPrivate Sub Fo
rm_Click() Dim a As Integer, b As Integer a = 5 b = 6
try a , b Print "a="; a, "b="; b End Sub2.
传值 (1) 传值就是通过值传送实际参数,即传送实参的值而不是传送它的地址。 (2) 当要求变量按值传送时,可以用下面的方法
: ① 把变量变成一个表达式。把变量转换成表达式的最简单的方法就是把它放在括号内。例如把变量用括号括起来,把它变为一个表达式
,如“(a)”。 ② 定义过程时用ByVal关键字指出参数是按值来传递的,例如:Sub PostAc( ByVal x As
Integer ) x = x + 2End SubSub try(ByVal x As Integer, ByVal y A
s Integer) x = x + 2 y = y + 3
Print "x="; x, "y="; y End SubPrivate Sub
Form_Click() Dim a As Integer, b As Integer a = 5
b = 6 try a, b Pri
nt "a="; a, "b="; b End Sub8.5 过程的嵌套与递归8.5.1 过程的嵌套调用
主程序可以调用子过程,在子过程中还可以调用另外的子过程,这种程序结构称为过程的嵌套。输入参数n,m,求组合数的值。Privat
e Function fact(x) p = 1 For i = 1 To x p = p i Next i f
act = p End FunctionPrivate Function comb(n, m) comb = fac
t(n) / (fact(m) fact(n – m)) End FunctionPrivate Sub Command1
_Click() m = Val(Text1.Text) n = Val(Text2.Text) If m > n Then
MsgBox "输入数据不正确!", 0, "请检查!" Exit Sub End If
Label2.Caption = "组合数是:" & comb(n, m)End Sub 8.5.2 过程的递归利用递归调
用计算n!,。Private Function fact(n) As Double If n > 0 Then fact
= n fact(n - 1) Else fact = 1 End IfEnd FunctionPrivate Su
b Text1_KeyPress(KeyAscii As Integer) Dim n As Integer, m As Dou
ble If KeyAscii = 13 Then n = Val(Text1.Text0) If n < 0 Or
n > 20 Then MsgBox ("非法数据!"): Exit Sub m = fact(n) Text2.T
ext = Format(m, "!@@@@@@@@@@") Text1.SetFocus End IfEnd Sub8.
6 常用算法实例8.6.1 将常用公式设计为子过程 编写一个计算矩形面积的Sub过程,然后调用该过程计算矩形面积。Sub
recarea(rlen, rwid) Dim area area = rlen rwid MsgBox
"矩形的面积是:" & area End SubPrivate Sub Form_click() Dim a, b a
= InputBox("请输入矩形面积的长度:") b = InputBox("请输入矩形面积的宽度:") recarea
a, b End Sub8.6.2 利用过程函数输出特定的图形Private Function stri(n As
Integer, f As String) p = "" For i = 1 To n p = p & " " &
f Next stri = p End FunctionPrivate Sub Form_Click() Dim f As
String 1 f = InputBox("显示的字符:", "请输入", "$") If f = "" The
n f = "$" Cls Print For n = 1 To 7 Print Tab(2 n + 2);
Print stri(15 – 2 n, f); Print Spc(8); Print
stri(2 n – 1, f); Print NextEnd Sub8.6.3 递归问题 有5个人
坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁。问第2个
人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人有多大岁数。Private Function age(n As
Integer) As Integer If n = 1 Then age = 10 Else age
= age(n – 1) + 2 End IfEnd FunctionPrivate Sub Form_Load() La
bel2.Caption = " 答案:第五个人的岁数是" & age(5)End Sub8.6.4 加密、解密问题 实现英
语单词或短语的加密∕解密操作。加密∕解密的基本原则是:把英语单词或短语中每个字符的ASCII码加上2,使其变为另外一个字符。例如“
ABCDE”,每个字符的ASCII码加2,变为“CEDFG”,从而对原来的单词或短语“加密”。Function en(inp As
String)Dim i As Integer Dim sout As String, scurrent As String,
snew As String i = Len(inp) For x = 1 To i scurrent = Mid$(
inp, x, 1) snew = Chr$(Asc(scurrent) + 2) sout = sout & s
new Next x en = sout End FunctionFunction de(inp
As String) Dim i As Integer Dim sout As String, scurrent As Str
ing, snew As String i = Len(inp) For x = 1 To i scurrent = M
id$(inp, x, 1) snew = Chr$(Asc(scurrent) – 2) sout =
sout & snew Next x de = soutEnd FunctionDim sph As StringPrivat
e Sub Command1_Click() Text1.Text = "" Text1.SetFocus
End SubPrivate Sub Command2_Click() Dim sen As String sen =
en(Text1.Text) Label1.Caption = sen End SubPrivate Sub
Command3_Click() Dim sde As String sde = de(en(Text1.Text)) L
abel2.Caption = sdeEnd Sub8.6.5 验证哥德巴赫猜想 一个不小于6的偶数可以表示为两个素数之和
。例如:6 = 3 + 3,8 = 3 + 5,10 = 3 + 7,…。 Private Sub Prime(m As Long
, f As Boolean) f = True If m > 3 Then For i = 3 To Sqr(m) I
f m Mod i = 0 Then f = False: Exit For Next End IfEnd SubPrivate Sub Command1_Click() Dim n As Long, x As Long, y As Long, p As Boolean n = Val(Text1.Text) If n < 6 Or n Mod 2 <> 0 Then MsgBox "对不起!必须输入大于6的偶数,请您重新输入!" Cancel = True Else For x = 3 To n / 2 Step 2 Call Prime(x, p) If p Then y = n – x Call Prime(y, p) If p Then Text2.Text = x & "+" & y Exit For End If End If Next End If Text1.SelStart = 0 Text1.SelLength = Len(Text1.Text)End Sub结束
献花(0)
+1
(本文系大高老师首藏)