第五章 数组
( 4学时)
5.1 数组的概念
5.2 静态数组及声明
5.3 动态数组及声明
5.4 数组的基本操作
5.5 控件数组
5.6 自定义数据类型
5.7 常用算法(二)
5.8 常见错误一,数组的概念
1.引例例 5.1若我们要求一个班 100个学生的平均成绩,然后统计高于平均分的人数 。
按以前简单变量的使用和循环结构相结合,求平均成绩程序段如下:
aver = 0
For i = 1 To 100
mark = InputBox("输入 " + i + "位学生的成绩 ")
aver = aver + mark
Next i
aver = aver / 100
但若要统计高于平均分的人数,则无法实现 。 mark是一个简单变量,存放的是最后一个学生的成绩 。
已有知识解决方法:再重复输入成绩,带来两个问题:
( 1) 输入数据的工作量成倍增加;
( 2) 若本次输入的成绩与上次不同,则统计的结果不正确 。
解决此问题的根本方法,引入数组,始终保持输入的数据,一次输入,多次使用 。
二、数组的声明数组并不是一种数据类型,而是一组相同类型的变量的集合。数组必须先声明后使用。
两类数组,静态 (定长 )数组、动态 (可变长 )数组
1,静态数组及声明形式,Dim 数组名 (下标 1[,下标 2…+) *As 类型 ]
声明了数组的名、维数、大小、类型维数,几个下标为几维数组,最多 60维。
下标,[下界 To ] 上界 省略下界为 0,必须为常数。
每一维大小,上界-下界 +1
数组大小,每一维大小的乘积例,Dim mark(1 to 100) As Integer
Dim lArray( 0 To 3,0 To 4) As Long 共有 4× 5个元素等价于,Dim lArray(3,4) As Long
注意:
(1) 下界缺省为 0,也可在重新定义数组的下界。例如:
Option Base 1
(2)错误的声明,下标是变量 n =Inputbox(“输入 n”)
Dim x(n) As Single
(3)在数组声明中的下标说明了数组的整体,即每一维的大小;
而在程序其他地方出现的下标表示数组中的一个元素。
两者写法形式相同,但意义不同。
例如:
Dim x(10) As Integer ' 声明了 x数组有 11个元素
x(10)=100 ' 对 x(10)这个数组元素赋值三、动态数组及声明动态数组指在声明数组时未给出数组的大小 (省略括号中的下标 ),当要使用它时随时用 ReDim语句重新指出数组大小。
形式如下,
ReDim 数组名 (下标 [,下标 2…]) [As 类型 ]
例,Sub Form_Load( )
Dim sArray( ) As Single

ReDim sArray(4,8)

End Sub
说明:
(1) Dim,Private,Public变量声明语句是说明性语句,可出现在过程内或通用声明段
ReDim语句是执行语句,只能出现在过程内。
(2) 在过程中可多次使用 ReDim来改变数组的大小,也可改变数组的维数,
(3) 每次使用 ReDim语句都会使原来数组中的值丢失,可以在 ReDim语句后加 Preserve
参数用来保留数组中的数据,但使用 Preserve只能改变最后一维的大小,前面几维大小不能改变。 例 5.2,求若干个学生的平均分。
(4) ReDim中的下标可以是常量,也可以是有了确定值的变量。
四、数组的基本操作
1,数组元素的赋初值
(1)用循环
For i = 1 To 10
iA(i)=0
Next i
(2) Array函数
Dim ib As Variant
ib = Array("abc","def","67")
For i = 0 To UBound(ib)
Picture1.Print ib(i); " ";
Next i
注意:
(1)利用 Array对数组各元素赋值,声明的数组是可调数组或连圆括号都可省,并且其类型只能是 Variant。
(2)数组的下阶为零,上界由 Array函数括号内的参数个数可决定,也可通过函数
Ubound获得。
2.数组的赋值在 VB6.0中,提供了数组直接对数组的赋值。例如:
Dim a() As Variant,b() As Variant,i%
a = Array(1,2,3,4,5)
ReDim b(UBound(a))
b = a
3,数组的输出输出方阵 sC中的下三角元素
For i = 0 To 4
For j = 0 To i
sc(i,j) = i * 5 + j
Print sc(i,j); " ";
Next j
Print ' 换行
Next I
For i = 0 To UBound(a)
b(i) = a(i)
Next i
注意:赋值号左边的数组只能声明为 Variant的可调数组或简单变量。
4,求数组中最大元素及所在下标
Dim Max As Integer,iMax As Integer
Max=iA(1),iMax=1
For i = 2 To 10
If iA(i)>Max Then
Max=iA(i)
iMax=i
End If
Next I
5,将数组中各元素交换
For i =1 To 10\2
t=iA(i)
iA(i)=iA(10-i+1)
iA(10-i+1)=t
Next I
五,控件数组一组相同类型的控件组成。 它们共用一个控件名,具有相同的属性,建立时系统给每个元素赋一个唯一的索引号 (Index)。
控件数组共享同样的事件过程,通过返回的下标值区分控件数组中的各个元素。
例,Private Sub cmdName _Click(Index As Integer)

If Index=3 then
‘ 处理第四个命令按钮的操作
End If

End Sub
1.在设计时建立控件数组
在窗体上画出控件,进行属性设置,这是建立的第一个元素
选中该控件,进行,Copy”进行若干次和,Paste”操作建立了所需 个数的控件数组元素。
进行事件过程的编程。
例 5,3 建立含有四个命令按钮的控件数组,当单击某个命令按钮,分别显示不同的图形或结束操作。
Private Sub Command1_Click(Index As Integer)
Select Case Index
Case 0
…… "画直线 "
Case 1
…… "画矩形 "
Case 2
……,画圆”
Case Else
End
End Select
End Sub
2.运行时添加控件数组建立的步骤如下,
在窗体上画出某控件,设置该控件的 Index值为 0,表示该控件为数组,这是建立的第一个元素
在编程时通过 Load方法添加其余的若干个元素,也可以通过 Unload方法删除某个添加的元素。
每个新添加的控件数组通过 Left和 Top属性确定其在窗体的位置,并将 Visible 属性设置为 True。
例 5.4 利用在运行时产生控件数组,构成一个国际象棋棋盘。
当单击棋格,显示对应的序号,并且将所有棋格颜色变反。
六、自定义数据类型一组不同类型变量的集合。相当于 C语言中的结构类型; Pascal中的记录类型。
1.自定义类型的定义形式如下,
Type 自定义类型名元素名 [(下标 )] As 类型名

[元素名 [(下标 )] As 类型名 ]
End Type
例如以下定义了一个有关学生信息的自定义类型:
Type StudType
No As Integer ' 学号
Name As String * 20 ' 姓名
Sex As String * 1 ' 性别
Mark(1 To 4) As Single ' 4门课程成绩
Total As Single ' 总分
End Type
元素名:表示自定义类型中的一个成员 。
下标:表示是数组 。
类型名:为标准类型 。
注意:
(1)自定义类型一般在标准模块 (.BAS)中定义,默认是 Public;在窗体必须是 Private。
(2)自定义类型中的元素类型可以是字符串,但应是定长字符串 。
(3)不要将自定义类型名和该类型的变量名混淆,前者表示了如同 Integer,Single等的类型名,后者 VB根据变量的类型分配所需的内存空间,存贮数据 。
(4)自定义类型一般和数组结合使用,简化程序的编写 。
2,自定义类型变量的声明和使用
(1) 声明形式:
Dim 变量名 As 自定义类型名例,Dim Student As StudType
(2) 引用形式,变量名,元素名例,表示 Student变量中的姓名,第 4门课程的成绩,则表示如下:
Student.Name,Student.Mark(4)
3,自定义类型数组的应用例 5.5 利用自定义类型数组,编一类似数据管理 ( 输入,显示,查询 ) 的程序

七、常用算法(二)
1,统计例 5.6输入一串字符,统计各字母出现的次数,大小写字母不区分。
分析:
1.统计 26个字母出现的个数,先声明一个具有 26个元素的数组,每个元素的下标表示对应的字母,元素的值表示对应字母出现的次数。
2.从输入的字符串中逐一取出字符,转换成大写字符(使得大小写不区分),进行判断。
3.运行界面:
For I = 1 To le
c = UCase(Mid(Text1,I,1))
If c >= "A" And c <= "Z" Then
j = Asc(c) - 65 + 1
a(j) = a(j) + 1
End If
Next I
2.大量数据的输入例 5.7输入一系列的数据,并将它们分离后存放在数组中。对输入的数据允许修改和自动识别非数字数据。
分析:
( 1)利用文本框输入和编辑数据,输入时去除非法数字。
( 2)输入结束利用 Rplace函数去除重复输入的分隔符;
( 3)对利用 Split函数按分隔符分离,放到数组中;
( 4)还可利用 Join函数将数组中各元素合并成一个字符串。
原始数据 8 6 9 3 2 7
a ( 1) a ( 2) a ( 3) a ( 4) a ( 5) a ( 6) 第 1 趟交换后 2 6 9 3 8 7
a ( 2) a ( 3) a ( 4) a ( 5) a ( 6) 第 2 趟交换后 2 3 9 6 8 7
a ( 3 ) a ( 4 ) a ( 5 ) a ( 6) 第 3 趟交换后 2 3 6 9 8 7
a ( 4) a ( 5) a ( 6) 第 4 趟交换后 2 3 6 7 8 9
a ( 5) a ( 6) 第 5 趟无交换 2 3 6 7 8 9
图 1.3.2 5 排序过程示意图
3.数组排序例 5.8 对已知存放在数组中的 n个数,用选择法按递增顺序排序。
(1) 从 n个数的序列中选出最小的数 (递增 ),与第 1个数交换位置 ;
(2)除第 1个数外,其余 n-1个数再按 (1)的方法选出次小的数,与第 2个数交换位置 ;
(3)重复 (1)n-1遍,最后构成递增序列。
For i = 1 To n - 1
iMin= i
For j = i+1 To n
If iA(j) < iA(iMin) Then iMin = j
Next j
t= iA(i),iA(i) = iA(iMin),iA(iMin) = t
Next I
4.数组元素的插入与删除
(1) 插入 例 5.10
在有序数组 a(1 to n)(原有 n-1个元素 )插入一个值 Key元素,算法,
查找要插入的位置 k( 1<=k<=n-1)
腾出位置,把最后一个元素开始到第 K个元素往后移动一个位置第 k个元素的位置腾出,就可将数据 Key插入
1 4 7 10 13 16 19 22 25
14 k
(2) 删除首先也是要找到欲删除的元素的位置 k;然后从 k+1到 n个位置开始向前移动;
最后将数组元素减 1。
1 4 7 10 13 14 16 19 22 25
k
八、数组中常见错误和注意事项
1.静态数组声明下标出现变量
n = InputBox("输入数组的上界 ")
Dim a(1 To n) As Integer
2.数组下标越界引用的下标比数组声明时的下标范围大或小。
Dim a(1 To 30) As Long,i%
a(1) = 1,a(2) = 1
For i = 3 To 30
a(i) = a(i - 2) + a(i - 1)
Next I
3,数组维数错数组声明时的维数与引用数组元素时的维数不一致 。
Dim a(3,5) As Long
a(I)=10
4,Aarry函数使用问题只能对 Variant 的变量或动态数组赋值 。
5,获得数组的上界,下界
UBound,Lbound函数