利用数组可以有效地存储和处理成批数据本章主要内容数组_第1页
利用数组可以有效地存储和处理成批数据本章主要内容数组_第2页
利用数组可以有效地存储和处理成批数据本章主要内容数组_第3页
利用数组可以有效地存储和处理成批数据本章主要内容数组_第4页
利用数组可以有效地存储和处理成批数据本章主要内容数组_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6数组

利用数组可以有效地存储和处理成批数据

本章主要内容数组的概念数组的声明和应用动态数组

ForEach...Next循环语句控件数组程序举例

第6章数组

6.1.1数组与数组元素

简单变量用一个变量名标识,不同的变量使用不同的变量名表示。处理成批的数据时,必须使用数组来处理表示100个学生的成绩,采用简单变量来表示:

s1,s2,s3,…s99,s100

采用数组来表示:t(0),t(1),t(2),…t(98),t(99)

t(k)(k=0,1,2,…99)为数组元素(或称下标变量),它表示第k个学生的成绩,k称为下标变量的下标数组的一个主要特点是通过下标(相当于索引)来引用数组元素

6.1数组的概念

例如计算这100个学生成绩的平均分,可用:

S=0

Fork=0To99

S=S+t(k)

‘累加分数

Nextk

Aver=S/100

‘求平均分

数组是一组按一定顺序排列的数据的集合

例如,学生成绩T=[t(0),t(1),…t(99)]是一个数组

三元一次方程组的系数矩阵

a11a12a13

A=a21a22a23

a31a31a33

也是一个数组

数组名(不能与简单变量同名);数组类型

又称有序的变量——下标变量

默认情况下,下标从0开始,

optionbasen必须在定义数组前使用。

例如,由一行共5个元素组成的数组x,它的5个下标变量为:

x(0)x(1)x(2)x(3)x(4)

由三行四列元素组成的数组y,它的12个下标变量可表示为:

y(0,0)y(0,1)y(0,2)y(0,3)

y(1,0)y(1,1)y(1,2)y(1,3)

y(2,0)y(2,1)y(2,2)y(2,3)

下标变量与简单变量具有基本相同的性质和作用数组元素

下标用来标明该下标变量在数组中的位置下标可以是常数值,也可以是变量(包括下标变量)或数值表达式

例如:若x(2)=10,k=2,则y(x(2))就是y(10),y(x(2)+k)就是y(12)

只要有规则地改变下标值,就可以很方便地使下标变量(如a(i))成为所需要的具体下标变量

数组的维数6.1.2下标和数组的维数6.2.1数组声明语句

使用数组之前,一般需要定义数组,以便让系统分配相应的存储单元。格式为:

Dim数组名([下界1to]上界1[,[下界2to]上界2…])[As数据类型]

功能:指定数组的维数、各维的上下界和数据类型

举例:

dima%(10),b!(2t08),c#(15),b(3,4)asLongDimSum(10)AsLong‘下标号从0~10,共11个元素

DimAry(1to20)AsInteger‘下标号从1~20,共20个元素

Dimd(1to5,1to10)AsDouble‘定义二维数组

dimc(-2to2)asstring*20

还可以使用Public、Static、Private等语句来声明数组

6.2数组的声明和应用数组下标测试函数Ubound(数组名[,维])Lbound(数组名[,维])Dimy(1to12,5to20,-3to6)PrintLbound(y,1),Ubound(y,1)PrintLbound(y,2),Ubound(y,2)PrintLbound(y,3),Ubound(y,3)

设定下界的方法

OptionBase1‘设定下界为1

DimData(10)AsSingle‘下标号从1~10

6.2.2Array函数

使用Array函数可以为数组元素赋值

示例

DimDAsVariant‘定义数组名(变体类型)

D=Array(1,2,3,4)

执行结果:1→D(0),2→D(1),3→D(2),4→D(3)

数组刷新语句可以作用于动态数组和静态数组

格式:

Erase数组名[,数组名]…

功能:该语句用来清除静态数组的内容,或者释放动态数组占用的内存空间例如:

DimArray1(20)AsIntegerDimArray2()AsSingle

ReDimArray2(9,10)……EraseArray1,Array2

对静态数组,Erase语句将数组重新初始化;对动态数组,Erase语句将释放动态数组所使用的内存

6.3.2

数组刷新语句(Erase)Erase

数组名[,数组名],……重新对静太数组进行初始化,数值置0,字符为空字符串,而原数组存在。释放动态数组存储空间,原有数组不再存在。变体数组,每个元素重新置为空。数组的引用和赋值:OptionBase1DimB1AsVariantB1=Array(89,96,81,67,79,90,63,85,95,83)

y=B1(3)C=B1(5)+B1(7)数组的引用下标不能越界数组的赋值:使用循环语句:

dimk(10)Fork=0To10

t(k)=2*k+1

Nextk

Dimd(5)AsIntegerFori=1To5'输入成绩

d(i)=Val(InputBox("请输入第"&Str(i)&_"个学生的成绩","输入成绩"))

Nexti数组输出Fori=1To5Printd(i);Nexti

与前面的循环语句For...Next类似,都是用来执行指定重复次数的循环。但ForEach...Next语句专门作用于数组或对象集合中的每一成员。语法格式:

ForEach成员In数组名

循环体

[ExitFor]

Next成员

“成员”是一个Variant变量,它实际上代表数组中每一个元素本语句可以对数组元素进行读取、查询或显示,它所重复执行的次数由数组中元素的个数确定在不知道数组中元素的数目时非常有用

6.4

ForEach...Next循环语句PrivateSubForm_Load()Dima(1To10)AsLong,sumAsLong,tAsLongDimnAsIntegerShowt=1Forn=1To10t=t*na(n)=tNextnsum=0ForEachxInasum=sum+xNextxPrint"1!+2!+3!+……10!=";sumEndSub输出结果:

1!+2!+3!+…+10!=4037913例6.6求1!+2!+…+10!的值

两种形式的数组:静态数组和动态数组静态数组是指数组元素的个数固定不变;动态数组的元素个数,在程序运行时可以改变动态数组可以在运行过程中改变数组的大小,提高存储区的使用效率

6.3.1建立动态数组

建立动态数组的步骤:

第一步:声明一个没有下标(或称空维数)的数组为动态数组第二步:在过程中用ReDim语句重新定义带下标的动态数组

ReDim语句格式:

ReDim[Preserve]数组名([下界1T0]上界1[,[下界2T0]上界2…])[As数据类型]

功能:重新定义动态数组,按定义的上下界重新分配存储单元

6.3

动态数组

声明F为动态数组的示例:

PrivateSubCommand1_Click()DimF()AsInteger‘声明一个整型动态数组

……

Size=20

ReDimF(Size)……EndSub

每次执行ReDim时,系统会清除指定数组的内容

若采用:ReDimPreserveF(Size)

则能保留数组中原有的数据PrivateSubForm_Load()Dima()AsIntegerShow

ReDima(800)k=0Forx=200To600Step3IfxMod8=0Thenk=k+1a(k)=xEndIfNextx

ReDimPreservea(k)Fori=1TokPrinta(i)NextiEndSub例6.5

ReDim语句应用示例

两类数组:一般数组和控件数组

6.5.1控件数组的概念

控件数组是一组具有相同名称、类型和事件过程的控件例如,Label1(0),Label1(1),Label1(2),……

但Label1,Label2,Label3,……不是控件数组控件数组具有以下特点:

(1)相同的控件名称(即Name属性);

(2)控件数组中的控件具有相同的一般属性;

(3)所有控件共用相同的事件过程。以下标索引值(Index)来标识各个控件,第一个下标索引号为06.5控件数组6.5.2控件数组的建立建立控件数组有三种方法:

(1)给控件起相同的名称

(2)将现有的控件复制并粘贴到窗体等上面

(3)将控件的Index属性设置为非Null数值

6.5.3控件数组的使用

例6.7

按图6.4设计窗体,其中一组(共5个)单选按钮构成控件数组,要求当单击某个单选按钮时,能够改变文本框中文字的大小控件数组设计步骤:

(1)设计控件数组Option1,其中包含5个单选按钮对象

具体操作方法:

①画出第一个单选按钮控件,名称采用默认的Option1。此时该控件处于选定状态。

②单击工具栏上的“复制”按钮(或按Ctrl+C)。③单击工具栏上的“粘贴”按钮(或按Ctrl+V),此时系统弹出一个如图6.5所示的对话框单击“是”,就建立一个控件数组元素,其Index属性为1,而已画出的第一个控件的Index属性值为0。通过鼠标拖放可以调整新控件的位置

④继续单击“粘贴”按钮(或按Ctrl+V)和调整控件位置,可得到控件数组中的其他三个控件,其Index属性值分别为2,3和4(即从上而下为0,1,2,3,4)

⑤设置控件数组各元素(从上而下)的Caption属性分别为10,14,18,24和28

(2)建立一个文本框Text1,其Text属性设置为“控件数组的使用”。再建立一个标签,其Caption属性为“字号控制”

(3)编写程序代码PrivateSubForm_Load()Option1(0).Value=True'选定第一个单选按钮

Text1.FontSize=10'设定文本框中的字号EndSubPrivateSubOption1_Click(IndexAsInteger)SelectCaseIndex'系统自动返回Index值

Case0Text1.FontSize=10Case1Text1.FontSize=14Case2Text1.FontSize=18Case3Text1.FontSize=24Case4Text1.FontSize=28EndSelect

EndSub

例6.1

输入某小组5个同学的成绩,计算总分和平均分(取小数后一位)

本例利用InputBox函数来输入成绩,输入完毕后经过计算,再采用Print直接在窗体上输出结果

6.2.3

数组的应用

PrivateSubForm_Load()Dimd(5)AsIntegerDimiAsInteger,totalAsSingle,averageAsSingleShowFori=1To5'输入成绩

d(i)=Val(InputBox("请输入第"&Str(i)&_"个学生的成绩","输入成绩"))

Nextitotal=0Fori=1To5'计算总分和平均分

total=total+d(i)Nextiaverage=total/5Print"总分:"&totalPrint"平均分:"&Format(average,"##.0")EndSub

程序中,先通过Dim语句为数组d定义维数及下标范围,也即为数组安排一块连续的内存存储区,但这并不意味着内存里该数组已建立了应有的内容本例中输入数组中的数据是由InputBox函数来实现的,共循环了五次,输入的五个数依次赋值给下标变量d(1)~d(5)

建立了数组中的数据后,就可以按要求进行处理

(1)创建应用程序的用户界面和设置对象属性

例6.2

输入10名学生的成绩,求出最高分和最低分功能要求:通过Array函数输入10个分数;单击“查找”按钮(Command2)后,开始查找最高分和最低分,找到后显示在标签Label1上

OptionBase1DimscoreAsVariantPrivateSubForm_Load()Label1.Caption="单击“查找”按钮开始查找最高分和最低分"

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

EndSub

(2)编写程序代码

PrivateSubCommand1_Click()DimmaxAsInteger,minAsIntegermax=score(1)'设定初值

min=score(1)Fori=2To10Ifmax<score(i)Then'找最高分

max=score(i)EndIfIfmin>score(i)Then'找最低分

min=score(i)EndIfNexti

'Chr(13)起换行作用

Label1.Caption="最高分:"+Str(max)+_Chr(13)+"最低分:"+Str(min)

EndSub例6.3分别计算5个学生和3门课的平均分

某学习小组有5名学生,成绩如表6.1所示

分析:用一个二维数组a(5,3)来描述。程序中设置两重循环,用以实现每行和每列上的累加。本例采用赋值语句来输入学生成绩,并采用Print直接在窗体上输出结果

r=1c=1,2,3r=2c=1,2,3r=3c=1,2,3r=4c=1,2,3r=5c=1,2,3求5个学生的平均分

下标使用情况

OptionBase1PrivateSubForm_Load()Dima(5,3)AsIntegerDimrAsInteger,cAsInteger,sAsIntegerk=Array("数学","英语","计算机")'输入课程名

a(1,1)=69:a(1,2)=89:a(1,3)=74'输入学生成绩

a(2,1)=94:a(2,2)=80:a(2,3)=90a(3,1)=57:a(3,2)=62:a(3,3)=73a(4,1)=98:a(4,2)=94:a(4,3)=90a(5,1)=73:a(5,2)=76:a(5,3)=63例6.3

ShowPrint"学生","平均分“

'输出20个减号“-”

PrintString(20,"-")Forr=1To5s=0'累加前清0

Forc=1To3

'累加同一行数据

s=s+a(r,c)NextcPrintr,Format(s/3,"##.0")NextrPrint

Print"课程","平均分"

PrintString(20,"-")Forc=1To3s=0Forr=1To5

'累加同一列数据

s=s+a(r,c)NextrPrintk(c),Format(s/5,"##.0")NextcEndSub

程序运行结果

解题方法:

(1)利用Int(91*Rnd+10)产生值为10到100的随机整数

使用Randomize得到不同的随机数序列

(2)按值从小到大进行排序。排序方法:

将10个数放入数组a中,对下列下标变量进行排序处理:

a(1),a(2),a(3),…,a(10)

①从这10个下标变量中,选出最小值,通过交换把该值存入a(1)中②除a(1)之外(a(1)已存放最小值),从其余9个下标变量中选出最小值(即10个数中的次小值),通过交换把该值存入a(2)中

③选出a(3)~a(10)中的最小值,通过交换,把该值存入a(3)中

④重复上述处理,至a(8),可使a(1)~a(8)按小到大排列

⑤第9次处理,选出a(9)及a(10)中的最小值,通过交换把该值存入a(9)中,此时a(10)存放的就是最大值

例6.4

随机产生十个10~100的整数,用“选择排序法”按值从小到大顺序排序,最后输出结果排列要求

小大示例:

a(1)a(2)a(3)a(4)

906465591.a(1)与a(2)~a(4)比较,选出最小值,结果

599065642.a(2)与a(3)~a(4)比较,选出次小值,结果

596490653.a(3)与a(4)比较,选出较小值,结果

59646590

i=1j=2,3,4i=2j=3,4i=3j=4Fori=1to3Forj=i+1to4……NextjNexti程序结构完成上述比较及排序处理过程,可以采用两重循环结构,外循环的循环变量i从1到9,共循环九次;内循环的循环变量j从i+1到10。

本例采用默认的用户界面,所需数据由随机函数产生,处理后结果信息通过Print方法直接输出在窗体上。

PrivateSubForm_Load()ShowRandomizeDima(1To10)AsIntegerPrint"原始数据:"

Fori=1To10'产生10个随机数

a(i)=Int(91*Rnd+10)Printa(i);Nexti

(3)程序结构

Print:PrintFori=1To9Forj=i+1To10Ifa(i)>a(j)Thent=a(i):a(i)=a(j):a(j)=t'交换位置

EndIfNextjNextiPrint"排序结果:"

Fori=1To10Printa(i);NextiEndSub

改写中间程序段“Fori=1To9”~“Nexti”(共7个程序行)

Fori=1To9k=i‘k用来记录每次选择的最小值的下标

Forj=i+1To10Ifa(k)>a(j)Thenk=jEndIfNextjt=a(k):a(k)=a(i):a(i)=t'交换位置

Nexti

变量k记录每一次选出的最小值的下标,在本次比较结束后,使a(i)与a(k)一次换位即可

6.6

程序举例

例6.8查找考场教室号

某课程统考凭准考证入场,考场教室安排如表6.2。编制程序,查找准考证号码所对应的教室号码

(1)分析:为便于查找,通过二维数组rm建立这两种号码对照表。数组rm由Form_Load事件过程来建立,它的每一行存放了一个教室资料(包含准考证号码范围和教室号码)。当判断到某个给定准考证号码落在某一行的准考证号码范围内时,则该行中的教室号码为所求

(2)创建应用程序的用户界面和设置对象属性

(3)编写程序代码

功能要求:用户在文本框Text1中输入准考证号码,单击“查找”按钮(Command1)后,则查找出对应的教室,并将教室号码输出在文本框Text2中

Dimrm(6,3)AsIntegerPrivateSubForm_Load()

‘输入数组数据

rm(1,1)=2101:rm(1,2)=2147:rm(1,3)=102rm(2,1)=1741:rm(2,2)=1802:rm(2,3)=103rm(3,1)=1201:rm(3,2)=1287:rm(3,3)=114rm(4,1)=3333:rm(4,2)=3387:rm(4,3)=209rm(5,1)=1803:rm(5,2)=1829:rm(5,3)=305rm(6,1)=2511:rm(6,2)=2576:rm(6,3)=306

EndSub

PrivateSubCommand1_Click()DimnoAsInteger,flagAsIntegerflag=0'查找标记,0表示未找到

no=Val(Text1.Text)Fori=1To6Ifno>=rm(i,1)Andno<=rm(i,2)ThenText2.Text=rm(i,3)'显示教室号码

flag=1'1表示找到

ExitForEndIfNextiIfflag=0ThenText2.Text="无此准考证号码"

EndIfText1.SetFocus‘设置焦点

EndSub

某学习小组10名学生的成绩情况如表6.3所示,现要求采用折半查找法,通过学号查询学生成绩

(1)分析:折半查找法也称对半查找法,是一种效率较高的查找方法。对于大型数组,它的查找速度比顺序查找法(例6.8采用的是顺序查找法)快得多在采用折半查找法之前,要求将数组按查找关键字(如本例的学号)排好序(从大到小或小到大)例6.9

采用折半查找法查询学生成绩

·先从数组中间开始比较,判别中间的那个元素是不是要找的数据:

是,则查找成功否,若被查找的数据是在该数组的上半部,则从上半部的中间继续查找,否则从下半部的中间继续查找

·照此进行下去,不断缩小查找范围

·至最后,因找到或找不到而停止查找

对于n个数据,若用变量Top、Bott分别表示每次“折半”的首位置和末位置,则中间位置M为

M=Int((Top+Bott)/2)这样就将[Top,Bott]分成两段,即[Top,M-1]和[M+1,Bott],

若要找的数据小于由M指示的数据,则该数据在[Top,M-1]范围内,反之,则在[M+1,Bott]范围内

折半查找法的过程

折半查找法的过程学号h()1201120212031205120612071209121012111215先排好序数学d(x,1)语文d(x,2)9286787183746775715562809883998057678078m=Int((Top+Bott)/2)要找的学号Noh(m)=m为所求m<

Bott=m-1>Top=m+1

Top=1Bott=10

(2)创建应用程序的用户界面和设置对象属性

(3)编写程序代码

Dimh(10)AsInteger,d(10,2)AsInteger

PrivateSubForm_Load()

'学号存放在数组h()中

h(1)=1201:h(2)=1202:h(3)=1203h(4)=1205:h(5)=1206:h(6)=1207h(7)=1209:h(8)=1210:h(9)=1211:h(10)=1215'成绩存放在数组d(,)中

d(1,1)=92:d(1,2)=86d(2,1)=78:d(2,2)=71d(3,1)=83:d(3,2)=74d(4,1)=67:d(4,2)=75d(5,1)=71:d(5,2)=55d(6,1)=62:d(6,2)=80d(7,1)=98:d(7,2)=83d(8,1)=99:d(8,2)=80d(9,1)=57:d(9,2)=67d(10,1)=80:d(10,2)=78

EndSub

PrivateSubCommand1_Click()DimnoAsInteger,flagAsIntegerDimmAsInteger,topAsInteger,bottAsIntegerflag=-1'置未找到标志

top=1:bott=10'设定范围

no=Val(Text1.Text)'取学号

Ifno<h(top)Orno>h(bott)Thenflag=-2'若超出学号范围,置特殊标志-2

EndIf

DoWhileflag=-1Andtop<=bott

m=(top+bott)/2'取中点

SelectCaseTrueCaseno=h(m)'找到

flag=m'置找到标志

Text2.Text=h(m)Text3.Text=d(m,1)Text4.Text=d(m,2)Text5.Text=(d(m,1)+d(m,2))/2Caseno<h(m)'小于中间数据

bott=m-1'上半部

Caseno>h(m)'大于中间数据

top=m+1'下半部

EndSelectLoop

Ifflag<0Then'判是否找不到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论