5.1 过程的基本概念
5.2 Sub过程
5.3 Function过程
5.4 过程的参数传递
5.5 实践检验第 5章 过 程本章知识点:
事件过程、通用过程,Function过程的各自特点
过程的创建及调用,过程的作用范围
形式参数与实际参数、按值传递与按地址传递的概念第 5章 过 程
5.1 过程的基本概念
“过程”是包含在过程声明语句和过程结束语句之间的 VB.NET 语句块。
所有的 VB.NET 语句代码都是在过程内部编写的。
过程从代码中的其他某处被调用。当过程执行结束时,它将控制返回给调用它的代码,此代码称为“呼叫代码”。呼叫代码是一个语句或语句内的表达式,它通过名称指定过程并将控制转让给它。
5.1.1 过程种类在 VB中,除了系统提供的内部函数过程和事件过程外,用户可自定义下列 4种过程。
-- Sub保留字开始的为子过程,不返回值。
-- Function保留字开始的为函数过程,返回一函数值给呼叫代码。
-- Property保留字开始的为属性过程,返回和分配对象或模块上的属性值。
-- Event保留字开始的为响应由用户操作或程序中的事件触发而执行的
Sub 过程。
本章将主要讨论前 2种过程,Property过程和 Event过程将在第 8章介绍。
5.1.2 过程的特点用过程构造代码有以下特点:
-- 应用程序中的每行代码都必须在某个过程的内部,如果将大过程细分为更小的过程,应用程序的可读性将更强。
-- 过程对执行重复或共享的任务很有用。可以在代码中的许多不同位臵调用过程,因此可以将过程用作应用程序的生成块。
-- 过程允许将程序分为不连续的逻辑单元。调试单独的单元与调试不包含过程的整个程序相比要容易。
-- 可以在其他程序中使用为某个程序开发的过程,而通常只需少量修改甚至不需修改。
5.2.1 事件过程与通用过程
VB.NET的 Sub过程分为事件过程和通用过程两大类。事件是可被某对象识别的操作或结果(如单击命令按钮或数值超限等),可以为它编写响应代码。事件可以作为用户操作或程序计算的结果发生,也可以由系统触发。
事件处理过程是为响应特定事件而编写的代码。有时多个不同的过程段需要使用同一段程序代码,为此,可将这段代码独立出来,编写为一个共用的过程,这种过程通常称为通用过程,它独立于事件过程之外,可供其他过程调用。
对象事件的语法格式为:
Private Sub<对象名 >_<事件名 >(<参数列表 >) [Handles <事件列表 >]
<语句组 >
End Sub
其中:
Handles关键字为可选参数,指示此过程是否可以处理一个或多个特定事件。
5.2 Sub过程
<事件列表 >包括所有共享此过程的(事件)过程名。
<语句组 >就是程序设计者编写的事件响应程序代码。
虽然可以自己键入事件过程的声明语句,但 VB.NET可自动声明,自动声明不仅快捷,而且不会出现人为错误,是一种值得提倡的方法。具体方法如下:
在代码窗体中,从“对象下拉列表框”中选择一个对象,从“过程下拉列表框”中选择一个事件过程名,就可在代码窗口中生成一个事件过程声明模板。例如:当对象选为窗体 Form1,过程选择为 Click,则在代码窗口就生成如图 5-1所示的声明模板。
通用过程只有在被调用时才被执行,主调程序可以是事件过程,也可以是通用过程。通用过程可以保存在窗体模块和标准模块中,其与事件过程不同之处在于,通用过程不是由对象的某个事件激活的,因此,通用过程的创建方法与事件过程有所不同。
5.2.2 通用过程的创建已经学习了事件过程的创建方法,那么通用事件呢?可以在“代码编辑窗口”中直接输入用户创建的过程,此时,代码窗口中的“对象下拉列表框”变为“常规”,“过程下拉列表框”显示“声明”。
通用过程的定义形式如下:
[<访问修饰符 >] Sub<过程名 >([<形参表 >])
<过程体 >
End Sub
说明:
( 1) <访问修饰符 >为可选项,可以是以下内容之一。
-- Public,全局过程,没有访问限制,为默认访问修饰符。
-- Protected,受保护过程,只能从其自身的类或派生类访问。
-- Friend,友元过程,只可从包含其声明的程序集内访问。
-- Private,私有过程,只能在模块级使用 Private。
( 2) <过程名 >使用与变量名相同的命名规则。过程名不返回值,而是通过形参与实参的传递得到结果,调用时可返回多个值。
( 3) <过程体 >是 VB的程序段,除一般的执行语句外,还可以包含局部变量或常数定义语句及 Exit Sub从过程中跳出的语句。
( 4) <形参表 >的语法格式。
[Optional] [{ByVal]|[ByRef}] [ParamArray]<变量名 >[As<类型 >][=<默认值 >]
其中:
-- Optional表示参数不是必须的关键字。如果使用了该选项,则(形参表)中的后续参数都必须是可选的,而且必须都使用 Optional关键字声明。
如果使用了 ParamArray,则任何参数都不能使用 Optional。
-- ByVal表示该参数按值传递; ByRef表示该参数按地址传递。 ByRef是
VB的默认选项。
-- ParamArray只用于形参表的最后一个参数,使用 ParamArray关键字可以提供任意数目的参数。 ParamArray关键字不能与 ByVal,ByRef或
Optional一起使用。
-- <变量名 >代表参数的变量的名称,遵循标准的变量命名约定。如果是数组变量,要在数组名后加上一对圆括号。
-- <默认值 >代表任何常数或常数表达式,只对 Optional参数合法。如果类型为 Object,则显式的默认值只能是 Nothing。
5.2.3 通用过程的调用可以使用独立的调用语句来显式调用 Sub过程,不能在表达式中使用过程名称来调用该过程,必须提供所有必选参数的值,并且必须用括号将实参数列表括起来。如果未提供任何参数,则也可以选择省略括号。
调用 Sub过程的语法如下所示:
[Call] <过程名 > [(<实参表 >)]
Call 关键字是可选项。
例 5-1 调用全局过程。
设计说明:
在工程中建立三个模块,Form1窗体模块,Form2窗体模块,Module1标准模块。其中,Form1,Form2窗体界面分别如图 5-2( a)、( b)所示。
在上述三个模块中分别建立三个全局过程,F1_test(a As Form),F2_test(a
As Form),M_test(a As Form),代码如下:
Form1窗体代码如下:
Public Sub F1_test()
Me.Label1.Text = "执行 Form1窗体过程 F1_test" '输出到 Label1
End Sub
Form2窗体中的全局过程 F2_test代码如下:
Public Sub F2_test()
Form1.Label2.Text = "执行 Form2窗体过程 F2_test"
'输出到 Form1窗体的 Label2
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Call F2_test() '调用其他窗体模块中的 Public过程必须加窗体模块名
End Sub
Module1中的全局过程 M_test代码如下:
Sub Main()
Dim f1 As New Form1
f1.Show()
End Sub
Public Sub M_test()
Form1.Label3.Text = "执行 Module1中 M_test过程 "
'输出到 Form1窗体的 Label3
End Sub
程序运行结果如图 5-2( c)所示。
例 5-2 计算 5!,6!,8!以及 5! +6! +8!,如图 5-3所示。
设计说明:
在 Form1窗体中包含一个 Label1框,4个 Button控件,4个命令按钮的
Text属性如图 5-3( a)所示,其从左到右 4个命令按钮的 Tag属性分别为
5,6,8,7,运行界面如图 5-3 ( b)所示。
4个 Button控件共享的 Click代码为:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click,Button2.Click,Button3.Click,
Button4.Click
Dim Sum As Long
Call Fact(sender.TAG,Sum) '实参 Sum的类型必须与形参 Total一致,即 Long型
If sender,Tag = 7 Then Sum = Sum / 42 + Sum / 7 + Sum * 8
5!+6!+8!,此处 Sum=7!
Label1.Text = sender,Text & " = " & Sum
End Sub
计算阶乘 n的通用过程 Fact为:
Private Sub Fact(ByVal n As Integer,ByRef Total As Long)
Dim i As Integer
Total = 1
For i = 1 To n
Total = Total * i
Next
End Sub
在应用程序设计中,有时需要让单个事件处理程序用于多个事件或者让多个事件引发同一过程。本例的 4个命令按钮的 Click事件共享 Button1_Click
事件处理程序,是通过使用 Handles 关键字实现的。
Button1_Click事件处理过程的第一个参数 sender 提供对引发事件的对象的引用,通过引用对象的属性( Tag或 TabIndex等)可获得一些信息。上面示例中的第二个参数 e 传递针对要处理事件的对象,如鼠标事件中鼠标的位臵。
5.3 Function过程
VB函数分为内部函数和外部函数。内部函数在 2.8节已做介绍(见表 2-
13所示),如 Cos,Sqrt,Len等。外部函数是用户根据需要用 Function关键字定义的函数过程,与 Sub过程不同的是通常 Function过程将返回一个值。
因此,Function过程的调用常出现在表达式中或赋值语句中,尽管 Function
过程可以作为基本语句使用,但一般不用。而 Sub过程没有返回值,都是作为独立的基本语句使用。
Function过程是包含在 Function 语句和 End Function 语句之间的一系列
Visual Basic语句。每次调用过程时都执行过程中的语句,从 Function 语句后的第一个可执行语句开始,到遇到的第一个 End Function,Exit Function
或 Return 语句结束。
Function过程与 Sub过程相似,但它还向调用程序返回值。 Function过程可以带呼叫代码传递给它的参数,如常数、变量或表达式。
声明 Function过程的语法如下所示:
[<访问修饰符 >] Function <函数名 >([<形参表 >]) [ As﹤ 类型 ﹥ ]
[ <局部变量或常数定义 >]
[ ﹤ 语句体 ﹥ ]
[ ﹤ 函数名 ﹥ = ﹤ 表达式 ﹥ ] 或 [ Return ﹤ 表达式 ﹥ ]
End Function
Sub 过程相同 <访问修饰符 >可以是 Public,Protected,Friend、
Protected Friend 或 Private。
可以在模块、类和结构中定义 Function 过程。默认情况下它们是 Public,
这意味着可以从应用程序中的任意位臵调用它们。
说明:
-- Function过程以,Function”开头,以,End Function”结束。
-- ﹤ 函数名 ﹥ 是 Function的过程名字,命名规则与变量名规则相同。在函数体内,函数名可以当变量使用,函数的返回值可以通过对函数名的赋值语句来实现的,即函数值通过函数名返回,因此在函数过程中至少要对函数名赋值一次。
-- As﹤ 类型 ﹥ 是指函数返回值的类型,如果类型检查开关( Option
Strict 语句)为 On,则为必选项。
--﹤ 语句体 ﹥ 是程序段,可有一个或多个 Exit Function语句退出函数过程,常常是与选择结构( If或 Select Case语句)联用,即当满足一定条件时,
退出函数过程。
-- 格式中的其他内容与 Sub过程中相同。
在需要将值返回给调用代码时,请使用 Function 过程。在不需要返回值时,请使用 Sub 过程。
例 5-3 用 Function过程实现例 5-2(计算 5!,6!,8!以及 5! +6!
+8!)。
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click,Button2.Click,Button3.Click,
Button4.Click
Dim sum&
sum = Fact(sender.TAG) '实参 Sum的类型必须与形参 Fact一致,
即 Long型
If sender.TAG = 7 Then sum = Fact(5) + Fact(6) + Fact(8)
Label1.Text = sender.Text & " = " & sum
End Sub
计算阶乘 n的通用过程 Fact为:
Private Function Fact(ByVal n As Integer) As Long
Dim i As Integer
Fact = 1
For i = 1 To n
Fact = Fact * i
Next
End Function
例 5-4 求三个数的最大公约数。
用两数最大公约数 Function过程来实现。
分析:
由数学中的知识可知,两整数 n,m 的最大公约数为,n× m/(最小公倍数)。
用“辗转相除法”,n存放大数,r放余数。
r ≠0时,重复 m→ n,r→ m,r = n Mod m
r=0时,m中的数就是开始 m与 n的最大公约数。
将 n与 m的最大公约数与 k用相同的方法,求出最终的最大公约数。
窗体界面设计如图 5-5所示,这里给出命令按钮的 Click事件代码及
ComDiv过程代码:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim n,m,k As Long
n = Val(TextBox1.Text)
m = Val(TextBox2.Text)
k = Val(TextBox3.Text)
If n * m * k = 0 Then Exit Sub
Label1.Text = ComDiv(ComDiv(n,m),k)
End Sub
Private Function ComDiv(ByVal n&,ByVal m&) As Long
Dim c,r As Integer
If m > n Then c = m,m = n,n = c
Do
r = n Mod m
n = m,m = r
Loop While r <> 0
Return n
End Function
5.4.1 形式参数与实际参数呼叫语句传递给过程的每个值称为“实参”(实际参数),实参可以是常量、变量或表达式。
过程中需要另外一些参数来接收这些实参值,这些参数称为“形参”
(形式参数),形参是在 Sub或 Function过程的定义中出现的变量名,形参中的数组一般不指明大小,但要有括号,定长字符串不能作形参。
调用一个过程时必须完成形参与实参的结合,即把实参的值传给形参,
然后按实参的值执行被调用过程。
参数传递是指呼叫语句的实际参数值传递给被呼叫过程中对应的形参,
这个过程称为“虚实”结合。
5.4.2 按值( ByVal)传递与按地址( ByRef)传递在定义过程时,用关键字 ByRef说明的参数,是定义按地址传递参数,
就是让过程根据变量的地址访问实际变量的内容,即形参与实参使用相同的内存单元,这样通过子程序就可以改变变量本身的值。
5.4 过程的参数传递在定义过程时,用关键字 ByVal说明的参数就是按值传递的参数,此类型的参数在过程被调用时,实际参数的数据“赋值”到形参中。此后,在过程体中的语句对该参数的任何改变,都与实参变量无关,即过程调用前后,
与该类形参对应的实参变量值保持不变。按值传递时,由于传递的只是变量的副本,因此比较安全。 VB.NET默认按值传递参数。
例 5-5 编一个交换两个整型变量值的 Sub过程。
Private Sub Swap(ByRef X As Integer,ByRef Y As Integer)
Dim Temp As Integer
Temp = X
X = Y
Y = Temp
End Sub
试想,这里为什么要使用按址传递参数?如果改用按值传递会出现什么结果?
再看下面的一段程序:
Private Sub SubA(ByRef A1 As Integer,ByRef A2 As Integer,ByVal
A3 As Integer)
A1 = A1 + 1
A2 = A2 + 1
A3 = A3 + 1
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button1.Click
Dim x,y As Integer
x = 1,y = 2
Call SubA(2 * 3,(X),Y)
Label1.Text = "X=" & x & " Y=" & y
End Sub
输出的结果是:
X= 1 Y= 2
这是由于实参 X外加了一个圆括号,将原来形参 A2按地址传递定义,强行改为按值传递。
5.4.3 传递数组数组作参数是通过地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:
-- 为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表中,并略去数组的上下界,但括号不能省略。如
Private Sub Sort( a() As single)
……
End Sub
其中,形参,a()”即为数组。
-- 被调过程可通过 Ubound函数确定实参数组的上界。
-- 当用数组作形参时,对应的实参必须也是数组,且类型一致。
-- 实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。
实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。
例 5-6 编写一个通用排序程序(升序) Sort()。产生 n个两位随机整数输出,再调用过程 Sort(),再输出排序后的上述随机数,如图 5-6 所示。
Private Sub Sort(ByVal A() As Integer)
Dim i,j,t As Integer
For i = LBound(A) To UBound(A) - 1
For j = i + 1 To UBound(A)
If A(i) > A(j) Then
t = A(i),A(i) = A(j),A(j) = t
End If
Next
Next
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim i,n,A() As Integer '定义动态数组
Label1.Text = ""
n = Val(InputBox("请输入数组元素的个数 ","冒泡排序 ",0))
ReDim A(n)
For i = 1 To n
A(i) = Int(Rnd() * 90) + 10
Label1.Text &= A(i) & " "
Next
Label1.Text &= Chr(10)
Sort(A)
For i = 1 To n
Label1.Text &= A(i) & " "
Next
End Sub
5..4.4 可选参数的使用
1 可选参数 ( Optional)
在定义过程的形参表中使用关键字 Optional声明的参数是可选参数。如果一个过程某个形参为可选参数,则在调用此过程时可以不提供对应于这个形参的实参。若一个过程有多个形参,当它的一个形参被设定为可选参数,则这个参数后面的其他参数也必是可选的,并且要用 Optional关键字来声明。
在 VB.NET2005中,每个可选参数都必须声明一个默认值,如果调用程序不提供该参数,则将默认值传递给过程。
例 5-7 2个命令按钮的 Click事件过程中,都含有调用同一个 Sub过程
( Ndres)的语句,其中一个调用语句向 Ndres传递一个参数;而另一个调用语句向 Ndres传递两个参数,如图 5-7( a)所示。
过程 Ndres将传递来的参数添加到列表框中,用 Optional关键字声明第二个参数,运行结果如图 5-7( b) 所示 。
Private Sub Ndres(ByVal x As String,Optional ByVal y As String = "地址不详 ")
Dim Temp As String
Temp = x & y
ListBox1.Items.Add(Temp)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button1.Click
Dim strName As String
strName = "张 三 "
Ndres(strName) '提供了一个参数。
End Sub
Private Sub Button2_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button2.Click
Dim strName,strAddress As String
strName = "李 四 "
strAddress = "成都市人民南路三段 3号 "
Ndres(strName,strAddress) '提供了两个参数。
End Sub
2 参数数组通常,调用的过程所包含的参数不能超出过程声明指定的数目。当需要数量不确定的参数时,可声明一个“参数数组”。
用 ParamArray 关键字表示参数数组。适用以下规则:
-- 每一个过程只能引用一个数组作为参数。
-- 作为参数的数组只能放在所有参数最后面。
-- 数组参数只能按值传递。
-- 数组参数只能是一维的,且数组中所有的元素数据类型必须一致 。
例 5-8 运用参数数组,使之可以接收任意个参数。
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button1.Click
TextBox1.Text = ""
StudentScores("Anne","10","26","32","15")
StudentScores("Mary","High","Low")
Dim JohnScores() As String = {"Absent","35","21","30"}
StudentScores("John",JohnScores)
End Sub
Sub StudentScores(ByVal Name As String,ByVal ParamArray Scores()
As String)
Dim I As Integer
TextBox1.Text &= "Scores for " & Name & ":" & Chr(13) &
Chr(10)
For I = 0 To UBound(Scores)
TextBox1.Text &= "Score " & I & "," & Scores(I) & Chr(13) &
Chr(10)
Next
End Sub
请读者通过源程序及如图 5-8所示给出的结果,理解程序中的每一条语句的含义。
5.4.5过程的嵌套在一个过程( Sub过程或 Function过程)中调用另外一个过程,这种程序结构称为过程的嵌套调用。分析下面 3个过程之间的嵌套调用。
Private Sub SubB(ByVal B1 As Integer,ByRef B2 As Integer,ByVal
B3 As Integer)
B1 = B1 + 1
B2 = B2 + 1
B3 = B3 + 1
Label1.Text &= "B1=" & B1 & " B2=" & B2 & " B3=" & B3 &
Chr(13)
End Sub
Private Sub SubA(ByRef A1 As Integer,ByRef A2 As Integer,ByVal
A3 As Integer)
A1 = A1 + 1
A2 = A2 + 1
A3 = A3 + 1
Call SubB(A1,A2,A3)
Label1.Text &= "A1=" & A1 & " A2=" & A2 & " A3=" & A3 &
Chr(13)
End Sub
Dim x,y As Integer
x = 1
y = 2
Label1.Text = ""
Call SubA(2 * 3,X,Y)
Label1.Text &= "X=" & x & " Y=" & y & Chr(13)
End Sub
上述 3个过程嵌套调用的执行过程,如图 5-9所示。
在事件过程 Button1_Click()中,Call SubA将 6,1,2三个实参值传给 SubA()的 A1,A2,A3,其中 A1,A2是按地址传递,A3是按值传递,
经 SubA()的计算后 A1,A2,A3分别为 7,2,3。
在过程 SubA()中的 Call SubB将 7,2,3三个实参传给 SubB()的 B1,B2、
B3,其中 B1,B2是按地址传递,B3是按值传递,经 SubB()的计算后,B1、
B2,B3分别为 8,3,4。
由于 B1,B2是按地址传递,所以在 SubB()中对 B1,B2值的改变将影响
A1,A2,即 A1为 8,A2为 3,A3按值传递,其值不受影响仍为 3。
在过程 Button1_Click()中,实参 X,Y与 SubA()的 A2,A3结合,其中 A2是按地址传递,A3是按值传递,Y的值不受影响仍为 2。 X值与 A2的值相同,
而 A2的最终值是 SubB()中的 B2值 3。
最终结果如图 5-10所示。
5.5 实践检验理论巩固
( 1)什么是实参?什么是形参?
( 2)试述传值和传地址的异同。
( 3)被调过程如何确定实参数组的上界和下界。
( 4)静态变量的特点是什么?如何定义静态变量?
( 5)过程中定义可选参数使用什么关键字?在 VB.NET2005中,对可选参数的使用有何规定?
( 6)过程中定义参数数组使用什么关键字?在 VB.NET2005中,对参数数组的使用有何规定?
( 7)下列程序运行后,用鼠标单击命令按钮 Button1,输出结果是什么?
Private Sub SM(ByVal A As Integer,ByVal B As Integer,ByVal C As
Integer)
A = A + 1,B = B + 2,C = C + 3
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim X,Y,Z As Int16
X = 9,Y = 8,Z = 2
Call SM(X,Y,Z)
Console.WriteLine("{0} {1} {2}",X,Y,Z)
End Sub
( 8)下列程序运行后,用鼠标单击命令按钮 Button1,输出结果是什么?
Private i As Integer
Private Sub abc()
Static x As Integer,a,b As Char
A = Chr(Asc("A") + i)
B = Chr(Asc("Z") - x)
Console.Write("{0};",a & b)
x = x + 1
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim x As Int16
For i = 0 To 4
x = x + 1
abc()
Next
End Sub
( 9)下列程序运行后,用鼠标单击命令按钮 Button1,输出结果是什么?
Private Sub Sub1(ByRef A As Integer,ByRef B As Integer,Optional
ByVal C As Integer = 0)
A = A + C,B = A + B
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim x,y As Int16
x = 3,y = 4
Sub1(x,(y),5)
Console.Write("{0} {1}",x,y)
End Sub
( 10)下列程序运行后,连续两次单击命令按钮,则输出结果是什么?
Public Function f(ByVal x As Integer)
x = x + 2
f = x
End Function
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button1.Click
Static x,y As Integer
y = 5
x = x + y
y = f(x)
Console.Write("{0} {1} ",x,y)
End Sub
( 11)编制生成 n个 3位随机整数的 SUB过程。
( 12)设数组下标为 1~n,移动第 i个数组元素到第 k位上,k,i∈
( 1~n)。
( 13)编写一个排序的 Sub过程或 Function过程。
上机实战
( 1)编制生成 n个 3位随机整数的 SUB过程。
( 2)设数组下标为 1~n,移动第 i个数组元素到第 k位上,k,i∈
( 1~n)。
( 3)编写一个排序的 Sub过程或 Function过程。
5.2 Sub过程
5.3 Function过程
5.4 过程的参数传递
5.5 实践检验第 5章 过 程本章知识点:
事件过程、通用过程,Function过程的各自特点
过程的创建及调用,过程的作用范围
形式参数与实际参数、按值传递与按地址传递的概念第 5章 过 程
5.1 过程的基本概念
“过程”是包含在过程声明语句和过程结束语句之间的 VB.NET 语句块。
所有的 VB.NET 语句代码都是在过程内部编写的。
过程从代码中的其他某处被调用。当过程执行结束时,它将控制返回给调用它的代码,此代码称为“呼叫代码”。呼叫代码是一个语句或语句内的表达式,它通过名称指定过程并将控制转让给它。
5.1.1 过程种类在 VB中,除了系统提供的内部函数过程和事件过程外,用户可自定义下列 4种过程。
-- Sub保留字开始的为子过程,不返回值。
-- Function保留字开始的为函数过程,返回一函数值给呼叫代码。
-- Property保留字开始的为属性过程,返回和分配对象或模块上的属性值。
-- Event保留字开始的为响应由用户操作或程序中的事件触发而执行的
Sub 过程。
本章将主要讨论前 2种过程,Property过程和 Event过程将在第 8章介绍。
5.1.2 过程的特点用过程构造代码有以下特点:
-- 应用程序中的每行代码都必须在某个过程的内部,如果将大过程细分为更小的过程,应用程序的可读性将更强。
-- 过程对执行重复或共享的任务很有用。可以在代码中的许多不同位臵调用过程,因此可以将过程用作应用程序的生成块。
-- 过程允许将程序分为不连续的逻辑单元。调试单独的单元与调试不包含过程的整个程序相比要容易。
-- 可以在其他程序中使用为某个程序开发的过程,而通常只需少量修改甚至不需修改。
5.2.1 事件过程与通用过程
VB.NET的 Sub过程分为事件过程和通用过程两大类。事件是可被某对象识别的操作或结果(如单击命令按钮或数值超限等),可以为它编写响应代码。事件可以作为用户操作或程序计算的结果发生,也可以由系统触发。
事件处理过程是为响应特定事件而编写的代码。有时多个不同的过程段需要使用同一段程序代码,为此,可将这段代码独立出来,编写为一个共用的过程,这种过程通常称为通用过程,它独立于事件过程之外,可供其他过程调用。
对象事件的语法格式为:
Private Sub<对象名 >_<事件名 >(<参数列表 >) [Handles <事件列表 >]
<语句组 >
End Sub
其中:
Handles关键字为可选参数,指示此过程是否可以处理一个或多个特定事件。
5.2 Sub过程
<事件列表 >包括所有共享此过程的(事件)过程名。
<语句组 >就是程序设计者编写的事件响应程序代码。
虽然可以自己键入事件过程的声明语句,但 VB.NET可自动声明,自动声明不仅快捷,而且不会出现人为错误,是一种值得提倡的方法。具体方法如下:
在代码窗体中,从“对象下拉列表框”中选择一个对象,从“过程下拉列表框”中选择一个事件过程名,就可在代码窗口中生成一个事件过程声明模板。例如:当对象选为窗体 Form1,过程选择为 Click,则在代码窗口就生成如图 5-1所示的声明模板。
通用过程只有在被调用时才被执行,主调程序可以是事件过程,也可以是通用过程。通用过程可以保存在窗体模块和标准模块中,其与事件过程不同之处在于,通用过程不是由对象的某个事件激活的,因此,通用过程的创建方法与事件过程有所不同。
5.2.2 通用过程的创建已经学习了事件过程的创建方法,那么通用事件呢?可以在“代码编辑窗口”中直接输入用户创建的过程,此时,代码窗口中的“对象下拉列表框”变为“常规”,“过程下拉列表框”显示“声明”。
通用过程的定义形式如下:
[<访问修饰符 >] Sub<过程名 >([<形参表 >])
<过程体 >
End Sub
说明:
( 1) <访问修饰符 >为可选项,可以是以下内容之一。
-- Public,全局过程,没有访问限制,为默认访问修饰符。
-- Protected,受保护过程,只能从其自身的类或派生类访问。
-- Friend,友元过程,只可从包含其声明的程序集内访问。
-- Private,私有过程,只能在模块级使用 Private。
( 2) <过程名 >使用与变量名相同的命名规则。过程名不返回值,而是通过形参与实参的传递得到结果,调用时可返回多个值。
( 3) <过程体 >是 VB的程序段,除一般的执行语句外,还可以包含局部变量或常数定义语句及 Exit Sub从过程中跳出的语句。
( 4) <形参表 >的语法格式。
[Optional] [{ByVal]|[ByRef}] [ParamArray]<变量名 >[As<类型 >][=<默认值 >]
其中:
-- Optional表示参数不是必须的关键字。如果使用了该选项,则(形参表)中的后续参数都必须是可选的,而且必须都使用 Optional关键字声明。
如果使用了 ParamArray,则任何参数都不能使用 Optional。
-- ByVal表示该参数按值传递; ByRef表示该参数按地址传递。 ByRef是
VB的默认选项。
-- ParamArray只用于形参表的最后一个参数,使用 ParamArray关键字可以提供任意数目的参数。 ParamArray关键字不能与 ByVal,ByRef或
Optional一起使用。
-- <变量名 >代表参数的变量的名称,遵循标准的变量命名约定。如果是数组变量,要在数组名后加上一对圆括号。
-- <默认值 >代表任何常数或常数表达式,只对 Optional参数合法。如果类型为 Object,则显式的默认值只能是 Nothing。
5.2.3 通用过程的调用可以使用独立的调用语句来显式调用 Sub过程,不能在表达式中使用过程名称来调用该过程,必须提供所有必选参数的值,并且必须用括号将实参数列表括起来。如果未提供任何参数,则也可以选择省略括号。
调用 Sub过程的语法如下所示:
[Call] <过程名 > [(<实参表 >)]
Call 关键字是可选项。
例 5-1 调用全局过程。
设计说明:
在工程中建立三个模块,Form1窗体模块,Form2窗体模块,Module1标准模块。其中,Form1,Form2窗体界面分别如图 5-2( a)、( b)所示。
在上述三个模块中分别建立三个全局过程,F1_test(a As Form),F2_test(a
As Form),M_test(a As Form),代码如下:
Form1窗体代码如下:
Public Sub F1_test()
Me.Label1.Text = "执行 Form1窗体过程 F1_test" '输出到 Label1
End Sub
Form2窗体中的全局过程 F2_test代码如下:
Public Sub F2_test()
Form1.Label2.Text = "执行 Form2窗体过程 F2_test"
'输出到 Form1窗体的 Label2
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Call F2_test() '调用其他窗体模块中的 Public过程必须加窗体模块名
End Sub
Module1中的全局过程 M_test代码如下:
Sub Main()
Dim f1 As New Form1
f1.Show()
End Sub
Public Sub M_test()
Form1.Label3.Text = "执行 Module1中 M_test过程 "
'输出到 Form1窗体的 Label3
End Sub
程序运行结果如图 5-2( c)所示。
例 5-2 计算 5!,6!,8!以及 5! +6! +8!,如图 5-3所示。
设计说明:
在 Form1窗体中包含一个 Label1框,4个 Button控件,4个命令按钮的
Text属性如图 5-3( a)所示,其从左到右 4个命令按钮的 Tag属性分别为
5,6,8,7,运行界面如图 5-3 ( b)所示。
4个 Button控件共享的 Click代码为:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click,Button2.Click,Button3.Click,
Button4.Click
Dim Sum As Long
Call Fact(sender.TAG,Sum) '实参 Sum的类型必须与形参 Total一致,即 Long型
If sender,Tag = 7 Then Sum = Sum / 42 + Sum / 7 + Sum * 8
5!+6!+8!,此处 Sum=7!
Label1.Text = sender,Text & " = " & Sum
End Sub
计算阶乘 n的通用过程 Fact为:
Private Sub Fact(ByVal n As Integer,ByRef Total As Long)
Dim i As Integer
Total = 1
For i = 1 To n
Total = Total * i
Next
End Sub
在应用程序设计中,有时需要让单个事件处理程序用于多个事件或者让多个事件引发同一过程。本例的 4个命令按钮的 Click事件共享 Button1_Click
事件处理程序,是通过使用 Handles 关键字实现的。
Button1_Click事件处理过程的第一个参数 sender 提供对引发事件的对象的引用,通过引用对象的属性( Tag或 TabIndex等)可获得一些信息。上面示例中的第二个参数 e 传递针对要处理事件的对象,如鼠标事件中鼠标的位臵。
5.3 Function过程
VB函数分为内部函数和外部函数。内部函数在 2.8节已做介绍(见表 2-
13所示),如 Cos,Sqrt,Len等。外部函数是用户根据需要用 Function关键字定义的函数过程,与 Sub过程不同的是通常 Function过程将返回一个值。
因此,Function过程的调用常出现在表达式中或赋值语句中,尽管 Function
过程可以作为基本语句使用,但一般不用。而 Sub过程没有返回值,都是作为独立的基本语句使用。
Function过程是包含在 Function 语句和 End Function 语句之间的一系列
Visual Basic语句。每次调用过程时都执行过程中的语句,从 Function 语句后的第一个可执行语句开始,到遇到的第一个 End Function,Exit Function
或 Return 语句结束。
Function过程与 Sub过程相似,但它还向调用程序返回值。 Function过程可以带呼叫代码传递给它的参数,如常数、变量或表达式。
声明 Function过程的语法如下所示:
[<访问修饰符 >] Function <函数名 >([<形参表 >]) [ As﹤ 类型 ﹥ ]
[ <局部变量或常数定义 >]
[ ﹤ 语句体 ﹥ ]
[ ﹤ 函数名 ﹥ = ﹤ 表达式 ﹥ ] 或 [ Return ﹤ 表达式 ﹥ ]
End Function
Sub 过程相同 <访问修饰符 >可以是 Public,Protected,Friend、
Protected Friend 或 Private。
可以在模块、类和结构中定义 Function 过程。默认情况下它们是 Public,
这意味着可以从应用程序中的任意位臵调用它们。
说明:
-- Function过程以,Function”开头,以,End Function”结束。
-- ﹤ 函数名 ﹥ 是 Function的过程名字,命名规则与变量名规则相同。在函数体内,函数名可以当变量使用,函数的返回值可以通过对函数名的赋值语句来实现的,即函数值通过函数名返回,因此在函数过程中至少要对函数名赋值一次。
-- As﹤ 类型 ﹥ 是指函数返回值的类型,如果类型检查开关( Option
Strict 语句)为 On,则为必选项。
--﹤ 语句体 ﹥ 是程序段,可有一个或多个 Exit Function语句退出函数过程,常常是与选择结构( If或 Select Case语句)联用,即当满足一定条件时,
退出函数过程。
-- 格式中的其他内容与 Sub过程中相同。
在需要将值返回给调用代码时,请使用 Function 过程。在不需要返回值时,请使用 Sub 过程。
例 5-3 用 Function过程实现例 5-2(计算 5!,6!,8!以及 5! +6!
+8!)。
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click,Button2.Click,Button3.Click,
Button4.Click
Dim sum&
sum = Fact(sender.TAG) '实参 Sum的类型必须与形参 Fact一致,
即 Long型
If sender.TAG = 7 Then sum = Fact(5) + Fact(6) + Fact(8)
Label1.Text = sender.Text & " = " & sum
End Sub
计算阶乘 n的通用过程 Fact为:
Private Function Fact(ByVal n As Integer) As Long
Dim i As Integer
Fact = 1
For i = 1 To n
Fact = Fact * i
Next
End Function
例 5-4 求三个数的最大公约数。
用两数最大公约数 Function过程来实现。
分析:
由数学中的知识可知,两整数 n,m 的最大公约数为,n× m/(最小公倍数)。
用“辗转相除法”,n存放大数,r放余数。
r ≠0时,重复 m→ n,r→ m,r = n Mod m
r=0时,m中的数就是开始 m与 n的最大公约数。
将 n与 m的最大公约数与 k用相同的方法,求出最终的最大公约数。
窗体界面设计如图 5-5所示,这里给出命令按钮的 Click事件代码及
ComDiv过程代码:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim n,m,k As Long
n = Val(TextBox1.Text)
m = Val(TextBox2.Text)
k = Val(TextBox3.Text)
If n * m * k = 0 Then Exit Sub
Label1.Text = ComDiv(ComDiv(n,m),k)
End Sub
Private Function ComDiv(ByVal n&,ByVal m&) As Long
Dim c,r As Integer
If m > n Then c = m,m = n,n = c
Do
r = n Mod m
n = m,m = r
Loop While r <> 0
Return n
End Function
5.4.1 形式参数与实际参数呼叫语句传递给过程的每个值称为“实参”(实际参数),实参可以是常量、变量或表达式。
过程中需要另外一些参数来接收这些实参值,这些参数称为“形参”
(形式参数),形参是在 Sub或 Function过程的定义中出现的变量名,形参中的数组一般不指明大小,但要有括号,定长字符串不能作形参。
调用一个过程时必须完成形参与实参的结合,即把实参的值传给形参,
然后按实参的值执行被调用过程。
参数传递是指呼叫语句的实际参数值传递给被呼叫过程中对应的形参,
这个过程称为“虚实”结合。
5.4.2 按值( ByVal)传递与按地址( ByRef)传递在定义过程时,用关键字 ByRef说明的参数,是定义按地址传递参数,
就是让过程根据变量的地址访问实际变量的内容,即形参与实参使用相同的内存单元,这样通过子程序就可以改变变量本身的值。
5.4 过程的参数传递在定义过程时,用关键字 ByVal说明的参数就是按值传递的参数,此类型的参数在过程被调用时,实际参数的数据“赋值”到形参中。此后,在过程体中的语句对该参数的任何改变,都与实参变量无关,即过程调用前后,
与该类形参对应的实参变量值保持不变。按值传递时,由于传递的只是变量的副本,因此比较安全。 VB.NET默认按值传递参数。
例 5-5 编一个交换两个整型变量值的 Sub过程。
Private Sub Swap(ByRef X As Integer,ByRef Y As Integer)
Dim Temp As Integer
Temp = X
X = Y
Y = Temp
End Sub
试想,这里为什么要使用按址传递参数?如果改用按值传递会出现什么结果?
再看下面的一段程序:
Private Sub SubA(ByRef A1 As Integer,ByRef A2 As Integer,ByVal
A3 As Integer)
A1 = A1 + 1
A2 = A2 + 1
A3 = A3 + 1
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button1.Click
Dim x,y As Integer
x = 1,y = 2
Call SubA(2 * 3,(X),Y)
Label1.Text = "X=" & x & " Y=" & y
End Sub
输出的结果是:
X= 1 Y= 2
这是由于实参 X外加了一个圆括号,将原来形参 A2按地址传递定义,强行改为按值传递。
5.4.3 传递数组数组作参数是通过地址方式传送。在传送数组时,除遵守参数传送的一般规则外,还应注意以下几点:
-- 为了把一个数组的全部元素传送给一个过程,应将数组名分别写入形参表中,并略去数组的上下界,但括号不能省略。如
Private Sub Sort( a() As single)
……
End Sub
其中,形参,a()”即为数组。
-- 被调过程可通过 Ubound函数确定实参数组的上界。
-- 当用数组作形参时,对应的实参必须也是数组,且类型一致。
-- 实参和形参结合是按地址传递,即形参数组和实参数组共用一段内存单元。
实参数组后面的括号可以省略,但为便于阅读,建议一般不要省略为好。
例 5-6 编写一个通用排序程序(升序) Sort()。产生 n个两位随机整数输出,再调用过程 Sort(),再输出排序后的上述随机数,如图 5-6 所示。
Private Sub Sort(ByVal A() As Integer)
Dim i,j,t As Integer
For i = LBound(A) To UBound(A) - 1
For j = i + 1 To UBound(A)
If A(i) > A(j) Then
t = A(i),A(i) = A(j),A(j) = t
End If
Next
Next
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim i,n,A() As Integer '定义动态数组
Label1.Text = ""
n = Val(InputBox("请输入数组元素的个数 ","冒泡排序 ",0))
ReDim A(n)
For i = 1 To n
A(i) = Int(Rnd() * 90) + 10
Label1.Text &= A(i) & " "
Next
Label1.Text &= Chr(10)
Sort(A)
For i = 1 To n
Label1.Text &= A(i) & " "
Next
End Sub
5..4.4 可选参数的使用
1 可选参数 ( Optional)
在定义过程的形参表中使用关键字 Optional声明的参数是可选参数。如果一个过程某个形参为可选参数,则在调用此过程时可以不提供对应于这个形参的实参。若一个过程有多个形参,当它的一个形参被设定为可选参数,则这个参数后面的其他参数也必是可选的,并且要用 Optional关键字来声明。
在 VB.NET2005中,每个可选参数都必须声明一个默认值,如果调用程序不提供该参数,则将默认值传递给过程。
例 5-7 2个命令按钮的 Click事件过程中,都含有调用同一个 Sub过程
( Ndres)的语句,其中一个调用语句向 Ndres传递一个参数;而另一个调用语句向 Ndres传递两个参数,如图 5-7( a)所示。
过程 Ndres将传递来的参数添加到列表框中,用 Optional关键字声明第二个参数,运行结果如图 5-7( b) 所示 。
Private Sub Ndres(ByVal x As String,Optional ByVal y As String = "地址不详 ")
Dim Temp As String
Temp = x & y
ListBox1.Items.Add(Temp)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button1.Click
Dim strName As String
strName = "张 三 "
Ndres(strName) '提供了一个参数。
End Sub
Private Sub Button2_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button2.Click
Dim strName,strAddress As String
strName = "李 四 "
strAddress = "成都市人民南路三段 3号 "
Ndres(strName,strAddress) '提供了两个参数。
End Sub
2 参数数组通常,调用的过程所包含的参数不能超出过程声明指定的数目。当需要数量不确定的参数时,可声明一个“参数数组”。
用 ParamArray 关键字表示参数数组。适用以下规则:
-- 每一个过程只能引用一个数组作为参数。
-- 作为参数的数组只能放在所有参数最后面。
-- 数组参数只能按值传递。
-- 数组参数只能是一维的,且数组中所有的元素数据类型必须一致 。
例 5-8 运用参数数组,使之可以接收任意个参数。
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button1.Click
TextBox1.Text = ""
StudentScores("Anne","10","26","32","15")
StudentScores("Mary","High","Low")
Dim JohnScores() As String = {"Absent","35","21","30"}
StudentScores("John",JohnScores)
End Sub
Sub StudentScores(ByVal Name As String,ByVal ParamArray Scores()
As String)
Dim I As Integer
TextBox1.Text &= "Scores for " & Name & ":" & Chr(13) &
Chr(10)
For I = 0 To UBound(Scores)
TextBox1.Text &= "Score " & I & "," & Scores(I) & Chr(13) &
Chr(10)
Next
End Sub
请读者通过源程序及如图 5-8所示给出的结果,理解程序中的每一条语句的含义。
5.4.5过程的嵌套在一个过程( Sub过程或 Function过程)中调用另外一个过程,这种程序结构称为过程的嵌套调用。分析下面 3个过程之间的嵌套调用。
Private Sub SubB(ByVal B1 As Integer,ByRef B2 As Integer,ByVal
B3 As Integer)
B1 = B1 + 1
B2 = B2 + 1
B3 = B3 + 1
Label1.Text &= "B1=" & B1 & " B2=" & B2 & " B3=" & B3 &
Chr(13)
End Sub
Private Sub SubA(ByRef A1 As Integer,ByRef A2 As Integer,ByVal
A3 As Integer)
A1 = A1 + 1
A2 = A2 + 1
A3 = A3 + 1
Call SubB(A1,A2,A3)
Label1.Text &= "A1=" & A1 & " A2=" & A2 & " A3=" & A3 &
Chr(13)
End Sub
Dim x,y As Integer
x = 1
y = 2
Label1.Text = ""
Call SubA(2 * 3,X,Y)
Label1.Text &= "X=" & x & " Y=" & y & Chr(13)
End Sub
上述 3个过程嵌套调用的执行过程,如图 5-9所示。
在事件过程 Button1_Click()中,Call SubA将 6,1,2三个实参值传给 SubA()的 A1,A2,A3,其中 A1,A2是按地址传递,A3是按值传递,
经 SubA()的计算后 A1,A2,A3分别为 7,2,3。
在过程 SubA()中的 Call SubB将 7,2,3三个实参传给 SubB()的 B1,B2、
B3,其中 B1,B2是按地址传递,B3是按值传递,经 SubB()的计算后,B1、
B2,B3分别为 8,3,4。
由于 B1,B2是按地址传递,所以在 SubB()中对 B1,B2值的改变将影响
A1,A2,即 A1为 8,A2为 3,A3按值传递,其值不受影响仍为 3。
在过程 Button1_Click()中,实参 X,Y与 SubA()的 A2,A3结合,其中 A2是按地址传递,A3是按值传递,Y的值不受影响仍为 2。 X值与 A2的值相同,
而 A2的最终值是 SubB()中的 B2值 3。
最终结果如图 5-10所示。
5.5 实践检验理论巩固
( 1)什么是实参?什么是形参?
( 2)试述传值和传地址的异同。
( 3)被调过程如何确定实参数组的上界和下界。
( 4)静态变量的特点是什么?如何定义静态变量?
( 5)过程中定义可选参数使用什么关键字?在 VB.NET2005中,对可选参数的使用有何规定?
( 6)过程中定义参数数组使用什么关键字?在 VB.NET2005中,对参数数组的使用有何规定?
( 7)下列程序运行后,用鼠标单击命令按钮 Button1,输出结果是什么?
Private Sub SM(ByVal A As Integer,ByVal B As Integer,ByVal C As
Integer)
A = A + 1,B = B + 2,C = C + 3
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim X,Y,Z As Int16
X = 9,Y = 8,Z = 2
Call SM(X,Y,Z)
Console.WriteLine("{0} {1} {2}",X,Y,Z)
End Sub
( 8)下列程序运行后,用鼠标单击命令按钮 Button1,输出结果是什么?
Private i As Integer
Private Sub abc()
Static x As Integer,a,b As Char
A = Chr(Asc("A") + i)
B = Chr(Asc("Z") - x)
Console.Write("{0};",a & b)
x = x + 1
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim x As Int16
For i = 0 To 4
x = x + 1
abc()
Next
End Sub
( 9)下列程序运行后,用鼠标单击命令按钮 Button1,输出结果是什么?
Private Sub Sub1(ByRef A As Integer,ByRef B As Integer,Optional
ByVal C As Integer = 0)
A = A + C,B = A + B
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim x,y As Int16
x = 3,y = 4
Sub1(x,(y),5)
Console.Write("{0} {1}",x,y)
End Sub
( 10)下列程序运行后,连续两次单击命令按钮,则输出结果是什么?
Public Function f(ByVal x As Integer)
x = x + 2
f = x
End Function
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button1.Click
Static x,y As Integer
y = 5
x = x + y
y = f(x)
Console.Write("{0} {1} ",x,y)
End Sub
( 11)编制生成 n个 3位随机整数的 SUB过程。
( 12)设数组下标为 1~n,移动第 i个数组元素到第 k位上,k,i∈
( 1~n)。
( 13)编写一个排序的 Sub过程或 Function过程。
上机实战
( 1)编制生成 n个 3位随机整数的 SUB过程。
( 2)设数组下标为 1~n,移动第 i个数组元素到第 k位上,k,i∈
( 1~n)。
( 3)编写一个排序的 Sub过程或 Function过程。