VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > VB.net教程 >
  • vb.net教程之复合数据类型

 迄今为止,我们使用的都是属于基本数据类型或简单数据类型(字符串、整型、实型等)的数据,可以通过简单变量名来访问它们的元素。除基本数据类型外,Visual Basic.NET还提供了复合数据类型,包含数组结构集合(相关vb.net教程)。复合数据类型是按照一定规则组成的元素类型的数据,元素类型又称基类型,它可以是简单数据类型,也可以是复合数据类型。对于复合数据类型来说,不能用一个简单变量名来访问它的某个元素。
 
<一> 数组
   在实际应用中,常常需要处理同一类型的成批数据。例如,为了处理100个学生某门课程的考试成绩,可以用S1、S2、S3……S100来分别代表每个学生的分数,其中S1代表第一个学生的分数,S2代表第二个学生的分数……。这里的S1、S2…、S100是带有下标的变量,通常称为下标变量。显然,用一批具有相同名字、不同下标的变量来表示同一属性的一组数据,能更清楚地表示它们之间的关系。在Visual Basic.NET中,把一组具有同一名字、不同下标的下标变量称为数组。如:Str(8)。
   其中S称为数组名,8是下标,上标为0。
   一个数组,如果只用一个下标就能确定一个数组元素在数组中的位置,则称为一维数组。而由两个或多个下标变量所组成的数组称为二维数组或多维数组。
 
1、静态数组
   在Visual Basic.NET里,数组下界总是从0开始,不能改变,并且它们基于数组中的元素的数量被定义。如:
   Dim  intmyarray(10)  As Integer
   该元素从intmyarray(0)开始,直到intmyarray(10)结果,共11个元素。
 
2、动态数组
   数组到底应该有多大才合适,有时可能不得而知,所以希望能够在运行时具有改变数组维数大小的能力。
   Visual Basic.NET中,固定大小数组通过Dim语句声明,在些语句中必须指出数组的维数及大小。动态数组也是先在Dim语句中声明,但不指定大小,只需要声明其类型,即数组名后的()内为空,最多只有“,”分隔开每个维。声明定义之后的数组还不能直接赋值。在使用动态数组之前,再通过ReDim语句重新确定动态数组上界大小,Rem之后才可以赋值或参与运算。
   Visual Basic.NET中的ReDim语句仅用于为数组分配或重新分配空间,而不能重新声明数组,一旦在最开始用Dim语句确定了其维数之后,就再也不能改变其维数的数目。如从二维扩大到三维,或从三维退到一维,唯一能改变的就是数组的大小,即数组上下界。另外,也不能通过ReDim改变数组类型。
   动态数组以变量作为下标值,在程序运行过程中完成定义,通常分为两步:首先用Dim或Public声明一个没有下标的数组(括号不能省略),然后在过程中用ReDim语句定义带下标的数组。如:
   Dim  TestVar()  As  Integer
   Dim  S  Integer
   Private Sub Bubbon1_Click(ByVal sender As System.Object,ByVal e As System.EvenArgs) Handles Button1.Click)
     S=InputBox(“请输入数组大小”,”数组输入”,”10”)
     ReDim  TesVar(S)
     ……
   End Sub
   该例先在窗体层用Dim语句声明了一个空数组TesVar和一个变量S,然后在按钮事件过程中用ReDim语句定义该数组,下标S在运行时输入。
   ReDim 语句的一般格式为:
     ReDim [Preserve] 变量(下标)
   该语句用来重新定义动态数组,按定义的上界重新分配存储单元。当重新分配动态数组时,数组中的内容被清除,但如果ReDim语句使用了Preserve选择项,则不清除数组内容。在ReDim语句中可以定义多个动态数组,但每个数组必须事先用Dim Variable()(一维数组)或Dim Variable(,)(二维数组)这种形式进行声明,在括号中省略上界,在用ReDim语句重新定义时指定数组下标的上界。如:
   Dim StuName(),Address(),City() As String
   ReDim StuName(sn),Address(sn),City(sn)
   ReDim只能出现在事件过程或通用过程中,用它定义的数组是一个“临时”数组,即在执行数组所在的过程时为数组开辟一定的内存空间,当过程结束时,这部分内存即被释放。
 
   对动态数组的具体说明如下:
   (1)动态数组分两次定义,第一次用Dim、Public、Private等语句定义,只有类型,不指定维数;第二在ReDim语句定义,给出具体的维数和上界。对于一维数组来说,第一次定义时,数组名的后面带有一对圆括号,例如temp( );而对于二维数组来说,第一次定义时,数组名后面的圆括号中有一个逗号,例如temp( , ),依此类推。
   (2)可以多次用ReDim语句定义同一个数组,随时修改数组中元素的个数,例如:
   Private Sub Button1_Click(Byval sender As System.Object,ByVal e As System.EvenArgs) Handles Button1.Click
     Dim temp() As String
     Rem Temp(4)
     Temp(2)=”Microsoft”
     Msgbox(temp(2))
     ReDim temp(6)
     Temp(5)=”Visual Basic.NET”
     Msgbox(temp(5))
   End Sub
   在事件过程中,开始时用ReDim定义的数组Temp有5个元素,然后再一次用ReDim把temp数组定义为7个元素。但是注意,只能改变元素的个数,不能改变数组的维数。
   (3)在用ReDim重新定义动态数组时,可以使用可选的Preserver关键字。如果不使用该关键字,则原来数组中的数据将被清除,而如果使用了该关键字,则原来数组中的数据将被传送到新建立的数组中。
 
3、数组的清除和重定义
   数组一经定义,便在内在中分配了相应的存储空间,其大小是不能改变的。也就是说,在一个程序,同一个数组只能定义一次。有时候,可能需要清除数组的内容或对数组重新定义,这时可以用Erase语句实现。格式为:
   Erase 数组名[,数组名]…
   Erase语句用来重新初始化静态数组的元素,或者释放动态数组的存储空间,它只能出现在过程中。注意,在Erase语句中,只给出要刷新的数组名,不带括号和下标。例如:Erase Test
 
   对数组清除和重定义的具体说明如下。
   (1)当把Erase语句用于静态数组时,如果这个数组是数值数组,则把数组中的所有元素置为0;如果是字符串数组,则把所有元素置为空字符串;如果是结构数组,则根据每个元素(包括定长字符串)的类型重新进行设置。如下表:
Erase语句对静态数组的影响
数组类型 Erase对数组元素的影响
数值数组 将每个元素设为0
字符串数组(变长) 将每个元素设为零长度字符串(“”)
Object数组 将每个元素设为Empty
结构数组 将每个元素作为单独的变量来设置
对象数组 将每个元素设为Nothing
 
   (2)当把Erase语句用于动态数组时,将删除整个数组结构并释放数组所占用的内存。也就是说,动态数组经Erase后即不复存在;而静态数组经Erase后仍然存在,只是其内容被清空。
   (3)Erase释放动态数组所使用的内存。在下次引用该动态数组之前,必须用ReDim语句重新定义该数组。
例:编写程序,试验Erase语句的功能。
   Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
     Dim Test(10), i As Integer
     Debug.WriteLine(“”)
     For i=0 to 10
       Test(i)=i
       Debug.Write(Str(Test(i)) & “”)
     Next i
     Erase Test
     Debug.WriteLine(“”)
     Debug.WriteLine(“Erase Test()”)
     ReDim Test(12)
     For i=0 to 12
       Debug.Write(Str(Text(i)) & “”)
     Next i
       Debug.WriteLine(“”)
       Debug.WriteLine(“”)
   End Sub
   在上面的事件过程,定义了一个数组Text,用For循环语句为每个元素赋值,并输出每个元素的值,然后执行Erase语句,将各元素的值清除,再用ReDim语句重新定义数组Text,使得每个元素的值为0。
   ReDim是不能直接定义数组的,但从这个例子可以看出,在用Erase清除一个数组后,可以用ReDim语句重新定义该数组。
 
4、默认数组与嵌套数组
   在Visual Basic.NET中,允许定义默认数组,并可用一个数组作为另一个数组的元素,即数组嵌套。
 
   (1)默认数组
默认数组就是默认数据类型的数组。在一般情况下,定义数组应指明其类型,如:Static Elec(100) As Integer
定义了一个数组Elec,该数组的类型为整型,它有101个元素,每个元素都是一个Integer数。
如果把上面的定义改为:Static Elec(100)
则定义的数组是默认数组,其类型默认为Object,因此,该定义等价于:Static Elec(1 to 100) As Object
从表面上看,定义默认数组似乎没有什么意义,实际上不然。几乎在所有的程序设计中,一个数组各个元素的数据类型都要求相同,即一个数组只能存放同一种类型的数据。而对于默认数组来说,同一个数组中可以存放各种不同的数据。因此,默认数组可以说是一种“混合数组”。请看下例:
   编写程序,试验默认数组的功能。
     Private Sub Form1_Click(ByVal sender As Object,ByVal As System.EvenArgs) Handles MyBase.Click
       Static Defau(5)
       Dim i As Short
       Debug.WriteLine(“”)
       Defau(0)=”清华大学”
       Defau(1)=100
       Defau(2)=234.56
       Defau(3)=”BeiJing”
       Defau(4)=Now
       Defau(5)=&HAAF
       For i=0 to 5
         Debug.WriteLine(“ Defau (“ & i & “) = “ & Defau(i))
       Next i
     End Sub
   该事件过程定义了一个表态数组Defau(默认数组一般应定义为静态的),然后对各元素赋予不同类型的数据,包括整形、实型、日期和时间类型及十六进制整型。
 
   (1)嵌套数组
在一般情况下,数组元素是一个具体的数据。而在Visual Basic.NET中,可以用数组作为另一个数组的元素,这样的数组称为嵌套数组。注意,嵌套数组必须是默认数组(即Object类型),而被嵌套的数组必须是标准数据类型数组。
在实际应用中,通常把整个被嵌套数组赋给嵌套数组中的某个元素,在赋值语句中写上被嵌套数组的名字,后面加上一对空括号。例如:
Dim a(4) As Integer
Dim b(2)
For i=1 to 4
  a(i)=i*i
Next i
b(1)=a()
该例首先定义了两个数组,其中a为整型数组,b为默认数据类型(即Object)数组,在循环语句中为数组a各元素赋值,然后执行“b(1)=a()”,即可把数组a作为数组b的第一个元素。在这种情况下,数组a中的各元素可以这样表示:
   b(1)(1)
   b(1)(2)
   b(1)(3)
   b(1)(4)
 
5、数组的初始化
   定义数组的目的在于使用数组。而为了使用数组,就要给数组的各个元素赋初值,然后引用指定的元素。
   在使用数组时,通常要求数组有初值。当然可以用赋值语句或输入语句使数组中的元素得到值,但这样做会占用运行时间。为些,Visual Basic.NET允许在定义数组时对各元素指定初始值,称为数组的初始化。
   在Visual Basic 6.0以前的版本中,数组元素的初始值用Array函数实现,而在Visual Basic.NET中,给数组赋初始值的方法与C语言类似。
   (1)一维数组的初始化:Dim 数组名( )  As 类型 = {值1,值2,值3,……,值n }
Visual Basic.NET不允许对显式指定上界的数组进行初始化,因此“数组名”后面的括号中必须为空,根据具体初值的个数确定数组的上界,需要赋给各元素的初值放在等号后面的花括号中,数据之间用逗号隔开。如:
Dim a()  As Short = {2,4,6,8,10}
定义了一个Short型数组a,该数组有5个初值,因此数组的上界为4,即a(4)。经过上述定义和初始化后,把花括号中的值依次赋给各数组元素,使得a(0)=2,a(1)=4,a(2)=6,a(3)=8,a(4)=10。类似地,对字符串数组也可以初始化。如:
Dim c()  As String={“Liu”,”De”,”Rong”}
定义了一个字符串数组c,该数组有3个初值,因此数组的上界为2,即c(3)。经过上述定义和初始化后,把花括号中的值依次赋给数组元素,使得 c(0)=”Liu”,c(1)=”De”,c(2)=”Rong”
(2)二维数组的初始化:Dim 数组名( , )  As 类型={{第一行值},{第二行值},……,{第n行值}}
 如:Dim  arr ( , )  As Short={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
定义了一个二维数组,它有3行4列,即 arr (2,3)。
(3)多维数组的初始化:与二维数组的相同。
 
6、For  Each……Next语句
   For  Each……Next语句类似于For…Next语句,两者都用来执行指定重复次数的一组操作。但For  Each…Next语句专门用于数组或对象“集合”,其一般格式为:
   For  Each 成员 In 数组
     循环体
     [Exit For]
     ……
   Next [成员]
   这里的“成员”是一个Object变量,它是为循环提供的,并在For  Each…Next结构中重复使用,它实际上代表的是数组中的每个元素。“数组”是一个数组名,没有括号和上下界。
   用For  Each…Next语句可以对数组元素进行处理,包括查询、显示或读取。它所重复执行的次数由数组中元素的个数确定,也就是说,数组中有多少个元素,就自动重复执行多少次。如:
   Dim  MyArray(5)
   Dim  x  As Short
   For  Each  x  In  MyArray
     Debug.Write(x)
   Next x
   将重复执行6次(因为数组MyArray有6个元素),每次输出数组的一个元素的值。这里的X类似于For…Next循环中的循环变量,但不需要为其提供初值和终值,而是根据数组元素的个数确定执行循环体的次数。此外,x的值处于不断的变化之中,开始执行时,x是数组第一个元素的值,执行完一次循环体后,x变为数组第二个元素的值…,当x为最后一个元素的值时,执行最后一次循环。x是一个Object变量,它可以代表任何类型的数组元素。
   可以看出,在数组操作中,For  Each…Next语句比For…Next语句更方便,因为它不需要指明结束循环的条件。

 

相关教程