《数组与自定义数据类型.ppt》由会员分享,可在线阅读,更多相关《数组与自定义数据类型.ppt(42页珍藏版)》请在三一办公上搜索。
1、第5章 数组与自定义数据类型,前面章节中所用的数值型、字符型、布尔类型等数据类型称为VB的标准数据类型,通过一个变量存取一个数据,该类变量称为简单变量。例如求3名同学的平均身高时,就可定义同类型的变量a1、a2和a3表示3名同学的身高,但如果要求100名同学的平均身高,采用100个简单变量表示100名同学的身高,在数据存储与处理时就比较繁琐。又如,在描述一个人的基本情况时,可能会涉及到“姓名、性别、出生日期、电话号码、身高、婚姻状况”等数据,这些数据类型不同,但却相互关联,如果使用不同类型的简单变量,在数据存储和处理时也会带来诸多的不便。通常,简单变量用于解决一些数据量小且处理简单的问题,对于
2、那些描述具有某种关联的批量数据时,应采用VB提供的数组和用户自定义数据类型两种数据结构。,5.1 数组,1 数组的基本概念 数组是VB提供的一种数据结构。用统一的名称来代表具有相同性质的一组数,该名称为数组名。数组中的每一个元素称为数组元素。为了区分数组中的每一个元素,需要用一个索引号区别,该索引号称为下标。数组中的每一个元素可以用数组名和下标惟一表示。每个数组元素和一个普通变量一样能存放一个数据。,5.1 数组,1 数组的基本概念数组的特点:(1)数组由若干个数组元素组成。数组元素的表示方法为:数 组名后跟圆括号和下标,如a(3)就表示数组a的元素。(2)数组元素在内存中有次序存放,下标代表
3、它在数组中的位 置。如数组元素a(3)表示数组a中的第3个元素(若下标从 0开始则为第4个元素,下同),而数组元素b(3,4)则表示 数组b的第3行第4列的那个元素。(3)数组元素数据类型相同,在内存中存储是有规律的,占连 续的一段存储单元。例如一个整型数组a,有3个元素 a(1)、a(2)和a(3),那么a(1)、a(2)和a(3)的数据类型均 为整型,若已知a(1)在内存中的存储单元地址编号为 3001H,a(2)在内存中的存储单元地址必然为3003H(因 为一个整型数据占两个字节),a(3)在内存中的存储单元 地址为3005H。,5.1 数组,1 数组的基本概念在表示数组元素时,应注意以
4、下几点:(1)用圆括号把下标括起来,不能使用中括号或大括号代替,圆括号也不能省略。(2)下标可以是常量、变量或表达式,其值为整数,如常量、变量或表达式的值为小数时,将自动“四舍五入”。(3)下标的最小取值称为下界,下标的最大取值称为上界。在 不加任何说明的情况下,数组元素下标的下界默认为0。,5.1 数组,2 数组的声明 在VB中,使用数组前要先进行声明,以使VB在遇到某个标识符时,能将其当作数组来处理。“先声明后使用,下标不能越界”是数组使用的基本原则。在用Dim语句声明时就确定了大小的数组,称为静态数组,静态数组在程序编译时分配存储空间,一旦分配,数组的大小就不能再改变了。,5.1 数组,
5、2 数组的声明1)一维静态数组格式:Dim 数组名(下界 To 上界)As 作用:声明数组具有“上界下限”个数组元素,这些元素 按照下标由小到大的顺序连续存储在内存中。其中:数组名 命名要符合变量命名规则。下界 To 上界 称为维说明,确定数组元素下标的取值范围(下标下界最小为-32768,上界最大值为32767)。下界默认值为0。下界和上界只能取直接常量或直接常量表达式、符号常量或符号常量表达式,不能为变量或包含变量的表达式。As 指明数组元素的类型,默认为变体数据类型。,5.1 数组,2 数组的声明2)二维静态数组格式:Dim 数组名(下界1 To 上界1,下界2 To 上界2As 作用:
6、声明(上界1下限1)*(上界2下限2)个连续的单元。例如:Dim Larray(0 to 3,0 to 4)As Long或 Dim Larray(3,4)As Long 声明了长整型的二维数组Larray,第1维下标范围为03,第2维下标范围为04,数组元素个数为4*5个,每个元素占4个字节的存储空间,元素排列如表所示。,5.1 数组,2 数组的声明静态数组声明的注意事项:(1)用“Option Base 1”可设定数组元素下标下界值为1,以改变下界默认值为0。该语句必须放在窗体或模块的通用声明段中,否则会出现“无效内部过程”的错误。例如:Option Base 1 Dim x(4)声明数组
7、x下标下界为1,因此x具有x(1)、x(2)、x(3)、x(4)4个数组元素,数组元素为变体类型数据。,5.1 数组,2 数组的声明静态数组声明的注意事项:(2)静态数组在同一个过程只能声明一次,否则会出现“当前范围内声明重复”的提示信息。例如:Private Sub Form_Click()Dim x(5)As Integer Dim x(5)As Single End Sub在该过程中两次声明了静态数组x。,5.1 数组,2 数组的声明静态数组声明的注意事项:(3)声明数组和声明变量一样,数组也有作用范围。如建立公用数组,在标准模块的通用声明段用Public语句声明;建立模块级数组,在窗体
8、的声明段用Private或Dim语句声明;建立过程级数组,在过程中用Dim或Static声明。详细内容请看第8章变量的作用域。(4)声明数组后,各数组元素的初值与声明普通变量相同。,5.1 数组,2 数组的声明3)动态数组声明 动态数组是指在程序执行过程中,数组元素的个数可以改变的数组。和静态数组类似,也分为一维动态数组、二维动态数组和三维动态数组。动态数组在用Dim语句声明数组时不给出数组的大小,程序执行到ReDim语句时才确定大小。创建动态数组通常分两步:,5.1 数组,2 数组的声明3)动态数组声明 第1步,在标准模块、窗体的通用程序段或过程,声明一个省略维说明的数组,格式为:Dim 数
9、组名()As 第2步,根据应用需要,用ReDim重新确定数组元素的个数,格式为:ReDim Preserve 数组名(维说明)As,5.1 数组,2 数组的声明3)动态数组声明 说明:(1)维说明 通常包含变量或表达式,但其中的变量或表达式 应有明确的值。(2)关键字Preserve 如果省略,重定义前数组元素的值全部 丢失,VB系统重新对数组元素进行初始化;如果使用了 Preserve,重定义前数组元素的值不丢失,VB系统保留原 数组元素的值。在使用Redim语句时请注意:Redim语句只能改变数组的大小,不允许改变数组的数据类型。,5.1 数组,例5-2 输入某门课n个同学的成绩,输出高于
10、平均分的成绩。Dim aver!,i%,x!()这里先声明一个空数组 n=Val(InputBox(请输入统计人数,输入框,1)ReDim x(1 to n)根据实际人数声明数组大小 aver=0 For i=1 To n x(i)=InputBox(请输入第&i&个学生成绩,录入窗口,0)Print 第&i&个学生成绩为:&x(i)aver=aver+x(i)Next i aver=aver/n Print 平均分为:&aver Print=以下成绩高于平均分=For i=1 To n If x(i)aver Then Print 第&i&个学生成绩为:&x(i)End If Next i,
11、5.1 数组,3 数组的赋值1)静态数组元素赋值 对于静态数组,不能将数组名作为被赋值对象,而只能将数组元素作为赋值对象,利用数组元素是有序存储和静态数组元素个数在声明时已经确定的特点,采用循环结构,逐一为数组元素赋值。通常,采用循环次数固定的ForNext结构。一维数组可通过单循环实现,二维数组可通过双层循环实现。Dim a(1 to 10)as Single For i=1 to 10 a(i)=0 Next i,5.1 数组,3 数组的赋值1)静态数组元素赋值 对于静态数组,不能将数组名作为被赋值对象,而只能将数组元素作为赋值对象,利用数组元素是有序存储和静态数组元素个数在声明时已经确定
12、的特点,采用循环结构,逐一为数组元素赋值。通常,采用循环次数固定的ForNext结构。一维数组可通过单循环实现,二维数组可通过双层循环实现。Dim a(1 to 10)as Single For i=1 to 10 a(i)=0 Next i,5.1 数组,3 数组的赋值2)动态数组赋值 动态数组赋值时,既可以将数组元素做为被赋值的对象,也可以将数组名作为被赋值的对象。这是因为:尽管动态数组在执行声明(Dim语句)时,数组大小没有确定,但是当执行ReDim语句后,动态数组元素个数和下标的上下限也就确定了,即数组元素下标的下界可由LBound(数组名)函数得到(默认为0),下标上界可由UBoun
13、d(数组名)函数得到,元素的个数可由表达式UBound(数组名)LBound(数组名)1得到,因此,所有对静态数组元素的赋值方法同样适合于动态数组元素。,5.1 数组,3 数组的赋值2)动态数组赋值使用Array()函数为动态数组赋值对于变体类型的一维动态数组,还可采用Array()函数为数组各元素赋值。格式为:数组名=Array()其中:可以是已经声明过的变体类型的动态数组,也可以是未声明过的数组。数组元素的个数由中数据个数决定,数组元素下标的下界可由LBound(数组名)函数得到(默认为0),下标上界可由UBound(数组名)函数得到。例如,以下程序段可以自动定义两个动态数组a和b,并为各
14、数组元素赋值。,5.1 数组,使用Array()函数为动态数组赋值举例 a=Array(1,3,4,5,-6)b=Array(abc,def,67,5,-6)For i=0 To UBound(a)Print a(i);Next i Print For i=0 To UBound(b)Print b(i);Next i注意:Array函数只能对一维动态数组赋值。若提前声明了数 组,类型必须为变体类型。,5.1 数组,3 数组的赋值2)动态数组赋值使用Split()函数为动态数组赋值 Split()函数为数组元素赋值的基本方法是:将要赋值的数据组成字符串,且数据之间用固定的分隔符(如“,”)分隔
15、;再通过Split()函数将其分离成逐个的数据后,赋给数组各元素,Split()函数格式为:=Split(,分隔符)其中:是一组为数组赋值的数据,数据之间用固定的分隔符分隔,默认为“”(一个空格字符)。,5.1 数组,3 数组的赋值2)动态数组赋值使用Split()函数为动态数组赋值注意:Split()函数要求所赋值的数组必须是动态数组,可以不提前声明,如果提前声明则必须声明为字符型。该方法通常和文本框配合使用解决大量数据处理问题。,5.1 数组,3 数组的赋值2)动态数组赋值使用Split()函数为动态数组赋值Split函数和Array函数使用时应注意的问题:Split函数只能给字符型数组赋
16、值;而Array函数只能给变 体类型数组赋值。Split和Array函数均只能为一维数组赋值,如果要为二维 数组赋值,需要先将数据存储在一维数组中,再通过程序 的方法将一维数组的值赋值给二维数组。用Array函数赋值时,数组元素的最小下标受Option Base 语句影响,当“Option Base 0”或默认情况下,数组元素 下标最小值为0;当“Option Base 1”时,数组元素下标最 小值为1;用Split函数为数组赋值时,数组元素的最小下 标与Option Base 语句无关,不管Option Base 语句设置 为0还是1,数组元素的最小下标均从0开始。,5.1 数组,例5-3
17、使用文本框录入大量的数据,将它们保存在一维数组中,并打印输出(每行显示10个数据)。,5.1 数组,例5-3 使用文本框录入大量的数据,将它们保存在一维数组中,并打印输出(每行显示10个数据)。Private Sub Command1_Click()Dim a$()a=Split(Text1.Text,)For i=0 To UBound(a)Picture1.Print Tab(6*(i Mod 10)+1);a(i);Next iEnd Sub,5.1 数组,4 数组的输出 在上面的例子中已经看到,数组输出就是分别输出数组中的各元素,采用循环或循环嵌套将数组中各元素逐一输出。通常利用For
18、循环或For循环嵌套,调用Print方法实现将数组元素值输出到窗体或图片框中。输出时可采用Tab()函数控制输出格式,使输出的数据清晰。以下程序是把随机函数产生的0,99之间的随机整数,存入到二维数组中并输出。,5.1 数组,4 数组的输出数组输出时的注意事项:(1)采用循环控制结构输出数组中各元素中的值时,输出方法在循环结构的位置要合理,避免下标超限现象。,5.1 数组,4 数组的输出数组输出时的注意事项:(2)可以根据需要单个输出数组元素的值,但下标不能超限。如:输出上例二维数组a前三个元素,可使用语句:Print a(1,1);a(1,2);a(1,2),5.1 数组,4 数组的输出数组
19、输出时的注意事项:(3)不能通过数组名来输出数组中各元素的值。如上述程序改为:Private Sub Form_Click()Dim a(5,5)As Integer For i=0 To 5 For j=0 To 5 a(i,j)=Int(Rnd*100)Next j Next i Print Tab(j*8+1);a;End Sub想通过数组名a输出二维数组中的每一个元素,则是错误码的。,5.1 数组,4 数组的输出数组输出时的注意事项:(4)要注意用Tab()函数控制输出格式为了使数组输出层次清晰,要注意使用Tab()函数或使用其他方法控制输出格式,实现行定位输出和换行输出。,5.1 数
20、组,5 数组的应用举例例5-4 输入多名学生的一门课程的考试成绩(假设为整数),统计各分数段学生人数。,5.1 数组,Private Sub Command1_Click()Dim a$()Dim x(0 To 10)As Integer 用于保存统计结果 a=Split(Text1,)For i=0 To UBound(a)If(a(i)0)Then k=a(i)10 x(k)=x(k)+1 End If Next i Print 统计结果如下:Print 100分的有:i*10+9&分有:&x(i)&人Next iEnd SubPrivate Sub Command2_Click()End
21、End Sub,5.1 数组,5 数组的应用举例例5-5 输入一串字符,统计各字母出现的次数(不区分大小写),并输出统计结果Private Sub Command1_Click()Dim a%(65 To 90),c As String*1 le=Len(Text1)For i=1 To le c=UCase(Mid(Text1,i,1)If c=A And c 0 Then Picture1.Print;Chr(j);=;a(j);Next jEnd Sub,5.2 数组控件,在应用程序开发中,往往要使用一些类型相同、功能相似的控件,这些控件需要执行基本相同的操作,如果把事件代码分别写在不同
22、对象的事件过程中,会造成代码重复,给程序维护带来了困难,而应用控件数组则能避免上述问题。,5.2 控件数组,1 控件数组的基本概念 控件数组由一组同类控件组成,它们共用一个控件,控件各数组元素有不同的索引号(类似于数组元素的下标),该索引由控件Index属性决定,最大索引值为32767。控件数组中的各控件元素可以具有不同的属性值,但具有相同的事件过程。例如:若CmdName是具有4个元素的命令按钮控件数组,不管单击哪个命令按钮,都会调用同一个单击事件过程,格式如下:Private Sub CmdName_Click(Index As Integer)End Sub,5.2 数组控件,2 建立控
23、件数组的方法 1)设计时建立步骤如下:(1)在窗体上添加第一个控件,设置好名称和其它属性;(2)选中该控件,进行复制和粘贴操作,系统会出现以下提示信息:单击“是”按钮,建立一个控件数组。通过若干次粘贴操作,便可建立所需要的控件数组。,5.2 数组控件,2 建立控件数组的方法 2)在程序运行时建立 步骤如下:(1)先建立第1个控件数组元素:在窗体中添加第1个控件,设 置其Index属性为0;(2)在程序中用Load方法添加其余的若干个元素,用Unload方 法删除某个元素;(3)新添的控件数组元素通过Left和Top属性值,确定它在窗 体上的具体位置。(4)设置其Visible属性为True,使
24、其显示出来。,5.3 自定义数据类型,在应用程序开发中,往往要使用一些类型相同、功能相似的控件,这些控件需要执行基本相同的操作,如果把事件代码分别写在不同对象的事件过程中,会造成代码重复,给程序维护带来了困难,而应用控件数组则能避免上述问题。,1 特点:,用于存贮不同数据类型的一组数据,5.3 自定义数据类型,2 定义:,Type As As As End Type,5.3 自定义数据类型,注意:自定义数据类型一般放在标准模块中,若放在窗体的通用声明段中时,要在Type前须加上Private关键词。,Type As As As End Type,举例:,Type Students Num As
25、 Integer Name As String*20 Sex As String*1 Birth As Data Age As Integer Jiguan As String*50End Type,注意:自定义类型一般应放在标准模块中,其默认型为Public,5.3 自定义数据类型,2 定义:,3 自定义类型的引用:,自定义类型必须先说明变量,再引用,Type Students Num As Integer Name As String*20 Sex As String*1 Birth As Data Age As Integer Jiguan As String*50End TypeDim Stud(50)As Students,在标准模块定义,5.3 自定义数据类型,4 用户自定义数据类型数组 用户自定义数据类型数组就是数组中的每个元素数据类型均为用户自定义数据类型。用户自定义数据类型数组的步骤如下:(1)使用Type语句定义自定义数据类型;(2)使用数组定义语句定义自定义数据类型数组;,5.3 自定义数据类型,