实例2-21 Function过程的声明和调用实例
该实例实现步骤如下。
1 创建窗体
在本章的项目chapter2中,右键单击解决方案资源管理器中项目名下面对应节的文件夹“过程”,在弹出菜单中选择“添加”→“Windows窗体”菜单命令,在弹出的对话框中输入窗体名FunFrm,单击“添加”按钮完成窗体的创建。
2 添加控件
在窗体上添加两个TextBox文本框,用来输入和显示信息。
在窗体上添加两个Label控件用来对相关信息进行说明。
在窗体上添加一个Button按钮,通过按钮的单击事件调用Function函数,实现对用户输入函数的判断。
3 添加代码
本实例由一个窗体组成,名称为FunFrm.vb。
双击窗体,进入窗体代码编辑器,在窗体类中添加代码2-26中的代码。
代码2-26 FunFrm.vb
01 Public Class FunFrm 02 Function prime_number(ByVal n As Integer) As Boolean 03 Dim i As Integer 04 For i = 2 To Math.Sqrt(n) 05 If n Mod i = 0 Then 06 Return False 07 Exit Function 08 End If 09 Next 10 Return True 11 End Function '结束Function过程 12 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 13 Dim num As Integer 14 Dim b As Boolean 15 num = Me.TextBox1.Text 16 b = prime_number(num) 17 If b = True Then 18 Me.TextBox2.Text = "是" 19 Else 20 Me.TextBox2.Text = "不是"
21 End If 22 End Sub 23 End Class
代码2-26执行步骤如下:
① 第2行代码定义一个Function过程,名称为prime_number,参数为n,过程返回值的类型为布尔型;
② 第3行代码定义一个整型变量i,作为下面For循环的计算器;
③ 第4行代码定义For循环计数器的初值和终值;
④ 第5行到第8行代码判断参数是否能被2到该数平方根中的某个数整除,若能则函数返回False,并强制退出Funtion过程,否则继续执行下一步;
⑤ 第10行代码返回True,说明此参数是素数;
⑥ 第16行代码调用prime_number函数判断用户输入的数,是否是素数,将返回的布尔值赋给布尔型变量b;
⑦ 第17行到第21行代码使用If语句判断布尔型变量的值,若为True则说明用户输入的整数是素数,若为False则说明用户输入的整数不是素数。
4 运行结果
按F5键,运行该程序代码,结果如图2-28所示。
图2-28 实例2-21运行结果
2.5.5 参数传递
在过程的调用中,往往需要传递参数。一个过程的每次调用,其结果根据作为参数传递的数据而有所不同。过程的参数可以是变量、常数或表达式。创建一个过程的时候,按声明变量的方法为过程声明参数,过程的参数默认的数据类型是Object,不过,也可以通过As子句声明参数为其他数据类型。示例如下:
Dim a as Integer
过程声明的参数叫做形式参数(形参)。在调用过程时与形式参数相对应的参数叫做实际参数(实参)。
参数可以按值传递和按地址传递两种方法传递给一个过程。
1.按值传递
按值传递参数方式在VB.NET中是默认的。使用ByVal关键字指出参数是按值来传递的。按值传递参数时,由于传递的只是变量的副本,所以即使过程改变传递的数值,原变量的数值也保持不变。
按照值传递,格式如下:
Sub或Function name([ByVal variable1 As type, ByVal variable2 As type...]) [statements] End Sub或End Function
示例如下:
Sub Accounts(ByVal num As Integer) '这里放语句 End Sub
注意
ByVal关键字可以省略。
2.按地址传递
按地址传递参数是过程用变量的内存地址去访问实际变量的内容,其结果是将变量传递给过程时,通过过程可改变变量值。按地址传递参数时,如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。用ByRef关键字指出参数是按地址来传递的,按地址传递的效率比较高,因为,无论变量是什么类型,传进的都只是4个字节。
按照地址传递,格式如下:
Sub或Function name([ByRef variable1 As type, ByRef variable2 As type,...]) [statements] End Sub或End Function
如下例中,参数“RunningTotal”是按地址传进来的,因此传进的变量值为参数“AcctNum”的值。
Sub PostAccount(ByVal AcctNum As Integer,ByRef RunningTotal As Single) RunningTotal=AcctNum End Sub
在这里还要提醒读者一点,数组作为参数时必须按地址传递,因此不能使用ByVal关键字修饰,且形参数组与实参数组的数据类型应一致。
下面以实例说明参数传递的方法。