1、第五章 数组,在基本类型之外VB提供了数组类型,可以方便的灵活的组织和使用数据。 例如: a(0)、a(1)、a(2)、a(3)、a(4)、a(5) 象变量一样,为了区分数组,必须为每一个数组取一个名字,称为数组名。 数组名的命名原则与变量名一样,数组的概念,在同一数组中,构成该数组的成员称为“数组元素”(数组分量、下标变量) 每一个数组元素都有一个编号,称为“下标” 将一组排列有序的、个数有限的变量作为一个整体,用一个统一的名字来表示,这些带有下标的变量的全体称为数组,数组变量与简单变量的区别,有序性和无序性是数组变量与简单变量的区别。 简单变量的没有顺序的,而数组中的单元是有排列顺序的。,
2、数组的特性,1、数组中的元素(或分量)均是同类型的量。 2、数组中的每个元素均能直接访问。 可以用数组名及下标唯一识别一个数组元素。 例如:a(2)=200,数组的定义,数组原则上应当先定义后使用。一个数组包括数组名、数组维数、数组单元数等因素。 使用数组时要告诉计算机以上内容,以便计算机分配足够的存储单元,这就是建立(说明、定义、声明)数组。,建立数组,Public | Private | Dim () AS 建立公用数组,在模块的声明段用Public 建立模块数组,在模块的声明段用Private或Dim 建立局部数组,在过程中用Dim或Private 例如:Dim a(9) As Inte
3、ger Dim b(3,4) As Integer,数组的上、下界,数组有上界和下界,数组在上界和下界之间是连续的。 数组的单元数和数组的维数由数组名后跟用括号括起来的的上界和下界组成。例如: Dim a(1 to 9) As Integer Dim b(1 to 3 , 1 to 4) As Integer Dim a(9) As Integer,Dim的相关说明,Dim不但能建立数组还能初始化数组,即将建立的数组赋初始值。 数值型数组初始值为0;字符串型数组初始值为空字符串。 Dim语句必须放在使用数组之前, Dim不具有再定义功能 即不能直接使用Dim对已经定义的数组进行重新定义。,数组
4、的维数,数组元素中下标的个数称为数组的维数。 一个下标的下标变量,构成一维数组。 两个下标的下标变量,构成二维数组。 例如: Static aa(9,9) As Double Dim bb(3, 1 to 4 , 1 to 5) As Integer,数组的类型,AS 表明数组元素的类型。可以声明任何基本类型的数组。 一个数组中所有元素应该具有相同的数据类型,但当数组类型为Vatiant时,各个元素能够包含不同类型的数据,即数组元素的类型可以不同。,下标变量的使用说明,下标变量由数组名后跟括号括起来的下标组成 下标可以是常量、变量或表达式 a(2)、c(x)、b(2+4)、a(x+3) 下标值
5、若为非整数,则自动取整,下标范围为Long类型的范围-21474836482147483647 下标变量的类型就是数组的类型。 下标变量象简单变量一样,可以被赋值和引用,例,例5.1 用数组计算6个同学的平均成绩和优秀率,缺省数组,缺省数组就是缺省数组的数据类型。 例如:Dim Elec(1 to 100) 缺省数组的数据类型为Variant Dim Elec(1 to 100) 等价于 Dim Elec(1 to 100) As Variant 缺省数组中的各个数组元素可以存放不同类型的数据,即各个数组元素的数据类型可以不同。,缺省数组例,Sub Form_Click( )Static De
6、fau(5)Defau(1)=100Defau(2)=234.56Defau(3)=“Beijing“ Defau(4)=“20“Defau(i)Next i End Sub,嵌套数组,一般情况下数组元素是一个具体的数据,VB允许用数组作为另一个数组的元素,这样的数组称为嵌套数组。 嵌套数组必须是缺省数组;被嵌套的数组必须是标准数据类型数组。,嵌套数组,Sub Form_Click()Dim a(4) As IntegerDim b(2)For x = 0 To 4a(x) = xNext xb(1) = a() For i = 0 To 4Print b(1)(i)Next i End Su
7、b,嵌套数组例5.2 Private Sub Form_Click( )Static Firstarray(4) As StringDim i As IntegerFor i=0 to 4Firstarray(i)=Chr$(i+65)Next iStatic Secondarray(4) As StringFor i=0 to 4Secondarray(i)=iNext iStatic Thirdarray(2)Thirdarray(1)=Firstarray( )Thirdarray(2)=Secondarray( )For i=0 to 4Print Thirdarray(1)(i)Pr
8、int Thirdarray(2)(i)Next i End Sub,5.2 静态数组与动态数组,静态数组: 计算机在执行程序前,系统进行编译的时候,根据说明语句开辟的固定的存储空间,直到程序执行结束,在整个过程中不再改变,这种数组称为静态数组。,5.2 静态数组与动态数组,动态数组: 计算机在执行过程中才给数组开辟存储空间,当不需要时,可以用Erase删除他,收回分配给他的存储空间,还可以使用ReDim(或Dim)语句再次分配存储空间,这样的数组称为动态数组。,5.2.1 动态数组的定义,在定义数组时,一般已经指定了上下界,这样数组大小就确定了。但是有时可能事先无法确认到底需要多大的数组所以
9、希望能够在运行时能够改变数组的大小,这就要用到动态数组。 动态数组是用变量作为下标定维的数组,在程序运行的过程中完成数组的定义,动态数组可以在任何时候改变大小。,5.2.1 动态数组的定义,创建动态数组通常分为以下两步: 第一步:声明一个没有下标的数组。 第二步:在过程中用ReDim语句定义带下标的数组。 Dim MyArray( ) As Integer Redim MyArray(5),ReDim语句,ReDim语句的语法: ReDim ()As(数据类型)Dim MyArray( ) As Integer Redim MyArray(5),ReDim语句,可以使用ReDim语句反复地改变
10、数组的元素以及数目,但是不能在将一个数组定义为某种数据类型之后,再使用ReDim将该数组改为其他数据类型,除非是variant所包含的数组。 如果将数组改小,则被删除的元素中的数据就会丢失。,ReDim语句,如果ReDim语句所使用的变量在模块级别或过程级别不存在,则该语句就相当于一个声明语句。 不应把ReDim作为声明语句使用,而只应作为重定义数组大小的语句。,例5.3:ReDim语句示例,Dim MyArray( ) As IntegerRedim MyArray(5) For i=0 To 5MyArray(i)=i Next iRedim MyArray(10) For i=0 To
11、10MyArray(i)=i Next iRedim Preserve MyArray(15),5.2.2 数组的清除和重定义,数组一经定义,便在内存中分配了相应的存储空间,其大小是不能改变的。也就是说,在一个程序中,同一个数组只能定义一次。有时候,可能需要清除数组的内容或对数组重新定义,这可以用Erase语句实现。,Erase语句,格式为:Erase 数组名,数组名 Erase语句用来重新初始化静态数组的元素,或者释放动态数组的存储空间。 注意,在Erase语句中,只给出要刷新的数组名,不带括号和下标。例如: Erase stu,Erase语句说明, 当把Erase语句用于静态数组时,如果这
12、个数组是数值数组,则把数组中的所有元素为0;如果是字符串数组,则把所有元素置为空字符串。,Erase语句说明, 当把Erase语句用于动态数组时,将删除整个数组结构并释放该数组所占用的内存。也就是说,动态数组经Erase后即不复存在;而静态数组经Erase后仍然存在,只是其内容被清空。,Erase语句说明, 当把Erase语句用于变体数组时,每个元素被重置为空。 Erase释放动态数组所使用的内存。在下次引用该动态数组之前,必须用Redim语句重新定义该数组变量的维数。,例5.4: Static sub Form_Click( )Static Test(1 to 20) As IntegerS
13、tatic i As IntegerFor i=1 to 20Test(i)=iPrint Test(i);Next iErase TestPrint “Erase Test( )“For i=1 to 20Print Test(i);Next i End sub,5.3 数组的基本操作,数组元素的输入(1)用InputBox函数输入 例5.5:从键盘输入3个姓名:LiuFeng、WangHong、Zhaoyitian,在窗体层(“通用”的“声明”段)输入: Option Base 1 Dim stuname( ) As String Form_Click( )的事件代码为: Private
14、Sub Form_Click( )Dim temp As Stringi As IntegerReDim stuname(3) As StringFor i=1 To 3temp=InputBox(“Enter Name“)stuname(i)=tempNext i End Sub,数组元素的输入,(2)用赋值语句输入 stuname(1)=“Liu Feng“ stuname(2)=“Wang Hong“ stuname(3)=“Zhaoyitian“,数组元素的输入,多维数组元素的输入通过多重循环来实现。由于数组是按行的顺序存储的,因此把控制数组第一维的循环变量放在最外层循环中。 Dim
15、a(35) For i=1 To 3For j=1 to 5a(ij)=2*i*j Next j Next i,数组元素的输出,例5.6:输入下面按行列式排列的数据,并按原始顺序输出。11 12 13 1421 22 23 2431 32 33 34 用一个二维数组,按行的顺序输入和输出。,Dim a(1 to 31 to 4)As Integer Private Sub Form_load( )Dim I As Integer , j As Integer For i=1 To 3For j=1 To 4a(i,j)=InputBox(“Enter Data:“)Next J Next iS
16、how For i=1 To 3For j=1 To 4Print a(ij);“ “;Next J PrintNext i End Sub,数组元素的复制,单个数组元素可以像简单变量一样从一个数组复制到另一个数组,而不管数组的维数是否相同。例如: Dim a(3,5),b(6) b(2)=a(2,3) a(2,1)=b(4),复制整个数组,Option Base 1 Dim name1( ) , name2( )(以上两行放在窗体中) Sub Form_Click( )ReDim name1(10) , name2(10)For I=1 to 10Msg$=InputBox$(“Enter
17、name:“)name1(i)=msg$Next IFor I=1 to 10name2(i)=name1(i)Next I End Sub 将把数组name1中的数据复制到name2中。,5.3.2 For EachNext语句,For Each InExit For Next ,5.3.2 For EachNext语句,For EachNext语句所重复执行的次数有数组中元素的个数确定,也就是说,数组中有多少个元素,就自动重复执行多少次。例如: Dim aa(1 To 6) For Each x In aaPrint x; Next x,例5.7:本例建立一个数组,并通过Rnd函数为每个数
18、组元素赋给一个1到100之间的整数。然后用For EachNext语句输出值大于50的元素,求出这些元素的和。如果遇到值大于90的元素,则退出循环。,Dim aa(1 T0 20) 在“通用“的“声明“段中输入Private Sub Form_Click( )For i=1 To 20aa(i)=Int(Rnd*100)Next iFor Each a In aaIf a50 ThenPrint as=s+aEnd IfIf a90 Then Exit ForNext aPrintPrint s End Sub,数组的初始化,所谓的数组的初始化,就是给数组的各元素赋初值。用赋值或InputBo
19、x函数为数组元素赋值,这两种方法都需要占用运行时间,影响效率。为此,VB提供了Array函数。,Array函数,Array函数用来为数组元素赋值,即把一个数据集读入某个数组。其格式为: 数组变量名=Array(数组元素值) Static Numbers As Variant Numbers=Array(1,2,3,4,5) 注意,Array函数只使用于一维数组,即只能对一维数组初始化,不能对二维或多维数组初始化。,Option Base 1 Private sub Command1_Click( )Static Test_str Test_str=Array(“one“,“Two)Print
20、Test_str(1) End Sub,注意, Array函数中数组变量不能是具体的数据类型,只能是变体(Variant)类型。 变体数组变量可以通过3种方式定义。 显式定义为Variant变量。 在定义时候不指明类型。 不定义而直接使用。,例5.8:,Option Base 1 Private Sub form_Click( )Dim aaa as variantMyWeek=Array(“Mon“,“Tue“,“Wed“,“Thu“,“Fri“,“Sat“,“Sun“)myday2=MyWeek(2)myday3=MyWeek(4)Print myday2,myday3aaa=Array(
21、1,2,3,4,5,6)For I=1 to 6Print aaa(i);Next I End Sub,例5.8:,用Array函数对两个数组变量进行初始化。其中变量aaa被显式地定义为变体类型,MyWeek未定义而直接使用,缺省为变体类型。 注意,Array函数只使用于一维数组,即只能对一维数组初始化,不能对二维或多维数组初始化。,5.4 控件数组,控件数组通常用于需要对若干个控件执行大致相同的操作,控件数组共享同样的事件过程。例如,假定一个控件数组含有3个命令按钮,则不管单击哪一个,都会调用同一个Click过程。,建立控件数组,可以通过两种方法来建立。 1给控件起相同的名称 2利用复制的方
22、法,控件数组的下标,控件数组由一组相同类型的控件组成,这些控件共用一个相同的控件名,具有相同的属性设置。 数组中的每个控件都有惟一的索引号,即下标,下标值由控件的Index属性指定。其所有元素的Name属性必须相同,所以Index属性与控件数组中某个元素有关。也就是说,控件数组的名字由Name属性指定,而数组中的每个元素则由Index属性指定。与普通数组一样,控件数组的下标也放在圆括号中,例如Option1(0),控件数组的下标,在建立控件数组时,VB给每个元素赋一个下标值,通过属性窗口中的Index属性,可以知道这个下标值是多少。可以看到,第一个命令按钮的下标值为0,第二个为1。在设计阶段,
23、可以改变控件数组元素的Index属性,但不能在运行时改变。,控件数组元素的引用,控件数组元素通过数组名和括号中的下标来引用。例如下面的代码,当单击每个命令按钮时,该按钮的Caption属性被设置为Hello。 Private Sub Command1_Click(Index As Integer)Command1(Index).Caption=“hello“ End Sub,控件数组例:,例5.9:设计窗体,输入两个数,根据不同运算符计算结果。,5.5 应用举例,例5.10:将下列字符存放到数组中,并以倒序打印出来。字符是: a b q r s t w x y e m n 例5.11:随机产生10个二位整数,放入数组a,从中选出一个最大的和最小的数打印出来。 例5.12:从键盘输入10个数,要求按从小到大的顺序打印出来。,