大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说结构体数组(数组作为结构体成员),希望您对编程的造诣更进一步.
第五章 数组和结构体
第一节 数组
5.1.1 什么是数组
在之前的章节中,我们已经学习到了如何去定义一个变量,那么假设现在我们需要100个整形变量,如何来声明这100个整形变量呢?这100个变量又如何给命名呢?
当然,可以通过写100个变量的名称来申明这100个变量,如果有时间的话,当然可以用例如a1、a2、a3……a100来一个一个命名。
但是,即使这样命名了,如何能够把这100个变量从第1个到第100个“重新阅读”一遍?或者如何让这100个整数分别等于1到100呢?是不是还需要写a1=1、a2=2……a100=100?
在许多计算机编程语言中,我们可以把像这样的一组变量类型相同的变量定义成一个“数组”所谓数组就是在计算机中连续储存的,相同类型的变量。在VBA中,当然也可以这样做了,即我们现在可以用一个“数组”来储存这100个变量,并且通过数组下标的方式来对数组的每一个元素实现一一遍历。
在VBA中,数组有两种形式,即定长数组和可变数组。
5.1.2 定长数组
(1) 声明数组的通常做法
所谓定长数组,就是数组元素个数确定的数组,在VBA中,声明一个定长数组最常用的命令是: Dim 数组名(N) As 类型。这里需要注意的是,在默认情况下,VBA中的数组是从0号元素开始的,所以数组的元素个数等于N+1。对于数组中的元素,可以用数组名(i)的形式访问,i表示数组的第i号元素,即数组的第i+1个元素。
例如: Dim Ary(6) As Integer,声明了一个整形数组,这个整形数组中有Ary(0),Ary(1),Ary(2)、Ary(3)、Ary(4)、Ary(5) 、Ary(6),共7个元素构成。例如,下面语句,声明了一个数组,并且把0到100共计100个数保存在是这个数组中。
Dim Ary(100) As Integer, i As Integer
For i =0 to 100
Ary(i)=i
Next i
(2)指定下标范围法:
在声明定长数组的时候,也可以指定数组的下标范围。例如,Dim B(2 to 6) As Integer。这个语句中的数组B的元素为 B(2)、B(3) 、B(4) 、B(5) 、B(6),共计5个元素。
5.1.3 指定下标从1开始
VBA中也可以强制指定所有的数组下标的起始数字,使用Option Base 1语句即可以指定数组的下标从1开始。下面语句中定义了一个从A(1) 到A(100) 的100个元素的数组。
Optional Base 1
Dim A(100) As Integer
5.1.4 下标溢出
在VBA中,下表超过数组范围时,会引发”下标溢出”的错误,例如,Dim A(10) As Integer,定义了数组A,下标范围从0到10,如果现在语句中同时出现了A(11)这样的用法,则会发生数组下标溢出的错误。
但是有时候确实也不是我们自己想这样做的,可能完全忘记了自己之前的操作或者操作后发生了问题,例如,一个一个地判断这个数组A中的数字是否大于零,若大于0则放入另外一个数组B,最后输出B的最后一个元素。如果这个程序写成下面这样:
Sub GT0()
Dim A(10) As Integer,B(10) As Integer, i as Integer
for i =0 to 10
A(i)=Inputbox(“输入第” & i & “次”)
If A(i)>0 Then B(i)=A(i)
Next i
Msgbox(B(i))
End Sub
这一段看上去似乎没啥问题,确实“聪明”的我们也会说,是啊,我这个i不是变化的么?这个i应该始终是最后一个元素的序号啊。但是,事实情况并不是这样!这是因为这个循环语句的时候,是先把i的数字加上1,然后再判断i是否大于等于10的,所以,循环后的i不是最后一个元素的序号,而是最后最后一个元素的序号加上1!
5.1.5 可变数组
除了定长数组,VBA还可以支持变成数组,定义一个可变数组的方法是:Dim 数组名() As 类型。
可变数组并不可以直接拿过来就用了,在使用之前,需要重新声明一下可变宿主的长度,重新声明的方法为:
Redim [Preserve] 数组名 (N)
若使用Preserve,则表明保留之前的数组中的数,若不使用Preserve则原数组丢失。
例如:让用户随机输入若干数字,输入完毕后,计算用户输入的数字的平均数。
Sub Ave()
Dim Ary() As String, N As Integer, i As Integer, S As Double
N = 1
Do
ReDim Preserve Ary(N)
Ary(N) = InputBox(“输入数字,#结束”)
If Ary(N) = “#” Then Exit Do
N = N + 1
Loop
For i = 1 To N – 1
S = S + Ary(i)
Next i
MsgBox (S / (N – 1))
End Sub
这一段中,同样要注意数组长度的问题,在循环后,数组长度并不等于N,而是等于N-1.
通常用一个可变宿主接受一个字符串分割后的结果,(字符串分割后结果为一个字符串数组例)如下面一个问题,在Excel表格中的A列输入的内容为用逗号分隔开的省市,例如“安徽省,合肥市”,如何将这些省市分成两列表示。
Sub S()
Dim RngA As Range, RngB As Range, RngC As Range, i As Integer, Ch() As String
i=1
Set RngA=Range(“A:A”)
Set RngB=Range(“B:B”)
Set RngC=Range(“C:C”)
While RngA(i)<>””
Ch=Split(RngA(i),”,”)
RngB(i)=Ch(0)
RngC(i)=Ch(1)
i=i+1
Wend
End Sub
这里要注意的是,单元格里面的那个逗号务必与VBA中的Split函数中的逗号保持统一,即要么都是英语状态的逗号,要么都是汉语状态的逗号。
5.4 Range数组
其实Range变量也是一个数组,就像上面所看见的那样,一个Range变量可以用下标i直接访问这个Range区域中的单元格。Range数组下标的规定是:Range变量的左上角单元格(区域最左边最上面的单元格)为1号元素(Range数组没有0号元素,这里提醒注意!)然后向右,为2号元素……一行结束后,下一行继续编号。例如Range(‘B2:E4”)每个单元格的序号如下:
图5.1 Range(“B2:E4”)中单元格的编号
第二节 多维数组
5.2.1 什么是多维数组
多维数组是数组的延伸,即二维或者高维上的一个数组。例如一个班级学生的座位号,可以看成一个二维数组,即通过行数和列数两个数定义一个确定的单元。例如三维空间的任何一个点,都可以用(x,y,z)这样的三个数字表示。
5.2.2 多维数组的声明和访问
与一维数组相同,声明一个多维数组的方法也是Dim 数组名(N,M,L……) As 类型,数组总的元素个数等于每一个“维度”上的元素个数的乘积。例如:
Dim A(2,4) As Integer
声明了一个二维数组,数组中的数为整形,数组元素为A(0,0),A(0,1),A(0,2),A(0,3),A(0,4)
,A(1,0),A(1,1),A(1,2),A(1,3),A(1,4),A(2,0),A(2,1),A(2,2),A(2,3),A(2,4),共计15个元素。
从这个例子也可以看到,对于二维数组中元素的访问,与一维宿主相似,二维数组需要用两个数组下标来对数组实现访问。
与一维数组不同,VBA中不可以直接定义可变多维数组。因VBA中自带了Range类型变量,可以借助Range变量来定义多维可变数组。
第三节 结构体
5.3.1 什么是结构体
通过上面的内容,我们讲述了如何通过数组定义类型一致的若干个变量,这里,我们讲述一下如何通过结构体定义有相互联系的变量。例如,我们平时用的最多的一种“结构体”就是通讯号码簿,对于每一个“联系人”均有一个“姓名“,一个”地址“,一个或者若干个联系电话等。然而这里我们可以定义一个特殊的“数据类型”:来储存这种特殊的结构,就把这种数据类型称为“结构体“。那么,我们首先要确定一下这种结构都有哪些具体的部分组成呢?
首先给这种”结构“取一个名字,叫做”通讯信息“通讯信息”包括下列组成部分
姓名 字符串型
性别 字符串型
年龄 整数型
职业 字符串型
地址 字符串型
电话号码 字符串型
明确了这些组成部分之后,我们就可以定义结构体了,这里,我们先说明一下两个术语,(1)结构体名,即这个结构体的名字,在上面的例子中,为“通讯信息”。(2)成员,结构体中的基本组成部分称为结构体的“成员”,上面例子中,“姓名”是“通讯信息”的一个成员。
在VBA中,结构体的定义是在Sub、Function以外的部分,整个模块开始的位置定义。定义结构体的命令是:
[Private | Public] Type Name
VarName1 As Type1
VarName2 As Type2
……
End Type
Private、Public,指明结构体是私有还是共有。Name:结构体的名字。VarName1:结构体中成员的名字。Type1:结构体中成员的类型。
例如上面的例子,用VBA声明结构体就是:
Type CommunInfo
Name As String
Gender As String
Age As Integer
Profession As String
Address As String
Tel As String
End Type
5.3.2 结构体赋值和成员访问
上面我们声明了一种“结构体”但是并没有声明这种结构体的一个变量,所谓声明结构体的一个变量就是声明一个变量,这个变量的类型为上述的这种“结构体”类型。声明一个结构体变量的方法同声明一个整形变量、字符串型变量一致。也就是说,一旦用户通过上面的语句定义了一种“结构体”类型后,这种由用户自己定义的类型就可以同系统中内置的类型一样使用了!
例如Dim A As CommunInfo 这样就定义了一个变量A,这个变量A为上面我们定义的CommunInfo类型。
对于这个结构体A的赋值,需要通过对其成员一一赋值来实现。
结构体的成员访问通过一个小点(即英文的句号)来实现,例如上面的例子中,A.Name实现对A结构体中Name这个成员的访问。
我们可以写成 A.Name=”LiLei” 这样就把A这个结构体变量的Name改为了“LiLei“。也可以另外定义一个这种”结构体”变量B,然后把A赋值给B,即B=A,这样就实现了把A中所有的成员赋值给B结构体了!
5.3.3 结构体数组
既然结构体也是一种类型,那么我们当然可以定义一个数组,这个数组的所有元素为“结构体”,定义这样一种“结构体数组”的方法就是Dim 数组名(N) As 结构体类型。可变数组时,不用N。
例如,我们可以通过一个“结构体数组”储存一下每天细胞培养的数据。
Type CellCult()
LCC As Single
Via As Single
Glu As Single
Lac As Single
End Type
Dim Cel1(14) As CellCult
这样就定义了一个数组Cel1,总共有15个元素,分别储存培养0到14天的数据,对于每一天的培养数据。用一个类型为“CellCult”的结构体来储存,这个结构体包括细胞密度LCC、细胞活率Via、葡萄糖浓度Glu以及乳酸浓度Lac四个成员。例如,对于培养第3天的葡萄糖浓度,表示为Cel1(3).Glu。
第四节 枚举类型
5.4.1 枚举
所谓的枚举就是一个一个地“举例”出来,例如“星期”可以枚举,不过从“星期日”到“星期六”。“月份”也可以枚举,即从“1月”到“12月”。
5.4.2 枚举类型
VBA中的枚举类型就是这样一种类型,即类型的数字范围已经确定的类型。枚举类型的好处:让用户只可以在枚举类型的范围内输入数据。在进行程序设计或者使用设计的程序的时候,往往不希望用户输入我们设想数值以外的数字,例如,在“星期”这样一个变量中,我们并不希望用户输入例如8、9这样的数字,也不希望用户输入例如2.3、5.4这样的数字。
VBA对于枚举类型的定义方法是:
Enum 枚举类型名
枚举名称1=常量1
枚举类型2=常量2
……
End Enum
这个定义方法与结构体的定义方法比较类似,声明一个枚举类型变量的方法也是Dim 变量名 As 枚举类型名。
例如,可以将一周的“周日”到“周六”列成枚举类型:
Enum Day
Sunday = 0
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
End Enum
这里可以观察到,在Sunday的后面有一个“=0“,Monday后面有一个”=1“……这里这个数字成为“枚举量“,即在一个枚举类型的变量a中,让a=Sunday和让a=0的效果是一样的。最后这个a的值均为0.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/36003.html