第六章 数组Word格式.docx
《第六章 数组Word格式.docx》由会员分享,可在线阅读,更多相关《第六章 数组Word格式.docx(54页珍藏版)》请在冰豆网上搜索。
正因为数组元素的下标可以是变量,所以与简单变量相比,下标变量有不少方便之处。
例如a(i)是数组a的一个元素,当i取不同的值时,它就表示不同的数组元素,如i=0,表示a(0),i=1,表示a
(1),……等等,使用时只要有规则地改变下标值,就可以方便地使用a(i)引用数组a中的所有元素。
2.数组的维数
如果数组元素只有一个下标,则称这个数组为一维数组。
如数组s有5个元素:
s(0)、s
(1)、s
(2)、s(3)、s(4),依次保存5个学生的一门功课的成绩,则s为一维数组。
一维数组中的各个元素又称为单下标变量。
一维数组中的下标又称为索引(Index)。
如果一个导师带有4个研究生,每个学生一学期选修有5门功课,要存储所有学生各门功课的成绩,可以使用有两个下标的数组来表示,如第i个学生第j门功课的成绩可以用s(i,j)表示。
其中i表示学生顺序号,称为行下标(i=0,1,2,3);
j表示课程序号,称为列下标(j=0,1,2,3,4)。
这4个研究生一学期的学习成绩可以用一个矩阵表示如下:
s(0,0)s(0,1)s(0,2)s(0,3)s(0,4)
s(1,0)s(1,1)s(1,2)s(1,3)s(1,4)
s(2,0)s(2,1)s(2,2)s(2,3)s(2,4)
s(3,0)s(3,1)s(3,2)s(3,3)s(3,4)
这样每个元素用两个下标的数组称为二维数组,其元素又称为双下标变量。
数组元素中下标的个数称为数组的维数。
在VB中最多可以使用16位数组。
数组元素在内存中占用一片连续的存储空间,而分配空间的大小由数组维数及下标的最大值和小值确定。
因此,又把数组下标的最大值称为下标的上界,下标的最小值称为下标的下界。
若一个数组定义之后,元素个数在程序运行过程中保持不变,这样的数组称为固定大小数组,简称固定数组;
若一个数组定义之后,元素个数在程序运行过程中可以改变的,这样的数组称为动态数组。
6.2数组的声明和应用
6.2.1数组声明语句
Dim语句除用于定义变量的类型外,还可用于定义数组,确定数组的维数及每一维元素的个数,以便在内存分配相应的存储空间,存放数组中的数据。
使用Dim定义数组有两种方式。
⑴指定下标的上界
定义数组时,指定下标的最大值(上界),而下标的最小值(下界)为默认值。
一维数组的定义格式:
Dim数组名(下标上界)As类型名
二维数组的定义格式:
Dim数组名(第一维的下标上界,第二维的下标上界)As类型名
说明:
①这里只给出了下标的上界,而下标的下界默认从零开始。
②可以借助OptionBase命令人为地选择下标从0开始或则从1开始。
格式为:
OptionBasen
这里n只能是0或1。
若n=1,则程序中定义的所有数组的各维下标都是从1开始(若n=0,则该语句是多余的,因为不说明,默认下标值从0开始)。
③定义数组下标的上、下界值不得超过Long数据类型能表示的范围。
DimSum(10)AsLong ‘定义长整型一维数组,共11个元素,下标从0~10
DimM(3,4)AsInteger ‘定义整型4×
5的二维数组,共20个元素
⑵指定下标的取值范围
定义数组时指定下标的上界、下界(-32768~32768)。
Dim数组名(下标下界To下标上界)
Dim数组名(下标下界To上界,第二维的下界To上界)
例如:
Dima(-3to6)AsInteger‘定义整型一维数组,共10个元素,下标从-3~6
DimM(1To10,1To10)AsDouble‘定义10×
10的二维数组,共100个元素
DimD(1To3,1To10,1To5)‘定义3×
10×
5的三维数组,共150个元素
数组一旦定义之后,即刻分配存储并初始化各元素,这与定义变量相同,数值型数组的各元素都初始化为0,字符型数组的各元素都初始化为空。
引用数组元素时,数组名、数组类型、数组维数、使用的下标(索引号)的范围都必须与数组声明一致。
例6-1随机产生10个两位数,找出其最大值、最小值和平均值。
分析:
在这里我们使用含有10元素的数组来存储产生的10个随机数,然后求出这10个元素中的最大值、最小值和平均值。
设计步骤如下:
⑴创建一个工程,在窗体上添加一个框架Frame1、4个标签Label1~Label4、3个文本框Text1~Text3、3个命令按钮Command1~Command3。
程序用户界面如图6-2所示。
图6-2求最大值、最小值和平均值
⑵编写程序代码。
在窗体模块的通用段声明数组,保证各个过程都能使用该数组。
编写窗体的Load事件过程,设置控件的有关属性。
代码如下:
Dima(9)AsInteger
PrivateSubForm_Load()
Frame1.Caption="
10个随机数"
Label2.Caption="
最大值"
Label3.Caption="
最小值"
Label4.Caption="
平均值"
Text1.Text="
"
Text2.Text="
Text3.Text="
Text1.Locked=True
Text2.Locked=True
Text3.Locked=True
Command1.Caption="
重置"
Command2.Caption="
计算"
Command3.Caption="
关闭"
EndSub
编写窗体的Activate事件过程,产生随机数,为数组各元素赋值。
PrivateSubForm_Activate()
DimpAsString,iAsInteger
RandomizeTime
p="
Fori=0To9
Do
x=Int(Rnd*90)+10
yes=0
Forj=0Toi-1
Ifx=a(j)Thenyes=1:
ExitDo‘如与前面元素相同,重新产生随机数
Next
LoopWhileyes=1
a(i)=x
p=p&
Str(a(i))&
"
"
Label1.Caption=LTrim(Left(p,Len(p)-1))
编写“重置”命令按钮Command1的Click事件过程,重新为数组元素赋值,并清除文本框显示的数据。
PrivateSubCommand1_Click()
Form_Activate
编写“计算”命令按钮Command2的Click事件过程,求最大值、最小值及平均值。
PrivateSubCommand2_Click()
DimmaxAsInteger,minAsInteger,sAsSingle,iAsInteger
min=100:
max=10:
s=0
Ifa(i)>
maxThenmax=a(i)
Ifa(i)<
minThenmin=a(i)
s=s+a(i)
Text1.Text=max
Text2.Text=min
Text3.Text=s/10
最后编写“关闭”命令按钮Command3的Click事件过程,退出程序。
PrivateSubCommand3_Click()
UnloadMe
程序运行情况如图6-2所示。
说明:
在VB中,数组与变量一样,随着定义的位置和形式的不同,有着不同的作用范围。
①可以用Public定义全局数组。
在程序模块(包含有程序代码的程序文件,如窗体文件.frm)的通用段,即在程序代码的起始部分,且不在任何过程内,用Public语句声明的数组为整个应用程序均可以访问的公用数组(全局数组),格式为:
Public数组名(维数及下标范围)As类型
这里的维数及下标范围与上面用Dim定义数组的形式相同。
同样,用Public定义的变量为全局(公用)变量。
②用Private或Dim定义模块级数组。
在程序模块的通用段用Private或Dim语句定义的数组都是在该程序模块内,各过程块可以访问的模块级数组,其格式与我们上面介绍地Dim定义数组的格式相同:
Private|Dim数组名(维数及下标范围)As类型
③用Private或Dim定义局部数组。
在某个过程内用Private或Dim定义的数组为该过程的局部数组,只能在定义的过程内访问局部数组,当过程执行结束后,所定义的数组也就从内存中被自动清除掉。
定义格式同上。
④也可以用Static语句定义数组,所定义的数组称为静态数组,与静态变量一样,在过程中使用,在整个代码运行期间都能保留使用Static语句声明的数组各元素的值,直至该模块复位或重新启动。
要注意区分静态数组和固定数组是不同的两个的概念,前者是指数组中的各个元素都是静态变量,后者是指数组元素的个数保持不变。
6.2.2Array函数
在VB程序中常通过赋值语句或InputBox函数为变量或数组元素赋值。
也可以用Array函数,根据数据表生成一个一维数组。
Array函数返回一个包含数组的Variant,其使用格式为:
变体名=Array(数据表)
其中,“变体名”是预先定义的类型为变体的数组名,“数据表”是一个用逗号隔开的值表,这些值用于给函数返回的Variant所包含的数组各元素赋值。
例如,创建一个工程,为窗体编写Load事件过程如下:
DimaAsVariant,bAsVariant
Show
a=Array(1,2,3,4)‘生成数组a
b=Array("
This"
"
Array"
String"
Variant"
)‘生成数组b
Fori=0To3
Printa(i);
Spc
(2);
b(i)
程序运行后,窗体上显示情况如图6-3所示。
图6-3使用Array函数生成数组
⑴使用Array函数时,“变体名”后面不能有括号,也没有维数和上界,下界默认为0或由OptionBase语句决定。
⑵Array函数只能根据数据表生成一个一维数组,不能生成二维数组或多维数组。
数据表中各个数据的类型可以相同,也可以不同。
6.2.3数组的应用
例6-2斐波那契(Fibonacci)数列如下:
1,1,2,3,5,8,13,21,……
试求出该数列的前30项。
由数列的前几项可知,该数列的第1、2项均为1,从第3项开始,以后各项都等于前两项之和。
如果用数组f(0)、f
(1)、f
(2)、…、f(n)来存储该数列的各项,则计算第i项的递推公式为:
f(i)=f(i-1)+f(i-2)。
设计步骤:
⑴创建一个工程,在窗体上添加一个列表框List1(输出计算结果)、一个标签Label1和一个命令按钮。
程序的用户界面如图6-4所示。
图6-4求Fibonacci数列前30项
编写窗体的Load事件过程,设置控件的属性。
Label1.Caption="
单击“计算”命令计算斐波那契数列的前30项"
编写“计算”命令按钮的Click事件过程,计算数列各项。
DimnAsInteger,iAsInteger,pAsString
Dimf(29)AsCurrency
f(0)=1:
f
(1)=1
第"
+Format(1,"
@@"
)+"
项:
+Space(4)+Format(f(0),"
######"
)
List1.AddItemp,0
+Format(2,"
+Space(4)+Format(f
(1),"
List1.AddItemp,1
Fori=2To29
f(i)=f(i-1)+f(i-2)
+Format(i+1,"
+Space(4)+Format(f(i),"
List1.AddItemp,i
程序运行情况如图6-4所示。
例6-3假设有10名学生的考试成绩为89,96,81,67,79,90,63,85,95,83,请按由高分到低分的顺序在窗体上输出。
先将这10个分数放入数组a中,再对数元素a(0),a
(1),a
(2),…,a(9)进行排序处理。
排序的方法很多,在这里我们选用“选择排序法”,其具体步骤为:
①令k=0,a(k)与a
(1)比较,若a(k)<
a
(1),令k=1,值大的元素的下标存放在k中;
②a(k)又与a
(2),a(3),…,直到a(9),重复①的工作,结束后,实现10个数中的最大元素的下标存放在k中,即a(k)为数组的最大值元素;
③a(0)与a(k)交换,把最大值存放在a(0)中;
④分别令k=1,2,3,…,8重复①②③的操作。
这个方法实质是用一个变量k保存当前较大元素的下标,不进行交换,直到完成一次内循环的比较后,k保存的是当前最大元素的下标,把a(k)交换到希望的位置a(i)。
选择排序法的操作流程如图6-5所示。
图6-5选择排序法流程图6-6例6-3程序运行情况
⑴创建一个工程。
直接在窗体上输出排序结果,不添加任何控件。
编写窗体的Load事件过程,生成数组,完成排序,并输出排序结果。
DimiAsInteger,jAsInteger,kAsInteger
DimaAsVariant,tAsInteger
a=Array(89,96,81,67,79,90,63,85,95,83)
Form1.Caption="
选择排序法"
Print"
排序前:
Print
Fori=0To8
k=i
Forj=i+1To9
Ifa(k)<
a(j)Thenk=j
t=a(k):
a(k)=a(i):
a(i)=t
排序后:
程序运行情况如图6-6所示。
例6-4随机产生25个小于100的整数,组成一个5×
5的方阵,求对角线上元素之和、对角线上元素之积和方阵中最大的元素。
方阵中的元素可以用一个二维数组表示。
通过循环操作为各元素赋值,然后计算对角线上元素之和、对角线上元素之积和方阵中最大的元素。
⑴创建一个工程,在窗体上添加一个框架Frame1、一个列表框List1(放置在框架内,输出方阵)、4个标签Label1~Label4、2个命令按钮Command1~Command2、3个文本框Text1~Text3(输出矩阵计算结果)。
程序界面如图6-7所示。
图6-7矩阵计算
声明模块级的二维数组,编写窗体的Load事件过程,设置控件的有关属性。
Dima(1To5,1To5)AsInteger
PrivateSubForm_Load()'
初始化,生成方阵
随机产生的5阶方阵"
按“计算”按钮可以得到对象线上元素的和、积以及方阵中的最大元素"
对角线上元素的和"
对角线上元素的积"
方阵中的最大元素"
编写窗体的Activate事件过程,清除列表框和文本框显示的数据,生成方阵。
DimpAsString,iAsInteger,jAsInteger
List1.Clear
Fori=1To5
Forj=1To5
a(i,j)=Int(Rnd*99)+1
Format(a(i,j),"
!
@@@"
List1.AddItemp,i-1
编写“计算”命令按钮Command1的Click事件过程,计算对象线上元素的和、积以及方阵中的最大元素,并输出计算结果。
PrivateSubCommand1_Click()
DimsAsInteger,tAsLong,iAsInteger,jAsInteger
DimMaxAsInteger,pAsInteger,qAsInteger
s=0:
t=1
Fori=1To5'
求对角线之和、积
s=s+a(i,i)
t=t*a(i,i)
Max=0
Fori=1To5'
求方阵中的最大元素
IfMax<
a(i,j)Then
Max=a(i,j)
p=i
q=j
EndIf
Text1.Text=s
Text2.Text=t
a("
&
p&
q&
)"
编写“重置”命令按钮Command2的Click事件过程,生成新的方阵。
PrivateSubCommand2_Click()
程序运行情况如图6-7所示。
6.3动态数组及声明
在程序设计时,数组到底应该有多大才合适,有时可能不得而知。
所以希望能够在运行时,程序具有改变数组大小的能力。
动态数组就可以在任何时候改变其大小。
在VisualBasic程序中,动态数组灵活、方便,有助于内存的管理。
6.3.1建立动态数组
创建动态数组分两步进行:
⑴声明动态数组。
如果希望数组为公用数组,则用Public语句声明数组,如果希望数组为模块级,则在模块级用Dim或Private语句声明数组,如果希望数组为局部数组,则在过程中用Static或Dim语句声明数组。
给数组附以一个空维数表,这样就将数组声明为动态数组。
DimDynArray()
⑵用ReDim语句分配实际的元素个数。
ReDim[Preserve]数组名(维数与下标范围)[As类型]
x=9
ReDimDynArray(x+1)‘把DynArray定义为一维数组,有11个元素
ReDimDynArray(4,4)‘把DynArray定义为5×
5的二维数组,有25个元素
①ReDim语句只能出现在过程中。
与Dim语句、Static语句不同,R