版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章数组
第8章数组除基本数据类型(字符串、整型、实型等)外,VisualBasic还提供了数组类型,利用数组,可以方便灵活地组织和使用数据。对于数组来说,不能用一个简单变量名来访问它的某个元素。数组是有序的数据的集合。在VisualBasic中,一个数组中的元素可以是相同类型的数据,也可以是不同类型的数据。8.1数组的概念在VisualBasic中,把一组具有同一名字、不同下标的下标变量称为数组,其一般形式为: S(8) 其中S称为数组名,8是下标。一个数组可以含有若干个下标变量(或称数组元素),下标用来指出某个数组元素在数组中的位置。在VisualBasic中,使用下标变量时,必须把下标放在一对紧跟在数组名之后的小括号中。如果只用一个下标就能确定一个数组元素在数组中的位置,则称为一维数组。也可以说,由具有一个下标的下标变量所组成的数组称为一维数组,而由具有两个或多个下标的下标变量所组成的数组称为二维数组或多维数组。8.1.1数组的定义数组应当先定义后使用。在计算机中,数组占据一块内存区域,数组名是这个区域的名称,区域的每个单元都有自己的地址,该地址用下标表示。定义数组的目的就是通知计算机为其留出所需要的空间。VisualBasic中,有4个定义数组的语句,这4个语句格式相同,但适用范围不同,其中:Dim用在窗体模块或标准模块中,定义窗体或标准模块数组,也 可用于过程中ReDim用在过程中Static用在过程中Public用在标准模块中,定义全局数组8.1.1数组的定义下面以Dim语句为例说明数组定义的语句格式,当用其他语句定义数组时,格式相同。VisualBasic提供了两种定义数组的格式。1.第一种格式第一种格式对于数组的每一维,只给出下标的上界(即可以使用的下标的最大值)。对于一维数组,格式为: Dim数组名(下标上界)As类型名称对于二维数组,格式为:
Dim数组名(第一维下标上界,第二维下标上界)As类型名称8.1.1数组的定义例如:(1)语句DimArrayDemo(5)AsInteger定义了一个一维数组,该数组的名字为ArrayDemo,类型为整型,占据6个(0~5)整型变量的空间(12个字节)。(2)语句DimTest(2,3)AsInteger定义了一个二维数组,名字为Test,类型为Integer,该数组有3行(0~2)4列(0~3),占据12(3×4)个整型变量的空间(24个字节):8.1.1数组的定义说明:(1)格式中的“数组名”与简单变量相同,可以是任何合法的VisualBasic变量名。“As类型名称”用来说明“数组”的类型,可以是Integer、Long、Single、Double、Currency、String等基本类型或用户定义的类型,也可以是Variant类型。如果省略“As类型名称”,则定义的数组为Variant类型。(2)数组必须先定义,后使用。BASIC的早期版本支持数组的隐式定义,即如果一个数组未经定义而直接使用,则该数组各维的默认上界为10,下界为0或1。但在VisualBasic中,不允许使用隐式定义。(3)当用Dim语句定义数组时,该语句把数值数组中的全部元素都初始化为0,而把字符串数组中的全部元素都初始化为空字符串。对于用Dim语句定义的记录变量中的元素以及定长字符串,也进行类似的处理。8.1.1数组的定义(4)一般情况下,下标的下界默认为0。如果希望下标从1开始,可以通过OptionBase语句来设置,其格式为:
OptionBasen
格式中的n为数组下标的下界,它只能是0或1。OptionBase语句只能出现在窗体层或模块层,不能出现在过程中,并且必须放在数组定义之前。此外,如果定义的是多维数组,则下标的默认下界对每一维都有效。(5)要注意区分“可以使用的最大下标值”和“元素个数”。“可以使用的最大下标值”指的是下标值的上界,而“元素个数”则是指数组中成员的个数。 例如,在DimArr(5)中,数组可以使用的最大下标值是5,如果下标值从0开始,则数组中的元素为:Arr(0)、Arr(1)、Arr(2)、Arr(3)、Arr(4)、Arr(5),共有6个元素。如果下标值从1开始,则元素的个数与最大下标值相同。8.1.1数组的定义
2.第二种格式格式:
Dim数组名([下界To]上界[,[下界To]上界]...)
例如:DimArr(-2To3)定义了一个一维数组Arr,其下标的下界为-2,上界为3,该数组可以使用的下标值在-2到3之间,数组元素为Arr(-2)、Arr(-1)、Arr(0)、Arr(1)、Arr(2)、Arr(3),共有6个元素。用第一种格式定义的数组,其下标的下界只能是0或1,而使用第二种格式,则可以根据需要指定数组下标的下界。没有To,数组的下标的下界只能是0或1,而使用To后,下标的范围可以是-32768~32767。在某些情况下,使用To能更好地反映对象的特性,例如: DimPopulation(1949To2000) 定义了一个人口(Population)数组,可以用Population(1978)表示1978年的人口数。8.1.1数组的定义在使用以上两种格式定义数组时,要注意以下几点:(1)数组名的定名规则与变量名相同,在命名时应尽可能有一定的含义,做到“见名知义”。(2)在同一个过程中,数组名不能与变量名同名,否则会出错。 (3)在定义数组时,每一维的元素个数必须是常数,不能是变量或表达式。如果需要在运行时定义数组的大小,可以通过以下两种方法来解决: ①用ReDim语句定义数组。 ②使用动态数组(见8.2.1节)。8.1.1数组的定义(4)数组的类型通常在As子句中给出,如果省略As子句,则定义的是默认数组(见8.1.2节)。此外,也可以通过类型说明符来指定数组的类型。(5)无论用哪一种格式定义数组,下界都必须小于上界。若需知道数组的上界值和下界值,可以通过Lbound和Ubound函数获得,其格式为: Lbound(数组[,维]) Ubound(数组[,维])
Lbound函数返回“数组”某一“维”的下界值,而Ubound函数返回“数组”某一“维”的上界值,两个函数一起使用即可确定一个数组的大小。对于一维数组来说,参数“维”可以省略。如果要测试多维数组,则“维”不能省略。8.1.1数组的定义例如:
DimA(1To100,0To50,-3To4)定义了一个三维数组,用下面的语句可以得到该数组各维的上下界:PrintLbound(A,1),Ubound(A,1)PrintLbound(A,2),Ubound(A,2)PrintLbound(A,3),Ubound(A,3)输出结果为:1 100
0
50-3
48.1.2默认数组在VisualBasic中,允许定义默认数组。默认数组是指数据类型为Variant(默认)的数组。在一般情况下,定义数组应指明其类型,例如:
StaticElec(1To100)AsInteger 定义了一个数组Elec,该数组的类型为整型,它有100个元素,每个元素都是一个整数。如果把上面的定义改为:
StaticElec(1To100) 则定义的数组是默认数组,其类型默认为Variant,该定义等价于:
StaticElec(1To100)AsVariant8.1.2默认数组对于默认数组来说,同一个数组中可以存放各种不同类型的数据。因此,默认数组可以说是一种“混合数组”。 例如:SubForm_Click()StaticDefau(5)Defau(1)=100Defau(2)=234.56Defau(3)="Beijing"Defau(4)="20"&NowDefau(5)=&HAAFFori=1To5Print"Defau(";i;")=";Defau(i)NextiEndSub该事件过程定义了一个静态数组Defau(默认数组一般应定义为静态的),然后对各元素赋予不同类型的数据,包括整型、实型、字符串型、日期和时间类型及十六进制整型。
8.2静态数组与动态数组定义数组后,为了使用数组,必须为数组开辟所需要的内存区。根据内存区开辟时机的不同,可以把数组分为静态(Static)数组和动态(Dynamic)数组。通常把需要在编译时开辟内存区的数组叫做静态数组,而把需要在运行时开辟内存区的数组叫做动态数组。当程序没有运行时,动态数组不占据内存。静态数组和动态数组由其定义方式决定:用数值常数或符号常量作为下标定维的数组是静态数组用变量作为下标定维的数组是动态数组动态数组以变量作为下标值,在程序运行过程中完成定义,通常分为两步:第一步:在窗体层、标准模块或过程中用Dim或Public声明一个没有下标的数组(括号不能省略);第二步:在过程中用ReDim语句定义带下标的数组。
8.2.1动态数组的定义ReDim语句格式:
ReDim[Preserve]变量(下标)As类型ReDim语句功能:该语句用来重新定义动态数组,按定义的上下界重新分配存储单元,并可为定义的变量改变存储类型。当重新分配动态数组时,数组中的内容将被清除,但如果在ReDim语句中使用了Preserve选择项,则不清除数组内容。在ReDim语句中可以定义多个动态数组,但每个数组必须事先用“DimVariable()”或“PublicVariable()”这种形式进行声明,在括号中省略上下界,在用ReDim语句重新定义时指定数组下标的上下界。ReDim只能出现在事件过程或通用过程中,用它定义的数组是一个“临时”数组,即在执行数组所在的过程时为数组开辟一定的内存空间,当过程结束时,这部分内存即被释放。8.2.1动态数组的定义说明:(1)在窗体层或模块层定义的动态数组只有类型,没有指定维数,其维数在ReDim语句中给出,最多不能超过8维。(2)可以用ReDim语句直接定义数组。如果在标准模块层或窗体层没有用Public或Dim声明过同名的数组,则用ReDim定义的数组最多可达60维。(3)在一个程序中,可以多次用ReDim语句定义同一个数组,随时修改数组中元素的个数。但是应注意,只能改变元素的个数,不能改变数组的维数,也不能用ReDim改变数组类型。8.2.2数组的清除和重定义数组一经定义,便在内存中分配了相应的存储空间,其大小是不能改变的。也就是说,在一个程序中,同一个数组只能定义一次。有时候,可能需要清除数组的内容或对数组重新定义,这可以用Erase语句来实现,其格式为:
Erase数组名[,数组名]...Erase语句用来重新初始化静态数组的元素,或者释放动态数组的存储空间。注意,在Erase语句中,只给出要刷新的数组名,不带括号和下标。说明:(1)当把Erase语句用于静态数组时,如果这个数组是数值数组,则把数组中的所有元素置为0;如果是字符串数组,则把所有元素置为空字符串;如果是记录数组,则根据每个元素(包括定长字符串)的类型重新进行设置。见表8.1。8.2.2数组的清除和重定义8.2.2数组的清除和重定义 (2)当把Erase语句用于动态数组时,将删除整个数组结构并释放该数组所占用的内存。也就是说,动态数组经Erase后即不复存在;而静态数组经Erase后仍然存在,只是其内容被清空。 (3)当把Erase语句用于变体数组时,每个元素将被重置为“空”(Empty)。(4)Erase释放动态数组所使用的内存。在下次引用该动态数组之前,必须用ReDim语句重新定义该数组变量的维数。8.3数组的基本操作1.数组的引用数组的引用通常是指对数组元素的引用,其方法是,在数组后面的括号中指定下标。要注意区分数组定义和数组元素,在下面的程序片断中:
Dimx(8)……Temp=x(8)…… 有两个x(8),其中Dim语句中的x(8)不是数组元素,而是“数组说明符”,由它说明所建立的数组x的最大可用下标值为8;而赋值语句“Temp=x(8)”中的x(8)是一个数组元素,它代表数组x中序号为8的元素。一般来说,在程序中,凡是简单变量出现的地方,都可以用数组元素代替。数组元素可以参加表达式的运算,也可以被赋值。8.3数组的基本操作在引用数组时,应注意以下几点:(1)在引用数组元素时,数组名、类型和维数必须与定义数组时一致。 例如:Dimx%(10) …… Printx$(4)Print语句中的x$(4)不是数组x%中下标为4的元素,必须写成x%(4)。但是,如果把x%(4)写成x(4),则是允许的。(2)如果建立的是二维或多维数组,则在引用时必须给出两个或多个下标。(3)引用数组元素时,其下标值应在建立数组时所指定的范围内。 例如:DimArr(20) …… PrintArr(24) 运行时将出现“下标越界”错误。8.3数组的基本操作
2.数组元素的输入 数组元素一般通过For循环语句及InputBox函数输入。例如:OptionBase1Dimstuname()AsStringSubForm_Click()ReDimstuname(4)AsStringFori=1To4temp$=InputBox$("EnterName:")stuname(i)=temp$NextiEndSub 上述程序运行后,在对话框中输入Zhang、Wang、Li、Zhao,它们被存入字符串数组Stuname中。8.3数组的基本操作多维数组元素的输入通过多重循环来实现。由于VisualBasic中的数组是按行存储的,因此把控制数组第一维的循环变量放在最外层循环中。 例如:
OptionBase1(在窗体层)
SubForm_Click()Dima(3,5)Fori=1to3Forj=1To5a(i,j)=i*jNextjNextIEndSub 程序运行后,单击窗体,结果为: a(1,1)=1,a(1,2)=2,a(1,3)=3......a(3,5)=158.3数组的基本操作3.数组元素的输出 数组元素的输出可以用Print方法来实现。例如:
OptionBase1(该语句放在窗体层中)
SubForm_Click()Dima(4,4)AsIntegerFori=1To4'将4行4列的数据存放在数组a中Forj=1To4a(i,j)=InputBox("EnterData:")NextjNexti
Fori=1To4'将数组a中的数据按4行4列形式输出Forj=1To4Printa(i,j);"";NextjPrintNextiEndSub
8.3数组的基本操作4.数组元素的复制单个数组元素可以像简单变量一样从一个数组复制到另一个数组。 例如:DimB(4,8),A(6,6) ......B(2,3)=A(3,2)二维数组中的元素可以复制到另一个二维数组中的某个元素,也可以复制到一个一维数组中的某个元素,并且反之亦然。 例如:DimA(8),B(3,2) ......A(3)=B(1,2)B(2,1)=A(4)8.3数组的基本操作为了复制整个数组,仍要使用For循环语句。例如:
OptionBase1Dimname1(),name2()SubForm_Click()ReDimname1(10),name2(10)Fori=1To10msg$=InputBox$("Entername:")name1(i)=msg$NextiFori=1To10name2(i)=name1(i)NextiEndSub把数组Name1中的数据复制到name2中。8.3数组的基本操作 【例8.2】从键盘上输入10个整数,用冒泡排序(BubbleSort)对这10个数从小到大排序。 冒泡排序是常用的一种排序方法。之所以称为“冒泡排序”,是因为值较小的或者说“较轻”的元素“浮到”作为继续排序的一组数的顶部。对于数值数据和字符串数据来说,其排序过程基本上相同,即,从数据组的第一项开始,每一项(I)都与下一项(I+1)进行比较,如果下一项的值较小,就将这两项的位置交换,从而使值较小的数据项“升”到上面。这种操作反复进行,直到数据组的结束,然后再回到开头进行重复处理。当整个数据组自始至终再也不出现项目交换时,全部数据项的排序即告结束。 首先在窗体上建立一个命令按钮Command1,然后编写如下的事件过程:8.3数组的基本操作SubCommand1_Click()Staticnumber(1To10)AsIntegermsg$="Enternumberforsort:"msgtitle$="SortDemo"Fori%=1To10number(i%)=InputBox(msg$,msgtitle$)Nexti%Fori%=10To2Step-1Forj%=1Toi%-1Ifnumber(j%)>number(j%+1)Thent=number(j%+1)number(j%+1)=number(j%)number(j%)=tEndIfNextj%Nexti%Fori%=1To10Printnumber(i%)Nexti%EndSub8.3数组的基本操作 上述过程首先定义一个一维数组,接着通过For循环用InputBox函数输入10个整数,然后用一个二重循环对输入的数进行排序,最后输出排序结果。在排序时,程序判断前一个数是否大于后一个数,如果大于,则交换两个数的下标,即交换两个数在数组中的位置。交换通过一个临时变量来进行。 如前所述,在建立数组时,可以省略其类型,在这种情况下,所定义的数组为默认数组,其类型为Variant。但是,如果数组中的元素用于排序,则在建立该数组时,必须给出类型,否则可能会得不到正确的结果。8.3数组的基本操作
5.ForEach...Next语句 ForEach...Next语句类似于For...Next语句,两者都用来执行指定重复次数的一组操作。但ForEach...Next语句专门用于数组。格式:
ForEach成员In数组 循环体
[ExitFor] …...Next[成员]
这里的“成员”是一个变体变量,并在ForEach...Next结构中重复使用,它实际上表示数组中的每个元素。“数组”是一个数组名,且没有括号和上下界。
8.3数组的基本操作 ForEach...Next语句重复执行的次数由数组中元素的个数确定,数组中有多少个元素,就自动重复执行多少次。 例如:DimMyArray(1to5) ForEachxinMyArray Printx; Nextx 将重复执行5次(因为数组MyArray有5个元素),每次输出数组的一个元素的值。这里的x类似于For...Next循环中的循环控制变量,但不需要为其提供初值和终值,而是根据数组元素的个数确定执行循环体的次数。此外,x的值处于不断的变化之中,开始执行时,x是数组第一个元素的值,执行完一次循环体后,x变为数组第二个元素的值...,当x为最后一个元素的值时,执行最后一次循环。x是一个变体变量,它可以代表任何类型的数组元素。注意,不能在For...Each...Next语句中使用用户自定义类型数组,因为Variant不能包含用户自定义类型。8.4数组的初始化所谓数组的初始化,就是给数组的各元素赋初值。除了使用赋值语句或InputBox函数为数组元素赋值以外,VisualBasic还提供了Array函数,利用该函数,可以使数组在程序运行之前初始化,得到初值。格式:数组变量名=Array(数组元素值)功能:为数组元素赋值,即把一个数据集读入某个数组。说明: (1)“数组变量名”是预先定义的数组名,在“数组变量名”之后没有括号。之所以称为“数组变量”,是因为它作为数组使用,但作为变量定义,它既没有维数,也没有上下界。“数组元素值”是需要赋给数组各元素的值,各值之间以逗号分开。 (2)数组变量不能是具体的数据类型,只能是变体(Variant)类型。8.4数组的初始化例如:StaticNumbersAsVariantNumbers=Array(1,2,3,4,5) 将把1、2、3、4、5这五个数值赋给数组Numbers的各个元素,即Numbers(0)=1,Numbers(1)=2,Numbers(2)=3,Numbers(3)=4,Numbers(4)=5。例如:OptionBase1 PrivateSubCommand1_Click()StaticTest_strTest_str=Array("One","Two","Three","Four")PrintTest_str(4)EndSub
经过上面的定义和初始化后,Test_str(1)="One",Test_str(2)="Two",Test_str(3)="Three",8.4数组的初始化一般来说,数组变量可以通过以下三种方式定义:(1)显式定义为Variant变量。例如:
DimNumbersAsVariant
(2)在定义时不指明类型。例如:
DimNumbers
(3)不定义而直接使用。在一般情况下,数组元素的值通过赋值语句或InputBox函数读入数组,如果使用Array函数,则可使程序大为简化。需注意的是,Array函数只适用于一维数组,即只能对一维数组进行初始化,不能对二维或多维数组进行初始化。8.5控件数组在VisualBasic中,可以使用控件数组,它为处理一组功能相近的控件提供了方便的途径。8.5.1基本概念控件数组由一组相同类型的控件组成,这些控件共用一个相同的控件名字,具有同样的属性设置。数组中的每个控件都有唯一的索引号(IndexNumber),即下标,所有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 部编人教版七年级生物下册教案(表格式)
- 排球集体教案
- 交通工具售后服务协议
- 5S管理办公室标准化
- 临床用血风险管理策略及要求
- 互联网行业保密协议
- 交通运输设备售后服务协议书
- 代理合作协议书格式及样板
- 互联网行业劳动合同数据保护案例
- 产学研合作遥感监测协议
- 医保定点变更承诺书模板
- 井队搬家合同范本
- 神经系统肿瘤
- 危重症患者疼痛与意识状态的评估
- 城市生命线安全风险综合监测预警平台解决方案
- 景观艺术设计智慧树知到期末考试答案章节答案2024年天津美术学院
- 中药独活课件
- 2024春期国开电大法学本科《知识产权法》在线形考(第一至四次形考任务)试题及答案
- 产科医生进修汇报
- 八年级语文(完整版)标点符号及使用练习题及答案
- 城市观光车项目可行性研究报告
评论
0/150
提交评论