Visual Basic 程序设计甘肃农业大学信息科学技术学院
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1 过 程
6.1.1 事件过程和通用过程
6.1.2 过程的定义
6.1.3 调用 Sub过程
6.1.4 Sub Main过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
Visual Basic的 Sub过程分为事件过程和通用过程两大类。
– 事件过程是当发生某个事件时,对该事件做出响应的程序代码,它是 Visual Basic应用程序的主体。
– 有时候,多个不同的事件过程可能需要使用一段相同的程序代码,因此可以把这一段代码独立出来,作为一个公共的过程,这样的过程称为通用过程,它独立于事件过程之外,可供其他事件过程调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
事件过程是由 Visual Basic自行声明的,用户不能增加或删除。当用户对某个对象发出一个动作时,Windows会通知 Visual
Basic产生了一个事件,Visual Basic会自动调用与该事件相关的事件过程。
事件过程是附加在窗体和控件上的,通常总是处于空闲状态,直到响应用户引发的事件或系统引发的事件才被调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
窗体事件过程
– 窗体事件过程定义为,Form_事件名”,其格式为:
Private Sub Form_<事件名 > ([参数表 ])
[语句组 ]
End Sub
– 不管窗体名字如何定义,但在事件过程中只能使用
Form,而在程序中对窗体进行引用才会用到窗体名字。
– 如果正在使用多重窗体 MDI(Multiple Document
Interface),则事件过程定义为,MDIForm_事件名”。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
控件事件过程
– 控件事件过程的定义是“控件名 _事件名”,
其格式为:
Private Sub <控件名 >_<事件名 > ([参数表 ])
[语句组 ]
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
– 在代码编辑器窗口建立事件过程,代码窗口会自动显示 Visual Basic的保留字,这样可以看出哪些是自己的编码。打开代码编辑器窗口有以下几种方法:
在设计窗体上双击窗体或控件,就打开了代码编辑器窗口,
并会出现该窗体或控件的默认过程代码。
单击工程资源管理器窗口的“查看代码”按钮,再从对象列表框中选择一个对象,从过程列表框中选择一个过程。
– 用户自己可以在代码编辑器窗口中直接编写事件过程,
但在代码窗口中不要随意改变事件或对象名称,如果想改变对象名称,则应该通过属性窗口来改变。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
通用过程
– 通用过程与事件过程不同,通用过程不与任何特定的事件相联系,只能由别的过程来调用。通常是在事件过程中调用通用过程,实际上由于事件过程也是过程
( Sub过程),所以,通用过程(包括 Function过程)
之间、事件过程之间、通用过程与事件过程之间,都可以相互调用。
– 通用过程可以放在标准模块中,也可以放在窗体模块中,而事件过程只能放在窗体模块中。不同模块中的过程(通用过程、事件过程)也可以相互调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1 过 程
6.1.1 事件过程和通用过程
6.1.2 过程的定义
6.1.3 调用 Sub过程
6.1.4 Sub Main过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
定义 Sub过程
– 通用 Sub过程的结构与事件过程的结构类似。
一般格式为:
[Static] [Private] [Public] Sub 过程名( [参数列表 ])
语句块
[Exit Sub]
[语句块 ]
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
说明:
– ( 1) Sub过程必须以 Sub开头,以 End Sub结束,中间是过程体。
– ( 2) Static静态变量声明。
如果使用 Static关键字,则该过程中的所有局部变量的存储空间只分配一次,且这些变量的值在整个程序运行期间都存在,即在每次调用该过程时,各局部变量的值一直存在。
如果省略 Static,过程每次被调用时重新为其变量分配存储空间,当该过程结束时释放其变量的存储空间。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
说明:
– ( 3) Private定义该过程为局部的,只有该过程所在模块中的程序才能调用它。
– ( 4) Public定义该过程为公用的(默认值),
应用程序可随处调用它(若定义在窗体,其他窗体程序调用它时要指定窗体名)。
– ( 5)过程名是供调用的标识符,应符合 Visual
Basic标识符命名规则。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
说明:
– ( 6)参数列表又叫做形式参数或形参,可以有多个参数。若是多个参数,参数之间要用逗号分割。参数列表指明了调用时传送给 过程的参数的类型和个数,每个参数的格式为:
[ByVal | ByRef] 变量名 [() ][As 数据类型 ]
,变量名”代表参数的变量的名称,遵循标准的变量命名约定。如果是数组,要在数组名后加上一对括号。
,类型”代表传递的参数的数据类型,可以是 Integer,Long,Single、
Double,String,Currency,Date,Variant或用户自定义类型。
如果省略,As 数据类型”,则默认为 Variant。
,变量名”前的 By Val是可选的,By Val表示该参数按值传递;
ByRef表示该参数按地址传递。 ByRef是 Visual Basic的缺省选项。
在定义 Sub过程时,“参数列表”中的参数称为“形式参数”,简称
“形参”,不能用定长字符串变量或定长字符串数组作为形式参数,
不过,在调用语句中可以用简单定长字符串变量作为“实际参数”。
在调用 Sub过程之前,Visual Basic 把它转换成变长字符串变量。过程可以有参数,也可以不带任何参数。没有参数的过程称为无参过程。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
说明:
– ( 7)过程中可以使用一个或多个 Exit Sub语句,
执行到 Exit Sub语句时则从过程中退出,若无
Exit Sub语句,则执行到 End Sub语句时退出过程。
– ( 8) Sub过程不能嵌套定义。也就是说,在
Sub过程内,不能定义 Sub过程或 Function过程;
不能用 Goto语句或 Return进入或退出一个 Sub
过程,只能通过调用执行 Sub过程,而且可以嵌套调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
建立 Sub过程
– 建立通用 Sub过程有以下两种方法:直接在代码编辑器窗口输入过程代码或使用“添加过程”
对话框。
– 第一种方法操作步骤如下:
( 1)执行“工程”菜单中的“添加模块”命令。
( 2)打开代码编辑器窗口,键入过程的名字。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
建立 Sub过程
– 第二种方法操作步骤如下:
( 1)执行“工程”菜单中的“添加模块”命令,打开“添加模块”对话框。在该对话框中,新建模块并打开模块代码窗口
( 2)执行“工具”菜单中的“添加过程”命令,打开“添加过程”对话框,
( 3)在“名称”文本框中输入过程名。
从“类型”组中选择过程类型。
从“范围”组中选择范围,相当于使用 Public或 Private关键字 。
( 4)单击“确定”按钮,回到模块代码窗口。此时可键入程序代码。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1 过 程
6.1.1 事件过程和通用过程
6.1.2 过程的定义
6.1.3 调用 Sub过程
6.1.4 Sub Main过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.3 调用 Sub过程
调用 Sub过程
– 调用过程即引起过程的执行。也就是说,要执行一个过程,必须调用该过程。
– 调用 Sub过程有两种方法:一种是把过程的名字放在一个 Call语句中,另一种是把过程作为一个语句来使用。
使用 Call语句调用 Sub过程格式,Call 过程名 [(实参表) ]
Call 语句把程序控制传送到一个 Visual Basic的 Sub过程。用 Call语句调用一个过程时,如果过程本身没有参数,则“实际参数”和括号可以省略;否则,应给相应的实际参数,并把参数放在括号中。实际参数是传送给 Sub过程的变量或常数。
把过程名作为一个语句来使用格式:过程名 [(实参表) ]
以上两种方法的区别为:使用 Call语句时,实参表必须用括号括起来;直接使用过程名调用时,实参表不必用括号括起来。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.3 调用 Sub过程
调用 Sub过程
– 除了同一模块中的各过程可以互相调用以外,在工程的任何地方都可以调用其他模块中说明为 Public的公用过程,称为外部调用。
调用其他窗体的公用过程要同时指出窗体名和过程名,并给出实参。格式为:
Call 窗体名,过程名 (实参表) 或窗体名,过程名 (实参表)
– 调用其他标准模块中的公用过程也要同时指出模块名和过程名,并给出实参。格式为:
Call 模块名,过程名 (实参表) 或模块名,过程名 (实参表)
– 如果一个标准模块的过程名在工程中是唯一的,则调用时可不加 模块名。
– 注意:不能在表达式中调用 Sub过程,调用 Sub过程必须是一个独立的语句。实参表和形参表的参数个数要一致,位置要对应,类 型要匹配。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.3 调用 Sub过程
【 例 6-1】 编写一个计算阶乘的 Sub过程,
计算 n的阶乘,n由用户输入。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1 过 程
6.1.1 事件过程和通用过程
6.1.2 过程的定义
6.1.3 调用 Sub过程
6.1.4 Sub Main过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.4 Sub Main过程
在一个含有多个窗体或多个工程的应用程序中,
缺省情况下,应用程序中的第一个窗体被指定为启动窗体。应用程序开始运行时,此窗体就被显示出来。
如果想在应用程序启动时显示别的窗体,那么就得改变启动窗体。有时候也许要应用程序启动时不加载任何窗体。
要做到这一点,可在标准模块中创建一个特殊的子过程,在 Visual Basic中,这样的过程称为启动过程,并命令为 Sub Main。
当工程中含有 Sub Main子过程时,应用程序装载窗体之前总是先执行 Sub Main子过程。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.4 Sub Main过程
Sub Main过程位于标准模块中,而且一个工程只能有一个 Sub Main过程。
设置 Sub Main过程为启动对象的方法是,从
“工程”菜单中选取
“工程属性”选项,在其“通用”选项卡的
“启动对象”下拉列表框中选定 Sub Main,如图所示。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2 函 数
6.2.1 建立 Function过程
6.2.2 调用 Function过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2.1 建立 Function过程
函数( Function)是过程的另一种形式,也称 Function
过程,与 Sub过程不同的是,它返回一个值,通常出现在表达式中。这一节将介绍函数( Function)过程的建立和调用。
建立 Function过程
Function过程的一般格式为:
[Static] [Private] [Public] Function 过程名( [参数列表 ]) [As 类型 ]
语句块
[过程名 = 表达式 ]
[Exit Function]
[语句块 ]
End Function
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2.1 建立 Function过程
说明:
– ( 1) Function过程以 Function开头,以 End Function结束,中间是过程体。
– ( 2)格式中的 Static,Private,Public、“过程名”、“参数列表”、,Exit Function”的含义与 Sub过程相同。,As 类型”是
Function过程返回值的类型,可以是 Integer,Long,Single、
Double,Currency,Date或 String,如果省略,则为 Variant。
– ( 3)“表达式”的值是过程返回的结果。
通过“过程名 = 表达式”赋给过程名,该值就是 Function过程返回的值。
如果在 Function过程中没有“过程名 = 表达式”语句,则该过程返回一个默认值,数值函数过程返回 0,字符串函数过程返回空字符串。
因此,为了能使一个 Function过程完成所指定的操作,通常要在过程中为“过程名”赋值。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2 函 数
6.2.1 建立 Function过程
6.2.2 调用 Function过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2.2 调用 Function过程
Function过程的调用比较简单,可以像使用
Visual Basic内部函数一样来调用 Function
过程。
– 实际上,由于 Function过程能返回一个值,一次完全可以把它看作一个函数,调用的基本方式是在函数名后跟一对括号,括号内是参数。
– 由于函数也是一种过程,若不需要返回值,则完全可以使用 Call来调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2.2 调用 Function过程
【 例 6-2】 编写 Function过程,已知直角三角形两直角边的长度,求第三边(斜边)
的长度。直角边长度由用户输入。
【 例 6-3】 编写一个求最大公约数的函数过程。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.1 形参与实参
形参是在被调用过程中的参数,出现在 Sub过程和
Function过程中。在过程被调用之前,形参并未被分配内存,只是说明形参的类型和在过程中的作用。形参列表中的各参数之间用逗号分隔,形参可以是变量名和数组名,
但不能是定长字符串变量。
实参是在主调过程中的参数,在过程调用时实参将数据传递给形参。实参表可由常量、表达式、有效的变量名、数组名组成,实参表中各参数用逗号分隔。在调用过程时,
实参被插入形参中的各变量处进行“形实结合”,形实结合是按位置结合的,即第一个实参与第一个形参结合,第二个实参与第二个形参结合,依此类推。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.1 形参与实参
形参列表和实参列表中的对应变量名可以不同,但实参和形参的个数、顺序以及数据类型必须相符。所谓类型相符,
对于变量参数就是类型相同,对于值参数则要求实际参数对形式参数赋值相容。
若在过程的形参表中列入了 Optional关键字,则可以指定过程的形式参数为可选参数,参数表中此参数后面的其他参数也必须是可选的,并要用 Optional来声明。关于可选参数详见 6.3.4。
一般来说,过程调用中的参数个数应等于过程说明的参数个数。如果使用 ParamArray关键字,则过程可以接受任意个数的参数。例如,我们可以定义一个可变参数过程,
用这个过程可以求任意多个数的乘积。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
传递参数的方式有两种:
– 如果调用语句中的实际参数是常量或表达式,
或定义过程时选用 ByVal关键字,就可以按值传递。
– 如果调用语句中实际参数为变量,或定义过程时选用 ByRef关键字,就可以按地址传递。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
按值传递参数
– 按值传递参数时,Visual Basic给传递的形参分配一个临时的内存单元,将实参的值传递到这个临时单元去。
实参向形参传递是单向的,如果在被调用的过程中改变了形参值,则只是临时单元的值变动,不会影响实参变量本身。当被调用过程结束返回主调过程时,
Visual Basic将释放形参的临时内存单元。
– 当要求变量按值传递时,可以先把变量变成一个表达式,把变量转换成表达式的最简单的方法就是把它放在括号内。例如把变量,A”用括号括起来,,(A)”就成为一个表达式了。或者定义过程时用 ByVal关键字指出参数是按值来传递的。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
【 例 6-4】 用函数过程编写程序,求 a,b两数中最大数。
a b x y
x y z
18 39 39 18
18 39 18
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
按地址传递参数
– 按地址传递参数,是指把形参变量的内存地址传递给被调用过程,形参和实参具有相同的地址,即形参、
实参共享一段存储单元。
– 因此,在被调过程中改变形参的值,则相应实参的值也被改变,也就是说,与按值传递参数不同,按地址传递参数可以在被调过程中改变实参的值。
– 系统缺省情况下是按地址传递参数。在传址调用时,
实参必须是变量,不能为常量或表达式,常量或表达式无法传址。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
将例 6-4求两数中最大数的程序改为按址传递
– 当输入变量 a为 18,b为 39时,形参与实参的数据传递如图,由于形参和实参共用同一内存单元,在被调用函数中交换 x和 y的数值后,a和 b的数值也同样发生变化。
a → b →
x → y →
z →
39 18
18
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
采用值传递只能从外界向过程传入信息,但不能传出;而采用地址传递则既能传入、又能传出。
正是由于不能传出,过程结束后,值传递中形参值变化就不会影响外界的任何量,因而在一定意义上说,值传递比较安全。
值传递和地址传递各有特点,采用哪一种更合适,
则视情况而定。一般来说,需要传出参数值时应该用地址传递,否则采用值传递较好。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
补充说明以下几点:
– ( 1)当把常数和表达式作为实参传递给形参时,应注意类型匹配。通常有以下 3种情况:
字符串常数和数值常数分别传递给字符串类型的形参和数值类型的形参。
当传递数值常数时,如果实参表中的某个数值常数的类型与 Function或 Sub过程形参表中相应的形参类型不一致,则这个常数被强制变为相应形参的类型。
当作为实参的数值表达式与形参类型不一致时,通常也强制变为相应的形参的类型。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
补充说明以下几点:
– ( 2)用户定义的类型,传送记录实际上是传送记录类型的变量,一般步骤如下:
定义记录类型。
定义记录类型变量
调用过程,并把定义的记录变量传送到过程。
在定义过程时,要注意形参类型匹配。
– ( 3)单个记录元素的传送。
传送单个记录元素时,必须把记录元素放在实参表中,写成“记录名,元素名”的形式。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.3 数组参数
在定义过程时,数组可以作为形参出现在过程的形参列表中。形参数组对应的实参也是数组,数据类型与形参一致,实参列表中的数组不需要用括号。过程传递数组只能按地址传递,形参与实参共用同一段内存单元。
在被调用过程中不能用 Dim语句对形参数组声明,
否则会产生“重复声明”的编译错误。但是在使用动态数组时,可以用 ReDim语句改变形参数组的维数,重新定义数组的大小。当返回调用过程时,对应的实参数组的维数也随之发生变化。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.3 数组参数
【 例 6-5】 编写一个 Function过程,求数组各元素的平均值 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
可选参数
– 在 Visual Basic中允许在过程中定义一个或几个可选参数。在过程的形参表中使用 Optional关键字,就可以指定过程的形式参数为可选的。
如果指定了可选参数,则参数表中此参数后面的其他参数也必是可选的,并且要用 Optional
关键字来声明
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
可选参数
– 例如,定义了如下过程:
Sub Account (a As Integer,b As Integer,Optional c,Optional d)
Sum = a + b
If Not IsMissing(c) Then
Sum = Sum + c
End If
If Not IsMissing(d) Then
Sum = Sum - d
End If
Print Sum
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
可选参数
– 在上面这个过程中,有 4个形式参数,其中后两个是可选的,其类型是使用默认类型 Variant,在过程中通过
IsMissing函数来测试是否向可选参数传送了实参值。
IsMissing函数有一个参数,它就是由 Optional指定的形参的名字,其返回值为 Boolean类型。如果没有向可选参数传送实参,返回 True,否则返回 False。
– 在调用上面的 Account过程时,首先把前两个参数 a和 b
的值相加,然后判断是否向可选参数 c传送了实参,如果传送了则把 c的值加到 sum上,接着判断是否向可选参数 d传送了实参,如果传送了则在 sum上减去 d的值。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
可变参数
– 一般来说,过程调用中的参数个数应等于过程说明的参数个数。如果使用了 ParamArray关键字,则过程可以接受任意个数的参数。一般格式为:
Sub 过程名 ( ParamArray 数组名() )
……
End Sub
– 这里的数组是一个形式参数,只有名字和括号,
没有上下界。数组必须声明为变体数组。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
【 例 6-7】 编写 Function过程,计算任意多个数的累加和 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.5 对象参数
在 Visual Basic中不仅可以把变量、常量、
表达式作为参数进行传送,也可以把对象
(窗体和控件)作为参数进行传送。
窗体参数
– 用窗体作通用过程的参数时,在定义通用过程时“形参表”中形参的类型要定义为 Form,其格式为:
Sub 过程名(变量名 As Form)
– 调用过程时的实参为窗体名,即窗体的 Name
属性。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.5 对象参数
【 例 6-8】 编写程序,运行程序时,单击窗体并输入窗体增加的宽度和高度值,改变窗体的大小。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.5 对象参数
控件参数
– 和窗体参数一样,控件也可作为通用过程的参数,即在一个通用过程中设置相同性质控件的所需要的属性,然后用不同的控件调用此过程。
用控件作通用过程的参数时,在定义通用过程时“形参表”中形参的类型要定义为 Control,
其格式为:
Sub 过程名(变量名 As Control)
– 调用过程时的实参为控件名,即控件的 Name
属性。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.6 过程的作用域
在 Visual Basic中,过程的作用范围分为模块级
(或称文件级 )和全局级 (或称工程级 )。
– 模块级过程是在某个模块内定义的过程。如果在 Sub或
Function过程前加 Private,则该过程只能被本模块中定义的过程调用,即其作用范围为本模块。
– 全局级过程是定义过程时,在 Sub或 Function前加关键字 Public(系统默认为 Public)。全局级过程可被整个应用程序的所有模块中定义的过程调用,即其作用范围是整个应用程序。
– 在工程中的任何地方都能调用其他模块中的全局过程。
调用其他模块中的过程的方法取决于该过程所属的模块是在窗体模块、标准模块还是类模块。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.6 过程的作用域
调用窗体中的过程
– 所有窗体模块的外部调用必须指向包含此过程的窗体模块,其格式为:
Call 窗体名,全局过程名 [(实参表 )]
调用标准模块中的过程
– 如果过程名是唯一的,则不必在调用时加模块名。无论是在模块内,还是在模块外调用,结果总会引用这个唯一过程。
– 如果有两个以上的模块包含同名的过程,则调用本模块内过程时不必加模块名,而调用其他模块的过程时必须以模块名为前缀。其格式为:
Call [标准模块名,]全局过程名 [(实参表 )]
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.6 过程的作用域
调用类模块中的过程
– 调用类模块中的全局过程,要求指向该类的某一实例作前缀。首先声明类的实例为对象变量,
并以此变量作为过程名前缀,不可直接用类名作为前缀。其格式为:
Call 变量,过程名 [(实参表 )]
– 如类模块 Class1,类模块的过程 ClassSub,变量名为 ExClass,调用过程的语句为:
Dim ExClass As New Class1
Call ExClass.ClassSub(实参表 )
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.6 过程的作用域
【 例 6-9】 全局过程的调用示例
– 应用程序中包括两个窗体 Form1,Form2和一个标准模块 Module1。
在 Form1窗体中定义一个计算矩形面积的全局级 Function过程
Area,在标准模块 Module1中定义一个计算矩形周长的全局级
Function过程 Circ,如图所示
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4 键盘与鼠标事件过程
6.4.1 键盘事件
6.4.2 鼠标事件
6.4.3 拖放操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
Visual Basic中的对象识别键盘事件,包括
KeyPress,KeyUp和 KeyDown事件。
– 用户按下并且释放一个 ANSI键时就会触发
KeyPress事件;
– 用户按下一个键时触发 KeyDown事件,释放引发 KeyUp事件。
– 在引发键盘事件的同时,用户所按的键盘码作为实参传递给相应的事件过程,供程序判断识别用户的操作。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
KeyPress事件
– 当用户按下并松开一个 ANSI键时将触发 KeyPress事件,
KeyPress事件的语法格式如下:
Private Sub Object_KeyPress( [ index As Integer,]
KeyAscii As Integer)
– 其中 Object 表示一个对象,即接收按键的对象; index
用于控件数组,用来唯一标识在控件数组中的一个控件(如果没有控件数组则不出现该参数); KeyAscii返回按键对应的 ASCII码的整型数值。 KeyAscii的值通过引用传递,对它进行改变可给接收按键对象发送一个不同的字符。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
【 例 6-10】 在窗体上放一文本框,编写一事件过程,保证在该文本框内只能输入字母,且无论大小写,都要转换成大写字母显示 。 程序如下:
Private Sub Text1_KeyPress( KeyAscii As Integer)
Dim str$
If KeyAscii < 65 Or KeyAscii > 122 Then
Beep
KeyAscii = 0
ElseIf KeyAscii >= 65 And KeyAscii <= 90 Then
Text1 = Text1 + Chr( KeyAscii)
Else
str = UCase( Chr( KeyAscii))
KeyAscii = 0
Text1 = Text1 + str
End If
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
KeyDown及 KeyUp事件
– KeyPress事件只识别 ENTER,TAB和
BACKSPACE及标准键盘上的字母、数字、标点等标准 ASCII字符。如要检测其他功能键、
编辑键和定位键,则需要利用 KeyDown和
KeyUp事件。其基本语法格式为:
Private Sub Object_KeyDown([ index As Integer,]
KeyCode As Integer,,Shift As Integer)
Private Sub Object_KeyUp([ index As Integer,]
KeyCode As Integer,,Shift As Integer)
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
KeyDown及 KeyUp事件
– 其中 Object 表示一个对象,即接收按键的对象;
index用于控件数组,用来唯一标识一个在控件数组中的控件
(如果没有控件数组则不出现该参数);
KeyCode返回按键对应的 ASCII码的整型数值。
Shift用来表示按键时 SHIFT,CTRL和 ALT键的状态的一个整数。这 3个键分别以二进制方式表示,每个键用三位,即 Shift
键为 001,Ctrl键为 010,A1t键为 100。
如果同时按下上面两个或三个键时,Shift参数的值即为上述两者或三者之和,因此 Shift参数共可取 8种值
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
【 例 6-11】 显示所按键的状态,并判断是否是
F10键。程序如下:
Private Sub Text2_KeyDown(KeyCode As Integer,Shift As Integer)
Dim Msg As String
If Shift And vbCtrlMask Then Msg = Msg & ″Ctrl ″
If Shift And vbAltMask Then Msg = Msg & ″Alt ″
If Shift And vbShiftMask Then Msg = Msg & ″Shift ″
If KeyCode = vbKeyF10 Then Msg = Msg & ″F10 ″
Label1.Caption = Msg & KeyCode
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4 键盘与鼠标事件过程
6.4.1 键盘事件
6.4.2 鼠标事件
6.4.3 拖放操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.2 鼠标事件
鼠标对于 Windows应用程序设计来说几乎是必需的,尤其是在图形图像处理的程序设计中,显得更为重要。而鼠标应用的基础是鼠标事件。
鼠标事件除了单击( Click)和双击
( DblClick)外,基本的鼠标事件还有 3个:
– MouseDown,MouseUp和 MouseMove。
– 工具箱中的大多数控件都能响应这 3个事件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.2 鼠标事件
语句格式如下:
Private Sub Object_Click()
Private Sub Object_DblClick()
Private Sub Object_MouseDown( [index As Integer,]
Button As Integer,Shift As Integer,X As Single,Y
As Single)
Private Sub Object _MouseUp( [index As Integer,]
Button As Integer,Shift As Integer,X As Single,
Y As Single)
Private Sub Object _MouseMove( [index As Integer,]
Button As Integer,Shift As Integer,X As Single,
Y As Single)
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.2 鼠标事件
– 其中:
Object是事件对象。
– index用于控件数组,用来唯一标识一个在控件数组中的控件(如果没有控件数组则不出现该参数)。
– Button返回一个整数,用来标识鼠标哪个键被按下或释放。
用一个 3位二进制数表示鼠标按钮的哪一个按钮起作用,
Button取值与鼠标按键的对应关系见表 6.2。
– Shift为 Shift,Ctrl,Alt键的状态,其含义同键盘事件中的
Shift。
– X,Y表示鼠标在当前获得焦点的控件的相对坐标。即鼠标指针的位置。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.2 鼠标事件
【 例 6-12】 随着鼠标的移动,在窗体上写出鼠标的位置(如图 6.9)。程序如下:
Private Sub Form_MouseMove(Button As Integer,
Shift As Integer,X As Single,Y As Single)
CurrentX = X
CurrentY = Y
Print X; Y
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4 键盘与鼠标事件过程
6.4.1 键盘事件
6.4.2 鼠标事件
6.4.3 拖放操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
在设计模式下,各控件都可用鼠标随意拖放的方式来改变控件的大小与位置。
Visual Basic提供了拖放功能,使用户在程序运行时也具有拖放的能力。
拖放是指运行时将控件拖到新的位置,包括两个操作:拖动和放下。
– 拖动是按下鼠标键并移动控件,而放下是指释放鼠标键。拖放操作涉及被拖动的对象,即源对象和将要放在其上的目标对象。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
与拖放操作相关的属性、事件和方法
– 除菜单、计时器和通用对话框外,Visual Basic中的其他控件都支持拖放功能。
属性
– DragMode属性
返回或设置一个值,确定在拖放操作中所用的是手动还是自动 拖动方式。该属性有两种取值:缺省值为 0,表示手工拖放模式,这时可以用手工方式来确定拖放操作何时开始或结束;如 果设为 1,表示被设置为自动拖放模式。如果 DragMode 属性设置为 1时,这时控件不能正常响应鼠标事件。
– DragIcon属性
设置或返回拖放操作中的对象拖动图标。在拖动控件时,
Visual Basic将控件的灰色轮廓作为缺省的拖动图标。对
DragIcon属性进行设置,就可用其他图像代替该轮廓。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
与拖放操作相关的属性、事件和方法
– 属性
MousePointer属性
– 在运行时当鼠标移到对象的一个特定部分时,该值只是被显示的鼠标指针的类型。 MousePointer属性的取值是一个整数,有 17种取值的可能
– 鼠标光标的形状既可以在属性窗口中设置,也可以在程序代码中设置。在属性窗口中设置 MousePointer属性时,首先,选中要改变鼠标形状的对象,在属性窗口中找到
MousePointer属性,然后单击属性设置框右端的下拉箭头,
从中就可以选择光标形状的各种值。在程序代码中可随意设置对象的鼠标形状,其语法格式如下:
对象,MousePointer = 值
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
属性
– MouseIcon属性
设置和返回自定义的鼠标图标。既可以在属性窗口中设置,也可以通过代码设置。其格式为:
对象,MouseIcon = LoadPicture( pathname)
利用该属性用户可以使用自己制作的图标文件来显示鼠标形状。如果要用自定义的光标形状,首先把对象的 MousePointer属性设为 99,然后再把对象的
MouseIcon属性设成自定义的图标文件。图标文件
(扩展名为,ico)必须和其他光标图标一样为
16× 16像素。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
事件
– DragDrop事件
当把一个控件拖动到目标对象,并释放鼠标按钮时,或使用
Drag方法,并将其 action参数被设置为 2(Drop)时,触发目标对象的 DragDrop事件。其语法格式为:
Private Sub Object_DragDrop(Source As Control,X As
Single,Y As Single)
……
End Sub
该事件有三个参数:
– Source参数引用被拖动的对象,可以通过 Source来引用或设置被拖动对象的各种属性;
– X和 Y表示当完成拖动过程松开鼠标时,鼠标的位置。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
事件
– DragOver事件
当拖放操作正在进行并越过一个控件时,触发该控件的
DragOver事件,语法格式为:
Private Sub Object_DragOver(Source As Control,X As Single,
Y As Single,State As Integer)
……
End Sub
该事件的前三个参数的含义与 DragDrop事件相同。
State参数是一个整数,表示拖动的状态,其取值如下:
– 0:进入(源控件正被向一个目标控件范围内拖动)
– 1:离开(源控件正被向一个目标控件范围外拖动)
– 2:跨越(源控件在目标控件范围内从一个位置移到了另一位置)
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
自动拖放和手工拖放
– 拖放操作分为自动方式和手工方式,这由源对象的 DragMode属性值决定的。
– 自动拖放
把控件的 DragMode属性设为 1,即可实现控件的自动拖放功能。
– 手工拖放
手工拖放的原理与自动拖放基本一样,只有以下三点不同:
1) DragMode属性值为 0。
2)允许控件在拖动之前响应 MouseDown事件(自动拖放不能响应)。
3)必须用 Drag方法手动激活拖放操作。即把 Drag方法的参数设为 1
来激活拖动操作,设为 0或 2停止拖动操作。如果设为 2,则在停止拖放后触发 DragDrop事件。
– 一般 Drag方法都和 MouseDown,MouseUp事件结合使用,实现手动拖放。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5 嵌套调用和递归算法
6.5.1 嵌套调用
6.5.2 递归算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.1 嵌套调用
Visual Basic不能嵌套定义过程,但 Visual
Basic中可以嵌套调用过程,也就是主程序可以调用子过程,在子过程中还可以调用另外的子过程,这种程序结构称为过程的嵌套。
主程序 子过程 1 子过程 2
① ② ③ ④
调用子过程 1 调用子过程 2 ⑤
⑨ ⑧ ⑦ ⑥
结 束 E n d S u b E n d S u b
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.1 嵌套调用
【 例 6-13】 计算组合公式的结果。
– 分析:如果求组合数用一个 Function过程
Comb来实现,则该过程中需要调用求阶乘 n!
的 Function过程 Fact。输入两个数 m,n,通过控件事件过程调用 Comb函数,计算组合数据的结果。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5 嵌套调用和递归算法
6.5.1 嵌套调用
6.5.2 递归算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.2 递归算法
递归分为两种类型,
– 一种是直接递归,即在过程中调用过程本身;
– 另一种是间接递归,即间接地调用一个过程,
例如第一个过程调用了第二个过程,第二个过程又回过头来调用第一个过程。
递归调用在完成阶乘运算、级数运算、幂指数运算等方面特别有效。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.2 递归算法
【 例 6-14】 用递归的方法计算 n!。
– 分析:自然数 n的阶乘可以递归定义为:
n!=1(N=0),n! =n*(n-1)!(n<>0)
– 递归的结束条件为,n=1时,n!=1。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.2 递归算法
【 例 6-15】 Hanoi塔问题:传说印度教的神梵天创造世界时,在印度北部佛教圣地贝拿勒斯圣庙里,安放了一块黄铜板,板上插着三根针,
在其中一根针上自下而上放着由大到小的 64个金盘,梵天要求僧侣们坚定不移地按下面规则把 64个盘子移到另一根针上:
– 一次只能移一个盘子。
– 盘子只许在三根针上存放。
– 永远不许大盘压小盘。
分析:这是一个典型的只能用递归方法解决的问题。将 n
个盘子从 A针移到 C针可以分解为以下三个
– 步骤:
(1) 将 A上 n- 1个盘子借助 C针先移到 B针上。
(2) 把 A针上剩下的一个盘子移到 C针上。
(3) 将 n- 1个盘子从 B针借助于 A针移到 C针上。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6 过程应用及常用算法
6.6.1 过程应用实例
6.6.2 常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.1 过程应用实例
【 例 6-16】 求 2~ 100以内的质数。
【 例 6-17】 求 999以内的完全数。所谓完全数是指这样的自然数:它的各个约数(不包括该数自身)之和等于该数自身。如
28=1+2+4+7+14就是一个完全数。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6 过程应用及常用算法
6.6.1 过程应用实例
6.6.2 常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
数制转换
– 不同进制数之间的转换,可通过编程来实现,
也可通过 Visual Basic提供的内部函数:十进制转换为八进制函数( Oct)、转换为十六进制函数( Hex)来实现。
【 例 6-18】 编写函数,实现一个十进制整数转换成二至十六任意进制的字符。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
加密和解密
– 在当今信息社会,信息的安全性得到了广泛的重视,信息加密是一项安全性的措施之一。信息加密有各种方法,最简单的加密方法是:将每个字母加一序数,称为密钥。例如,加序数
5,这时,A”对应,F”,,a”对应,f”,,B”对应,G”,,Y”对应,D”,,Z”对应,E”;解密是加密的逆操作。
【 例 6-19】 编写加密和解密的程序,即将输入的一行字符串中的所有字母加密,同时,加密后还可以进行解密。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
查找、插入和删除数据
– 查找是在数组中,根据指定的关键值,找出与其值相同的元素。一般有顺序查找和二分法查找。
【 例 6-20】 顺序查找
– 算法:根据查找的关键值与数组中的元素逐一比较,若相同,查找成功,若找不到,则查找失败。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
查找、插入和删除数据
– 【 例 6-21】 二分法查找
算法:首先将数组排序,将要查找的关键值同数组的中间元素比较,若相同则查找成功结束;否则判别关键值落在数组的哪一部分,然后保留一半,舍弃另一半。如此重复上述查找,直到查找到或数组中没有这样的元素。二分法查找每进行一次,就把数据的个数减少一半。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
查找、插入和删除数据
– 【 例 6-22】 假定有数组声明 a( 1 to n )的有序数组,在指定位置 k(1<=k<=n-1)处插入一个元素,首先把最后一个元素往后移动一个位置,
再依次把前一个元素向后移,直到把 k个元素移动完毕;这样第 k个元素的位置腾出,就可将数据插入。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
插入排序和合并排序
– 在前一章介绍的选择法、冒泡法排序都是在欲排序的数组元素全输入后,再进行排序。而插入排序是每输入一个数,马上插入到数组中,
数组在输入过程中总是有序的。在插入排序中,
涉及前面介绍的查找、数组内元素的移动和元素插入等算法。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
插入排序和合并排序
– 【 例 6-23】 用插入排序法输入不多于 20个数,使数组保持递增的序列。
– 算法分析:对数组中已有 n-1个有序数,当输入某数 x时,
插入排序法的步骤如下:
( 1)找 x应在数组中的位置 j。
( 2)从最后一个数 (下标为 n -1)
开始共 n -j个数依次往后移,
使位置为 j的数让出。
( 3)将数 x放入数组中应有的位置 j,
一个数插入完成。
对于若干个数输入,只要调用插入排序过程即可。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
插入排序和合并排序
– 【 例 6-24】 假设有序的数组为 A,B,合并后的数组为 C。
– 合并排序的算法为:
( 1)先在 A,B数组中各取第一个元素进行比较,
将小(递增次序)的放入 C数组的第 1个元素;
( 2)取小的元素所在的数组的下一个元素与上次比较时较大的元素比较,重复上述比较过程,直到某个数组先排完;
( 3)将剩余的元素抄入 C数组,合并排序完成。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
字符处理应用
– 【 例 6-25】 编写一个英文打字训练的程序,要求如下:
( 1)在标签框内随机产生 30个字母的范文; 2)当焦点进入文本框时开始计时,并显示当时的时间; 3)在文本框中按照产生的范文输入相应的字母; 4)当输满 30个字母时结束计时,禁止向文本框输入内容,并显示打字的速度和正确率。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社学完本章你应能够:
了解过程的概念及分类;
理解 Sub过程的定义,Sub过程的调用;
理解 Function过程的定义,Function过程的调用;
掌握参数传递,传值与传址的概念及实现;
理解过程的作用域及对象参数;
掌握几种常用的算法。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社思 考 题
1,简述过程的分类和子过程的特点。
2,Sub过程和 Function过程有什么不同?调用的方法有什么区别?
3,什么是形参和实参?
4.,传值”和“传址”有什么区别?
5,什么是变量的作用域?变量的作用域如何分类?
6,如何在程序运行过程中改变鼠标的形状?
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1 过 程
6.1.1 事件过程和通用过程
6.1.2 过程的定义
6.1.3 调用 Sub过程
6.1.4 Sub Main过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
Visual Basic的 Sub过程分为事件过程和通用过程两大类。
– 事件过程是当发生某个事件时,对该事件做出响应的程序代码,它是 Visual Basic应用程序的主体。
– 有时候,多个不同的事件过程可能需要使用一段相同的程序代码,因此可以把这一段代码独立出来,作为一个公共的过程,这样的过程称为通用过程,它独立于事件过程之外,可供其他事件过程调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
事件过程是由 Visual Basic自行声明的,用户不能增加或删除。当用户对某个对象发出一个动作时,Windows会通知 Visual
Basic产生了一个事件,Visual Basic会自动调用与该事件相关的事件过程。
事件过程是附加在窗体和控件上的,通常总是处于空闲状态,直到响应用户引发的事件或系统引发的事件才被调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
窗体事件过程
– 窗体事件过程定义为,Form_事件名”,其格式为:
Private Sub Form_<事件名 > ([参数表 ])
[语句组 ]
End Sub
– 不管窗体名字如何定义,但在事件过程中只能使用
Form,而在程序中对窗体进行引用才会用到窗体名字。
– 如果正在使用多重窗体 MDI(Multiple Document
Interface),则事件过程定义为,MDIForm_事件名”。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
控件事件过程
– 控件事件过程的定义是“控件名 _事件名”,
其格式为:
Private Sub <控件名 >_<事件名 > ([参数表 ])
[语句组 ]
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
– 在代码编辑器窗口建立事件过程,代码窗口会自动显示 Visual Basic的保留字,这样可以看出哪些是自己的编码。打开代码编辑器窗口有以下几种方法:
在设计窗体上双击窗体或控件,就打开了代码编辑器窗口,
并会出现该窗体或控件的默认过程代码。
单击工程资源管理器窗口的“查看代码”按钮,再从对象列表框中选择一个对象,从过程列表框中选择一个过程。
– 用户自己可以在代码编辑器窗口中直接编写事件过程,
但在代码窗口中不要随意改变事件或对象名称,如果想改变对象名称,则应该通过属性窗口来改变。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.1 事件过程和通用过程
通用过程
– 通用过程与事件过程不同,通用过程不与任何特定的事件相联系,只能由别的过程来调用。通常是在事件过程中调用通用过程,实际上由于事件过程也是过程
( Sub过程),所以,通用过程(包括 Function过程)
之间、事件过程之间、通用过程与事件过程之间,都可以相互调用。
– 通用过程可以放在标准模块中,也可以放在窗体模块中,而事件过程只能放在窗体模块中。不同模块中的过程(通用过程、事件过程)也可以相互调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1 过 程
6.1.1 事件过程和通用过程
6.1.2 过程的定义
6.1.3 调用 Sub过程
6.1.4 Sub Main过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
定义 Sub过程
– 通用 Sub过程的结构与事件过程的结构类似。
一般格式为:
[Static] [Private] [Public] Sub 过程名( [参数列表 ])
语句块
[Exit Sub]
[语句块 ]
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
说明:
– ( 1) Sub过程必须以 Sub开头,以 End Sub结束,中间是过程体。
– ( 2) Static静态变量声明。
如果使用 Static关键字,则该过程中的所有局部变量的存储空间只分配一次,且这些变量的值在整个程序运行期间都存在,即在每次调用该过程时,各局部变量的值一直存在。
如果省略 Static,过程每次被调用时重新为其变量分配存储空间,当该过程结束时释放其变量的存储空间。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
说明:
– ( 3) Private定义该过程为局部的,只有该过程所在模块中的程序才能调用它。
– ( 4) Public定义该过程为公用的(默认值),
应用程序可随处调用它(若定义在窗体,其他窗体程序调用它时要指定窗体名)。
– ( 5)过程名是供调用的标识符,应符合 Visual
Basic标识符命名规则。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
说明:
– ( 6)参数列表又叫做形式参数或形参,可以有多个参数。若是多个参数,参数之间要用逗号分割。参数列表指明了调用时传送给 过程的参数的类型和个数,每个参数的格式为:
[ByVal | ByRef] 变量名 [() ][As 数据类型 ]
,变量名”代表参数的变量的名称,遵循标准的变量命名约定。如果是数组,要在数组名后加上一对括号。
,类型”代表传递的参数的数据类型,可以是 Integer,Long,Single、
Double,String,Currency,Date,Variant或用户自定义类型。
如果省略,As 数据类型”,则默认为 Variant。
,变量名”前的 By Val是可选的,By Val表示该参数按值传递;
ByRef表示该参数按地址传递。 ByRef是 Visual Basic的缺省选项。
在定义 Sub过程时,“参数列表”中的参数称为“形式参数”,简称
“形参”,不能用定长字符串变量或定长字符串数组作为形式参数,
不过,在调用语句中可以用简单定长字符串变量作为“实际参数”。
在调用 Sub过程之前,Visual Basic 把它转换成变长字符串变量。过程可以有参数,也可以不带任何参数。没有参数的过程称为无参过程。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
说明:
– ( 7)过程中可以使用一个或多个 Exit Sub语句,
执行到 Exit Sub语句时则从过程中退出,若无
Exit Sub语句,则执行到 End Sub语句时退出过程。
– ( 8) Sub过程不能嵌套定义。也就是说,在
Sub过程内,不能定义 Sub过程或 Function过程;
不能用 Goto语句或 Return进入或退出一个 Sub
过程,只能通过调用执行 Sub过程,而且可以嵌套调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
建立 Sub过程
– 建立通用 Sub过程有以下两种方法:直接在代码编辑器窗口输入过程代码或使用“添加过程”
对话框。
– 第一种方法操作步骤如下:
( 1)执行“工程”菜单中的“添加模块”命令。
( 2)打开代码编辑器窗口,键入过程的名字。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.2 过程的定义
建立 Sub过程
– 第二种方法操作步骤如下:
( 1)执行“工程”菜单中的“添加模块”命令,打开“添加模块”对话框。在该对话框中,新建模块并打开模块代码窗口
( 2)执行“工具”菜单中的“添加过程”命令,打开“添加过程”对话框,
( 3)在“名称”文本框中输入过程名。
从“类型”组中选择过程类型。
从“范围”组中选择范围,相当于使用 Public或 Private关键字 。
( 4)单击“确定”按钮,回到模块代码窗口。此时可键入程序代码。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1 过 程
6.1.1 事件过程和通用过程
6.1.2 过程的定义
6.1.3 调用 Sub过程
6.1.4 Sub Main过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.3 调用 Sub过程
调用 Sub过程
– 调用过程即引起过程的执行。也就是说,要执行一个过程,必须调用该过程。
– 调用 Sub过程有两种方法:一种是把过程的名字放在一个 Call语句中,另一种是把过程作为一个语句来使用。
使用 Call语句调用 Sub过程格式,Call 过程名 [(实参表) ]
Call 语句把程序控制传送到一个 Visual Basic的 Sub过程。用 Call语句调用一个过程时,如果过程本身没有参数,则“实际参数”和括号可以省略;否则,应给相应的实际参数,并把参数放在括号中。实际参数是传送给 Sub过程的变量或常数。
把过程名作为一个语句来使用格式:过程名 [(实参表) ]
以上两种方法的区别为:使用 Call语句时,实参表必须用括号括起来;直接使用过程名调用时,实参表不必用括号括起来。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.3 调用 Sub过程
调用 Sub过程
– 除了同一模块中的各过程可以互相调用以外,在工程的任何地方都可以调用其他模块中说明为 Public的公用过程,称为外部调用。
调用其他窗体的公用过程要同时指出窗体名和过程名,并给出实参。格式为:
Call 窗体名,过程名 (实参表) 或窗体名,过程名 (实参表)
– 调用其他标准模块中的公用过程也要同时指出模块名和过程名,并给出实参。格式为:
Call 模块名,过程名 (实参表) 或模块名,过程名 (实参表)
– 如果一个标准模块的过程名在工程中是唯一的,则调用时可不加 模块名。
– 注意:不能在表达式中调用 Sub过程,调用 Sub过程必须是一个独立的语句。实参表和形参表的参数个数要一致,位置要对应,类 型要匹配。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.3 调用 Sub过程
【 例 6-1】 编写一个计算阶乘的 Sub过程,
计算 n的阶乘,n由用户输入。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1 过 程
6.1.1 事件过程和通用过程
6.1.2 过程的定义
6.1.3 调用 Sub过程
6.1.4 Sub Main过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.4 Sub Main过程
在一个含有多个窗体或多个工程的应用程序中,
缺省情况下,应用程序中的第一个窗体被指定为启动窗体。应用程序开始运行时,此窗体就被显示出来。
如果想在应用程序启动时显示别的窗体,那么就得改变启动窗体。有时候也许要应用程序启动时不加载任何窗体。
要做到这一点,可在标准模块中创建一个特殊的子过程,在 Visual Basic中,这样的过程称为启动过程,并命令为 Sub Main。
当工程中含有 Sub Main子过程时,应用程序装载窗体之前总是先执行 Sub Main子过程。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.1.4 Sub Main过程
Sub Main过程位于标准模块中,而且一个工程只能有一个 Sub Main过程。
设置 Sub Main过程为启动对象的方法是,从
“工程”菜单中选取
“工程属性”选项,在其“通用”选项卡的
“启动对象”下拉列表框中选定 Sub Main,如图所示。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2 函 数
6.2.1 建立 Function过程
6.2.2 调用 Function过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2.1 建立 Function过程
函数( Function)是过程的另一种形式,也称 Function
过程,与 Sub过程不同的是,它返回一个值,通常出现在表达式中。这一节将介绍函数( Function)过程的建立和调用。
建立 Function过程
Function过程的一般格式为:
[Static] [Private] [Public] Function 过程名( [参数列表 ]) [As 类型 ]
语句块
[过程名 = 表达式 ]
[Exit Function]
[语句块 ]
End Function
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2.1 建立 Function过程
说明:
– ( 1) Function过程以 Function开头,以 End Function结束,中间是过程体。
– ( 2)格式中的 Static,Private,Public、“过程名”、“参数列表”、,Exit Function”的含义与 Sub过程相同。,As 类型”是
Function过程返回值的类型,可以是 Integer,Long,Single、
Double,Currency,Date或 String,如果省略,则为 Variant。
– ( 3)“表达式”的值是过程返回的结果。
通过“过程名 = 表达式”赋给过程名,该值就是 Function过程返回的值。
如果在 Function过程中没有“过程名 = 表达式”语句,则该过程返回一个默认值,数值函数过程返回 0,字符串函数过程返回空字符串。
因此,为了能使一个 Function过程完成所指定的操作,通常要在过程中为“过程名”赋值。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2 函 数
6.2.1 建立 Function过程
6.2.2 调用 Function过程
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2.2 调用 Function过程
Function过程的调用比较简单,可以像使用
Visual Basic内部函数一样来调用 Function
过程。
– 实际上,由于 Function过程能返回一个值,一次完全可以把它看作一个函数,调用的基本方式是在函数名后跟一对括号,括号内是参数。
– 由于函数也是一种过程,若不需要返回值,则完全可以使用 Call来调用。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.2.2 调用 Function过程
【 例 6-2】 编写 Function过程,已知直角三角形两直角边的长度,求第三边(斜边)
的长度。直角边长度由用户输入。
【 例 6-3】 编写一个求最大公约数的函数过程。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.1 形参与实参
形参是在被调用过程中的参数,出现在 Sub过程和
Function过程中。在过程被调用之前,形参并未被分配内存,只是说明形参的类型和在过程中的作用。形参列表中的各参数之间用逗号分隔,形参可以是变量名和数组名,
但不能是定长字符串变量。
实参是在主调过程中的参数,在过程调用时实参将数据传递给形参。实参表可由常量、表达式、有效的变量名、数组名组成,实参表中各参数用逗号分隔。在调用过程时,
实参被插入形参中的各变量处进行“形实结合”,形实结合是按位置结合的,即第一个实参与第一个形参结合,第二个实参与第二个形参结合,依此类推。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.1 形参与实参
形参列表和实参列表中的对应变量名可以不同,但实参和形参的个数、顺序以及数据类型必须相符。所谓类型相符,
对于变量参数就是类型相同,对于值参数则要求实际参数对形式参数赋值相容。
若在过程的形参表中列入了 Optional关键字,则可以指定过程的形式参数为可选参数,参数表中此参数后面的其他参数也必须是可选的,并要用 Optional来声明。关于可选参数详见 6.3.4。
一般来说,过程调用中的参数个数应等于过程说明的参数个数。如果使用 ParamArray关键字,则过程可以接受任意个数的参数。例如,我们可以定义一个可变参数过程,
用这个过程可以求任意多个数的乘积。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
传递参数的方式有两种:
– 如果调用语句中的实际参数是常量或表达式,
或定义过程时选用 ByVal关键字,就可以按值传递。
– 如果调用语句中实际参数为变量,或定义过程时选用 ByRef关键字,就可以按地址传递。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
按值传递参数
– 按值传递参数时,Visual Basic给传递的形参分配一个临时的内存单元,将实参的值传递到这个临时单元去。
实参向形参传递是单向的,如果在被调用的过程中改变了形参值,则只是临时单元的值变动,不会影响实参变量本身。当被调用过程结束返回主调过程时,
Visual Basic将释放形参的临时内存单元。
– 当要求变量按值传递时,可以先把变量变成一个表达式,把变量转换成表达式的最简单的方法就是把它放在括号内。例如把变量,A”用括号括起来,,(A)”就成为一个表达式了。或者定义过程时用 ByVal关键字指出参数是按值来传递的。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
【 例 6-4】 用函数过程编写程序,求 a,b两数中最大数。
a b x y
x y z
18 39 39 18
18 39 18
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
按地址传递参数
– 按地址传递参数,是指把形参变量的内存地址传递给被调用过程,形参和实参具有相同的地址,即形参、
实参共享一段存储单元。
– 因此,在被调过程中改变形参的值,则相应实参的值也被改变,也就是说,与按值传递参数不同,按地址传递参数可以在被调过程中改变实参的值。
– 系统缺省情况下是按地址传递参数。在传址调用时,
实参必须是变量,不能为常量或表达式,常量或表达式无法传址。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
将例 6-4求两数中最大数的程序改为按址传递
– 当输入变量 a为 18,b为 39时,形参与实参的数据传递如图,由于形参和实参共用同一内存单元,在被调用函数中交换 x和 y的数值后,a和 b的数值也同样发生变化。
a → b →
x → y →
z →
39 18
18
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
采用值传递只能从外界向过程传入信息,但不能传出;而采用地址传递则既能传入、又能传出。
正是由于不能传出,过程结束后,值传递中形参值变化就不会影响外界的任何量,因而在一定意义上说,值传递比较安全。
值传递和地址传递各有特点,采用哪一种更合适,
则视情况而定。一般来说,需要传出参数值时应该用地址传递,否则采用值传递较好。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
补充说明以下几点:
– ( 1)当把常数和表达式作为实参传递给形参时,应注意类型匹配。通常有以下 3种情况:
字符串常数和数值常数分别传递给字符串类型的形参和数值类型的形参。
当传递数值常数时,如果实参表中的某个数值常数的类型与 Function或 Sub过程形参表中相应的形参类型不一致,则这个常数被强制变为相应形参的类型。
当作为实参的数值表达式与形参类型不一致时,通常也强制变为相应的形参的类型。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.2 值传递与地址传递
补充说明以下几点:
– ( 2)用户定义的类型,传送记录实际上是传送记录类型的变量,一般步骤如下:
定义记录类型。
定义记录类型变量
调用过程,并把定义的记录变量传送到过程。
在定义过程时,要注意形参类型匹配。
– ( 3)单个记录元素的传送。
传送单个记录元素时,必须把记录元素放在实参表中,写成“记录名,元素名”的形式。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.3 数组参数
在定义过程时,数组可以作为形参出现在过程的形参列表中。形参数组对应的实参也是数组,数据类型与形参一致,实参列表中的数组不需要用括号。过程传递数组只能按地址传递,形参与实参共用同一段内存单元。
在被调用过程中不能用 Dim语句对形参数组声明,
否则会产生“重复声明”的编译错误。但是在使用动态数组时,可以用 ReDim语句改变形参数组的维数,重新定义数组的大小。当返回调用过程时,对应的实参数组的维数也随之发生变化。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.3 数组参数
【 例 6-5】 编写一个 Function过程,求数组各元素的平均值 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
可选参数
– 在 Visual Basic中允许在过程中定义一个或几个可选参数。在过程的形参表中使用 Optional关键字,就可以指定过程的形式参数为可选的。
如果指定了可选参数,则参数表中此参数后面的其他参数也必是可选的,并且要用 Optional
关键字来声明
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
可选参数
– 例如,定义了如下过程:
Sub Account (a As Integer,b As Integer,Optional c,Optional d)
Sum = a + b
If Not IsMissing(c) Then
Sum = Sum + c
End If
If Not IsMissing(d) Then
Sum = Sum - d
End If
Print Sum
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
可选参数
– 在上面这个过程中,有 4个形式参数,其中后两个是可选的,其类型是使用默认类型 Variant,在过程中通过
IsMissing函数来测试是否向可选参数传送了实参值。
IsMissing函数有一个参数,它就是由 Optional指定的形参的名字,其返回值为 Boolean类型。如果没有向可选参数传送实参,返回 True,否则返回 False。
– 在调用上面的 Account过程时,首先把前两个参数 a和 b
的值相加,然后判断是否向可选参数 c传送了实参,如果传送了则把 c的值加到 sum上,接着判断是否向可选参数 d传送了实参,如果传送了则在 sum上减去 d的值。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
可变参数
– 一般来说,过程调用中的参数个数应等于过程说明的参数个数。如果使用了 ParamArray关键字,则过程可以接受任意个数的参数。一般格式为:
Sub 过程名 ( ParamArray 数组名() )
……
End Sub
– 这里的数组是一个形式参数,只有名字和括号,
没有上下界。数组必须声明为变体数组。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.4 可选参数和可变参数
【 例 6-7】 编写 Function过程,计算任意多个数的累加和 。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.5 对象参数
在 Visual Basic中不仅可以把变量、常量、
表达式作为参数进行传送,也可以把对象
(窗体和控件)作为参数进行传送。
窗体参数
– 用窗体作通用过程的参数时,在定义通用过程时“形参表”中形参的类型要定义为 Form,其格式为:
Sub 过程名(变量名 As Form)
– 调用过程时的实参为窗体名,即窗体的 Name
属性。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.5 对象参数
【 例 6-8】 编写程序,运行程序时,单击窗体并输入窗体增加的宽度和高度值,改变窗体的大小。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.5 对象参数
控件参数
– 和窗体参数一样,控件也可作为通用过程的参数,即在一个通用过程中设置相同性质控件的所需要的属性,然后用不同的控件调用此过程。
用控件作通用过程的参数时,在定义通用过程时“形参表”中形参的类型要定义为 Control,
其格式为:
Sub 过程名(变量名 As Control)
– 调用过程时的实参为控件名,即控件的 Name
属性。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3 参数传递
6.3.1 形参与实参
6.3.2 值传递与地址传递
6.3.3 数组参数
6.3.4 可选参数和可变参数
6.3.5 对象参数
6.3.6 过程的作用域
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.6 过程的作用域
在 Visual Basic中,过程的作用范围分为模块级
(或称文件级 )和全局级 (或称工程级 )。
– 模块级过程是在某个模块内定义的过程。如果在 Sub或
Function过程前加 Private,则该过程只能被本模块中定义的过程调用,即其作用范围为本模块。
– 全局级过程是定义过程时,在 Sub或 Function前加关键字 Public(系统默认为 Public)。全局级过程可被整个应用程序的所有模块中定义的过程调用,即其作用范围是整个应用程序。
– 在工程中的任何地方都能调用其他模块中的全局过程。
调用其他模块中的过程的方法取决于该过程所属的模块是在窗体模块、标准模块还是类模块。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.6 过程的作用域
调用窗体中的过程
– 所有窗体模块的外部调用必须指向包含此过程的窗体模块,其格式为:
Call 窗体名,全局过程名 [(实参表 )]
调用标准模块中的过程
– 如果过程名是唯一的,则不必在调用时加模块名。无论是在模块内,还是在模块外调用,结果总会引用这个唯一过程。
– 如果有两个以上的模块包含同名的过程,则调用本模块内过程时不必加模块名,而调用其他模块的过程时必须以模块名为前缀。其格式为:
Call [标准模块名,]全局过程名 [(实参表 )]
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.6 过程的作用域
调用类模块中的过程
– 调用类模块中的全局过程,要求指向该类的某一实例作前缀。首先声明类的实例为对象变量,
并以此变量作为过程名前缀,不可直接用类名作为前缀。其格式为:
Call 变量,过程名 [(实参表 )]
– 如类模块 Class1,类模块的过程 ClassSub,变量名为 ExClass,调用过程的语句为:
Dim ExClass As New Class1
Call ExClass.ClassSub(实参表 )
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.3.6 过程的作用域
【 例 6-9】 全局过程的调用示例
– 应用程序中包括两个窗体 Form1,Form2和一个标准模块 Module1。
在 Form1窗体中定义一个计算矩形面积的全局级 Function过程
Area,在标准模块 Module1中定义一个计算矩形周长的全局级
Function过程 Circ,如图所示
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4 键盘与鼠标事件过程
6.4.1 键盘事件
6.4.2 鼠标事件
6.4.3 拖放操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
Visual Basic中的对象识别键盘事件,包括
KeyPress,KeyUp和 KeyDown事件。
– 用户按下并且释放一个 ANSI键时就会触发
KeyPress事件;
– 用户按下一个键时触发 KeyDown事件,释放引发 KeyUp事件。
– 在引发键盘事件的同时,用户所按的键盘码作为实参传递给相应的事件过程,供程序判断识别用户的操作。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
KeyPress事件
– 当用户按下并松开一个 ANSI键时将触发 KeyPress事件,
KeyPress事件的语法格式如下:
Private Sub Object_KeyPress( [ index As Integer,]
KeyAscii As Integer)
– 其中 Object 表示一个对象,即接收按键的对象; index
用于控件数组,用来唯一标识在控件数组中的一个控件(如果没有控件数组则不出现该参数); KeyAscii返回按键对应的 ASCII码的整型数值。 KeyAscii的值通过引用传递,对它进行改变可给接收按键对象发送一个不同的字符。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
【 例 6-10】 在窗体上放一文本框,编写一事件过程,保证在该文本框内只能输入字母,且无论大小写,都要转换成大写字母显示 。 程序如下:
Private Sub Text1_KeyPress( KeyAscii As Integer)
Dim str$
If KeyAscii < 65 Or KeyAscii > 122 Then
Beep
KeyAscii = 0
ElseIf KeyAscii >= 65 And KeyAscii <= 90 Then
Text1 = Text1 + Chr( KeyAscii)
Else
str = UCase( Chr( KeyAscii))
KeyAscii = 0
Text1 = Text1 + str
End If
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
KeyDown及 KeyUp事件
– KeyPress事件只识别 ENTER,TAB和
BACKSPACE及标准键盘上的字母、数字、标点等标准 ASCII字符。如要检测其他功能键、
编辑键和定位键,则需要利用 KeyDown和
KeyUp事件。其基本语法格式为:
Private Sub Object_KeyDown([ index As Integer,]
KeyCode As Integer,,Shift As Integer)
Private Sub Object_KeyUp([ index As Integer,]
KeyCode As Integer,,Shift As Integer)
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
KeyDown及 KeyUp事件
– 其中 Object 表示一个对象,即接收按键的对象;
index用于控件数组,用来唯一标识一个在控件数组中的控件
(如果没有控件数组则不出现该参数);
KeyCode返回按键对应的 ASCII码的整型数值。
Shift用来表示按键时 SHIFT,CTRL和 ALT键的状态的一个整数。这 3个键分别以二进制方式表示,每个键用三位,即 Shift
键为 001,Ctrl键为 010,A1t键为 100。
如果同时按下上面两个或三个键时,Shift参数的值即为上述两者或三者之和,因此 Shift参数共可取 8种值
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.1 键盘事件
【 例 6-11】 显示所按键的状态,并判断是否是
F10键。程序如下:
Private Sub Text2_KeyDown(KeyCode As Integer,Shift As Integer)
Dim Msg As String
If Shift And vbCtrlMask Then Msg = Msg & ″Ctrl ″
If Shift And vbAltMask Then Msg = Msg & ″Alt ″
If Shift And vbShiftMask Then Msg = Msg & ″Shift ″
If KeyCode = vbKeyF10 Then Msg = Msg & ″F10 ″
Label1.Caption = Msg & KeyCode
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4 键盘与鼠标事件过程
6.4.1 键盘事件
6.4.2 鼠标事件
6.4.3 拖放操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.2 鼠标事件
鼠标对于 Windows应用程序设计来说几乎是必需的,尤其是在图形图像处理的程序设计中,显得更为重要。而鼠标应用的基础是鼠标事件。
鼠标事件除了单击( Click)和双击
( DblClick)外,基本的鼠标事件还有 3个:
– MouseDown,MouseUp和 MouseMove。
– 工具箱中的大多数控件都能响应这 3个事件。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.2 鼠标事件
语句格式如下:
Private Sub Object_Click()
Private Sub Object_DblClick()
Private Sub Object_MouseDown( [index As Integer,]
Button As Integer,Shift As Integer,X As Single,Y
As Single)
Private Sub Object _MouseUp( [index As Integer,]
Button As Integer,Shift As Integer,X As Single,
Y As Single)
Private Sub Object _MouseMove( [index As Integer,]
Button As Integer,Shift As Integer,X As Single,
Y As Single)
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.2 鼠标事件
– 其中:
Object是事件对象。
– index用于控件数组,用来唯一标识一个在控件数组中的控件(如果没有控件数组则不出现该参数)。
– Button返回一个整数,用来标识鼠标哪个键被按下或释放。
用一个 3位二进制数表示鼠标按钮的哪一个按钮起作用,
Button取值与鼠标按键的对应关系见表 6.2。
– Shift为 Shift,Ctrl,Alt键的状态,其含义同键盘事件中的
Shift。
– X,Y表示鼠标在当前获得焦点的控件的相对坐标。即鼠标指针的位置。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.2 鼠标事件
【 例 6-12】 随着鼠标的移动,在窗体上写出鼠标的位置(如图 6.9)。程序如下:
Private Sub Form_MouseMove(Button As Integer,
Shift As Integer,X As Single,Y As Single)
CurrentX = X
CurrentY = Y
Print X; Y
End Sub
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4 键盘与鼠标事件过程
6.4.1 键盘事件
6.4.2 鼠标事件
6.4.3 拖放操作
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
在设计模式下,各控件都可用鼠标随意拖放的方式来改变控件的大小与位置。
Visual Basic提供了拖放功能,使用户在程序运行时也具有拖放的能力。
拖放是指运行时将控件拖到新的位置,包括两个操作:拖动和放下。
– 拖动是按下鼠标键并移动控件,而放下是指释放鼠标键。拖放操作涉及被拖动的对象,即源对象和将要放在其上的目标对象。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
与拖放操作相关的属性、事件和方法
– 除菜单、计时器和通用对话框外,Visual Basic中的其他控件都支持拖放功能。
属性
– DragMode属性
返回或设置一个值,确定在拖放操作中所用的是手动还是自动 拖动方式。该属性有两种取值:缺省值为 0,表示手工拖放模式,这时可以用手工方式来确定拖放操作何时开始或结束;如 果设为 1,表示被设置为自动拖放模式。如果 DragMode 属性设置为 1时,这时控件不能正常响应鼠标事件。
– DragIcon属性
设置或返回拖放操作中的对象拖动图标。在拖动控件时,
Visual Basic将控件的灰色轮廓作为缺省的拖动图标。对
DragIcon属性进行设置,就可用其他图像代替该轮廓。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
与拖放操作相关的属性、事件和方法
– 属性
MousePointer属性
– 在运行时当鼠标移到对象的一个特定部分时,该值只是被显示的鼠标指针的类型。 MousePointer属性的取值是一个整数,有 17种取值的可能
– 鼠标光标的形状既可以在属性窗口中设置,也可以在程序代码中设置。在属性窗口中设置 MousePointer属性时,首先,选中要改变鼠标形状的对象,在属性窗口中找到
MousePointer属性,然后单击属性设置框右端的下拉箭头,
从中就可以选择光标形状的各种值。在程序代码中可随意设置对象的鼠标形状,其语法格式如下:
对象,MousePointer = 值
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
属性
– MouseIcon属性
设置和返回自定义的鼠标图标。既可以在属性窗口中设置,也可以通过代码设置。其格式为:
对象,MouseIcon = LoadPicture( pathname)
利用该属性用户可以使用自己制作的图标文件来显示鼠标形状。如果要用自定义的光标形状,首先把对象的 MousePointer属性设为 99,然后再把对象的
MouseIcon属性设成自定义的图标文件。图标文件
(扩展名为,ico)必须和其他光标图标一样为
16× 16像素。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
事件
– DragDrop事件
当把一个控件拖动到目标对象,并释放鼠标按钮时,或使用
Drag方法,并将其 action参数被设置为 2(Drop)时,触发目标对象的 DragDrop事件。其语法格式为:
Private Sub Object_DragDrop(Source As Control,X As
Single,Y As Single)
……
End Sub
该事件有三个参数:
– Source参数引用被拖动的对象,可以通过 Source来引用或设置被拖动对象的各种属性;
– X和 Y表示当完成拖动过程松开鼠标时,鼠标的位置。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
事件
– DragOver事件
当拖放操作正在进行并越过一个控件时,触发该控件的
DragOver事件,语法格式为:
Private Sub Object_DragOver(Source As Control,X As Single,
Y As Single,State As Integer)
……
End Sub
该事件的前三个参数的含义与 DragDrop事件相同。
State参数是一个整数,表示拖动的状态,其取值如下:
– 0:进入(源控件正被向一个目标控件范围内拖动)
– 1:离开(源控件正被向一个目标控件范围外拖动)
– 2:跨越(源控件在目标控件范围内从一个位置移到了另一位置)
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.4.3 拖放操作
自动拖放和手工拖放
– 拖放操作分为自动方式和手工方式,这由源对象的 DragMode属性值决定的。
– 自动拖放
把控件的 DragMode属性设为 1,即可实现控件的自动拖放功能。
– 手工拖放
手工拖放的原理与自动拖放基本一样,只有以下三点不同:
1) DragMode属性值为 0。
2)允许控件在拖动之前响应 MouseDown事件(自动拖放不能响应)。
3)必须用 Drag方法手动激活拖放操作。即把 Drag方法的参数设为 1
来激活拖动操作,设为 0或 2停止拖动操作。如果设为 2,则在停止拖放后触发 DragDrop事件。
– 一般 Drag方法都和 MouseDown,MouseUp事件结合使用,实现手动拖放。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5 嵌套调用和递归算法
6.5.1 嵌套调用
6.5.2 递归算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.1 嵌套调用
Visual Basic不能嵌套定义过程,但 Visual
Basic中可以嵌套调用过程,也就是主程序可以调用子过程,在子过程中还可以调用另外的子过程,这种程序结构称为过程的嵌套。
主程序 子过程 1 子过程 2
① ② ③ ④
调用子过程 1 调用子过程 2 ⑤
⑨ ⑧ ⑦ ⑥
结 束 E n d S u b E n d S u b
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.1 嵌套调用
【 例 6-13】 计算组合公式的结果。
– 分析:如果求组合数用一个 Function过程
Comb来实现,则该过程中需要调用求阶乘 n!
的 Function过程 Fact。输入两个数 m,n,通过控件事件过程调用 Comb函数,计算组合数据的结果。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5 嵌套调用和递归算法
6.5.1 嵌套调用
6.5.2 递归算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.2 递归算法
递归分为两种类型,
– 一种是直接递归,即在过程中调用过程本身;
– 另一种是间接递归,即间接地调用一个过程,
例如第一个过程调用了第二个过程,第二个过程又回过头来调用第一个过程。
递归调用在完成阶乘运算、级数运算、幂指数运算等方面特别有效。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.2 递归算法
【 例 6-14】 用递归的方法计算 n!。
– 分析:自然数 n的阶乘可以递归定义为:
n!=1(N=0),n! =n*(n-1)!(n<>0)
– 递归的结束条件为,n=1时,n!=1。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.5.2 递归算法
【 例 6-15】 Hanoi塔问题:传说印度教的神梵天创造世界时,在印度北部佛教圣地贝拿勒斯圣庙里,安放了一块黄铜板,板上插着三根针,
在其中一根针上自下而上放着由大到小的 64个金盘,梵天要求僧侣们坚定不移地按下面规则把 64个盘子移到另一根针上:
– 一次只能移一个盘子。
– 盘子只许在三根针上存放。
– 永远不许大盘压小盘。
分析:这是一个典型的只能用递归方法解决的问题。将 n
个盘子从 A针移到 C针可以分解为以下三个
– 步骤:
(1) 将 A上 n- 1个盘子借助 C针先移到 B针上。
(2) 把 A针上剩下的一个盘子移到 C针上。
(3) 将 n- 1个盘子从 B针借助于 A针移到 C针上。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社第 6章 过程与函数
6.1 过 程
6.2 函 数
6.3 参数传递
6.4 键盘与鼠标事件过程
6.5 嵌套调用和递归算法
6.6 过程应用及常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6 过程应用及常用算法
6.6.1 过程应用实例
6.6.2 常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.1 过程应用实例
【 例 6-16】 求 2~ 100以内的质数。
【 例 6-17】 求 999以内的完全数。所谓完全数是指这样的自然数:它的各个约数(不包括该数自身)之和等于该数自身。如
28=1+2+4+7+14就是一个完全数。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6 过程应用及常用算法
6.6.1 过程应用实例
6.6.2 常用算法
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
数制转换
– 不同进制数之间的转换,可通过编程来实现,
也可通过 Visual Basic提供的内部函数:十进制转换为八进制函数( Oct)、转换为十六进制函数( Hex)来实现。
【 例 6-18】 编写函数,实现一个十进制整数转换成二至十六任意进制的字符。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
加密和解密
– 在当今信息社会,信息的安全性得到了广泛的重视,信息加密是一项安全性的措施之一。信息加密有各种方法,最简单的加密方法是:将每个字母加一序数,称为密钥。例如,加序数
5,这时,A”对应,F”,,a”对应,f”,,B”对应,G”,,Y”对应,D”,,Z”对应,E”;解密是加密的逆操作。
【 例 6-19】 编写加密和解密的程序,即将输入的一行字符串中的所有字母加密,同时,加密后还可以进行解密。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
查找、插入和删除数据
– 查找是在数组中,根据指定的关键值,找出与其值相同的元素。一般有顺序查找和二分法查找。
【 例 6-20】 顺序查找
– 算法:根据查找的关键值与数组中的元素逐一比较,若相同,查找成功,若找不到,则查找失败。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
查找、插入和删除数据
– 【 例 6-21】 二分法查找
算法:首先将数组排序,将要查找的关键值同数组的中间元素比较,若相同则查找成功结束;否则判别关键值落在数组的哪一部分,然后保留一半,舍弃另一半。如此重复上述查找,直到查找到或数组中没有这样的元素。二分法查找每进行一次,就把数据的个数减少一半。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
查找、插入和删除数据
– 【 例 6-22】 假定有数组声明 a( 1 to n )的有序数组,在指定位置 k(1<=k<=n-1)处插入一个元素,首先把最后一个元素往后移动一个位置,
再依次把前一个元素向后移,直到把 k个元素移动完毕;这样第 k个元素的位置腾出,就可将数据插入。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
插入排序和合并排序
– 在前一章介绍的选择法、冒泡法排序都是在欲排序的数组元素全输入后,再进行排序。而插入排序是每输入一个数,马上插入到数组中,
数组在输入过程中总是有序的。在插入排序中,
涉及前面介绍的查找、数组内元素的移动和元素插入等算法。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
插入排序和合并排序
– 【 例 6-23】 用插入排序法输入不多于 20个数,使数组保持递增的序列。
– 算法分析:对数组中已有 n-1个有序数,当输入某数 x时,
插入排序法的步骤如下:
( 1)找 x应在数组中的位置 j。
( 2)从最后一个数 (下标为 n -1)
开始共 n -j个数依次往后移,
使位置为 j的数让出。
( 3)将数 x放入数组中应有的位置 j,
一个数插入完成。
对于若干个数输入,只要调用插入排序过程即可。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
插入排序和合并排序
– 【 例 6-24】 假设有序的数组为 A,B,合并后的数组为 C。
– 合并排序的算法为:
( 1)先在 A,B数组中各取第一个元素进行比较,
将小(递增次序)的放入 C数组的第 1个元素;
( 2)取小的元素所在的数组的下一个元素与上次比较时较大的元素比较,重复上述比较过程,直到某个数组先排完;
( 3)将剩余的元素抄入 C数组,合并排序完成。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社
6.6.2 常用算法
字符处理应用
– 【 例 6-25】 编写一个英文打字训练的程序,要求如下:
( 1)在标签框内随机产生 30个字母的范文; 2)当焦点进入文本框时开始计时,并显示当时的时间; 3)在文本框中按照产生的范文输入相应的字母; 4)当输满 30个字母时结束计时,禁止向文本框输入内容,并显示打字的速度和正确率。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社学完本章你应能够:
了解过程的概念及分类;
理解 Sub过程的定义,Sub过程的调用;
理解 Function过程的定义,Function过程的调用;
掌握参数传递,传值与传址的概念及实现;
理解过程的作用域及对象参数;
掌握几种常用的算法。
Vis
ua
l B
as
ic
P
ro
gr
am
mi
ng
中国科学技术出版社思 考 题
1,简述过程的分类和子过程的特点。
2,Sub过程和 Function过程有什么不同?调用的方法有什么区别?
3,什么是形参和实参?
4.,传值”和“传址”有什么区别?
5,什么是变量的作用域?变量的作用域如何分类?
6,如何在程序运行过程中改变鼠标的形状?