第 9章 数组本章的学习要点
掌握数组的概念
区分静态数组和动态数组
掌握数组的基本操作 (数组元素的输入、输出、排序 )
掌握控件数组的建立与应用
了解二维数组的使用变量在一个时刻只能存放一个值,当数据不多时,
使用简单变量可解决问题,但数据庞大时用简单变量效率太低。
例如:
1)输入 100个数,按从大到小或者从小到大的顺序输出。
2)某学校有近万名学生,做一个学生信息表。
9.1 数组的概念
9.1 数组的概念
1.数组的概述数组是具有相同数据类型的数据元素的集合。它由 同一个名字 不同下标 的 同类型 变量组成。
数组中的变量称为 数组元素,数组中的 每个元素都有一个唯一的下标 (索引)来标识自己。
数组元素的个数 称为数组的长度(大小)
数组的特点:
1)数组的命名规则遵循标识符命名规则;
2)数组中的元素是有序排列的;
3)数组的元素个数是有限的;
4)数组的数据类型就是该数组的下标变量的数据类型;
5)数组元素的存储不是松散状态,而是占据一片连续区域。
Score(1)
Score(2)
……
Score(100)
Score
数组的内存表示使用数组和简单变量主要存在如下区别:
( 1)输入的简单变量越多,程序就越长,程序本身占用的内存空间就越大。
( 2)在一个程序中使用的简单变量个数有限,对大批量数据,简单变量就不能表示了。
( 3)简单变量的存储位置呈松散状态,数组却占据着一片连续的存储区域。
( 4)在程序结构上,简单变量不适合使用循环的办法来解决,增加了代码的复杂度。
9.1 数组的概念
2.数组的定义
1)数组的声明一个数组包括数组名称、数组维数、数组大小、数组类型以及作用范围。
在使用数组时要将以上内容告诉计算机,以便开辟足够的内存单元来存储数据,这个过程叫做 声明数组 。
声明数组的语法格式:
{Public | Private | Dim} 数组名 [(维数定义 )][As 数据类型 ],.
说明:
( 1)数组必须“先声明,后使用”;
( 2)一条声明语句可以同时声明多个不同维数的数组,但数组间不能同名。
9.1 数组的概念
2)数组的上、下界数组有上界和下界,数组的元素在上下界内连续递增。
语法格式:
[下界 1 To] 上界 1 [,[下界 2 To]上界 2]...
其中,
下界和上界分别表示该维的最小和最大下标值,通过关键字 To连接起来确定下标的取值范围。 默认下界为 0,下界可以省略,若省略下界说明下标的取值范围是从 0到上界。
例如:声明数组 Sums
Dim Sums(9)As Double ’该数组包含 10个元素,a(0)~ a(9)
9.1 数组的概念
3) 数组的维数
下标变量中下标的个数决定数组的维数,各维下标之间用逗号,,,隔开。
一个下标的下标变量构成一维数组,一维数组表示线性顺序;
两个下标的下标变量构成二维数组,二维数组用于表示平面;
三个下标的下标变量构成三维数组,三维数组可以表示立体空间。
有多少个下标的下标变量就构成多少维的数组,通常又把二维以上的数组称为多维数组。
9.1 数组的概念例如:
Orange(1 to 5)表示一维数组共有 5个元素。
Apple(1 to 3,2 to 5)
表示二维数组,大小为 3× 4,元素总数为二个维数的乘积 12,
该数组在数学上可表示为 3行 4列的矩阵。
Pear(1 to 2,1 to 3,2 to 4)
表示三维数组,大小为 2× 3× 3,元素总数为三个维数的乘积 18,该数组在数学上可以用立体图形来表示。
注意:
在增加数组的维数时,数组所占的存储空间会大幅度增加,
由于对每一个下标变量都分配空间,所以声明数组的大小要合适。
9.1 数组的概念
4) 数组的类型
,As 数据类型”表明数组元素的类型。可以声明任何基本数据类型的数组,Byte,Boolean,Long、
Currency,Single,Double,Date,String(变长字符串),String*length(定长字符串),Object(对象型),Variant(变体型)、用户定义类型。
9.1 数组的概念
5) 下标变量的使用说明
下标变量由数组名后跟小括号,()‖括起来的下标组成。且下标必须放在小括号内。
例如,a(3)不能写成 a3,否则被当作简单变量处理。
下标可以是常量、数值变量、算术表达式。
例如,a(6),b(2*m+1),c(i)。
若下标中若含有变量,使用前该变量应提前赋值。
例如,当 i=1时,a(i)表示 a(1),a(i+2)表示 a(3);
当 i=b(1)=1时,a(b(1))表示 a(1)。
下标变量的类型就是数组的类型,所有下标变量都具有一样的类型。
下标变量像简单变量一样,一个下标变量代表相应数组的一个组成元素。
9.1 数组的概念
9.2 静态数组与动态数组
静态数组,在程序执行前,系统进行编译时,根据数组说明语句开辟的固定的存储空间,直到程序执行完毕,在整个过程中存储空间大小不再改变,这种数组就叫静态数组。
动态数组,在执行过程中给数组开辟存储空间后,
还可以用 Redim(或 Dim)语句再次分配存储空间,这种数组就叫动态数组。
在程序未执行时,动态数组不占用内存;而静态数组,编译程序将为它的数据段预留空间。
9.2.1 静态数组
1.静态数组的声明数组声明的语法格式:
Public | Private | Dim } 数组名 (下标 ) [As 类型 ]
下标的格式,[下界 1 To] 上界 1 [,[下界 2 To] 上界 2]… )
例如:
Dim A(2)As Double
一维数组 A,共有三个双精度元素,分别为 A(0),A(1),A(2)。
Dim B(-2 To 2)As Single
一维数组 B,共有 5个单精度元素,分别为 B(-2),B(-1),B(0),B(1)、
B(2)。
Dim C(2,1 To 2)As Integer
二维数组 C,共有 6个整型元素,分别为 C(0,1),C(0,2),C(1,1)、
C(1,2),C(2,1),C(2,2)。
Dim D(1,1)As Double
二维数组 D,共有 4个双精度元素,分别为 D(0,0),D(0,1),D(1,0)、
D(1,1)。
2.数组下标设置语句下界默认开始值为 0。但在使用时,若希望从别的值开始,这就需要用,Option Base‖语句设置数组下标的起始值。
Option Base语句的语法格式,Option Base n
例如:
Option Base 1
Dim A(5)As String
’等价于 Dim A(1 To 5)As String
9.2.1 静态数组注意:
1)在数组声明时,下标表示数组的维数大小,但在使用中,只表示数组中的一个元素。 即:
Dim D(1,1)As Double
声明过程中 D(1,1)表示 D是一个二维数组,有 4个元素,分别为 D(0,0),D(0,1),D(1,0),D(1,1)。声明完成后再出现的 D(1,1),则表示数组 D中的一个数组元素。
2) Option Base n语句必须在标准模块中或窗体通用声明处使用。
9.2.1 静态数组例 9.2 随机产生 5个两位整数,求出 5个数的平均值、最大值、最小值。思路,5个随机两位数要利用 Rnd函数和
Int函数,通过循环来产生,求平均值则要先求和,所以要用循环进行累加求和,另外在累加求和过程中通过比较寻找 5个数的最大值和最小值。
9.2.1 静态数组
Option Base 1 '标识数组下标从 1开始,并且一定要是模块级变量
Private Sub Command1_Click()
Dim a(5) As Integer
Dim i As Integer,max As Integer,min As Integer,
sum As Integer
Dim avr As Double
For i = 1 To 5
a(i) = Int(Rnd * 90 + 10) '随机数用到 Rnd函数和
Int函数
Label4.Caption = Label4.Caption & " " & a(i)
Next i
max = a(1)
min = a(1)
9.2.1 静态数组
For i = 1 To 5
If max < a(i) Then max = a(i)
If min > a(i) Then min = a(i)
sum = sum + a(i)
Next i
avr = sum / 5
Text1.Text = avr
Text2.Text = max
Text3.Text = min
End Sub
Private Sub Command2_Click()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Label4.Caption = "随机产生的 5个数为,"
End Sub
9.2.1 静态数组例 9.3 用数组求 1!+2!+?+10! 之和。
Private Sub Form_Click()
Dim a(1 To 10) As Long,sum As Long,f As Long
Dim n As Integer
f = 1
For n = 1 To 10 '通过 10次循环,分别求出 1!~ 10!
f = f * n
a(n) = f '每求得一个阶乘就赋值给一个数组元素
Next n
sum = 0
For n=1 To 10
sum = sum +a(n)
Next n
Print "1! + 2! + 3! + 10! ="; sum
End Sub
9.2.1 静态数组
9.2.2 动态数组与静态数组对应的是动态数组,即 数组元素个数不定的数组 。
若事先不知道数组的大小,并希望在运行时可以根据需要改变数组的大小(或大小不断改变),这时就要使用动态数组。
动态数组与静态数组不同的是,动态数组灵活、经济、可伸缩,可在任何时候改变数组的大小,从而不会浪费内存。
1.动态数组的声明数组声明的语法格式:
{Public | Private | Dim} 数组名 () [As 类型 ]
2.创建动态数组的步骤
1)声明 一个空维数表 的数组(不必说明维数和界限)。
例如,Dim X( )As Integer。
2)在需要指定数组大小时,再使用 ReDim语句分配数组中实际元素个数。
例如,ReDim X(50,50)。
9.2.2 动态数组
ReDim语法格式:
ReDim [Preserve] 数组名 (下标 )[As 类型 ]
其中:
( 1) ReDim语句中的 [As 类型 ]可以省略,若不省略则必须要和数组声明中的类型一致。
( 2) 使用 ReDim相当于数组被重新初始化,原来的数据将全部丢失。
( 3) Preserve表示再次使用 ReDim语句改变数组大小时保留数组中原来的数据,但 Preserve只能改变多维数组中最后一维的上界,否则运行程序报错。
( 4) ReDim 语句用来 更改某个已声明维数或大小的数组 。如果有一个较大的数组,并且不再需要它的某些元素,ReDim 可通过减小数组大小来释放内存。另一方面,如果代码确定某个数组需要更多元素,也可使用 ReDim语句来实现。
9.2.2 动态数组例 9.4 使用 ReDim语句来声明动态数组。
Private Sub Form_Click()
Dim a() As Integer
ReDim a(5) As Integer
a(0) = 100
Print "第一次重新动态分配后,a(0)=" & a(0)
ReDim a(1,1)
a(0,1) = 200
Print "第二次重新动态分配后,a(0,1)=" & a(0,1)
ReDim Preserve a(1,3)
Print "第三次重新动态分配后,a(0,1)=" & a(0,1)
End Sub
9.2.2 动态数组例 9.5 统计输入的任意个数之和。
Private Sub Command1_Click()
Dim N As Integer,A() As Single,i As Integer,
s As Single
N = InputBox("输入几个数? ")
ReDim A(1 To N)
For i = 1 To N
A(i) = InputBox("输入第 " + Str(i) + "个数 ")
Print "第 " & i & "个数 =" & A(i)
s = s + A(i)
Next i
Print N & "个数之和为 " & s
End Sub
9.2.2 动态数组
9.3 一维数组的基本操作数组是一个整体,但在具体操作时是针对数组元素进行的。
基本操作包括:
一维数组元素赋初值
一维数组元素的输入与输出
数组的排序
使用循环结构赋初值例,For i=1 to 100
a(i)=0
next I
则 a( 1)- a( 100)的初值均为 0
使用 Array函数赋初值 (数组必须是变体型数组 )
格式,<数组名 >= Array( <列表 >)
例,Dim A as variant
A=Array(2,4,6)
则 A(0)= 2,A(1)=4,A(2)=6
9.3.1 一维数组元素赋初值
例 9.6 将若干学生的成绩按照优秀( 90~ 100分,用 A
表示)、良好( 80~ 89分,用 B表示)、及格( 60~ 79
分,用 C表示)、不及格( 60分以下,用 D表示)分档,
分别统计出各档成绩的人数。
9.3.1 一维数组元素赋初值
Private Sub Command1_Click()
Dim s(10) As Integer,a As Variant,i As Integer,p As Integer
For i = 0 To 9
a = Array(17,51,82,42,87,92,79,68,80,90) '初始化数组
Next i
Print "10个学生的成绩分别为,"
For i = 0 To 9
Print a(i) & " ";
If i = 4 Then Print '输出数组
p = Int(a(i) / 10) '将分数化为 0~ 10档
s(p) = s(p) + 1 '对应档数组元素累加
Next i
Print
Print "等级 A:"; s(10) + s(9)
Print "等级 B:"; s(8)
Print "等级 C:"; s(7) + s(6)
Print "等级 D:"; s(1) + s(2) + s(3) + s(4) + s(5)
End Sub
9.3.1 一维数组元素赋初值
9.3.2一维数组元素的输入与输出
1.数组元素的输入
1)键盘输入 ——使用文本输入框或者 InputBox()函数实现。
例:静态数组的输入
Private Sub Form_Click()
Dim A(1 To 10) As Integer,i As Integer
For i = 1 To 10
A(i) = Val(InputBox(―输入第 " & i & "个数据 ","
输入 "))
Next i
……
End Sub
2)下标生成 ——主要用于数组元素与下标之间存在函数关系例:生成一维数组,元素为 1,3,5,7……
Private Sub Form_Click()
Dim A(1 To 10) As Integer,i As Integer
For i = 1 To 10
A(i) = 2*i-1
Next i
……
End Sub
9.3.2一维数组元素的输入与输出
3)随机数生成 ——使用 Rnd函数实现例:随机生成一维数组。
Private Sub Form_Click()
Dim A(1 To 10) As Integer,i As Integer
For i = 1 To 10
A(i) = Int(100*Rnd)+1
Next i
……
End Sub
9.3.2一维数组元素的输入与输出
2,数组整体赋值将一个已知数组整体赋值给另一个可调数组,并自动确定可调数组的大小。如:
Dim A(3) As string,B() as string
A(0)=,张三”,A(1)=,李四”
A(2)=,王五”,A(3)=,赵六”
B=A
通过赋值语句将数组 B的大小确定为 4,且各数组元素值和顺序 A的值相同。
9.3.2一维数组元素的输入与输出
3,数组输出数组内容的输出使用一重循环实现。例如:
Private Sub Form_Click()
Dim A(1 To 10) As Integer,i As Integer

For i = 1 To 10
Print A(i)
Next i

End Sub
9.3.2一维数组元素的输入与输出
9.3.3 数组的排序
1.冒泡法排序冒泡法排序模拟水中气泡的排放规则,使份量,较轻,(值较小)的气泡浮到上面,份量,较重,(值较大)的气泡沉到下面,对每一趟排序,从第一个元素开始,按照规则调整相邻元素的大小关系,确定一个最大
(或最小)的气泡的位置,
冒泡法排序如:有数组 a,4 1 8 6 5,使用冒泡法从小到大排序第一趟排序,
4
1
8
6
5
1
4
8
6
5
1
4
8
6
5
1
4
6
8
5
1
4
6
5
8
4
1
8
6
5
1
4
8
6
5
1
4
8
6
5
1
4
6
8
5
1
4
6
5
8
经过第一趟排序的四次调整后,使五个数的 最大值 8
放在最后一个位置,这个位置是确定的,在以后的排序过程中不会再改变,因此,在后面的排序中就不再对该位置进行改变第二趟排序 (对前四个元素排序):
在第一次排序的基础上,经过第二趟排序的三次调整后,
使前四个数的最大值 6放在倒数第二个位置,同样,在后面的排序中就不再对该位置进行改变第三趟排序 (对前三个元素排序):
1
4
5
6
8
1
4
5
6
8
1
4
5
6
8
9.3.3数组的排序第四趟排序 (对前二个元素排序):
1
4
5
6
8
1
4
5
6
8
最后一个元素显然不用再排序了,这样,经过四趟排序,
完成了对数组 a中的五个元素的排序,即若数组中有 N个元素,
则需要进行 N-1趟排序才能完成对整个数组的排序
9.3.3数组的排序程序实现:(其中 N为数组 a的下标上界)
For i = 1 To N – 1 ’控制有几趟排序
For j = 1 To N – I ’控制每趟排序的个数
If a(j) > a(j + 1) Then
temp = a(j)
a(j) = a(j + 1)
a(j + 1) = temp
End If
Next j
Next i
9.3.3数组的排序完整的冒泡排序程序
1.输入数据
Dim n As Integer
Dim a()
n = InputBox("dd")
ReDim a(n)
For j = 1 To n
a(j) = Int(Rnd * 90 + 10)
Print a(j);
Next j
2.数据处理 (排序 )
For i = 1 To n - 1 '
For j = 1 To n - i '控制每趟排序的个数
If a(j) > a(j + 1) Then
temp = a(j)
a(j) = a(j + 1)
a(j + 1) = temp
End If
Next j
Next i
3.数据输出
For j = 1 To n
Print a(j);
Next j
2.选择法排序
1)选择法排序的基本思路
将 a(0)作为参考标准,在 a(0)-a(9)中挑选最小的一个数,跟 a(0)
交换;再将 a(1)到 a(9)中最小的数与 a(1)对换;依次类推。 10个数共需进行 9轮比较以达到顺序的目的。
假设第 1个数据最小,依次同第 2、第 3,?,第 N个数据进行比较,
一旦第 1个数据大于其他值则交换。这样,第 1轮比较完毕,找出了最小数据作为第 1个数据。
以第 2个数据为最小数据,依次同第 3、第 4,?,第 N个数据进行比较,若第 2个数据大于其他值则交换。这样,第 2轮交换完毕,则找出第二小的数据作为第 2个数据。
依此类推,第 N-1轮比较将找出第 N-1小的数据,剩下的一个数据就是最大数,排列在最后。
9.3.3数组的排序
2)实现选择法排序的程序
Dim i As Integer,j As Integer,temp As Integer
For i = 1 To n - 1
For j = i + 1 To n
If a(i) > a(j) Then
temp = a(i)
a(i) = a(j)
a(j) = temp
End If
Next j
Next i
其中 i是外循环的循环变量,j是内循环的循环变量。 For i = 1
To n-1至 Next i是外循环,表示总共排序的趟数; For j = 1 To n
- i至 Next j是内循环,表示每一趟排序时,比较的次数。
9.3.3数组的排序
例 9.7 随机产生 10个 100以内的正整数,将这 10个数按照从小到大的顺序输出。要求单击窗体在 Label1中显示随机产生的 10个数,单击排序按钮,在 Label2中显示按照从小到大的顺序排序后的结果。
9.3.3数组的排序
Option Base 1
Dim a(i) As Integer
Private Sub Command1_Click()
Dim i As Integer
For i = 1 To 10
a(i) = Int(Rnd * 100)
Label1.Caption = Label1.Caption & a(i) & " "
Next i
Print
End Sub
9.3.3数组的排序
Private Sub Command2_Click()
Dim i As Integer,j As Integer,temp As Integer
For i = 1 To 9
For j = i + 1 To 10
If a(i) > a(j) Then
temp = a(i)
a(i) = a(j)
a(j) = temp
End If
Next j
Next i
For i = 1 To 10
Label3.Caption = Label3.Caption & a(i) & " "
Next i
End Sub
9.3.3数组的排序
9.4 二维数组的使用二维数组通常是指由两个下标的数组元素所组成的数组。一个二维表格就是一个二维数组。数学上形如矩阵 {aij}表示的数据均可用二维数组来处理。
例 9.8 矩阵的加减运算。
Private Sub Command1_Click()
Dim a(1 To 4,1 To 5) As Integer
Dim b(1 To 4,1 To 5) As Integer
Dim c(1 To 4,1 To 5) As Integer
For i = 1 To 4
For j = 1 To 5
a(i,j) = Int(Rnd * 40) + 10
'通过 Int和 Rnd函数产生 20个 10~ 50之间的整数构成矩阵 a
b(i,j) = Int(Rnd * 40) + 10
c(i,j) = a(i,j) + b(i,j)
'矩阵 a和矩阵 b对应元素之和放入矩阵 c中
Next j
Next i
For i = 1 To 4
For j = 1 To 5
Print a(i,j) & " "; '输出矩阵 a中的数据
Next j
Print
Next i
Print "----------------------" '两个矩阵之间用 "-"隔开
For i = 1 To 4
For j = 1 To 5
Print b(i,j) & " "; '输出矩阵 b中的数据
Next j
Print
Next i
Print "----------------------"
9.4 二维数组的使用
For i = 1 To 4
For j = 1 To 5
Print c(i,j) & " "; '输出矩阵 c中的数据
Next j
Print
Next i
End Sub
Private Sub Command2_Click()
Cls
End Sub
9.4 二维数组的使用例 9.9 求一个 4× 4矩阵的对角线元素之和。
Private Sub Command1_Click()
Dim a(1 To 4,1 To 4) As Integer
Dim sum As Integer
For i = 1 To 4
For j = 1 To 4
a(i,j) = Val(InputBox("请输入第 " & i & "行,第 " & j & "列的数 ","矩阵输入 "))
Print a(i,j) & " ";
Next j
Print
Next i
sum = 0
For i = 1 To 4
For j = 1 To 4
If i = j Or i + j = 5 Then sum = sum + a(i,j) '两条对角线上的值求和
Next j
Next i
Print "矩阵的对角线元素的和为 "; sum
End Sub
9.4 二维数组的使用
9.5 控件数组
控件数组 是由一组相同类型的控件组成,使用相同的名称,具有基本相同的属性,执行不同的功能
根据建立时的顺序,系统给每个控件元素一个唯一的索引号( Index),即下标,下标从 0开始。这些控件元素将使用相同的事件过程,在事件过程中使用
Index区分各个元素控件数组的建立有以下几种方法:
1.复制粘贴法步骤:
①在窗体上创建第一个控件,并设置好控件的属性;
②选中该控件,进行,复制,和,粘贴,操作,系统将会弹出提示消息框如下
③单击,是,按钮后,就建立了一个控件数组,在此之后进行的,粘贴,操作生成的控件都是控件数组中的元素。
9.5 控件数组
2,Name设置法方法:将需要放置在数组中的控件的 Name属性都设置为相同,当设置第二个控件的 Name时也会弹出以上的提示建立控件数组的消息框
3.通过指定控件的索引值创建控件数组首先指定控件数组中的第一个控件的索引值为 0或比 0
大的值,然后通过前两种方法之一就可得到控件数组,
所不同的是不会弹出对话框
9.5 控件数组建立好控件数组后,往往需要编写控件的事件过程。
控件数组共享同样的事件过程,
为了区分是哪个元素触发的事件,VB会把它的下标值传送给事件过程,事件过程通过 Index参数接收,并判断。
例题,简易四则运算器两个操作数,四个操作符按钮用控件数组
9.5 控件数组
Private Sub Command2_Click(Index As Integer)
Dim op1 As Single,op2 As Single
op1 = Val(Text1(0).Text)
op2 = Val(Text1(1).Text)
Select Case Index
Case 0
Text2.Text = op1 + op2
Case 1
Text2.Text = op1 - op2
Case 2
Text2.Text = op1 * op2
Case 3
If op2 <> 0 Then Text2.Text = op1 / op2
End Select
End Sub
9.5 控件数组数组按作用域分为:
( 1) 公用数组,在模块的声明段用 Public语句声明数组。
语法格式:
Public 数组名 (维数说明 )[As类型 ]
( 2) 模块级数组,在模块的声明段用 Private语句声明数组。
语法格式:
{Private| Dim} 数组名 (维数说明 )[As类型 ]
( 3) 局部数组,在过程中用 Private 语句声明数组。
语法格式:
{Dim | Private} 数组名 (维数说明 )[As类型 ]
数组的作用域例如:下列数组声明可出现在模块或过程的声明段
Dim A(5) As Integer
Dim B(10) As String
为建立公用数组,直接用 Public取代 Dim:
Public A(5) As Integer
声明了一个有 6个元素的公用数组,其索引值为 0~ 5
Public B(10) As String
声明了一个有 11个元素的公用数组,其索引值为 0~ 10
说明:
数组声明要考虑其作用域,也就是应用的有效范围。
如果省略类型,将默认为 Variant类型。
当下标不止一个时,下标下界可任意选择显式(值)或隐式
( 0)。
数组的作用域