第二章(4)过程与函数_第1页
第二章(4)过程与函数_第2页
第二章(4)过程与函数_第3页
第二章(4)过程与函数_第4页
第二章(4)过程与函数_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二章 Visual Basic.NET语法基础 本章主要介绍以下内容:l Visual Basic.NET数据类型 l 变量与常量 l 运算符与表达式 l 三种基本语法结构 l 数组 l 过程与函数 l 程序调试 l 作业,2. 6 过程与函数事件过程:当发生某个事件时(如单击命令按钮),对该事件作出响应的程序段。通用过程:多个不同的事件过程可能要执行一段相同的程序代码,那么可以将这一段代码抽出来,建立一个独立的过程,供事件过程或其他通用过程调用。通用过程分为两类:子程序过程(Sub过程)和函数过程(Function过程),一、Sub过程1、建立Sub过程格式 : StaticPrivate

2、 Public Sub 过程名 (参数列表) 语句块 Exit Sub 语句块 End Sub说明:1、参数表指定在调用该过程时应该传递的参数的个数和类型,参数表中可以包含多个参数项,相邻的两个参数项之间用逗号隔开,每个参数项的形式如下: ByVal|ByRef 参数名() As 类型2、变量名前的ByVal表明参数是按照值来传递,ByRef表明按照地址来传递,2、调用Sub过程 即执行Sub过程中的代码,形式如下: 过程名(实际参数表)#功能:运行该过程名对应的过程 #实际参数表:a、是传递给该过程的诸参数,可以是常量、变量或表达式b、相邻的两个实参之间用逗号隔开c、实参的个数、顺序、类型和

3、形参要一一对应 #调用的执行过程是:首先将实参传递给形参,然后执行过程体,当过程运行结束后,从调用该过程的语句的下一句处继续执行。,Public Sub Hello(ByVal name As String) MessageBox.Show(Hello & name) End Sub,Sub Test( ) Hello(John) End Sub,t,建立Sub过程 Sub area(ByRef intA As Integer, ByRef intB As Integer) Dim intS As Integer intS = intA*intB Console.WriteLine (“The

4、 area is ” + intS.ToString() End Sub,调用Sub过程 Dim intX As Integer Dim intY As Integer intX= 5 intY = 7 area(intX, intY),t,建立Sub过程 Sub sums() Dim intA As Integer Dim intB As Integer intA = 3 intB = 7 Console.WriteLine(intA & “+”& intB & “=” & intA + intB) End Sub,调用Sub过程 Sums(),t,数据在内存中是如何存储的,如何读取的? D

5、im intA,intB As Integer 1、编译时系统分配2000、2001、2002、 2003四个字节给变量intA,20042007 字节给intB 2、在内存中已没有intA、intB这些变量名, 对变量值的存取都是通过地址进行的 3、intA=2 根据变量名与地址的对应关系, 找到变量intA的地址2000,然后把2送到地址 为2000开始的Integer存储单元中 4、intB=intA 从地址2000开始的四个字节中取出数据(即变量2的值),把它送到地址2004开始的Integer存储单元中 5、TextBox1.Text = intB.ToString(),从地址200

6、4开始的四个字节中取出数据(即变量2的值),输出到文本框中,内存空间,数据在内存中是如何存储的,如何读取的? 如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元,系统根据程序中定义的变量类型,分配一段长度的空间 内存区的每一个字节有一个编号,这就是“地址”,相当于旅馆中的房间号,在地址所标志的单元存放数据 在内存中已没有intA、intB这些变量名,对变量值的存取都是通过地址进行的,参数传递 1、传值: 将实际参数的值传递给形式参数,在定义过程时,在形式参数的前面加ByVal 系统将要传送的变量的值复制到一个临时单元中,然后把临时单元的地址传送给被调用的过程,即系统为形式参数重新分配

7、存储单元 由于被调用过程没有访问实际参数,因而在改变形式参数值时,并没有改变实际参数的值,Sub swap(ByVal intX As Integer) ,Private Sub BtnStart_Click() Dim intA As Integer = 30 swap(intA) End Sub,30,2000,2008,2012,2016,2020,2004,实参intA,形参intX,系统将要传送的变量的值复制到一个临时单元中,然后把临时单元的地址传送给被调用的过程,即系统为形式参数重新分配存储单元,intX = 2,2,从地址2000开始的四个字节中取出数据 (即变量30的值),输出

8、到文本框中, 根据变量名与地址的对应关系,找到变量intX的地址2012,然后把2送到 地址为2012开始的Integer存储单元中,TextBox1.Text = intA.ToString(),2、传址: 将实际参数的引用(地址)传递给形式参数,在形式参数的前面 加ByRef 参数传递的是将实际参数的地址传递给形式参数,所以形式参数 和实际参数共享相同的存储单元 当在过程中对形式参数的值更改时,实际参数的值也进行相应的 更改 前面定义的过程swap采用的传值参数,仅交换的形式参数的值, 并没有改变实际参数的值,为了能改变实际参数的值,对该过程 进行改造,将传值参数改为传址参数,Sub sw

9、ap(ByRef intX As Integer) ,Private Sub BtnStart_Click() Dim intA As Integer = 30 swap(intA) End Sub,2000,2008,2012,2016,2020,2004,实参intA,形参intX,参数传递的是将实际参数的地址传递给形式参数,所以形式参数和实际参数共享相同的存储单元,intX = 2,2,从地址2000开始的四个字节中取出数据 (即变量2的值),输出到文本框中, 根据变量名与地址的对应关系,找到变量intX的地址2000,然后把2送到 地址为2000开始的Integer存储单元中,Text

10、Box1.Text = intA.ToString(),【案例2-15】 过程应用举例。求S=3!+5!+8!。在WINDOWS工作界面下,编写如下代码建立F子过程,其中N、 T为形式参数。N 按值传递, T按地址传递方法1:用Call语句调用Sub过程Sub F(ByVal N As Integer, ByRef T As Double)Dim I As IntegerT = 1For I = 1 To N 求N的阶乘T = T * I NextEnd SubPrivate Sub Form1_Click(ByVal sender As Object, ByVal e As System.E

11、ventArgs) _ Handles MyBase.ClickDim A As Double, B As Double, C As DoubleDim SUM As Double调用F子过程,并将实参3传给N,F子过程运行后的T值回传给ACall F(3, A)调用F子过程,并将实参5传给N,F子过程运行后的T值回传给BCall F(5, B)调用F子过程,并将实参8传给N,F子过程运行后的T值回传给CCall F(8, C) SUM = A + B + C MsgBox(3!+5!+8!= & SUM)End Sub,方法2:调用SUB时,把过程名作为一个语句来使用Dim SUM As D

12、ouble 定义SUM为窗体级变量 建立F子过程,其中N为形式参数,按值传递 Sub F(ByVal N As Integer) Dim I As Integer Dim T As Double T = 1 For I = 1 To N T = T * I Next SUM = SUM + T End Sub Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles MyBase.Click F(3) : F(5) : F(8) 三条调用F子过程的语句 MsgBox(3!+5!+

13、8!= & SUM ) End Sub,二、Function过程 Sub过程不返回值,且以语句的形式调用 Function过程要返回一个值,调用方式是以表达式的形式出现 Function过程的定义格式如下: StaticPrivatePublic Function 过程名(参数表) As 类型名 语句序列 End Function 过程体中至少有一条Return语句,当调用该过程时,过程的返回值即此表达式的值 Return 表达式 “As类型名”指定Function过程返回值的数据类型,例:定义、调用计算阶乘的Function过程 1、定义 Function facts(intN As Int

14、eger) As Long Dim I As Integer Dim intResult As Long = 1 For I=1 to intN intResult = intResult * I Next Return intResult End Function 2、调用 Dim intM As Integer = 12 Dim lngY As Long lngY = facts(intM) TextBox1.Text = intM.ToString + != + lngY.ToString,t,【案例2-16】 Function过程应用举例。求S=3!+5!+8!。在WINDOWS工作界

15、面下,编写如下代码,并运行程序。定义一个求阶乘的Function过程F() Function F(ByVal N As Integer) As Double Dim I As Integer, T As Long T = 1 For I = 1 To N T = T * I Next I Return T 此处也可以使用 F = T 命令,将T 变量值返回给 F 过程 读者可以去掉上条语句,观察程序运行结果End Function Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handl

16、es MyBase.Click Dim SUM As Long调用Function过程,像使用内部函数一样调用该自定义函数F() SUM = F(3) + F(5) + F(8) MsgBox(3!+5!+8!= & SUM) End Sub,【案例2-17】 过程调用中的参数传递举例。在WINDOWS工作界面下,编写如下代码,并运行程序,分析结果。 CHANGE过程中,A按地址传递,B按值传递 Sub CHANGE(ByRef A As Integer, ByVal B As Integer) Dim T As Integer A += 50 : B += 50 A、B变量重新赋值 End

17、Sub Private Sub Form1_Click(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles MyBase.Click Dim X As Integer, Y As Integer X = 10 : Y = 20 MsgBox(调用CHANGE过程前,变量X= & X & 变量Y= & Y) CHANGE(X, Y) 调用CHANGE过程 MsgBox(调用CHANGE过程后,变量X= & X & 变量Y= & Y) End Sub,【案例2-18】 过程调用中的数组参数传递举例。在WINDOWS工作界面下

18、,编写如下代码,并运行程序,分析结果。 CHANGE过程中,ARR_A形参按地址传递,ARR_B形参按值传递 Sub CHANGE(ByRef ARR_A() As Integer, ByVal ARR_B() As Integer) Dim I As Integer 为ARR_A数组赋值 For I = 0 To ARR_A.GetUpperBound(0) ARR_A(I) = 0 Next 为ARR_B数组赋值 For I = 0 To ARR_B.GetUpperBound(0) ARR_B(I) = 0 Next End Sub,Private Sub Form1_Click(ByV

19、al sender As Object, ByVal e As _System.EventArgs) Handles MyBase.Click Dim ARR_X(2) As Integer, ARR_Y(2) As Integer, I As Integer Dim STR1 As String, STR2 As String 为ARR_X数组赋初值 For I = 0 To ARR_X.GetUpperBound(0) ARR_X(I) = I 将数组各变量的值转为字符型,连成字符串STR1 += ARR_X(I).ToString + Next 为ARR_B数组赋初值 For I = 0

20、 To ARR_Y.GetUpperBound(0) ARR_Y(I) = I STR2 += ARR_X(I).ToString + Next,MsgBox(调用CHANGE过程前,数组ARR_X各元素的值为: & STR1 _ & Chr(10) & Chr(13) _ & 数组ARR_Y各元素的值为: & STR2) Call CHANGE(ARR_X, ARR_Y) 调用CHANGE过程 STR1 = : STR2 = For I = 0 To ARR_X.GetUpperBound(0) STR1 += ARR_X(I).ToString + Next For I = 0 To AR

21、R_Y.GetUpperBound(0) STR2 += ARR_X(I).ToString + NextMsgBox(调用CHANGE过程后,数组ARR_X各元素的值为: & STR1 _ & Chr(10) & Chr(13) _ & 数组ARR_Y各元素的值为: & STR2) End Sub,通过对本题的源程序代码及运行结果分析,可以得出如下结论:(1) 在Visual Basic.NET 的过程中,允许参数是数组。(2) 在使用数组参数时,应该注意在形式参数表中,数组名后的括号不能省略,需要指明数组的维数,但不需要维数的下标界限。例如,定义以下过程:Sub F(ByVaL ARR_A

22、() As Integer) , 过程 F 有一个一维数组形参 ARR_A。再例如,定义以下过程:Sub F(ByVaL ARR_B( ,) As Integer),过程 F 有一个二维数组形参 ARR_B。如果是 2 维以上的数组,则表明维数的逗号不能省略。(3) 在本题中,虽然CHANGE过程中,ARR_A形参数组前有“ByRef”,ARR_B形参数组前有“ByVal”,但我们看到:ARR_A形参数组和ARR_B形参数组在CHANGE过程中“值”的改变都分别带回给了ARR_X实参数组和ARR_Y实参数组。也就是说:数组本身是引用类型的变量,所以无论以何种方式传递数组,实现的都是按地址传递的

23、结果。请读者考虑:若在本题CHANGE过程中的开头位置加上如下代码,结果如何?请总结规律。ReDim Preserve ARR_A(3)ReDim Preserve ARR_B(3),作业:1、 掌握 过程与函数的基础概念2、 掌握本节案例。,2、冒泡法排序 算法思想: 第一趟冒泡排序:首先将第1个数和第2个数进行比较,如果前者较大,则将两个数交换,然后比较第2个数和第3个数的大小,依次类推,直至第n-1个数和第n个数为止,上述过程将最大的数交换到了最后 第二趟冒泡排序:对前n-1个记录进行同样的操作,结果是将次大的数被交换到了倒数第二的位置 依此进行下去,直到排序完成,第一次将8和9对调,第二次将第2和第3个数(9和5)对调,如此共进行5次,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论