第5章数组前面章节中程序涉及的数据量都比较小,简单变量(即每个变量都使用一个独立的名称,变量间不存在联系)就可以很方便地进行存取,但是在实际问题中往往会有大量的相关数据需要存取,例如,要存储40个学生5门课程的成绩,如果用简单变量来存取这些数据,需要声明200个简单变量,这样做不但烦琐,而且效率低。为了在程序中能方便**地处理大批量的数据,充分发挥循环控制结构的作用,VB中引入了数组。本章将着重介绍数组的特点以及在实际问题中的应用。
引例: 求一个班5个学生的某门课的平均成绩,然后统计高于平均分的人数。
程序代码如下。Private Sub Form_Click()
Dim s!, aver!, overn%, mark!
s=0
aver=0
For i=1 To 5
mark=InputBox("输入第" & i & "位学生的成绩")
s=s mark
Next i
aver=s/5
overn=0
For i=1 To 5
mark=InputBox("输入第" & i & "位学生的成绩")
If mark>=aver Then overn=overn 1
Next i
Print aver, overn
End Sub通过阅读上述程序代码可以知道,在引例中,由于变量mark多次赋值后,只保留*后一次的值,所以,在求平均值时,在循环体内,给变量mark输入了5个学生的分数,输入完后,mark只保存了*后一个学生的分数;而要统计高于平均分的人数时,又要在循环体内将这5个学生的分数再给变量mark输入一遍。也就是说,给mark赋了两遍值。这成倍的工作量势必降低工作效率,有没有办法只赋一遍值并且将所赋的值都保存下来供程序多次使用呢?〖2〗面向对象程序设计基础——Visual Basic(第2版)第5章数组〖2〗在数学中表示一个数列时使用x1,x2,x3,…,xi,…,xn的形式,这种形式称为数列。数列中的每一个数据项都表示为xi的形式,其中x为数列名,i为数据项在数列中所处的位置,称为下标,xi称为下标变量。这种表示形式的好处是能批量处理数据,容易找出数据之间的依赖关系(例如,Fibonacci数列等)。在VB中,为了能处理一批数据或与其位置有关的数据,也采取这种类似的方法,所不同的只是将下标放入一对括号“()”中。例如,在引例中,就可以采用这种方法,可将5个学生的某门课的成绩分别存入到mark(1),mark(2),mark(3),mark(4),mark(5)中。其中,mark称为数组名,mark(i)(i=1,2,…,5)称为mark数组中的元素,数组元素可以存储第i个学生的成绩,i称为数组元素的下标,下标指出某个数组元素在数组中的位置,所以,数组元素也叫下标变量。要使用这些下标变量mark(i),必须在使用之前声明一个mark数组。
5.1数组的基本概念数组是一组相同名称的下标变量的集合。这些下标变量称为数组元素,每个数组元素都有一个编号,这个编数组概念
号叫做下标,放在圆括号“()”里,通过下标来区别这些元素,下标代表元素在数组中的位置。下标变量的名称称为数组名。例如,下标变量mark(1),mark(2),mark(3),mark(4),mark(5)是数组mark中的元素。
数组元素和数组是个体和整体的关系。在计算机中,数组占据一块内存区域,数组名是这个区域的名称,区域的每个单元就是数组元素。
数组必须遵循先声明后使用的原则,声明一个数组就是声明其数组名、类型、维数和数组的大小。
在Visual Basic中,数组元素一般都是同种类型的,而Variant类型(默认)数组的各元素可以是不同的数据类型,但建议不要使用。
按数组的大小(元素个数)是否可以改变,可将数组分为静态(定长)数组和动态(可变长)数组两类。
按元素的数据类型,可分为数值型数组、字符型数组、日期型数组、变体类型数组等。
按数组元素的下标数量的不同,数组可分为一维数组、二维数组、多维数组(*多60维)。一维数组的元素只有一个下标,二维数组的元素有两个下标,多维数组的元素有多个下标。
按数组元素的性质,可分为数据数组和控件数组。
5.1.1静态数组及其声明〖*3/4〗1. 一维数组声明格式:Dim|Private|Static|Public<数组名>([<下界>To]<上界>)[As<数据类型>]或Dim|Private|Static|Public<数组名>[<数据类型符>] ([<下界>To]<上界>)功能: 声明一维数组的名称、大小、类型,并为数组分配存储空间。
说明:
(1) Dim语句可用在窗体的通用声明段中,定义窗体数组,也可用于过程中;Private语句用在窗体的通用声明段中,定义窗体数组;Static语句用在过程中;Public语句用在标准模块的通用声明段中,定义全局数组。这4种语句的适用范围也同样适用于各种类型的数组声明。
(2) 数组名的命名规则与变量的命名相同。在同一个过程中,数组名不能与变量名同名,否则会出错。
(3) 数组的大小就是数组元素的个数。一维数组的元素个数: 上界-下界 1(下界≤上界)。下界*小值为-32 768,上界*大值为32 767。
(4) 如果省略<下界>To,其下界默认值为0。若希望下界从1开始,可在窗体或模块的通用声明段使用Option Base 1语句将其设为1。格式:Option Base n(n只能取0或1。该语句只能出现在窗体模块或标准模块的通用声明段,不能出现在过程内,而且必须在数组声明之前设置。如果声明的是多维数组,则使用该语句设置的默认下界值对每一维都有效)。
(5) <下界>和<上界>必须是数值型常量或由数值型常量构成的表达式,常量可以是直接常量、符号常量,一般是整型常量。
例如:Const k As Integer=10
Dim x(10) As Single'正确
Dim a(k) Aslong '正确而n=10
Dim x(n) As Single '错误(6) 如果省略As子句,则数组的类型为变体类型。
(7) 数组声明,并初始化所有数组元素。数值型数组中的元素初值是0,字符型数组中的元素初值是空字符串(""),逻辑型数组中的元素初值是False,变体类型数组中的元素初值是空(Null)。
例如:DimA(-1 To 5)As Integer
'声明了名称为A的一维数组,共有7个整型元素,分别是A(-1),A(0),A(1),A(2),A(3),A(4),A(5)
DimB(5)As Integer
'声明了名称为B的一维数组,共有6个整型元素,分别是B(0),B(1),B(2),B(3),B(4),B(5)通过学习一维数组的有关知识,引例中的学生成绩就可以只输入一遍值并且能保存下来供后面的程序使用了,程序修改如下。Private Sub Form_Click()
Dim s!, aver!, overn%, mark!(1 To 5)
s=0
aver=0
For i=1 To 5
mark(i)=InputBox("输入第" & i & "位学生的成绩")
s=s mark(i)
Next i
aver=s/5
overn=0
For i=1 To 5
If mark(i)>=aver Then overn=overn 1
Next i
Print aver, overn
End Sub