第五章 数组.ppt_第1页
第五章 数组.ppt_第2页
第五章 数组.ppt_第3页
第五章 数组.ppt_第4页
第五章 数组.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

第五章数组,2,掌握数组的定义和使用掌握动态数组的定义和使用掌握控件数组的建立和使用掌握常用算法,教学要求,3,教学内容,5.1数组的概念5.2数组的基本操作5.3动态数组5.4控件数组5.5程序示例,4,5.1数组的概念,5.1.1数组命名与数组元素5.1.2数组定义5.1.3数组的结构5.1.4数组函数及数组语句,5,基本概念前面所说的变量都是指简单变量,即一个变量名对应一个存储单元,只能存储一个值,各个变量之间无关联。本章我们要介绍的是一种下标变量数组,是通过一个数组名和下标的组合来表示多个值。用一个相同的名字引用一组变量的数据。数组,是VB支持的一种复合结构的数据类型。数组,是用于保存一组具有相同数据类型的有序的变量的集合。,6,5.1.1数组命名与数组元素,命名规则与简单变量相同。(参阅P45)数组名不是代表某一变量,而是一组变量。数组元素:由数组名和该元素在数组中的编号(索引、下标)唯一确定,下标是连续的整数。数组元素的一般形式:数组名(下标1,下标2,)数组的维数:一维数组只需一个下标即可唯一确定一个数组元素多维数组有两个或两个以上下标的数组,每个下标对应一个“维”。,7,5.1.2数组定义,数组必须先定义后使用。定义数组时,确定其名称、数据类型、维数、每一维的上、下界。数组定义时,系统分配连续的内存空间,用于依次保存所有数组元素。固定大小数组与动态数组。,8,1、数组说明语句,格式:Public|Private|Static|Dim数组名(To,To,)As类型说明:声明关键字决定作用域,见下页TO决定了每一维的大小,下界指下标的最小值,上界指下标的最大值,其中TO可省略,此时,默认下界是0。我们习惯于下标是从1开始,可在模块的“通用”声明段中使用如下语句OptionBase1则在缺省下界的情况下,默认下界是1。,9,注意:全局数组、全局符号常量和全局定长字符串只能在标准模块中定义,10,举例,-Dima(6)asintegerPrivateName(1999to2002)asstring*8Dimb(2,1to2)asinteger,注意:在声明语句中的A(6)是数组说明符,而在程序其他语句出现的A(6)是一个数组元素。,数组元素分别为:a(0)、a(1)、a(2)、a(3)、a(4)、a(5)、a(6),共7个,数组元素分别为:name(1999)name(2000)name(2001)name(2002),用于保存长度为8的字符串数据。,数组元素分别为:b(0,1),b(0,2),b(1,1),b(1,2),b(2,1),b(2,2),11,2数组的上、下界,上、下界表示下标的最大、最小值;下界上界;在固定大小数组定义时,上、下界是常量或常量表达式,不得是变量;上、下界应是整数,若不是,则自动四舍五入。,举例:DimmasintegerConstn=5asintegerDima(n)asintegerDimb(1to6.6)asintegerDimc(1to2*3)asintegerDimd(0tom)asinteger,12,3数组的类型,可为任一简单数据类型4数组的大小指数组中包含元素的个数。一维数组元素个数:上界-下界+1二维数组元素个数:(上界1-下界1+1)*(上界2-下界2+1),13,5.1.3数组的结构,数组的所有元素是按一定顺序存储在连续的存储单元的。1.一维数组的结构例:Dimstra(3)逻辑结构:(stra(0),stra(1),stra(2)stra(3)存储结构:按照下标从小到大依次存储,14,2二维数组的结构,例:Optionbase1Dimy(3,4)asinteger逻辑结构:y(1,1),y(1,2),y(1,3),y(1,4)y(2,1),y(2,2),y(2,3),y(2,4)y(3,1),y(3,2),y(3,3),y(3,4)存储结构:“按列存放”,15,3三维数组的结构,行、列和页组成的三维表。逻辑结构:见书P88存储结构:“逐页逐列”,16,5.1.4数组函数及数组语句1、返回上、下界函数:上界:UBound(数组名,d)下界:LBound(数组名,d)说明:d代表维数。省略时表示返回第一维的值。,DimA(5)AsInteger,B(2,3to5)AsIntegera1=LBound(A)a1=UBound(A)b1=LBound(B,1)b2=LBound(B,2)b3=UBound(b,1)b4=UBound(b,2)Printa1;a2;b1;b2;b3;b4,结果:050325,举例:,17,格式:Erasea1,a2,.功能:对普通数组初始化(按数组类型给元素赋初值),对动态数组进行存储空间释放。例:p.89,OptionBase1PrivateSubForm_Click()Dima(3)AsIntegera(1)=1:a(2)=2:a(3)=3Printa(1),a(2),a(3)EraseaPrinta(1),a(2),a(3)EndSub,(3)Erase初始化数组语句,18,格式:ForEachElementIn语句块ExitFor语句块NextElement功能:依次(存储次序)处理每一个数组元数,直到数组结束。说明:Element是Variant变量,它逐个地代表数组中的每一个变量。,(4)ForEach-Next数组循环结构,19,PrivateSubForm_Click()DimE(2,3)AsInteger,VAsVariantDimiAsInteger,jAsIntegerFori=1To2Forj=1To3E(i,j)=i*10+jNextjNextiForEachVInEPrintV;NextVEndSub,请注意:只能一行或一列输出,不能以矩阵形式输出。参见p90,例:,处理顺序为该数组的存储顺序按列!,20,5.2数组的基本操作,5.2.1数组元素的赋值5.2.2数组元素的输出5.2.3数组元素的引用,21,5.2.1数组元素的赋值,1用赋值语句给单个数组元素赋值。Dimscore(3)asintegerscore(1)=90:score(2)=80:score(3)=682在循环结构中,用赋值语句逐一给数组元素赋值。Dima(1to6)asintegerFori=1to6a(i)=int(99*rnd)+1Nexti3在循环结构中,利用Inputbox函数给数组元素赋值。,Dima(1to6)asintegerFori=1to6a(i)=inputbox(“请输入a(”NextiPrintPrint最大数是;maxPrint最小数是;minEndSub,max=compare(1):min=compare(1)Fori=2To12Ifcompare(i)maxThenmax=compare(i)ElseIfcompare(i)minThenmin=compare(i)EndIfNexti,例5-1产生12个两位数,从中找出最大值、最小值,25,例:有一个一维数组a(20),要求按照每行6个元素的格式输出。数组元素为100-200之间的随机数。,OptionBase1PrivateSubForm_Click()Dima(20)AsIntegerDimiAsInteger,jAsIntegerFori=1To20a(i)=Int(101*Rnd)+100NextiEndSub,Fori=1To20Printa(i);j=j+1Nexti,IfjMod6=0ThenPrint,26,二维数组引用必须用二重循环实现,OptionExplicitOptionBase1PrivateSubForm_Click()DimiAsInteger,jAsIntegerDima(3,4)AsIntegerRandomizeFori=1To3Forj=1To4a(i,j)=Int(Rnd*31+20)NextjNextiFori=1To3Forj=1To4Printa(i,j);NextjPrintNextiEndSub,程序分析:程序执行时,计数变量i和j的变化为:i=1时,j从1变化到4,结束内层循环,i变成2i=2时,j从1变化到4,结束内层循环,i变成3i=3时,j从1变化到4,结束内层循环,i变成4结束外层循环。循环变量(i,j)的变化过程为(1,1)(1,2)(1,3)(1,4)(2,1)(2,2)(2,3)(2,4)(3,1)(3,2)(3,3)(3,4)正好和二维数组引用的下标一致。,例:二维数组的赋值与输出,Fori=1To3Forj=1To4Picture1.Printa(i,j);NextjPicture1.PrintNexti,Fori=1To3Forj=1To4s=sNextjPrintNextiPrintFori=1To4Forj=1To5sum=sum+a(i,j)NextjNextIPrint第;i;行元素之和为:;sumEndSub,Sum=0,Print第;i;行元素之和为:;sum,程序执行结果界面,28,有关二维数组的常见问题:,转置求对角线元素之和求周边元素之和求上、下三角形元素之和求鞍点、最大、最小元素二维数组相乘,29,OptionBase1PrivateSubForm_Click()DimiAsInteger,jAsInteger,a(3,4)AsIntegerRandomizeFori=1To3Forj=1To4a(i,j)=Int(Rnd*31+20)Printa(i,j);NextjPrintNextIEndSub,例:产生一个3行4列的矩阵,数据为20,50之间的随机数,然后将矩阵转置输出。,Fori=1To4Forj=1To3Printa(j,i);NextjPrintNexti,Forj=1To4Fori=1To3Printa(i,j);NextjPrintNexti,思考题:求n阶方阵的转置矩阵,并输出?,30,1、分别求一个3*3二维数组的主、付对角线元素之和。2、求二维数组周边元素之和。,练习,31,5.3动态数组,定义:在程序运行过程中,可重新定义大小的数组。说明语句:Dim数组名()as类型在变量说明部分ReDimPreserve(维界定义)在可执行语句中,PrivateSubForm_Click()DimPin()AsInteger说明整型的动态数组PinDimxasIntegerX=Val(Text1.text)ReDimPin(x)重新说明数组Pin.EndSub,注意:-Redim是可执行语句,只能出现在过程中-重新定义动态数组时,不能改变数据类型-重定义时,维界定义中可以有变量,32,-如果Redim重定义的数组不存在,则相当于一个说明语句-当缺省Preserve参数时,定义后,原来存储在数组中的数据全部丢失,此时可重新定义数组的维数和各维的上下界。-当有Preserve参数时,可保留原数组中的数据,但不能改变数组的维数,且只能改变最后一维的维上界。-用Dim语句声明过的数组,只是一个空数组,系统并没有给它分配内存空间,此时,不能对数组元素进行存取操作,否则出错。必须用ReDim语句重新定义其大小,系统才给它分配内存,用户才能对此数组元素进行操作。,说明,33,举例:,Optionbase1Dimdynarry()asintegerDimxasinteger,yasintegerDynarry(1)=1Redimdynarry(9)Dynarry(1)=1x=2:y=4Redimdynarry(x,y)Dynarry(1,1)=1ErasedynarryDynarry(1,1)=1,非法语句,出错,给一维数组元素赋值,给二维数组元素赋值,非法语句,出错,34,OptionExplicitOptionBase1PrivateSubForm_Click()DimiAsInteger,a()AsIntegerReDima(4)Fori=1To4a(i)=iPrinta(i);NextiPrintReDimPreservea(6)a(5)=5a(6)=6Fori=1To6Printa(i);NextiEndSub,如果省去Preserve,会怎样?,举例,35,例:找出1000以内的所有完数并以指定的格式在列表框中输出。所谓完数,是指它的所有的质因子之和等于它本身的数,如6=1+2+3。,解题思路:第一步:找出确定一个数是完数的方法;第二步:从1到1000依次判断。算法实现:两层循环:内层循环用于找出某数m的所有因子并相加求和,并在循环结束后依据因子和是否与该数相等来判断该数是否是完数;外层循环则用于穷举所有1000以内的整数。,PrivateSubCommand1_Click()DimiAsInteger,jAsInteger,sAsInteger,kAsIntegerDimstr1AsString,a()AsIntegerFori=1To1000Forj=1Toi1IfiModj=0Then是因子,保存进数组并累加求和s=s+jEndIfNextjIfs=iThen是完数,按指定格式输出EndIfNextiEndSub,注意s、k赋初值的位置,s=0:k=0,k=k+1ReDimPreservea(k)a(k)=j,str1=CStr(i)NextiPrintS=InputBox(输入要查找的数)Fori=1To10Ifsearch(i)=SThenExitForNextiIfiBOT,例5-5:二分查找。,x=8,x=5,59,Left=LBound(a)Right=UBound(a)x=InputBox(请输入要查找的数据)DoWhileLeft=RightMid=Int(Left+Right)/2)Ifa(Mid)=xThenExitDoElseIfa(Mid)xThenLeft=Mid+1ElseRight=Mid-1EndIfLoopIfLeft=AAndCh=ZThenIdx=Asc(Ch)-Asc(A)A(Idx)=A(Idx)+1EndIfNextI,ForI=0To25IfA(I)0ThenJs=Js+1Text2=Text2&Chr(I+Asc(A)&:&Str(A(I)&IfJsMod5=0ThenText2=Text2&Chr(13)&Chr(10)EndIfNextI,控制打印每行统计字符的个数,转换为大写字符,求该字符与“A”的间隔位置,以此作为下标,例5-10找出5000以内的亲密对数。所谓亲密对数,是指甲数的所有因子之和等于乙数,而乙数的所有因子之和等于甲数。如:220的因子和:1+2+4+5+10+11+20+44+55+110=284284的因子和:1+2+4+71+142=220,算法分析:采用二层循环结构.外层循环:遍历15000以内的所有整数,采用FOR循环,计数控制变量i既控制循环执行的次数,又可作为甲数。内层循环:求出某数的所有因子,并求和,因为每个数的因子数不确定,所以用动态数组保存因子。外层循环中:先求出i的因子之和sum1,然后再求出sum1的因子之和sum2,判断sum2是否等于i,若相等,则输出i和sum1及其因子,不等则继续判断i+1。,63,例5-11将一个数列中的重复数删除。,算法分析:第一轮,将A(1)与A(2)、A(3)A(N)依次比较,若A(i)与A(1)相同,则删除,删除的方法是将位于A(i)元素之后的元素依次前移一位,即将A(i)覆盖;第二轮,将A(2)与其后元素依次比较,删除所有与A(2)相同的元素;循环的次数事先不确定,随重复数的多少而不同,所以采用DO-LOOP循环,循环结束条件是被比较的数组元素a(n)是倒数第二个元素。与比较数进行比较的数a(i)是从a(n+1)开始到最后一个元素。而一旦发现与a(n)重复的a(i),就利用FOR循环将a(i+1)到最后一个元素依次赋给前一个元素,即将a(i)覆盖删除,同时重新定义数组的大小,减1。,64,ub

温馨提示

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

评论

0/150

提交评论