第 8章 数组的使用
人民邮电出版社
21世纪高等学校计算机基础教育系列教材数组的使用数组的概念数组与数组元素数组是用一个统一的名称表示的,顺序排列的一组变量 。 数组中的变量称为数组元素,用数字 ( 下标 ) 来标识它们,因此数组元素又称为下标变量 。
数组的类型 数组的维数固定大小的数组数组的声明有 3种方法声明固定大小的数组,用哪一种方法取决于数组应用的有效范围:
l 建立公用数组,在模块的通用段用 Public语句声明数组 。 格式为
Public 数组名 (〈 维数定义 〉 ) [ As 〈 类型 〉 ]
l 建立模块级数组,在模块的通用段用 Private或 Dim语句声明数组 。
格式为
Private | Dim 数组名 (〈 维数定义 〉 ) [ As 〈 类型 〉 ]
l 建立局部数组,在过程中用 Dim或 Private语句声明数组 。 格式为
Dim | Private 数组名 (〈 维数定义 〉 ) [ As 〈 类型 〉 ]
数组的使用随机产生 10个两位整数,找出其最大值,最小值和平均值,如图所示 。
设计步骤如下:
(1) 建立应用程序用户界面与设置对象属性。
(2) 编写代码 。
随机整数的生成由窗体的 Load事件代码完成:
Private Sub Form_Load()
Dim p As String
Randomize
p = ""
For i = 1 To 10
a(i) = Int(Rnd * 90) + 10
p = p & Str(a(i)) & ","
Next
Label1.Caption = LTrim(Left(p,Len(p) – 1))
End Sub
求最大值、最小值和平均值求最大,最小以及平均值由
,确定,按钮 Command2 的
Click事件代码完成:
Private Sub
Command2_Click()
Dim n As Integer,m As Integer,
s As Single
min = 100,max = 10,s = 0
For i = 1 To 10
If a(i) > n Then max = a(i)
If a(i) < m Then min = a(i)
s = s + a(i)
Next
Text1.Text = max
Text2.Text = min
Text3.Text = s / 10
End Sub
“重置”按钮 Command1的 Click事件代码:
Private Sub Command1_Click()
Form_Load
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
End Sub
最后是“关闭”按钮 Command3的
Click事件代码:
Private Sub Command3_Click()
Unload Me
End Sub
交换数组中各元素交换的要求就是将数组的第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,依此类推。结果见图:
‘交换按钮的代码:
Private Sub Command1_Click()
For i = 1 To 10 \ 2
temp = s(i)
s(i) = s(10 - i + 1)
s(10 - i + 1) = temp
Next i
For i = 1 To 10
Text2.Text = Text2.Text & s(i) & " "
Next i
End Sub
‘退出按钮的代码:
Private Sub Command2_Click()
End
End Sub
‘初始化按钮的代码:
Private Sub Command3_Click()
For i = 1 To 10
Text1.Text = Text1.Text & s(i) &
" "
Next i
End Sub
‘初始化数组元素,可以使用
InputBox()函数来输入数组元素
Private Sub Form_Load()
For i = 1 To 10
s(i) = 2 * i - 1
Next i
End Sub
数组排序排序就是将一组数据按照递增或者递减的次序排列。排序的方法有很多种,
常用的有选择法,冒泡法,插入法以及合并排序等等,其中最简单的是选择法。在这里主要介绍选择法和冒泡法。
选择法排序:对一组数组中的 n个数,用选择法按照递减的顺序排列。 选择法排序 的思想是:
( 1)对于有 n个数的序列,从中选出最大的一个数与第一个数交换;
( 2)从除去第一个数的 n-1个数中在按照步骤( 1)选出最大的数和数组序列的第二个数交换;一直重复第( 1)步 n-1次,最后构成递减数列。
原始数组 8 6 9 2 3
A(1) a(2) a(3) a(4) a(5) 第一遍交换 9 6 8 2 3
A(1) a(2) a(3) a(4) a(5) 第二遍交换 9 8 6 2 3
A(1) a(2) a(3) a(4) a(5) 第三遍交换 9 8 6 2 3
A(1) a(2) a(3) a(4) a(5) 第四遍交换 9 8 6 3 2
选择法的算法程序通用代码
for I=1 to n-1
imin = I
for j=I+1 to n
if s(j)> s(imin) then imin=j
next j
temp = s(imin)
s(imin) = s(I)
s(I) = temp
next I
冒泡排序 的思想是:
1.将第一个元素和第二个元素比较,如果第一个元素大于第二个元素,
则将第一个元素和第二个元素交换; 2.比较第二个元素和第三个元素,以此类推,直到第 n-1个元素和第 n个元素; 3.对前 n-1个元素重复进行第 1步和第 2步; 4.重复第 3步直到形成一个递增的数组。
下面是实现 冒泡排序的通用程序段,为了通用性更强,这里给出含有 n个元素的数组的排序程序代码:
For I = n-1 to 1 step –1
For j=1 to I
If S( j) >S(j+1) then
Temp =S(j)
S(j)=s(j+1)
S(j+1) = Temp
End If
Next j
Next I
数组的复制
“复制数组”是指将整个数组的内容复制到另一个数组中。只要复制的目标数组不属于固定大小的数组,就可以顺利地完成数组的复制。例如:
Dim a( 2)
Dim b( 3)
Dim obj()
c = Array( 10,11,12,13)
d = Array(‘ a’,‘ b’,‘ c’,‘ d’,‘ e’)
b = c ‘这一句是错误的,因为 b是一个固定大小的数组
a = c ‘错误,a的大小固定,且数组元素个数也不等
obj = c ‘正确
c = d ‘正确,因为此处 c的大小不固定但是下面程序段是正确的:
for I=0 to 3
b( I) =d( I)
next I
动态数组的使用在声明中不给出数组的大小(省略数组声明中括号中的下标),当要使用它的时候,随时可以用 ReDim语句来重新定义该数组的大小。使用动态数组的优点在于用户可以根据自己的需要来有效地利用存储空间,
在程序执行到 ReDim语句时分配存储空间,而静态数组是在程序编译时就分配存储空间。
声明动态数组的方法:使用 Dim,Private或 Public语句声明一个不写下标的数组,然后在后面需要的时候再用 ReDim语句来指出数组的大小。
语句的形式如下:
Dim sa() [AS 类型 ]
……
ReDim sa(下标 1[,下标 2,下标 3……] ) [AS 类型 ]
其中:下标 I可以是常量,也可以是有了确定值的变量。例如:
Dim sa() AS Integer
Private Sub Form_click()
ReDim sa( 4,8)
……
End Sub
二维数组二维数组就是有两个下标的数组,用来表示一些分组的元素。它的定义方法如下所示:
Dim 数组名(下标 1,下标 2) [AS 类型 ]
对于其中的每一个下标,都可以采用下界 To 上界的格式来定义,从而使得数组的存放符合人们的习惯。对于二维数组来说,数组的元素个数就是(下标 1上界 -下标 1下界 +1) *(下标 2上界 -下标 2下界 +1)个。
例如定义一个二维数组如下,
Dim myarray(1 To 3,1 To 2) AS Integer
则这个数组共有( 3-1+1) *( 2-1+1) =6个元素,这六个元素分别是:
myarray( 1,1),myarray( 1,2)
myarray( 2,1),myarray( 2,2)
myarray( 3,1),myarray( 3,2)
而且这些变量都是整型类型。
将一个二维数组行和列元素交换,存到另一个二维数组中
‘定义两个数组变量和两个计数器变量
Dim a(1 To 2,1 To 3) AS Integer
Dim b(1 To 3,1 To 2) AS Integer
Dim i,j AS Integer
‘程序装入时输入数组元素,本例中分别输入
‘ 12,34,56,78,89,90
Private Sub Form_Load()
For i = 1 To 2
For j = 1 To 3
a(i,j)=InputBox("请输入第 " & i & "," & j & "个元素 ")
Next j
Next i
End Sub
‘转置按钮的代码:
Private Sub Command1_Click()
For i = 1 To 2
For j = 1 To 3
Text1.Text = Text1.Text & a(i,j) &,,,b(j,i) = a(i,j)
Next j
Text1.Text = Text1.Text & Chr(13) & Chr(10)
Next i
For i = 1 To 3,For j = 1 To 2
Text2.Text = Text2.Text & b(i,j) & " "
Next j
Text2.Text = Text2.Text & Chr(13) & Chr(10)
Next i
End Sub
‘退出按钮的代码:
Private Sub Command2_Click()
End
End Sub
多维数组前面讲过,在 Visual Basic 中,最多允许有 60维的数组,但是在使用中并不能使用这么庞大的数组,因为这么庞大的数组已经远远超出了人们能够理解的范围,人们现实生活中都是生活在三维空间中的,所以人们很少去使用超过三维以上的数组,用户在使用多维数组的时候,可以和前面讲过的声明二维数组的方法一样来声明多维数组,也就是它的使用格式是:
Dim 数组名(下标 1[,下标 2,下标 3…] ) [AS 类型 ]
当然多维数组也可以有动态数组,它的使用方法和二维数组的使用完全一样,因为二维数组是一个最简单的多维数组。
控件数组的建立创建控件数组可以在设计中创建,在设计中,可以通过以下方法来创建一个控件数组:
在窗体上创建一个控件,对控件名称和一些属性进行设置,选中该控件用鼠标进行复制( Copy)和粘贴( Paste)。会出现如图
8.10一个询问是否创建控件数组的对话框,单击“是”按钮进行创建控件数组。
在点击了“是”按钮后,在窗体中就会创建一个控件数组,下面的例子中就是创建一个计算器中数字键和运算符号键的控件数组。
然后对这些数字键可以采用同一段代码来实现数字的键入。这样就可以减少程序员编写代码的任务。
使用数组的一些函数和语句
Lbound函数,Ubound函数
Lbound函数是用来返回数组下标的最小索引值的,Ubound函数是用来返回数组下标的最大索引值的。
IsArray函数
IsArray函数是用来判断一个变量是否属于数组,
Erase语句
Erase函数是将某个数组所占的内存空间释放,归还给系统。
在使用了 Erase函数后,这个数组的元素就不能再被引用了,
要想重新使用这个数组的元素话,就必须用 ReDim语句或
Array语句来重新声明。
菜单数组可以在菜单编辑器中设定一个菜单,标题( Caption)不写任何内容,
只写它的名称( Name),将它的索引( Index)设为 0,并且设置为不可见( Visible = False)。其余部分通过程序来实现。
Private Sub
Form_Load()
f(0).Visible = True
f(0).Caption = "北方工业大学 "
For i = 1 To 4
Load f(i)
f(i).Visible = True
f(i).Caption = "张露 "
& i
Next i
End Sub
名称( name) 下标( index) 标题( caption) 可见( visible)
file file true
ne new true
ope open true
clo close true
hex - true
f 0----4 false
He1 - true
ext exit true
用 For Each...Next访问数组元素对数组中的每个元素进行相加,然后输出计算结果。
在窗体中添加一个命令按钮,书写如下代码:
Dim arr(20) AS Integer ‘定义窗体级的全局数组变量
Private Sub Form_Load() ‘窗体在加载的时候初始化数组。
For i = 1 To 20
arr(i) = 2 * i + 1
Next
End Sub
Private Sub Command1_Click() ‘单击命令按钮对数组元素进行求和,输出计算结果。
s = 0
For Each x In arr,s = s + x
Next x
Print s
End Sub
人民邮电出版社
21世纪高等学校计算机基础教育系列教材数组的使用数组的概念数组与数组元素数组是用一个统一的名称表示的,顺序排列的一组变量 。 数组中的变量称为数组元素,用数字 ( 下标 ) 来标识它们,因此数组元素又称为下标变量 。
数组的类型 数组的维数固定大小的数组数组的声明有 3种方法声明固定大小的数组,用哪一种方法取决于数组应用的有效范围:
l 建立公用数组,在模块的通用段用 Public语句声明数组 。 格式为
Public 数组名 (〈 维数定义 〉 ) [ As 〈 类型 〉 ]
l 建立模块级数组,在模块的通用段用 Private或 Dim语句声明数组 。
格式为
Private | Dim 数组名 (〈 维数定义 〉 ) [ As 〈 类型 〉 ]
l 建立局部数组,在过程中用 Dim或 Private语句声明数组 。 格式为
Dim | Private 数组名 (〈 维数定义 〉 ) [ As 〈 类型 〉 ]
数组的使用随机产生 10个两位整数,找出其最大值,最小值和平均值,如图所示 。
设计步骤如下:
(1) 建立应用程序用户界面与设置对象属性。
(2) 编写代码 。
随机整数的生成由窗体的 Load事件代码完成:
Private Sub Form_Load()
Dim p As String
Randomize
p = ""
For i = 1 To 10
a(i) = Int(Rnd * 90) + 10
p = p & Str(a(i)) & ","
Next
Label1.Caption = LTrim(Left(p,Len(p) – 1))
End Sub
求最大值、最小值和平均值求最大,最小以及平均值由
,确定,按钮 Command2 的
Click事件代码完成:
Private Sub
Command2_Click()
Dim n As Integer,m As Integer,
s As Single
min = 100,max = 10,s = 0
For i = 1 To 10
If a(i) > n Then max = a(i)
If a(i) < m Then min = a(i)
s = s + a(i)
Next
Text1.Text = max
Text2.Text = min
Text3.Text = s / 10
End Sub
“重置”按钮 Command1的 Click事件代码:
Private Sub Command1_Click()
Form_Load
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
End Sub
最后是“关闭”按钮 Command3的
Click事件代码:
Private Sub Command3_Click()
Unload Me
End Sub
交换数组中各元素交换的要求就是将数组的第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,依此类推。结果见图:
‘交换按钮的代码:
Private Sub Command1_Click()
For i = 1 To 10 \ 2
temp = s(i)
s(i) = s(10 - i + 1)
s(10 - i + 1) = temp
Next i
For i = 1 To 10
Text2.Text = Text2.Text & s(i) & " "
Next i
End Sub
‘退出按钮的代码:
Private Sub Command2_Click()
End
End Sub
‘初始化按钮的代码:
Private Sub Command3_Click()
For i = 1 To 10
Text1.Text = Text1.Text & s(i) &
" "
Next i
End Sub
‘初始化数组元素,可以使用
InputBox()函数来输入数组元素
Private Sub Form_Load()
For i = 1 To 10
s(i) = 2 * i - 1
Next i
End Sub
数组排序排序就是将一组数据按照递增或者递减的次序排列。排序的方法有很多种,
常用的有选择法,冒泡法,插入法以及合并排序等等,其中最简单的是选择法。在这里主要介绍选择法和冒泡法。
选择法排序:对一组数组中的 n个数,用选择法按照递减的顺序排列。 选择法排序 的思想是:
( 1)对于有 n个数的序列,从中选出最大的一个数与第一个数交换;
( 2)从除去第一个数的 n-1个数中在按照步骤( 1)选出最大的数和数组序列的第二个数交换;一直重复第( 1)步 n-1次,最后构成递减数列。
原始数组 8 6 9 2 3
A(1) a(2) a(3) a(4) a(5) 第一遍交换 9 6 8 2 3
A(1) a(2) a(3) a(4) a(5) 第二遍交换 9 8 6 2 3
A(1) a(2) a(3) a(4) a(5) 第三遍交换 9 8 6 2 3
A(1) a(2) a(3) a(4) a(5) 第四遍交换 9 8 6 3 2
选择法的算法程序通用代码
for I=1 to n-1
imin = I
for j=I+1 to n
if s(j)> s(imin) then imin=j
next j
temp = s(imin)
s(imin) = s(I)
s(I) = temp
next I
冒泡排序 的思想是:
1.将第一个元素和第二个元素比较,如果第一个元素大于第二个元素,
则将第一个元素和第二个元素交换; 2.比较第二个元素和第三个元素,以此类推,直到第 n-1个元素和第 n个元素; 3.对前 n-1个元素重复进行第 1步和第 2步; 4.重复第 3步直到形成一个递增的数组。
下面是实现 冒泡排序的通用程序段,为了通用性更强,这里给出含有 n个元素的数组的排序程序代码:
For I = n-1 to 1 step –1
For j=1 to I
If S( j) >S(j+1) then
Temp =S(j)
S(j)=s(j+1)
S(j+1) = Temp
End If
Next j
Next I
数组的复制
“复制数组”是指将整个数组的内容复制到另一个数组中。只要复制的目标数组不属于固定大小的数组,就可以顺利地完成数组的复制。例如:
Dim a( 2)
Dim b( 3)
Dim obj()
c = Array( 10,11,12,13)
d = Array(‘ a’,‘ b’,‘ c’,‘ d’,‘ e’)
b = c ‘这一句是错误的,因为 b是一个固定大小的数组
a = c ‘错误,a的大小固定,且数组元素个数也不等
obj = c ‘正确
c = d ‘正确,因为此处 c的大小不固定但是下面程序段是正确的:
for I=0 to 3
b( I) =d( I)
next I
动态数组的使用在声明中不给出数组的大小(省略数组声明中括号中的下标),当要使用它的时候,随时可以用 ReDim语句来重新定义该数组的大小。使用动态数组的优点在于用户可以根据自己的需要来有效地利用存储空间,
在程序执行到 ReDim语句时分配存储空间,而静态数组是在程序编译时就分配存储空间。
声明动态数组的方法:使用 Dim,Private或 Public语句声明一个不写下标的数组,然后在后面需要的时候再用 ReDim语句来指出数组的大小。
语句的形式如下:
Dim sa() [AS 类型 ]
……
ReDim sa(下标 1[,下标 2,下标 3……] ) [AS 类型 ]
其中:下标 I可以是常量,也可以是有了确定值的变量。例如:
Dim sa() AS Integer
Private Sub Form_click()
ReDim sa( 4,8)
……
End Sub
二维数组二维数组就是有两个下标的数组,用来表示一些分组的元素。它的定义方法如下所示:
Dim 数组名(下标 1,下标 2) [AS 类型 ]
对于其中的每一个下标,都可以采用下界 To 上界的格式来定义,从而使得数组的存放符合人们的习惯。对于二维数组来说,数组的元素个数就是(下标 1上界 -下标 1下界 +1) *(下标 2上界 -下标 2下界 +1)个。
例如定义一个二维数组如下,
Dim myarray(1 To 3,1 To 2) AS Integer
则这个数组共有( 3-1+1) *( 2-1+1) =6个元素,这六个元素分别是:
myarray( 1,1),myarray( 1,2)
myarray( 2,1),myarray( 2,2)
myarray( 3,1),myarray( 3,2)
而且这些变量都是整型类型。
将一个二维数组行和列元素交换,存到另一个二维数组中
‘定义两个数组变量和两个计数器变量
Dim a(1 To 2,1 To 3) AS Integer
Dim b(1 To 3,1 To 2) AS Integer
Dim i,j AS Integer
‘程序装入时输入数组元素,本例中分别输入
‘ 12,34,56,78,89,90
Private Sub Form_Load()
For i = 1 To 2
For j = 1 To 3
a(i,j)=InputBox("请输入第 " & i & "," & j & "个元素 ")
Next j
Next i
End Sub
‘转置按钮的代码:
Private Sub Command1_Click()
For i = 1 To 2
For j = 1 To 3
Text1.Text = Text1.Text & a(i,j) &,,,b(j,i) = a(i,j)
Next j
Text1.Text = Text1.Text & Chr(13) & Chr(10)
Next i
For i = 1 To 3,For j = 1 To 2
Text2.Text = Text2.Text & b(i,j) & " "
Next j
Text2.Text = Text2.Text & Chr(13) & Chr(10)
Next i
End Sub
‘退出按钮的代码:
Private Sub Command2_Click()
End
End Sub
多维数组前面讲过,在 Visual Basic 中,最多允许有 60维的数组,但是在使用中并不能使用这么庞大的数组,因为这么庞大的数组已经远远超出了人们能够理解的范围,人们现实生活中都是生活在三维空间中的,所以人们很少去使用超过三维以上的数组,用户在使用多维数组的时候,可以和前面讲过的声明二维数组的方法一样来声明多维数组,也就是它的使用格式是:
Dim 数组名(下标 1[,下标 2,下标 3…] ) [AS 类型 ]
当然多维数组也可以有动态数组,它的使用方法和二维数组的使用完全一样,因为二维数组是一个最简单的多维数组。
控件数组的建立创建控件数组可以在设计中创建,在设计中,可以通过以下方法来创建一个控件数组:
在窗体上创建一个控件,对控件名称和一些属性进行设置,选中该控件用鼠标进行复制( Copy)和粘贴( Paste)。会出现如图
8.10一个询问是否创建控件数组的对话框,单击“是”按钮进行创建控件数组。
在点击了“是”按钮后,在窗体中就会创建一个控件数组,下面的例子中就是创建一个计算器中数字键和运算符号键的控件数组。
然后对这些数字键可以采用同一段代码来实现数字的键入。这样就可以减少程序员编写代码的任务。
使用数组的一些函数和语句
Lbound函数,Ubound函数
Lbound函数是用来返回数组下标的最小索引值的,Ubound函数是用来返回数组下标的最大索引值的。
IsArray函数
IsArray函数是用来判断一个变量是否属于数组,
Erase语句
Erase函数是将某个数组所占的内存空间释放,归还给系统。
在使用了 Erase函数后,这个数组的元素就不能再被引用了,
要想重新使用这个数组的元素话,就必须用 ReDim语句或
Array语句来重新声明。
菜单数组可以在菜单编辑器中设定一个菜单,标题( Caption)不写任何内容,
只写它的名称( Name),将它的索引( Index)设为 0,并且设置为不可见( Visible = False)。其余部分通过程序来实现。
Private Sub
Form_Load()
f(0).Visible = True
f(0).Caption = "北方工业大学 "
For i = 1 To 4
Load f(i)
f(i).Visible = True
f(i).Caption = "张露 "
& i
Next i
End Sub
名称( name) 下标( index) 标题( caption) 可见( visible)
file file true
ne new true
ope open true
clo close true
hex - true
f 0----4 false
He1 - true
ext exit true
用 For Each...Next访问数组元素对数组中的每个元素进行相加,然后输出计算结果。
在窗体中添加一个命令按钮,书写如下代码:
Dim arr(20) AS Integer ‘定义窗体级的全局数组变量
Private Sub Form_Load() ‘窗体在加载的时候初始化数组。
For i = 1 To 20
arr(i) = 2 * i + 1
Next
End Sub
Private Sub Command1_Click() ‘单击命令按钮对数组元素进行求和,输出计算结果。
s = 0
For Each x In arr,s = s + x
Next x
Print s
End Sub