您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > vb之 数组及其使用
第7章数组西南交通大学峨眉校区唐加胜第七章数组本章要求:1.理解数组的概念2.掌握数组的定义及其引用3.掌握控件数组的建立及使用。4.理解常用的排序方法。本章重点:数组定义及引用方法,排序算法本章难点:动态数组、排序算法数组是具有相同数据类型的一组有序数据。数组中的变量称为数组元素。数组元素的表示:数组名(下标1[,下标2…])。例如:a(1)、a(1,2)只有一个下标的数组叫一维数组有两个下标的数组叫二维数组,…,最多可达60维。数组在使用前必须先声明(数组名、类型、维数和数组的大小)。数组声明时,指定了数组的维数和大小的数组称为静态数组。没有指定维数和大小的数组称为动态数组。前者大小固定,后者在使用前需要重定义。7.1数组的定义和使用一、数组的定义静态数组的声明:格式:Dim数组名([下界To]上界[,…])[As数据类型]也可以使用Public和Private来定义数组。数组定义举例:DimCounter(1To14)AsInteger‘14个元素的局部数组。PrivateSum(20)AsDouble‘21个元素的模块级数组。Dimx(3,4)asInteger‘20个元素的二维数组。DimA(-5To20)AsInteger数组定义说明数组名的命名规则与变量命名相同。一维数组的元素个数:上界-下界+1。缺省下界为0。若希望缺省下界设为1,可在模块的通用部分使用语句:OptionBase1下界和上界不能使用变量,必须是常量(整型常量)数组定义后自动获得默认值:数值为0,字符为“”,逻辑为False一、数组的定义数组的存放顺序数组中各元素在内存占一片连续的存储空间。二维数组则按先行后列的顺序。A(0)A(1)A(2)A(n)….一维数组A在内存中存放的顺序S(0,0)S(0,1)S(0,2)S(0,3)S(1,0)S(1,1)S(1,2)S(1,3)S(2,0)S(2,1)S(2,2)S(2,3)第0行第1行第2行第0列第1列第2列第3列一维数组S(2,3)在内存中存放的顺序1、数组元素的引用数组的引用通常是指对数组元素的引用。格式为:数组名(下标1[,下标2…])下标可以是常量、变量或表达式,但表达式的值必须介于定义数组时指定的下标的下界和上界之间,否则将导致“下标越界”的错误。例如:A(1)=A(1)+B(1)′取数组元素运算A(i)=B(i)′下标使用变量B(i+1)=A(i+2)′下标使用表达式C(3,4)=100′下标使用常量二、数组的使用2、给数组元素赋值静态数组只能逐个元素赋值。如果赋值有规律,可以使用循环结构。用=直接赋值A(1)=10A(2)=20如果赋值有规律,使用循环结构赋值。例如,给数组A(4)的元素赋值Fori=1To4A(i)=iNexti通过InputBox函数输入值。例如:Fori=1To4A(i)=inputbox(“请输入第”&i&“个整数”)Next通过文本框输入值。例如:A(1)=Text1.textA(2)=Text2.text二、数组的使用3、数组间的赋值静态数组之间不能整体赋值,只能逐个元素赋值。可使用循环结构。可以将一个静态数组整体赋值给一个动态数组,并自动确定动态数组的大小。注意:相互赋值的两个数组的类型必须相同。例如:DimA(4)Asinteger,B()AsintegerA(0)=0:A(1)=1:A(2)=2:A(3)=3:A(4)=4B=A‘将A数组整体赋值给B数组且大小确定为5。4、数组的输出输出数组中的全部或部分元素,一般使用循环结构。例如:Fori=1To4printA(i)Nexti二、数组的使用5、Foreach…Next语句ForEach…Next语句与For…Next语句类似,都是实现循环结构的语。但ForEach…Next语句是专用于数组和对象集合的。语法格式:ForEach成员In数组循环体[ExitFor]…Next成员成员:为一个Variant变量,在ForEach…Next语句中代表数组中的每个元素,数组中有几个元素,此成员就重复使用几次,循环体就执行几遍。数组:在此之前经过定义的数组,用在此处时仅仅是一个数组名,没有括号和上下界。不能在ForEach…Next中使用用户自定义数据类型。使用ForEach…Next的好处是不用知道数组的大小和维数,就可输出数组的所有元素。二、数组的使用示例:DimA(1To4)ForEachxInAPrintx;Nextx求1!+2!+3!+……10!PrivateSubCommand1_Click()Dima(1To10)AsLong,sumAsLong,tAsLongDimnAsInteger,xt=1Forn=1To10t=t*na(n)=tNextnsum=0ForEachxInasum=sum+xNextxPrint1!+2!+3!+……10!=;sumEndSub二、数组的使用7.2动态数组的声明和使用动态数组的声明:Dim数组名()[As数据类型]动态数组大小的说明:Redim[preserve]数组名([下界To]上界[,…])Preserve:选择Preserve时,保留数组中原来的数据,但只允许ReDim语句改变动态数组最后一维的上界。例如:OptionBase1DimA()ASintegerRedimA(4,5)RedimPreserveA(4,UBound(Str,2)+4)注意:Redim语句可以多次使用,但只能改变数组的维数和大小,不能改变数组的类型。动态数组举例输入n个整数,存入动态数组,再输出这些数与数组有关的函数1.Array函数Array函数可以对Variant类型的动态数组或变量整体赋值。赋值后的数组大小由赋值的个数决定。例如,要将1,3,4,6,7这些值赋值给数组a,可使用下面的方法赋值。Dima()A=array(1,3,4,6,7)或DimaA=array(1,3,4,6,7)Array函数举例:自动抽题系统与数组有关的函数2.Ubound()和Lbound()函数格式:UBound(数组名[,N])求数组的上界格式:LBound(数组名[,N])求数组的下界N:可选;一般是整型常量或变量。指定返回哪一维的上界。1表示第一维,2表示第二维,如此等等。如果省略默认是1。例如:不知道数组A的元素个数,要用FOR循环输出数组A的全部元素值。Fori=Lbound(a)toUbound(a)printa(i)Nexti数据的排序就是将一批数据由小大到(升序)或由大到小(降序)进行排列。常用的有选择法、冒泡法。1.冒泡法排序:冒泡排序是常用的一种排序方法。假设n个元素按递增的顺序排序,排序思想为:第一轮:从数组的第一项开始,每一项(i)都与下一项(i+1)进行比较。如果下一项的值较小,就将这两项的位置交换,直到最后第n-1与第n项进行比较,将最大的数排列在最后。第二轮:从数组的第一项开始,每一项(i)都与下一项(i+1)进行比较。如果下一项的值较小,就将这两项的位置交换,直到最后第n-2与第n-1项进行比较,将第二大的数排列在倒数第二位。依此类推,直到只有第一项与第二项进行比较交换,完成递增法排序。7.3数组的排序例:随机产生10个10~100的整数,从小到大顺序输出。冒泡排序法(升序)程序ConstN=10RandomizeDima(1ToN)AsIntegerPrint原始数据:Fori=1ToN'产生10个随机数a(i)=Int(91*Rnd+10)Printa(i);NextiFori=1ToN-1Forj=1ToN-iIfa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=t'交换位置EndIfNextjNextiPrint:Print排序结果:Fori=1ToNPrinta(i);Nexti数组的排序思考:产生7个0-9之间的随机数如何改程序?[a,b]间的数=int(b-a+1)*rnd+a2.选择法排序(升序)选择法排序是最为简单且易理解的算法,其基本思想是每次将最小(或最大)的数找出来放在序列的最前面。假设按递增法将有n个数的数组A(1Ton)进行排列,步骤为:(1)假定最小值Temp,将Temp与A(2)进行比较,若A(2)A(1),则令Temp=A(2),直到比较到A(n),这样Temp中就存放了A(1)~A(n)中的最小数,将Temp所指向的元素与A(1)进行交换,从而将A(1)~A(n)中的最小数存放在数组的第1个位置。(2)对除第1个数外的其余n-1个数再按步骤(1)的方法选出次小的数,与第2个数交换位置。(3)依次类推,经过n-1遍后构成递增序列。若要按递减次序排列,只要每次选最大的数即可。数组的排序例:随机产生10个10~100的整数,从小到大顺序输出。选择排序法(升序)程序:ConstN10RandomizeDima(1ToN)AsIntegerPrint原始数据:Fori=1ToN'产生10个随机数a(i)=Int(91*Rnd+10)Printa(i);NextiFori=1ToN-1Forj=i+1ToNIfa(i)a(j)Thent=a(i):a(i)=a(j):a(j)=t'交换位置EndIfNextjNextiPrint:Print排序结果:Fori=1ToNPrinta(i);Nexti数组的排序选择法排序(升序)的改进:Fori=1ToN-1p=iForj=i+1ToNIfa(p)a(j)Thenp=jNextjt=a(i):a(i)=a(p):a(p)=tNexti7.4控件数组控件数组:具有相同的名称和事件过程的一组同类型控件。控件数组中的每一个控件具有一个唯一的索引值——index属性值,它相当于数组的下标。控件数组中的所有控件共享同一事件过程。例如,假定某个控件数组含有5个命令按钮,则不管单击哪个标签,系统都会调用同一个Click过程。由于每个按钮在程序中的作用不同,系统会将被单击的按钮的Index属性值传递给过程,由事件过程根据不同的Index值执行不同的操作。一个控件数组中至少应有一个元素,最多可有32767个。控件数组中的每个控件都有自己独立的属性。控件数组的建立复制已有的控件并将其粘贴到窗体上。将窗体上已有的类型相同的多个控件的Name属性(名称)设置为同一值。7.4控件数组访问控件数组元素:控件数组名(index值)如:Command1(0).Caption=确定Command1(1).Caption=取消控件数组的属性LBound控件数组下标的下界,如:command1.LboundUBound控件数组下标的上界,如:command1.UboundCount控件数组的个数,如:command1.count注意:对于控件数组,不能使用Ubound()和Lbound()函数。控件数组示例7.4控件数组动态添加控件数组元素Load控件数组名(index值)注意:Load语句中的控件数组必须已经存在,并且添加的控件元素的index值不能与其他元素的index值重复。如:LoadCommand1(command1.Ubound+1)Command1(command1.Ubound+1).move1000,1000,1000,600Command1(command1.Ubound+1).visible=True动态删除控件数组元素UnLoad控件数组名(index值)例如:unloadcommand1(6)注意:不能UnLoad设计时创建的控件。7.4控件数组
本文标题:vb之 数组及其使用
链接地址:https://www.777doc.com/doc-3800976 .html