第6章数组与集合_第1页
第6章数组与集合_第2页
第6章数组与集合_第3页
第6章数组与集合_第4页
第6章数组与集合_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

VB.NET程序设计实训教程第6章数组与集合6.1数组6.2数组重定义6.3对象数组6.4集合与控件数组6.5实训练习66.1数组6.1.1数组的分类1.VB.NET中的数组分类(1)按数组的大小(元素个数)是否可以改变可分为:固定大小(定长)数组、动态(可变长)数组。(2)按元素的数据类型可分为:数值型数组(整型、实型)、字符串数组、逻辑型数组、日期型数组等,这些都是基本数据类型的数组,数组类型也可以是Object类型。(3)按数组的维数可分为:一维数组和二维数组、三维数组等多维数组。

2.按作用域分类与变量一样,数组按作用域分可为:全局数组(应用程序级)、模块级数组和局部数组(过程级)。(1)全局数组:在标准模块的声明部分使用Public声明,其作用范围是整个应用程序,可以在应用程序的所有模块中访问数组。(2)模块级数组:在模块的声明部分使用Private或Dim语句(二者等价)声明,模块级数组只在声明它的模块中可用。(3)过程级数组:在过程中使用Dim或Static语句声明,只能在本过程中使用。使用Static声明的静态数组,在过程的两次执行之间它的所有元素的值均被保留。6.1.2一维数组1.一维数组的声明数组的声明格式为(两种格式)格式一:Dim数组名(下标上界) As <数据类型>例如:DimarrData(2)asStringDimarrA(5)AsInteger说明:①按作用域不同,关键字Dim可以换成Public、Static②数组名的命名规则与变量的命名规则相同。③VB.NET数组下界为0,且不能更改(与旧版本VB不同),数组的元素个数为:下标上界+1。④VB.NET中,声明数组时,<下标上界>值可以是整型常量、变量或表达式。例如:DimmAsIntegerm=5DimarrA(m)As。⑤声明数组时,下标上界最好是整型数据,如果是浮点数,系统会自动四舍五入取整。例如,DimarrA(4.5)AsIntege下标上界为5⑥数组中各元素在内存占一片连续的存储空间。声明数组的第二种格式:

Dim数组名()As数据类型1=New数据类型2(<下标上界>){}注意:数据类型2和数据类型1必须相同,下标上界后的一对大括号{}不能省略。①Dim数组名 As 数据类型1()=New 数据类型2(<下标上界>){}②Dim数组名=New 数据类型2(<下标上界>){}例如,以下三种格式是等效的:DimarrA() AsvInteger=NewInteger(4){}DimarrA As Integer()=NewInteger(4){}DimarrA=NewInteger(4){}2.一维数组的引用引用形式:数组名(下标)定义了数组后可以引用数组元素,每个数组元素有一个唯一序号,称为下标,下标可以是整型常量、变量或表达式。如果下标不是整数,系统会自动四舍五入取整。例如,定义两个数组:DimarrA(10),arrB(10)AsInteger则下面的语句都是正确的:arrA(1)=arrA(2)+arrB(1)+5'下标是整数arrA(i)=arrB(i)'下标使用变量arrB(i+1)=arrA(i+2)'下标使用表达式引用数组元素时,VB.BET对下标范围进行检查,正确的下标范围是0~下标上界,超出范围会提示相应错误信息——索引超出了数组界限。3.一维数组的基本操作(1)数组的初始化数组的初始化是指在声明数组的同时为数组元素赋初值,具体格式有以下两种:Dim数组名() As 数据类型={表达式1,表达式2,...,表达式n}Dim数组名 As 数据类型()={表达式1,表达式2,...,表达式n}例如:DimarrA()AsInteger={1,2,3,4,5}注意:①对数组进行初始化时,不能指定数组上界。例如,DimarrA(5)AsInteger={1,2,3,4,5},运行时会提示如下错误信息“对于用显式界限声明的数组不允许进行显式初始化”。②数组长度由花括号内数据个数决定。上例中数组arrA的长度为5。③如果对数组不进行显式初始化,系统会进行隐式初始化。数值型数组被初始化为0,字符型被初始化为空串“”,布尔型数组初始化为False,日期型数组被初始化为01/01/000100:00:00。格式三:Dim数组名()As数据类型1=New数据类型2(){表达式1,表达式2,...,表达式n}例如:DimarrA()AsSingle=NewSingle(){1,2,3,4,5}注意:①用New子句初始化时,数组名后的圆括号可以放到数据类型1后面,也可以将数组名后的圆括号、as和数据类型1都省略。②通常数据类型2后的圆括号中不指定下标上界,元素个数由在大括号{}中提供的数值个数决定。但也可以同时提供下标上界和元素值,此时,必须为数组的每个元素都提供初始值,即大括号中的数值个数必须为下标上界+1。如上例的声明可改为:DimarrA()AsSingle=NewSingle(4){1,2,3,4,5}(2)数组的整体赋值数组的整体赋值是指先声明数组,然后用赋值语句对其进行整体赋值。格式为:Dim数组名(下标上界n) As 数据类型数组名={表达式1,表达式2,...,表达式n,表达式n+1}例:Dim arrA(4)AsIntegerarrA={1,2,3,4,5}在VB.NET中,也可以用一个已知数组给另一个数组进行一次性赋值,只要这两个数组的数据类型相同即可。例如:Dim arrA(4) As Integer={1,2,3,4,5}Dim arrB(4) As IntegerarrB=arrA(3)通过循环在程序中逐个为数组元素赋值在编写程序时已经能够确定各元素值的,可以在循环体中通过赋值语句赋值。例如:Dim arrA(9) As Integer'arrA数组索引值范围为0~9Fori=0To9 arrA(i)=i+1'arrA数组的元各素值分别为1,2,3,...,9,10Nexti如果是在程序运行时给数组赋值,可以通过TextBox控件或InputBox函数逐个输入数组各元素值,如果是控制台应用程序,可以用read或readline来实现。例如,输入10个数,存入到数组arrA中,代码为:Dim arrA(9) As IntegerFori=0To9arrA(i)=Val(InputBox("输入A("&i&")的值"))Nexti(4)数组的输出数组的输出,不能通过数组名进行整体输出,只能逐个输出数组元素。具体地,通过循环结构,使用TextBox控件、label控件,或messagebox函数输出数组元素的值。如果是控制台应用程序,可以用console.write或console.writeline来输出。例如:Fori=0To9CallMessageBox.Show(A(i))NextI(5)ForEach...Next循环的使用利用ForEach...Next循环可以遍历数组中的每个元素,例如:Dim arrA() As string={"A","B","C","D","E"}ForEachstrAsstringInarrA

CallMessageBox.Show(str)Nextstr该语句可以令str依次取数组arrA中的每个元素值,遍历数组arrA。不论数组有多少个元素,代码都适用。【例6-1】创建一个窗体应用程序,程序运行结果如图6-1所示。要求定义一个包含10个元素的一维数组,数组元素值是随机产生的10个100以内的整数,求数组中最大元素及所在位置。实现步骤:(1)启动VS2013,创建窗体应用程序例6-1。(2)按照图6-1所示设计应用程序界面。修改三个标签控件、按钮控件的Text属性。(3)在代码窗口中定义模块级一维数组arrA(9)(4)编写“产生数组”按钮的代码PrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.ClickDimiAsIntegerRandomize()TextBox1.Text=""Fori=0To9A(i)=Int(100*Rnd())TextBox1.Text=TextBox1.Text+CStr(A(i))+","NextTextBox1.Text=Mid(TextBox1.Text,1,Len(TextBox1.Text)-1)EndSub(5)编写“最大值及其位置”按钮的代码。PrivateSubButton2_Click(senderAsObject,eAsEventArgs)HandlesButton2.ClickDimMax,IMaxAsIntegerMax=A(0):IMax=0Fori=1To9IfA(i)>MaxThenMax=A(i)IMax=iEndIfNextiTextBox2.Text=Str(Max)TextBox3.Text=Str(IMax)+1EndSub(6)编写“退出”按钮代码。PrivateSubButton3_Click(senderAsObject,eAsEventArgs)HandlesButton3.ClickApplication.Exit()EndSub(7)运行程序。6.1.3二维数组1.二维数组的声明声明二维数组格式为:格式一:Dim数组名(下标1上界,下标2上界) As 数据类型格式二:Dim数组名数据类型(下标1上界,下标2上界)例如:Dim arrA(2,3) As Single也可以使用

New

子句创建二维数组,格式为:格式三:Dim数组名(,) As 数据类型1=New数据类型2(下标1上界,下标2上界){}例如,DimarrB(,) As Integer=New Integer(2,3){}2.二维数组的引用引用形式:数组名(下标1,下标2)'下标可以是整型变量、常量或表达式例如,arrA(1,2)=10arrA(i+2,j)=arrA(2,3)*23.二维数组的基本操作(1)二维数组的初始化格式一:Dim数组名(,)As数据类型={{第1行元素初值序列},{第2行元素初值序列},...,{第m行元素初值序列}}在每行的元素初值序列中,各个数值要用逗号分开。例如:DimarrA(,)AsInteger={{1,2,3,4},{5,6,7,8},{9,10,11,12}}采用这种格式对二维数组进行初始化时,也不能指定数组的下标上界,如果将上述语句改为:DimarrA(2,3)AsInteger={{1,2,3,4},{5,6,7,8},{9,10,11,12}},系统也会报错。使用New子句初始化二维数组的格式为:Dim数组名(,)As数据类型1=New数据类型2(下标1上界,下标2上界){{第1行元素初值序列},{第2行元素初值序列},...,{第m行元素初值序列}}例如,DimarrA(,)AsInteger=NewInteger(,){{1,2,3,4},{5,6,7,8},{9,10,11,12}}DimarrA(,)AsInteger=NewInteger(2,3){{1,2,3,4},{5,6,7,8},{9,10,11,12}}(2)二维数组的整体赋值对已定义的m行n列二维数组,整体赋值格式为:数组名={{第1行元素初值序列},{第2行元素初值序列},...,{第m行元素初值序列}}其中每一行的初值序列都包含n个数值。例如:DimarrA(2,3)AsIntegerarrA={{1,2,3,4},{5,6,7,8},{9,10,11,12}}如果两个相同数据类型的数组的维数和长度都相等,也可以用一个数组给另一个数组赋值。例:DimarrA(2,3)AsInteger={{1,2,3,4},{5,6,7,8},{9,10,11,12}}DimarrB(2,3)AsIntegerB=A(3)通过循环给二维数组赋值DimarrA(2,3)AsInteger'arrA是3×4的二维数组Dimi,jAsIntegerFori=0To2'i对应下标1,初值为0,终值为下标1上界Forj=2To3'j对应下标2,初值为0,终值为下标2上界arrA(i,j)=i*jNextjNexti如果要在程序运行时,逐个输入二维数组的各元素值,可将语句arrA(i,j)=i*j改为由TextBox控件或InputBox函数输入元素值。如:arrA(i,j)=Val(InputBox("arrB("&i&","&j&")=?"))(4)二维数组的输出通过循环输出二维数组时,也需要双重循环,外层循环控制变量对应下标1,内层循环控制变量对应下标2,在循环体内添加对应的输出语句。具体数值可以输出到TextBox控件、label控件中,或用messagebox函数输出数组元素的值,如果是控制台应用程序,可以用console.write或console.writeline来输出。例如:DimarrA(2,3)AsInteger'3×4的二维数组Dimi,jAsIntegerFori=0To2'i对应下标1,初值为0,终值为下标1上界Forj=2To3'j对应下标2,初值为0,终值为下标2上界CallMessageBox.Show(arrA(i,j))NextjNextI【例6-2】定义一个3行4列整型二维数组arrA,从键盘上输入各元素值,求最大元素及其所在的位置。实现:创建一个窗体应用程序,编写窗体的单击事件过程,代码如下。PrivateSubForm1_Click(senderAsObject,eAsEventArgs)HandlesMyBase.ClickDima(2,3)AsIntegerDimi,jAsIntegerDimMax,Row,ColAsIntegerFori=0To2Forj=0To3a(i,j)=Val(InputBox("a("&i&","&j&")=?"))NextjNextiMax=a(0,0):Row=0:Col=0Fori=0To2Forj=0To3Ifa(i,j)>a(Row,Col)ThenMax=a(i,j):Row=i:Col=jEndIfNextjNextiCallMessageBox.Show("最大元素是"&Str(Max)&"在第"&Row&"行,"&"第"&Col&"列")EndSub【例6-3】求二维矩阵的转置,即将矩阵的对应行和列的元素互换。程序运行界面如图6-2所示。

ConstM=4,N=4PrivateSubForm1_Click(senderAsObject,eAsEventArgs)HandlesMyBase.ClickDimA(M,N),TempAsFori=0ToMForj=0ToNarrA(i,j)=2*iNextjNextiDimstrAsString=""Fori=0ToMForj=0ToNstr=str&arrA(i,j)&""Nextjstr=str&vbCrLfNextistr=str&vbCrLfFori=0ToMForj=iToNTemp=arrA(i,j)arrA(i,j)=arrA(j,i)arrA(j,i)=TempNextjNextiFori=0ToMForj=0ToNstr=str&arrA(i,j)&""Nextjstr=str&vbCrLfNextiCallMessageBox.Show(str)EndSub【例6-4】编程实现两矩阵相乘。

ConstM1=4,N=3,M2=5DimA(M1-1,N-1)AsInteger'声明M1×N二维A数组DimB(N-1,M2-1)AsInteger'声明N×M2二维B数组DimC(M1-1,M2-1)AsInteger'声明M×M二维C数组PrivateSubForm1_Load(senderAsObject,eAsEventArgs)HandlesMyBase.LoadDimi,j,kAsIntegerFori=0ToM1Forj=0ToNA(i,j)=i+j+2TextBox1.Text=TextBox1.Text&(CStr(A(i,j)).PadLeft(3))NextjTextBox1.Text=TextBox1.Text&vbCrLfNextiFori=0ToNForj=0ToM2B(i,j)=i+j+1TextBox2.Text=TextBox2.Text&(CStr(B(i,j)).PadLeft(3))NextjTextBox2.Text=TextBox2.Text&vbCrLfNextiEndSubPrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.ClickFori=0ToM1Fork=0ToM2Forj=0ToNC(i,k)=C(i,k)+A(i,j)*B(j,k)'生成新数组NextjNextkNextiFori=0ToM1Forj=0ToM2TextBox3.Text=TextBox3.Text&(CStr(C(i,j)).PadLeft(4))NextjTextBox3.Text=TextBox3.Text&vbCrLfNextiEndSub6.1.4多维数组定义多维数组的格式为:Dim数组名(下标上界1,下标上界2,……) As 数据类型例如:DimarrA(5,5,5)AsInteger’声明arrA是三维数组DimarrB(2,6,10,5)AsInteger'声明arrB是四维数组多维数组的操作与二维数组类似,可以用For循环的嵌套来处理多维数组。当增加数组的维数时,数组所占的存储空间会大幅度增加,所以要慎用多维数组。6.1.5交错数组交错数组是一种特殊的数组,即数组中每个元素的本身又是一个一维或多维数组,称为“数组的数组”,即交错数组1.交错数组的声明(1)交错数组的元素为一维数组格式一:Dim数组名(下标上界)() As 数据类型采用该格式声明交错数组时,数组名后必须用两对圆括号,而且下标上界要在第一对圆括号中指定。例如,DimarrA(3)()AsString格式二:Dim数组名()()As数据类型1=New数据类型2(下标上界)(){}例如,DimarrA()()AsString=Newstring(3)(){}'声明了包含四个元素的交错数组,而且四个元素都是一维数组。采用格式二声明交错数组时,数组名后的两对圆括号可以放到数据类型1后,但下标上界只能在数据类型2后的第一对圆括号中指定。(2)交错数组的元素为多维数组如果交错数组的元素为二维数组,声明格式为:格式一:Dim数组名(下标上界)(,) As数据类型

格式二:Dim数组名()(,) As数据类型1=New数据类型2(下标上界)(,){}例如,DimarrA(,) AsInteger={{1,2,3},{4,5,6}}'arrA是2×3的二维数组DimarrB(,) As Integer={{1,2},{3,4},{5,6},{7,8}}'arrB是4×2的二维数组DimarrAB(1)(,)AsInteger'定义包含2个元素的交错数组arrABarrAB(0)=arrA'交错数组第一个元素赋值为二维数组arrAarrAB(1)=arrB''交错数组第二个元素赋值为二维数组arrA如果交错数组的元素为三维数组,则声明格式为:格式一:Dim数组名(下标上界)(,,) As数据类型格式二:Dim数组名()(,,) As数据类型1=New数据类型2(下标上界)(,,){}(3)交错数组的元素为交错数组如果交错数组的元素为交错数组,则声明格式为:格式一:Dim数组名(下标上界)()() As数据类型格式二:Dim数组名()()() As数据类型1=New数据类型2(下标上界)()(){}例如,下列程序段中,arrA就是一个元素为交错数组的交错数组。DimarrA1()AsInteger={1,2,3}'arrA1是上界为2的一维数组DimarrA2()AsInteger={4,5,6,7}'arrA2是上界为3的一维数组DimarrA(1)()AsInteger'arrA是由数组arrA1、arrA2作为元素的交错数组arrA(0)=arrA1arrA(1)=arrA2DimarrB1()AsInteger={11,22}'arrB1是上界为1的一维数组DimarrB2()AsInteger={33,44,55}'arrB2是上界为2的一维数组DimarrB3()AsInteger={66,77,88,99}'arrB3是上界为3的一维数组DimarrB(2)()AsInteger'arrB是由数组arrB1、arrB2、arrB3作为元素的交错数组arrB(0)=arrB1arrB(1)=arrB2arrB(2)=arrB3DimarrAB(1)()()AsInteger'arrAB是上界为1的交错数组,且两个元素都是交错数组arrAB(0)=arrAarrAB(1)=arrB2.交错数组的初始化与一般数组相同,可以在声明交错数组的同时进行初始化,例如:DimarrA()()AsInteger={NewInteger(){1,2,3},NewInteger(){4,5,6,7}}对由一维数组构成的交错数组初始化,注意大括号对中的NewInteger()不能省略。初始化时,也可以采用New子句,上述初始化语句可以改为:Dim arrA()() As Integer=New Integer(1)(){New Integer(){1,2,3},NewInteger(){4,5,6,7}}对由二维数组构成的交错数组初始化,可以采用以下几种格式:DimarrAB()(,)AsInteger={NewInteger(,){{1,2},{3,4}},NewInteger(,){{5,6},{7,8},{9,10}}}DimarrAB()(,)AsInteger=NewInteger(1)(,){NewInteger(,){{1,2},{3,4}},NewInteger(,){{5,6},{7,8},{9,10}}}DimarrAB()(,)AsInteger=NewInteger()(,){NewInteger(,){{1,2},{3,4}},NewInteger(,){{5,6},{7,8},{9,10}}}6.2.1动态数组在VB.NET中,声明数组时,声明格式为:一维数组:Dim数组名()As数据类型二维数组:Dim数组名(,)As数据类型三维数组:Dim数组名(,,)As数据类型对于多维数组,可以以此类推进行声明。声明动态数组时需要注意以下几点:①数组名后的括号不仅可以放在数组名后,还可以放在数据类型名后,具体为:一维数组:Dim数组名As数据类型()二维数组:Dim数组名As数据类型(,)②声明二维动态数组时,不能省略数组名后面小括号中的逗号。③对于动态数组,由于声明时它只是说明了类型,却没有在内存中分配空间(因为元素个数未定),

因此,在它没有具体实例化前是不能直接使用的。6.2数组重定义④也可以使用New子句定义动态数组,格式为:一维数组:Dim数组名()As数据类型1=New数据类型2(){}二维数组:Dim数组名(,)As数据类型=New数据类型2(){}三维数组:Dim数组名(,,)As数据类型=New数据类型2(){}⑤对动态数组,可以进行初始化和整体赋值。例如:DimarrA1AsChar()={"n"c,"e"c,"t"c}

'字符数组arrA1初始化,长度为3,语句可以改为以下两条,效果是相同的:DimarrA1()AsChar:arrA1={"n"c,"e"c,"t"c}

Dim

arrA2()AsBoolean={True,True,False,True}

'布尔型数组arrB初始化,长度为4。该语句也可以改为以下两条等效的语句:Dim

arrA2()AsBooleanarrA2={True,True,False,True}DimarrD(,)AsInteger'声明动态二维数组arrD={{1,2,3,4},{5,6,7,8},{9,10,11,12}}'二维数组arrD整体赋值除了初始化和整体赋值,对动态数组必须用redim重新定义后才能正常使用。6.2.2数组重定义1.数组的重定义格式:ReDim[Preserve]数组名(上界1[,上界2…])该语句用来重新定义数组,按定义的上界重新分配存储单元。当重新定义数组时,数组中的原有内容将被清除,但如果在ReDim语句中使用了Preserve选项,则不清除数组内容。使用ReDim重新定义数组时需要注意下面几点:①与Dim、Static语句不同,ReDim语句是一个可执行语句,只能出现在过程中。②如果想改变数组大小又不想丢失原来的数据,只要在ReDim语句中包含Preserve关键字就可以。③对于已经使用ReDim重定义过的动态数组,可以使用ReDim再次重新定义,而且再定义的数组长度可以增加,也可以减小。④ReDim只能用来重新定义数组的长度,不能重新定义数组的维数,也不能更改数组的数据类型。⑤对于多维数组,在使用Preserve关键字时,只能修改最后一维的大小。如果不使用Preserve关键字,数组每一维的大小都可以更改。⑥由于VB.NET中的数组都是动态的,即使声明时指定了数组上界,也可以使用ReDim重定义。例如:DimarrB(6)AsInteger={1,2,3,4,5,6,7}ReDimPreservearrB(8)ReDimPreservearrB(5)⑦在VB.NET中所有的数组都是动态的,可以在任何时候重新定义数组的长度,即使不用redim,可以使用New关键字来对任何一个数组进行引用,并且重新定位。Dim

X()

As

Single'在类模块级声明X=New

Single(20){}'相当于redimx(20)2.数组的清除格式为:Erase数组名[,数组名]Erase语句只能出现在过程级别,只能在过程中而不是在类或模块级释放数组。Erase语句等效于将Nothing分配给每一个数组元素。如果数组是数值型的,则把数组中的所有元素置为0;如果是字符串数组,则把所有元素置为空字符串。

6.2.3与数组操作有关的几个系统函数(1)IsArray()函数IsArray(varName)用来判断参数varName是否为数组,如果是数组,返回True,否则返回False。(2)Ubound()函数和Lbound()函数格式:UBound(<数组名>[,<N>])LBound(<数组名>[,<N>])这两个函数分别用来确定数组某一维的上界和下界值。其中N是可选的,一般是整型常量或变量,用于指定返回哪一维的上界或下界。1表示第一维,2表示第二维,以此类推。N的默认值是1,即Ubound(aa)与UBound(aa,1)等价。

(3)Split()函数格式:Split(<字符串表达式>[,<分隔符>])该函数可将一个字符串以某个指定符号为分隔符,分离为若干个子字符串,赋值给一个一维数组。例如:DimarrA()AsString'声明一个字符串数组s="ab/cd/ef/ghijk"'以/为分隔符arrA=Split(s,“/“)【例6-5】按照图6-4所示界面设计一个拆分字符串的应用程序,程序可以按照用户指定的分隔符拆分字符串并输出。PrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.ClickDimarrS()AsStringarrS=Split(TextBox1.Text,TextBox2.Text)ForEachssInarrSTextBox3.Text=TextBox3.Text&ss&""NextEndSub6.3对象数组6.3.1Object类型数组在VB6.0中,如果声明数组时不指定数据类型,或指定Variant类型,称为变体数组,在VB.NET中,取代Variant的是Object类型。Object类型支持.NETFramework类层次结构中的所有类,并为派生类提供低级别服务,它是.NETFramework中所有类的最终基类。如果数组被声明为Object类型,可以用其保存不同类型的数据,该数组是对象数组。在面向对象程序设计中,用户还以自定义复杂数据类型——类,数组的数据类型也可是用户自定义类的对象。例如,如果用户自定义了表示人员的类Person,就可以用语句“DimarrP(10)AsPerson”创建对象数组arrP。【例6-6】分析下列程序运行结果,理解Object数组的使用。

SubMain()DimarrA(4)AsObject'声明Object类型数组arrA(4)arrA(0)="asdf"'arrA(0)被赋值为字符串“asdf”arrA(1)=123'arrA(1)被赋值为整数123arrA(2)=45.6'arrA(2)被赋值为浮点数45.6arrA(3)=True'arrA(3)被赋值为布尔型数据TruearrA(4)=#3/2/2016#'arrA(4)被赋值为日期类型数据

Fori=0To4Console.Write(arrA(i))Console.Write("")Console.WriteLine(arrA(i).GetType)'输出数组元素的数据类型NextConsole.Read()EndSub【例6-7】编写一个应用程序,界面如图6-6所示。要求输入几个学生成绩后,要将文本框中字符串拆分成数组,单击“计算平均值”按钮可以计算平均值,并显示在下面的文本框中。按钮的单击事件代码为:PrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.ClickDimsumAsInteger=0DimScore()AsObjectScore=Split(TextBox1.Text,",")DimnAsInteger=Score.LengthFori=0Ton-1sum=sum+Score(i)NextTextBox2.Text=n&"个学生平均成绩="&Int(sum/n*10+0.5)/10EndSub6.3.2System.Array类及其成员Array类是公共语言运行库中所有数组的基类。在VB.NET中,所有的数组都是从Array类继承而来,数组被作为一个对象来处理,任何数组都可以访问Array类的方法和属性。数组中的一个元素就是Array中的一个值。Array的长度是它可包含的元素总数。Array的秩是数组的维数。Array中某一维的下限是数组该维度的起始索引,多维数组的各个维度可以有不同的界限。1.System.Array类的常用属性属

性说

明IsFixedSize获取指示Array是否具有固定大小的值。IsReadOnly获取指示Array是否为只读的值。Length获取Array的所有维度中的元素总数。Rank获取Array的秩(也就是维数)。表6.1Array类的常用属性及其说明方

法说

明BinarySearch使用二进制搜索算法在一维的排序Array中搜索值。Clear将Array中的一系列元素设置为零、false或空引用(即:Nothing),具体操作时设定值取决于元素类型。Copy将一个Array的一部分复制到另一个Array中,并根据需要执行强制类型转换和装箱。CopyTo将当前一维Array的所有元素复制到指定的一维Array中(从指定的目标Array索引开始)。GetLength获取Array的指定维度中的元素数。GetLowerBound获取Array中指定维度的下限。GetUpperBound获取Array的指定维度的上限。GetValue获取当前Array中指定元素的值。IndexOf返回一维Array或部分Array中某个值的第一个匹配项的索引LastIndexOf返回一维Array或部分Array中某个值的最后一个匹配项的索引。Reverse反转一维Array或部分Array中元素的顺序。Sort对一维数组各元素进行升序排列SetValue将当前Array中的指定元素设置为指定值。表6.2System.Array类的常用方法及其说明(1)复制数组元素方法Copy和CopyTo方法都用于进行一维数组复制可以将源数组的全部或部分元素复制到目标数组指定位置,具体格式为:格式一:源数组名.CopyTo(目标数组名,目标数组起始位)格式二:Array.Copy(源数组,源数组起始位,目标数组,目标数组起始位,长度)(2)克隆数组源数组名.Clone():该方法可以将源数组完全复制,返回一个新的对象。例如:DimarrA()AsInteger={1,2,3,4,5}DimarrC()AsIntegerarrC=arrA.Clone‘

arrC(0)~arrC(4)分别为1,2,3,4,5(3)返回元素的下标值Array.IndexOf(数组,元素值):

返回第一个等于该元素值的元素的下标值。Array.LastIndexOf(数组,元素值):返回最后一个等于该元素值的元素的下标值。例如,在上例中复制得到数组arrB的7个元素,arrB(0)~arrB(6)分别为0、1、2、3、4、5,则

Array.IndexOf(arrB,3)

为3,Array.IndexOf(arrB,0)

为0。Array.LastIndexOf(数组,0)值为6。(4)将数组各元素排序Array.Sort(数组):对数组各元素进行升序排列。例如:DimarrA()AsString={"M","O","R","S","K"}Array.Sort(arrA)'排序后,arrA(0)~arrA(3)分别是K、M、O、R、S。(5)反向排列各元素值Array.Reverse(数组)

:将数组各元素按相反顺序排列。例如:DimarrA()AsString={"M","O","R","S","K"}Array.Reserve(arrA)‘反转后,arrA(0)~arrA(3)分别是K、S、R、O、M。(6)搜索数组元素Array.BinarySearch(数组,元素值)

:如果数组中没有重复值,返回该元素的下标值;如果数组有重复值且数组未排序,返回第一个与该元素值相等的元素下标值,如果数组已排序,则返回最后一个与该元素值相等的元素下标值。例如:DimarrA()AsString={"M","O","R","S","K","R"}MessageBox.Show(Array.BinarySearch(arrA,"R"))'显示值为2Array.Sort(arrA)MessageBox.Show(Array.BinarySearch(arrA,"R"))'显示值为4【例6-8】按照图6-7所示界面,创建一应用程序,通过四个按钮分别进行一维数组、二维数组的声明、初始化、数组中各元素的排序,以及数组的重新申明、重新初始化等操作。按照图6-7创建应用程序界面,编写各个按钮的单击事件代码,其中,按钮1、2、3是对一维数组的操作,按钮4是创建二维数组,且在程序中进行初始化。DimarrS1(3)AsStringPrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.ClickDimiAsIntegerFori=0To3arrS1(i)=InputBox("请输入字符串初始化创建的一维数组",,"元素"&i)NextButton3.Enabled=TrueButton4.Enabled=TrueListBox1.Items.Clear()DimTempAsStringForEachTempInarrS1ListBox1.Items.Add(Temp)NextEndSubPrivateSubButton2_Click(senderAsObject,eAsEventArgs)HandlesButton2.ClickDimarrS2(,)AsString={{"VB.NET","程序设计"},{"实用","教程"}}Fori=0To1Forj=0To1ListBox2.Items.Clear()DimTempAsStringForEachTempInarrS2ListBox2.Items.Add(Temp)NextNextNextEndSubPrivateSubButton3_Click(senderAsObject,eAsEventArgs)HandlesButton3.ClickArray.Sort(arrS1)'对一维数组排序ListBox1.Items.Clear()DimTempAsStringForEachTempInarrS1ListBox1.Items.Add(Temp)NextEndSubPrivateSubButton4_Click(senderAsObject,eAsEventArgs)HandlesButton4.ClickReDimPreservearrS1(5)DimiAsIntegerFori=4To5arrS1(i)=InputBox("请输入字符串,初始化一维数组!",,"元素"&i)NextListBox1.Items.Clear()DimTempAsStringForEachTempInarrS1ListBox1.Items.Add(Temp)NextEndSub6.4集合与控件数组6.4.1集合与数组数组从Array类继承了许多的属性和方法,使得数组复制、排序、搜索等操作都比较便利。同时,数组元素在内存中是连续存储的,遍历比较方便,也可以很方便的修改元素。但是使用数组元素时,会受到数组下标上界的限制,要更改数组的大小,必须使用

ReDim语句。而集合则不需要事先定义大小,可以根据需要自动分配大小,可以随意添加、删除某个元素。

集合提供了一种更灵活的处理对象组的方法。集合是类,实例化后,才能向集合中添加元素。放入集合中的每个对象都有一个索引序号(从0开始的整数),利用该索引可以检索和操作该对象。

声明数组时要指定数据类型,数组只能保存声明时所指定数据类型的数据(除非是Object类型),但一个集合中可以存储不同类型的数据。所以,如果要处理的数据类型不同,数据项数经常更改,或者无法预测所需的最大项数,使用集合非常方便。

6.4.2创建集合1.集合的类型根据程序的不同用途,.NETFramework提供了许多常用的集合类型,这些类隶属于不同名称空间。主要包括用于System.Collections.Generic

、System.Collections.Concurrent

和System.Collections。System.Collections中的类不是将元素存储为指定类型的对象,而是存储为Object

类型的对象,所以,能够很方便地存储任何数据类型的元素。System.Collections名称空间提供了以下几个强大的类,包括ArrayList、

BitArray

Hashtable等,各个类及作用如下:

ArrayList:实现一个数组,其大小在添加元素时自动增加大小,为一个可变大小的数组,可以在其列表中的任意位置增添或移除数据,而且一个ArrayList对象可以存储不同种类型的数据。

BitArray

:管理以位值存储的布尔数组。Hashtable:实现由键组织的值的集合(KeyValue),排序是基于键的散列完成的(哈希函数)。Queue:实现先进先出的集合(排序方式)。Stack

:实现后进先出的集合。SortedList:实现带有相关键的值的集合,该值按键来排序,可以通过键或索引来访问。2.创建与使用集合在VB.NET中,支持原VB的collection

集合,

声明这种集合具体格式为:Dim集合名AsNewCollection()集合名只要符合变量名命名规则即可,根据集合访问权限的不同,Dim可以换成Public、Static,例如:Dim mycoll As New Collection()就会创建一个名为mycoll的集合对象。创建集合后可以使用集合的属性和方法进行相应操作,主要包括使用

Add方法添加元素,使用

Remove方法移除元素等。集合中的成员可以是同一种类型的数据,也可以是不同类型的数据。建立了集合后,集合中的每个成员都有一个索引值,它相当于数组中的下标,通常也称为下标,集合元素的索引值是从1到集合的

Count

属性值。可以通过索引使用集合元素,格式为:集合名.Item(索引)

【例6-9】分析下列代码,熟悉集合的创建与使用方法。PrivateSubForm1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMyBase.Clic

DimiAsShortDimCollAAsNewCollection()Fori=1To10CollA.Add("集合元素"&i)NextiFori=1To10TextBox1.Text=TextBox1.Text&CollA(i)&vbCrLfNextEndSub

6.4.3ArrayList对象1.创建ArrayList对象创建ArrayList对象实例的方法与创建数组相似,格式为:格式一:Dim变量名As New ArrayList格式二:Dim变量名As ArrayList:

变量名=NewArrayList例如:Dim Arl As New ArrayList该语句与下面两条语句相同。DimArlAsArrayList:Arl=NewArrayList

2.ArrayList的常用属性ArrayList的常用属性包括以下几个:(1)Capacity:获取或设置

ArrayList

可包含的元素数,即ArrayList的容量

,空集合容量为0,非空集合容量为4,8,16......,每次扩大2倍的方式递增。(2)Count:获取

ArrayList

中实际包含的元素数。(3)IsReadOnly:判断

ArrayList

是否为只读。(4)Item(索引):获取或设置指定索引处的元素,索引是从零开始的整数。(5)IsFixedSize:判断

ArrayList

是否具有固定大小。3.ArrayList的常用方法ArrayList的方法有很多,使用这些方法可以很方便地添加、删除集合数据项,复制集合、以及对集合进行排序等。(1)add(对象):将对象添加到

ArrayList

的结尾处,随着向ArrayList中添加元素,容量按需自动增加。(2)Clear:从

ArrayList

中移除所有元素。。(3)Contains(object):如果数组列表含有该对象则返回true。(4)CopyTo(array):把一个数组列表拷贝到一个一维的数组array中去。(5)IndexOf(object):返回第一个元素的值。(6)Insert(index,object):在index指定的位置插入一个元素(7)Remove():从列表中删除指定元素或指定位置的元素。(8)Sort:对列表进行排序。(9)Reverse:将整个

ArrayList

中元素的顺序反转。(10)ToArray(数据类型):将

ArrayList

的元素复制到一个指定元素类型的新数组。(11)ToString:返回表示当前对象的字符串。【例6-10】分析下列程序代码,熟悉ArrayList的属性和方法。

SubMain()DimArlAsNewArrayList'必须用new实例化DimobjItemAsObjectConsole.WriteLine(Arl.Capacity)'显示为0,新建数组列表对象初始容量为0Arl.Add("Visual")'添加一个-字符串Console.WriteLine(Arl.IndexOf("Visual"))'新添加的字符串索引为0Console.WriteLine(Arl.Capacity)'显示为4,只要添加了元素,数组列表对象最小容量为4Arl.Add("Basic")'添加一个字符串,索引为1Arl.Add("Net")'添加一个字符串,索引为2Arl.Insert(2,".")'在索引2处插入一个字符串,将“.”插入到Net之前

ForiAsInteger=1To5'利用循环在集合末尾添加5个整数,索引为4~8Arl.Add(i)Next

Console.WriteLine(Arl.Capacity)'数值为16Console.WriteLine(Arl.Count)'数值为9Console.WriteLine(Arl.Contains("Net"))'显示为TrueArl.Remove(3)'删除数值为3的元素,数值3的索引为6,后序数据前移Console.WriteLine(Arl(6))'数值为4Arl.RemoveAt(6)'删除索引为6的元素,即删除数值4ForEachobjItemInArlConsole.WriteLine(objItem.ToString)'以字符串形式显示集合的所有元素NextConsole.Read()EndSub

6.4.4控件数组的创建方法控件数组是一组共享同一名称和类型的控件,在VB6.0中既允许在设计阶段可视地创建和编辑控件数组,又可以在程序中定义并生成控件对象数组,它们也共享同一事件过程。但在VB.NET中不是按照在VB6.0中同样的方法创建控件数组,而是使用控件集合。所谓控件集合是指包含在一个容器中的所有控件的总和,不仅仅是同类型的控件。能够创建控件集合的容器有:Form、Panel、GropBox等。程序运行时,可以通过访问容器的Control属性来得到该容器中的所有控件。1.利用Form容器控件创建控件数组在VB.NET中,一个窗体中的所有控件自动构成一个控件集合(控件数组)。所以,在访问这些控件时,有两种方式,一是通过控件名称直接访问;二是通过Controls.Item(n)属性按下标访问。例如,建立图6-8所示的窗体应用程序后,在Form1上先添加的七个标签控件label1~label7,再添加七个文本框控件textbox1~textbox7,最后添加一个按钮控件button1。这些添加到窗体上的控件自动构成了一个控件集合。默认情况下,集合中控件的下标顺序是与设计窗体时加入控件的顺序相反的,即Me.Controls.Item(0)代表的是按钮bton1,Me.Controls.Item(1)代表的是textbox7,以此类推,Me.Controls.Item(14)代表的是label1。可以采用以下方法修改下标的顺序。(1)在【解决方案资源管理器】视图中,单击Form1.vb左侧的三角按钮,在展开的列表中再单击Form1左侧的三角按钮,在其展开项中找到【componentsAsIcontainer】项,(2)双击【componentsAsIcontainer】项,将打开文件“”,在代码编辑窗中点击Windows窗体设计器生成的代码左侧的“+”号,将所有代码展开,就可以找到下列代码:Me.Controls.Add(Me.Button1)Me.Controls.Add(Me.TextBox7)Me.Controls.Add(Me.TextBox6)......Me.Controls.Add(Me.Label1)这个代码顺序就是控件数组的下标顺序。(3)修改这个顺序就可以改变控件数组中每个元素的下标。2.在程序中动态添加控件数组前面定义的控件数组是在设计阶段完成的,它要求,控件数组中的控件数量必须已知,也叫静态控件数组;但很多时候要求,控件数组中的控件数量要用程序的某些运行情况来确定,这就要求,控件数组中的控件要能实现动态添加。(1)利用

ArrayList

对象创建控件数组下面来建立一个VB.NET的窗体应用程序,在Form上添加两个按钮,其中,Button1用来添加动态控件数组;Button2用来修改数组中每个控件的属性。

在代码编辑窗口中输入如下代码:Dim

List

As

New

ArrayList

PrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.ClickDimiAsIntegerFori=0To4'利用循环语句动态加入控件数组。

DimFirstTextBoxAsNewTextBox'定义文本框对象

Me.Controls.Add(FirstTextBox)'将一个文本框控件加入到Form上

Arl.Add(FirstTextBox)'将文本框控件加入到例表集合中

Arl.Item(i).top=i*Arl.Item(i).height+20'修改新加入控件在Form上的位置Arl.Item(i).left=100FirstTextBox.TabIndex=i'修改新加入控件的TabIndex值

Arl.Item(i).text="TextBox"&i.ToString'修改默认文本。

NextEndSubPrivateSubButton2_Click(senderAsObject,eAsEventArgs)HandlesButton2.ClickDimiAsIntegerFori=0To4Arl.Item(i).text="第"&i.ToString&"个元素"NextEndSub(2)创建指定类型控件数组VB.NET支持利用程序创建指定类型控件的数组,如label、TextBox、RadioButton等具体控件类型,创建格式为:Dim控件数组名()As控件类型例如:DimlblA(5)AsLabel'创建包含6个元素的

温馨提示

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

评论

0/150

提交评论