收藏 分享(赏)

数组与自定义数据类型.ppt

上传人:hskm5268 文档编号:8179608 上传时间:2019-06-13 格式:PPT 页数:23 大小:418.50KB
下载 相关 举报
数组与自定义数据类型.ppt_第1页
第1页 / 共23页
数组与自定义数据类型.ppt_第2页
第2页 / 共23页
数组与自定义数据类型.ppt_第3页
第3页 / 共23页
数组与自定义数据类型.ppt_第4页
第4页 / 共23页
数组与自定义数据类型.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、第7章 数组与自定义数据类型,数组,数组概述,数组是变量的扩展,一个数组可以存储多个值,通过数组名和下标对这些值进行存取。 1数组的优点 与变量相比,数组有以下优点: (1)数组能够保存多个值; (2)数组可与循环语句配合实现复杂算法; (3)数组可作通用过程的参数,传递大量的值; (4)数组可作函数过程的返回值,可返回大量的值; (5)数组常用来表示与一维、二维、三维空间分布相关的数据,非常直观; (6)动态数组可根据需要开辟内存空间,优化程序、提高效率。,2数组的几个概念 (1)数组名(Array Name):代表整个数组,命名规则与变量相同 (2)元素( Element ) :数组中的一

2、个值。一个数组元素相当于一个变量。数组是元素的有序集合。 (3)下标( Index ) :数组中各个元素的序号,该序号是连续的整数。通过数组名与下标可以访问指定的数组元素。 (4)维数( Dimension ) :指定数组中的一个元素所需的下标个数,可以是一维、二维、三维等。 (5)下标的上界( Upper Boundary )和下界( Lower Boundary ) : 数组某一维下标的最小值称为下标下界,最大值称为下标上界。由下标的上下界可以确定数组中元素的个数。,数组必须先声明才能使用。声明时要指定数组的数组名、数据类型、作用域。如果数组在声明时指定了下标的上下界,称为固定大小的数组(

3、又称为常规数组),常规数组在程序运行时元素的个数不变;如果声明时不指定下标上下界的数组称为动态数组,动态数组在程序运行时可以通过重定义来改变下标上下界,从而改变元素的个数和维数。,Public|Private|Dim|Static数组名(维数与下标界限)As数据类型名常规数组,即固定大小的数组。由括号中的数值决定数组的维数和下标的上下界。1指定下标界限可以使用下列两种方式指定一维数组的下标界限:(1)使用关键字To指定下标的下界和上界,形式如下:Dima(mTon)As.m为下标下界,n为下标上界。m和n必须为整型常量,可以是负值,并要求mn。(2)只指定下标上界,由Option Base语句

4、指定下标下界:Dima(n)As.在模块“代码”窗口顶部的声明段中使用以下语句定义下标下界是0或1:Option Base0|1使用“0”时,上界n必须是非负整数常量,使用“1”时,上界n必须是正整数常量。如果没使用Option Base语句,默认为0。2元素个数一维数组元素个数的计算公式是:元素个数下标上界下标下界1常规数组至少应该有一个元素,这时下标的上界与下界相等。,常规数组-一维数组,3. 访问数组元素常规数组被定义之后,便具有了内存空间,可以通过以下方式访问数组指定下标的元素: 数组名(下标)访问数组元素时的“下标”可以是整型(或长整型)常量、变量或表达式。下标值不能小于数组下标的下

5、界,不能大于下标的上界,否则会引发“下标越界”的运行时错误。数组元素可以像普通变量一样被赋值、参与表达式计算、作为实参调用通用过程,也可以使用循环语句对多个元素进行“批量”操作。例子: Dim a(0 To 5) As Integer 定义数组a 方法1:为单个元素 a(0) = 1 : a(1) = 3 : a(2) = 5 : a(3) = 7 : a(4) = 9 : a(5) = 11 赋值 方法2:通过循环结构为各个元素赋值 For i = 0 To 5a(i) = 2 * i +1 Next,二维数组,二维数组是指有两个下标的数组,每个下标对应一个“维”。定义二维数组的语法格式为:

6、Dim数组名(第一维的下标界限 , 第二维的下标界限)As数据类型二维数组中每一维下标界限的定义方式与一维数组相同。例子:Dim a(4 , 5) As IntegerPublic b(-5 To 5 , 10) As DoublePrivate c(1 To 10 , 2 To 5) As Boolean,二维数组的元素个数是各维下标取值个数之积。 二维数组可以被理解为二维表格。如图所示,这是一个记录学习成绩的表格,由行和列组成。可以使用以下语句定义一个二级数组(如图所示)来表示此表格:Dim a(1 To 3 , 1 To 4) As Integer(1)访问二维数组元素a (i, j)

7、= k (i行号,j列号) (2)使用循环结构访问数组元素,多维数组,多维数组是指三维或三维以上的数组,是在一维和二维概念上的扩展。多维数组的定义、元素的访问方式与一维和二维数组类似。例如,下而定义的是2个多维数组。Dim a(3,3,4) As Integer 3维数组Dim b(1 To 10,-4 To 5, 10,20) As Single 4维数组,如果将二维数组比作二维表格,那么,三维数组可看作是由多张二维表组成的三维表格。,多维数组的元素个数是所有维的下标取值个数的乘积。,包括三个部分: (1)数组元素所占内存数量,即:元素个数每个元素所占内存(由数据类型决定) (2)每一维额外

8、占用4个字节; (3)整个数组占用占有20个额外字节。,常规数组占用的内存大小,【例7.1】十进制数转换为二进制数。Option Base 0Private Sub Command1_Click()Dim i As Integer: Dim d As IntegerDim b(15) As Byte : Dim s As Stringd = Text1.Text 得到十进制数Do Until d = 0b(i) = d Mod 2 除2取余d = d 2i = i + 1LoopDo While i 0i = i - 1s = s & b(i) 反序排列LoopText2.Text = s 显

9、示二进制数End Sub,本程序使用的转换方法是“除2反序取余法”:把要转换的十进制数反复除以2取其余数(除尽为,除不尽为),直至商为0;再将余数反序排列即为对应的二进制数。程序中使用了数组b保存每次除以2所得的余数。,打开【例7.1】,【例7.2】找出数组元素中的最大值、最小值并计算所有元素的平均值。 Option Base 1 Private Sub Command1_Click()Const N As Integer = 10 定义常量Dim a(N) As Integer 定义数组Dim i As IntegerDim sum As Integer 此变量保存总和Dim max As

10、Integer 此变量保存最大值Dim min As Integer 此变量保存最小值For i = 1 To Na(i) = Rnd * 100 为数组元素赋随机值Print a(i)Nextmax = a(1) 注意!给变量赋初值min = a(1) 注意!给变量赋初值sum = a(1) 注意!给变量赋初值For i = 2 To N If max a(i) Then min = a(i)sum = sum + a(i)NextText1.Text = max 显示最大值Text2.Text = min 显示最小值Text3.Text = sum / N 显示平均值 End Sub,打开

11、【例7.2】,当在编程时不能预料应该为数组定义多少个元素时,可以使用Visual Basic提供的动态数组。动态数组的维数和下标上下界可以在程序运行过程中改变。定义动态数组的的语法结构与定义常规数组相似,只是括号是空的: Public|Private|Dim|Static动态数组名( )As数据类型名定义语句确定了动态数组的名称、作用域和数据类型。在使用ReDim语句重新定义之前,动态数组没有元素,不能使用。重定义是指定动态数组的维数和下标界限(不能再改变数据类型): ReDimPreserve动态数组名(m1 To n1, m2 To n2,)ReDim语句指定动态数组维数和下标界限的方法与

12、Dim定义常规数组相同。对于同一个动态数组,重定义ReDim语句可以反复使用,即可以多次改变该动态数组的维数和下标界限。如果不加关键字Preserve,ReDim语句会清除重定义之前动态数组所有元素中的数据,使用默认值来填充。如果希望重新定义之后,保留那些原来就有的数组元素值,则必须使用Preserve关键字。,动态数组,定义动态数组,重定义动态数组,Preserve关键字,【例7.3】矩阵的转置。矩阵是由N行M列数值组成的特殊数据形式,本例涉及的是方阵(即N=M,N称为阶数)。矩阵的转置是指行列数据交换(即沿对角线反转,如图)。如图所示,矩阵A可以使用二维数组表示。,打开【例7.3】,【例7

13、.4】生成杨辉三角。杨辉是我国南宋时期的数学家,它引用前人贾宪的研究成果提出了后人所说的“杨辉三角”。如图所示,杨辉三角的两侧全部是1,中间的每个数是其左上方和右上方两个数之和。,打开【例7.4】,1LBound函数、UBound函数LBound(ArrayName,Dimension)UBound(ArrayName,Dimension)参数ArrayName指定数组名,参数Dimension指定第几维,函数LBound返回指定数组指定维的下标下界,函数UBound返回指定数组指定维的下标上界。 如果省略Dimension参数,则返回的是第一维的下界与上界。例:Dim B(3 To 8, 2

14、00 To 208)Print LBound(B,1), LBound(B,2), UBound(B,1), UBound(B,2) 2Erase语句Erase数组名1, 数组名2,Erase语句对数组进行初始化操作。对于常规数组,Erase语句使其成为数据类型的默认值。对于动态数组,Erase语句释放动态数组的存储空间,要继续使用这个动态数组,则必须使用ReDim语句重新定义。,数组函数与语句,Private Sub Form_Click( )Dim A(3) As Integer, B( ) As IntegerA(1) = 1: A(2) = 2: A(3) = 3ReDim B(4)P

15、rint A(1), A(2), A(3)Erase A, BPrint A(1), A(2), A(3) End Sub,在编写通用过程时,允许定义数组参数,这样便可以使用一个参数传递大量的值。 (1)数组形参的定义ByRef数组形参名( )As数据类型名数组形参名后必须加空括号,并且不能使用ByVal关键字修饰,因为数组参数必须按地址传递。 (2)调用时,相应的实参必须是与形参相同类型的数组名,可以带空括号。 (3)一个通用过程可以定义多个数组参数。 (4)作参数的数组可以是任意维的,由实参数组决定。因为是按地址传递,在通用过程中修改形参数组的元素值可以改变父过程中实参数组的元素值。如果实

16、参是动态数组,则相应的形参也可以被看作为动态数组,在子过程中可以使用ReDim语句重新定义,改变数组维数、下标上下界以及元素值,同时也改变了父过程的数组。,【例7.6】使用数组参数编写求和的函数sum。 【例7.7】顺序查找。,数组作参数,打开【例7.6】,打开【例7.7】,【例7.8】折半查找。“折半查找法”比顺序查找效率更高一些。折半查找的原理是:假设数组是递增的,并且被查找的数一定在数组中。如图所示,先拿被查找数(12)与数组中间的元素进行比较,如果被查找数大于元素值,则说明被查找数位于数组中的后面一半元素中。如果被查找数小于数组中间元素值,则说明被查找数位于数组中的前面一半元素中。接下

17、来,只考虑数组中包括被查找数的那一半元素。拿剩下这些元素的中间元素与被查找数进行比较,然后根据二者的大小,再去掉那些不可能包含被查找值的一半元素。这样,不断地减小查找范围,直到最后只剩下一个数组元素,那么这个元素就是被查找的元素。当然,也不排除某次比较时,中间的元素正好是被查找元素。,打开【例7.8】,如果通用过程的数组形参使用“ParamArray”关键字进行修饰,则该过程被调用时可以接受任意多个普通实参值,这些实参值按顺序存于这个数组中,在通用过程中可以访问这些值。使用ParamArray参数有以下特点: (1)ParamArray关键字修饰的形参必须是通用过程的惟一的或最后一个形参; (

18、2)一个过程只能有一个这样的形参。 (3)ParamArray不能与ByVal、ByRef或Optional关键字针对同一个形参一起使用; (4)使用ParamArray关键字修饰的参数只能是Variant类型; (5)调用时,前面的实参传递给相应的形参,多余的实参都会以数组元素的形式传递给ParamArray修饰的数组参数; (6)ParamArray修饰的数组参数只能是一维的。,不定数量的参数(ParamArray),打开【例7.9】,【例7.9】使用ParamArray求多个数之和。,函数返回数组是返回大量值的好办法。如果在定义函数过程时,返回值类型后加上空的小括号,表示此函数过程的返回

19、值是一个数组。Function函数过程名(形参列表)As数据类型名() 1指定函数的返回值首先在函数体中定义一个与返回值类型相同的数组,把要返回的值赋给数组的各个元素。在返回之前,把这个数组名赋值给函数名,则这个数组会作为返回值返回。 2调用返回数组的函数调用返回数组的函数之前,先定义一个与函数返回值类型相同的动态数组(不必重定义)或变体类型的变量;调用函数时,把返回值赋给定义好的动态数组名或变量。通过动态数组或变体变量即可访问返回数组的元素。【例7.10】矩阵乘法。,函数返回数组,打开【例7.10】,可以使用Type关键字来定义自定义数据类型。自定义数据类型是由已存在的数据类型组合而成的。定

20、义自定义数据类型,必须要在模块的声明段中进行。 Public|PrivateType自定义数据类型名成员名1As已有的数据类型名 成员名2As已有的数据类型名成员名3As已有的数据类型名 EndType使用Private关键字定义的模块级自定义数据类型,只能在本模块中使用;使用Public关键字定义的全局自定义数据类型,可在程序的所有模块中使用。如果省略了Public和Private关键字,默认是应用程序级。如果要定义全局的自定义数据类型,必须在标准模块的声明段中定义,不能在窗体模块中定义全局自定义数据类型。自定义数据类型中的成员的定义方法类似于定义变量,只是省略了Public|Private

21、|Dim|Static关键字。成员可以是任何已有的数据类型,包括定长和变长字符串以及已定义的其他自定义类型。如果是变体类型,必须使用“As Variant”显式定义。成员也可以是数组(包括常规数组和动态数组)。除非使用To关键字指定下标的上下界,否则成员数组的下标下界总是0,不受Option Base 0|1设置的影响。,自定义数据类型,Option Base 1 Private Type studentstrName As String * 4dtmBirthday As DateblnSex As Booleanintmark(2) As IntegerstrHobby( ) As Str

22、ing End Type,1定义自定义类型的变量和数组可以使用与基本数据类型一样的语法格式来定义自定义类型的变量和数组。例如:Dim student1 As Student, student2 As Student 定义两个Student类型的变量Dim students(1 To 50) As Student 定义Student类型的常规数组studentsDim mystudents( ) As Student 定义Student类型的动态数组mystudentsRedim mystudents(50) 重定义动态数组自定义类型变量所占用的内存空间是各个成员占用内存空间之和。其中变长字符串

23、和动态数组只占4字节,字符串和数组内容保存在内存的其他区域,成员中保存的是这个区域的地址。 2访问自定义类型变量或数组元素的成员为自定义类型变量、数组元素赋值,或使用其值,应使用以下格式(类似于访问对象的属性):自定义类型变量名.成员名自定义类型数组(下标).成员名 3为自定义类型变量赋值为自定义类型变量赋值有两种方法:(1)逐一给各个成员赋值;(2)使用同类型的变量或数组元素为整个变量赋值,被赋值变量的每个成员的值与赋值变量每个成员的值相同。 4为自定义类型数组赋值为自定义的数组赋值就是为其每个元素赋值,方法与为自定义类型的变量赋值相同。,Dim student1 As student, s

24、tudent2 As student student1.strName = “张三“ student1.dtmBirthday = #1/2/1981# student1.intmark(1) = 95 ReDim student1.strHobby(1 To 10) student1.strHobby(5) = “唱歌“ student2 = student1,如果通用过程的形式参数被定义为自定义数据类型,则可以给该通用过程传递自定义类型的值。若父过程与被调用的子过程不在同一个模块中,必须在标准模块中定义全局的自定义类型。自定义类型参数必须按地址传递,不能使用ByVal关键字修饰。,自定义数据类型参数,要让函数过程返回自定义类型的值,首先应定义全局的或模块级的自定义数据类型。定义函数过程时应该把函数返回值的类型定为该自定义类型。在函数过程体中,定义自定义类型的变量,给这个变量的各个成员赋值,最后把这个变量的值赋予函数名作为返回值(也可以把函数名当成这种自定义类型的变量,直接给它的各个成员赋值)。,自定义数据类型返回值,打开【例7.11】,打开【例7.12】,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报