第六章 数组.docx

上传人:b****6 文档编号:4163355 上传时间:2022-11-28 格式:DOCX 页数:54 大小:362.43KB
下载 相关 举报
第六章 数组.docx_第1页
第1页 / 共54页
第六章 数组.docx_第2页
第2页 / 共54页
第六章 数组.docx_第3页
第3页 / 共54页
第六章 数组.docx_第4页
第4页 / 共54页
第六章 数组.docx_第5页
第5页 / 共54页
点击查看更多>>
下载资源
资源描述

第六章 数组.docx

《第六章 数组.docx》由会员分享,可在线阅读,更多相关《第六章 数组.docx(54页珍藏版)》请在冰豆网上搜索。

第六章 数组.docx

第六章数组

第六章数组

如果在程序中涉及的数据较多,处理的是一批或多批数据,就要用到数组的的概念。

在VisualBasic中,不仅可以使用一般数据类型的数组,还可以使用控件数组。

6.1数组的概念

6.1.1数组与数组元素

若有100个互不关联的数据,可以分别把它们存放到100个变量中。

但是如果这些数据是有内在联系的,是具有相同属性的(如100个学生的成绩),可以把这批数据看作一个有机的整体,称为数组(array),用一个统一的名字代表这批数据,而用序号或下标来区分各个数据。

例如用s代表学生成绩这组数据,s就是数组名,用s1,s2,s3分别代表学生l、学生2、学生3的成绩,s右下角的数字l,2,3用来表示该数据在数中的序号,称为下标(subscript)或索引(index)。

数组中的数据称为数组元素。

概括地说:

数组是有序数据的集合。

要寻找一个数组中的某一个元素必须给出两个要素,即数组名和下标。

数组名和下标唯一地标识一个数组中的一个元素。

数组是有类型属性的,例如可以定义a是整型数组,b是单精度型数组等。

这样同一数组中的每一个元素都属于同一数据类型。

在VB中,当声明数组的数据类型为Variant时,各个元素能够含不同类型的数据(对象、字符串、数值等)。

一个数组在内存中占用一片连续的存储单元。

如果有一个整型数组a,假设数组的起始地址为2000,则该数组在内存中的存储情况如图6.1所示。

图6.1

图中数组名a代表该数在内存中分配的存储空间的首地址,即2000。

索引号(下标)表示指定元素到数组首地址的“单元距离”,即从数组的首地址开始,越过多少个数组元素才访问到指定的元素。

在这里a是Integer类型的数组,每一个元素占用两个字节。

引人数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系。

许多好的算法都与数组有关。

熟练地利用数组,可以大大地提高编程和解题的效率,加强了程序的可读性。

由于在程序中无法在数组名的右下角书写下标,因此在计算机高级语言中都用括号来表示下标,在VB中用圆括号来表示下标,如s

(1),s

(2),s(3)分别代表s1,s2,s3。

6.1.2数组的下标与维数

1.数组的下标

由上面的分析可知,在数组中的一个元素相当于一个普通变量,用以存放一个数据项,由数组名和下标确定,下标必须用圆括号括起来。

数组元素又称为下标变量。

下标可以是常数、变量、表达式或另一个数组的元素。

下标值可以是正整数、0和负整数,如果带有小数部分将会自动地对它四舍五入取整。

例如:

若x

(1)=5,k=3,则y(x

(1))就是y(5),y(x

(1)+k)就是y(8)。

又如x(1.7)将作为x

(2)处理,x(-1.7)将作为x(-2)处理。

正因为数组元素的下标可以是变量,所以与简单变量相比,下标变量有不少方便之处。

例如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))&","

Next

Label1.Caption=LTrim(Left(p,Len(p)-1))

EndSub

编写“重置”命令按钮Command1的Click事件过程,重新为数组元素赋值,并清除文本框显示的数据。

代码如下:

PrivateSubCommand1_Click()

Form_Activate

Text1.Text=""

Text2.Text=""

Text3.Text=""

EndSub

编写“计算”命令按钮Command2的Click事件过程,求最大值、最小值及平均值。

代码如下:

PrivateSubCommand2_Click()

DimmaxAsInteger,minAsInteger,sAsSingle,iAsInteger

min=100:

max=10:

s=0

Fori=0To9

Ifa(i)>maxThenmax=a(i)

Ifa(i)

s=s+a(i)

Next

Text1.Text=max

Text2.Text=min

Text3.Text=s/10

EndSub

最后编写“关闭”命令按钮Command3的Click事件过程,退出程序。

代码如下:

PrivateSubCommand3_Click()

UnloadMe

EndSub

程序运行情况如图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事件过程如下:

PrivateSubForm_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)

Next

EndSub

程序运行后,窗体上显示情况如图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事件过程,设置控件的属性。

代码如下:

PrivateSubForm_Load()

Label1.Caption="单击“计算”命令计算斐波那契数列的前30项"

Command1.Caption="计算"

EndSub

编写“计算”命令按钮的Click事件过程,计算数列各项。

代码如下:

PrivateSubCommand1_Click()

DimnAsInteger,iAsInteger,pAsString

Dimf(29)AsCurrency

f(0)=1:

f

(1)=1

p="第"+Format(1,"@@")+"项:

"+Space(4)+Format(f(0),"######")

List1.AddItemp,0

p="第"+Format(2,"@@")+"项:

"+Space(4)+Format(f

(1),"######")

List1.AddItemp,1

Fori=2To29

f(i)=f(i-1)+f(i-2)

p="第"+Format(i+1,"@@")+"项:

"+Space(4)+Format(f(i),"######")

List1.AddItemp,i

Next

EndSub

程序运行情况如图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)

(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事件过程,生成数组,完成排序,并输出排序结果。

代码如下:

PrivateSubForm_Load()

DimiAsInteger,jAsInteger,kAsInteger

DimaAsVariant,tAsInteger

a=Array(89,96,81,67,79,90,63,85,95,83)

Show

Form1.Caption="选择排序法"

Print"排序前:

"

Fori=0To9

Printa(i);

Next

Print

Print

Fori=0To8

k=i

Forj=i+1To9

Ifa(k)

Next

t=a(k):

a(k)=a(i):

a(i)=t

Next

Print"排序后:

"

Fori=0To9

Printa(i);

Next

Print

EndSub

程序运行情况如图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()'初始化,生成方阵

Frame1.Caption="随机产生的5阶方阵"

Label1.Caption="按“计算”按钮可以得到对象线上元素的和、积以及方阵中的最大元素"

Label2.Caption="对角线上元素的和"

Label3.Caption="对角线上元素的积"

Label4.Caption="方阵中的最大元素"

Command1.Caption="计算"

Command2.Caption="重置"

EndSub

编写窗体的Activate事件过程,清除列表框和文本框显示的数据,生成方阵。

代码如下:

PrivateSubForm_Activate()

DimpAsString,iAsInteger,jAsInteger

Text1.Text=""

Text2.Text=""

Text3.Text=""

List1.Clear

RandomizeTime

Fori=1To5

p=""

Forj=1To5

a(i,j)=Int(Rnd*99)+1

p=p&Format(a(i,j),"!

@@@")

Next

List1.AddItemp,i-1

Next

EndSub

编写“计算”命令按钮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)

Next

Max=0

Fori=1To5'求方阵中的最大元素

Forj=1To5

IfMax

Max=a(i,j)

p=i

q=j

EndIf

Next

Next

Text1.Text=s

Text2.Text=t

Text3.Text="a("&p&","&q&")"

EndSub

编写“重置”命令按钮Command2的Click事件过程,生成新的方阵。

代码如下:

PrivateSubCommand2_Click()

Form_Activate

EndSub

程序运行情况如图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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1