




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章数组,5.1数组的概念5.2静态数组5.3动态数组5.4控件数组,为什么要使用数组?,变量代表在程序执行过程中其值可以改变的存储单元.问题:输入50个数,放在内存存储单元中?若需要对相同类型的一批数据进行处理,则需要在计算机内存中开辟一块连续的区域对之进行存储.,1.数组的概念,数组:具有相同类型变量的有序集合。这些变量按照一定的规则排列,使用一片连续的存储单元,数据名就是这块存储区域的名称。注:数组名不是代表一个变量,而是有内在联系的一组变量。,2.数组元素与维数,数组元素:数组内的任一成员。下标:确定数组元素在数组中的位置。如果只需一个下标就可以确定一个数组元素在数组中的位置,则该数组称为一维数组。数组元素名的一般形式:数组名(下标)例如:单个下标的数组A有4个元素,则它的元素可表示为:A(0)、A(1)、A(2)、A(3),如果需要两个下标才能确定一个数组元素在数组中的位置,则该数组称为二维数组。二维数组元素名的一般形式:数组名(下标1,下标2)通常把二维以上的数组称为多维数组。如:B(2,3),数组元素与维数(续),5.2静态数组,VB中两种变量数组:静态数组和动态数组。静态数组大小固定动态大小不确定,使用前重新定义(定义2次)VB中的对象数组-控件数组,使用数组之前必须对其进行定义(先定义后使用)定义语句格式如下:Dim|Static|Private|Public数组名(下标1,下标2)AsDim数组名(下标1)As一维数组Dim数组名(下标1,下标2)As二维数组,5.2.1静态数组的定义,下标的格式如下:,To上界1,To上界2其中,“下界”和关键字“To”可以省略,若程序中无特别声明,表示下标的取值从0开始,等价于“0To上界”。DimA(5)AsInteger等价于DimA(0To5)AsIntegerA为数组名,该数组中有6个数组元素,分别为:A(0)、A(1)、A(2)、A(3)、A(4)、A(5),DimB(2,1To2)AsSingle等价于DimB(0To2,1To2)AsSingle解析:定义了一个名为B的二维数组,其中有6个数组元素,分别为:B(0,1)、B(0,2)、b(1,1)、B(1,2)、B(2,1)、B(2,2)二维数组:其元素构成一个二维表格或矩阵.数组元素的第一个下标值表示该元素在表格中的行号,第二个下标值表示列号.,数组定义(续),二维数组矩阵,二维数组的元素表示,第1行第2行第3行,第1列第2列,1.数组的上下界数组的上界和下界下界:数组中表示某维最小的下标值;上界:数组中表示某维最大的下标值;注:定义静态数组时,维的上下界必须是常数表达式,不可以是变量名。且下界上界,5.2.2静态数组的操作,静态数组的操作(续),数组的上界和下界DimMAsIntegerConstN=5AsIntegerDimA(N)AsIntegerDimB(1To6.6)AsInteger四舍五入后维上界7DimC(1To2*3)AsStringDimD(0ToM)AsSingle,数组的维下界,定义数组时,若未指定某维的下界,则下界默认为0设置缺省维下界的数组的维下界为1的方法:在代码窗口通用声明部分写一语句optionBase1再在cmd1_click()事件过程中进行定义:DimS(4),B(3,3)asinteger变体型,整型数组,数组的大小,数组的大小即数组所包含的数组元素的个数,也称为数组的长度。数组的大小=第一维大小第二维大小第N维大小维的大小=维上界维下界+1dimA(6)asintegerdimB(3,-1to4)assingle,2.数组元素的引用,引用形式:数组名(下标表达式)Dimscore(3)asintegerDimtwo(1,1to2)asintegerscore(0)=80:score(1)=score(0)+23score(2)=87:score(3)=9two(0,1)=score(0),3.数组的输入/输出操作,(1)一维数组元素的初始化(输入)初始化是给数组成员赋初值。通过循环逐一给数组元素赋值*使用Inputbox接收若干数值*随机产生数值(2)一维数组元素值的显示(输出)*边输入(获得每一元素值后)边输出*获得全部元素值后再输出窗体/图片框/文本框/Msgbox,实例,在FOR循环中用循环控制变量作为数组元素的下标。边输入边输出FORI=0TO5A(I)=INT(99*RND)+1PRINTA(I);NEXTI,用INPUT函数给数组元素赋值,DIMA(6)asinteger,IasintegerFORI=0to6A(I)=inputbox(“给数组元素赋值”,”数组A赋值”)PRINTA(I);NEXTI,例1:输入50个数,按逆序输出,输入使用随机函数,每得到一个数将之赋给数组元素.边输入边输出每个元素值(正序)如何实现逆序输出?,例2随机产生100个0到9之间的整数,统计并输出每个数出现的次数。,所产生的整数在0-9之中需要10个计数器(计数变量)来存放10个数各自出现的次数(数组元素)a(0)-0a(1)-1,例3最值问题(重点算法),编写一个程序,随机产生10个两位正整数,并从中找出一个最大数和一个最小数。打擂台思想,5.4控件数组,控件数组由一组相同类型的控件组成,例如一组命令按钮或一组文本框。它们共用一个控件名,具有相同的属性,建立时系统给每个元素赋一个唯一的索引号(Index)。,1.基本概念,控件共享事件代码,那么如何识别哪个控件执行事件代码呢?,在某个控件识别了一个事件时,VB将调用公共事件过程,并把该控件的Index属性值传递给过程,由它指明是哪个控件识别了控件。例:PrivateSubCommand1_click(IndexAsInteger)EndSub,2.建立控件数组,方法一:创建同名控件TEXT1TEXT2命名(NAME属性)为TEXT1,创建控件数组。INDEX值不同。方法二:复制现存控件,3.使用控件数组,例如:为文本框控件数组的三个元素设置共同字体与大小DIMIASINTEGERFORI=0TO2TEXT1(I).FONT.NAME=“隶书”TEXT1(I).FONT.SIZE=20NEXTI,数组第3次课运行时添加和删除控件数组中的控件,Load对象名(index)向控件数组添加控件对象名指在数组中添加的控件名称,Index是控件在数组中的索引值。加载新元素到控件数组时,要在程序中将Visible属性设置为TRUE,通过代码安排新元素在窗体上的位置(通过top,left属性)。Unload对象名(index)删除用Load产生的对象数组元素。例5.2建立一个动态添加和删除控件数组元素的程序.,【例1】随机生成包含8个元素(全为一位正整数)的数组,要求交换对称位置的元素,并输出交换前后的各元素值。,交换:a(0)-a(7)a(1)-a(6)a(2)-a(5).,数组第二次课生科院,【例2】输出Fibonacci数列的前20项,要求4项一行输出,请使用数组完成,即数组各元素取得各项值,以4个一行的形式输出数组中各元素值。,5.3动态数组,动态数组:应用中数组的大小不确定.首先定义不指明大小的数组:Public|Private|Dim|数组名()As数据类型其次,使用ReDim语句动态定义数组的大小。ReDimPreserve数组名(下标1,下标2)As注意:用Redim语句定义数组时若指定数据类型,应与上面的Dim数组名()As数据类型中的数据类型一致,即不允许更换类型.,例:OptionBase1PrivateSubCommand1_Click()Dima()asintegerredima(9)Printa(8)Redima(2,3)Printa(1,1)EndSub思考:将蓝色语句改为redima(9)aslong是否会出错?,RedimPreserve数组名(维界定义)As数据类型Example:动态数组单循环例子(读程序见下页),在使用ReDim语句重新定义数组时,如果需要保留动态数组的内容可采用如下方式:,重新定义数组时可以保留原数组中的内容,单循环例子(读程序),OptionBase1PrivateSubForm_Click()Dima()AsIntegerDimiAsInteger,jAsIntegerFori=1To3ReDima(i)思考:redimpreservea(i)a(i)=iNextiPrinta(1);a(2);a(3)EndSub,【例3】生成若干个0-99之间的整数存于数组a,删除指定位置的元素,并显示删除前、后结果。,利用循环生成数组各元素值。指定要删除元素的位置删除方法:用后继元素覆盖之由于数组大小在删除元素后会发生变化,所以应定义为动态数组。,【例4】将某范围内的素数存放到数组中.,从键盘输入一个正整数,找出该数以内的所有素数存放在数组prime中并将所有找到的素数按每行5个的形式输出到文本框中。输出到当前窗体中。,数组的输入(赋值)与输出(显示)Array函数:给Variant类型的变量或Variant类型的动态数组赋值例:ARRAY赋值.vbp,4.用ARRAY函数给一维数组赋值,一维数组的输入:直接赋值,随机赋值,inputbox赋值,OptionBase1PrivateSubForm_Click()DimAAsVariant,IAsIntegerDimB()AsVariantFontSize=30A=Array(5,4,3,2,1)PrintA(1);A(2);A(3);A(4);A(5)A=Array(1.5!,2.3!,3.6!,4.1!)PrintA(1);A(2);A(3);A(4);A=NOARRAYPrintAB=Array(1,2,3,4,5,6)PrintB(1)EndSub,数组的输出(元素值的显示),循环控制(下标变量printa(i)ForEachNext结构不需要提供初值与终值根据数组元素的个数确定循环执行的次数ForEachvIn数组v是变体变量ExitforNext成员v必须定义为variant类型,Dimi%,j%Dimb(1To2,1To3)AsIntegerFori=1To2Forj=1To3b(i,j)=i*10+jPrintb(i,j);NextjPrintNexti*此方法按行列式的格式输出,二维数组的定义及赋初值,ForEachvInb此结构按列输出二维数组中的各元素Printv;Next,【例5】随机生成两位正整数,存放到一个4*5的数组中,请按下图所示格式分别将其输出到文本框及图片框中。,5.2.3数组的常用函数及语句,1.LBound函数返回指定数组某维的下界值.LBound(数组名,维编号)2.UBound函数返回指定数组某维的上界值.UBound(数组名,维编号)*缺省时返回第一维上/下界,Erase语句:用于清除指定数组的内容用于静态数组时,将所有数组元素置为默认值用于动态数组时,将删除整个数组结构并释放该数组所占内存。下次引用该动态数组前必须REDIM重新定义。例:Erase.vbp,3.Erase语句,Dima(3)AsInteger,b()AsIntegera(1)=1:a(2)=2:a(3)=3ReDimb(4)Printa(1),a(2),a(3)Erasea,bPrinta(1),a(2),a(3)Printb(1)此行出错,部分重点算法:一数组,求其中最大和最小;对一数组排序(选择法、冒泡法)在一数组中查找指定的数(顺序、二分查找)插入,删除删除一数组中重复的数,一维数组的应用,【例6】选择排序法,基本思想:设在数组S中存放n个无序的数,要求将这n个数按升序(从小到大)重新排列。第一轮比较:使得s(1)为所有元素中最小的.用s(1)与s(2)比较,若s(1)s(2),则交换两个元素中的值,然后继续用s(1)与sort(3)比较,若s(1)s(3),则交换这两个元素的值。依此类推,直到s(1)与s(n)进行比较处理后,s(1)中存放了这n个数中的最小数。第二轮比较,s(2)依次与比较总共通过n-1轮比较,得到一个从小到大排列的有序序列。,【例7】数组元素的插入,(1)将任意一整数插入到数组中,由用户指定插入的数据作为第几个元素(2)已知一按升序排好的包含有10个元素的数组,将某一整数插入到该数组中,基本思路:首先要找到插入位置.以升序为例.,【例8】数据检索问题(顺序查找法),基本思想对所存储的数据从第一项开始,依次与所要检索的数据进行比较,直到找到该数据,或将全部元素都找完还没有找到该数据为止。将元素显示在列表框中.结果显示在文本框中,结果格式为:23找到了,为元素a(5)。,【例9】二分查找(要求数组已排好序)算法说明:给定一组数据,查找是否存在指定的某个值,二分法查找要求这组数据必须已经是排好序的,每次将查找范围一分为二,直到找到或查询了所有区间也没有找到要查找的数为止。,具体思路为:假设给定的一组数据存放在数组A中,需要查找的数为x。设定三个下标left(初始值为0)、right(初始值为数组A的上界)、Mid分别指向查找区间的左端、右端和中间位置。计算Mid=,比较x和AMid的大小,*若Find=AMid,则要查找的数已经找到;*若FindAMid,说明需要查找的数应当在Mid和right区间,则left=mid+1;重复以上步骤,每次查找区间减少一半
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论