《掌握控件数组的建立和使用.PPTx》由会员分享,可在线阅读,更多相关《掌握控件数组的建立和使用.PPTx(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 of 63 .1 .1 数组的概念数组的概念 .2 .2 数组的基本操作数组的基本操作 .3 .3 动态数组动态数组 .4 .4 控件数组控件数组 .5 .5 常用算法程序示例常用算法程序示例第1页/共63页2 of 63 前面所说的变量都是指简单变量,即一个变量名对应一个存储单元,只能存储一个值,各个变量之间无关联。本章我们要介绍的是一种下标变量数组,是通过一个数组名和下标的组合来表示多个值。用一个相同的名字引用一组变量的数据。数组,一种复合结构的数据类型。作用:用于保存一组具有相同数据类型的有序的变量的集合。.1 .1 数组的概念数组的概念第2页/共63页3 of 63.1.1.1.1
2、 数组命名与数组元素数组命名与数组元素 命名规则与简单变量相同。命名规则与简单变量相同。(参阅参阅P45)数组元素:数组元素:数组元素的一般形式:数组元素的一般形式:数组名(下标数组名(下标1,下标,下标2,)Name(10)x(5)数组的维数:数组的维数:一维数组一维数组只需一个下标即可唯一确定一个数组元只需一个下标即可唯一确定一个数组元素素多维数组多维数组有两个或两个以上下标的数组,每个下有两个或两个以上下标的数组,每个下标对应一个标对应一个“维维”。a(1,3)t(1,2,5)第3页/共63页4 of 63.1.2 .1.2 数组定义数组定义 数组必须数组必须先定义后使用先定义后使用。数
3、组定义时,系统分配数组定义时,系统分配连续连续的内存空间,的内存空间,用于依次保存所有数组元素。用于依次保存所有数组元素。数组定义后就有了与其类型相应的数组定义后就有了与其类型相应的初值初值。固定大小数组与动态数组。固定大小数组与动态数组。第4页/共63页5 of 631 1、数组说明语句、数组说明语句 格式格式:Public|Private|Static|Dim Public|Private|Static|Dim 数组名数组名(To To1 ,To To,2,)as as 类型类型例如:例如:Dim a(10)As Integer,Name(30)As StringDim a(10)As I
4、nteger,Name(30)As String 说明说明:TO TO省略时,默认下界是省略时,默认下界是0 0。我们习惯于下标是从我们习惯于下标是从1 1开始,可在模块的开始,可在模块的“通用通用”声明声明段中使用如下语句段中使用如下语句 Option Base 1Option Base 1 则在缺省下界的情况下,默认下界是则在缺省下界的情况下,默认下界是1 1。第5页/共63页6 of 632 2 数组的上、下界数组的上、下界在固定大小数组定义时,上、下界可以是常量或常量表在固定大小数组定义时,上、下界可以是常量或常量表达式,达式,不得是变量不得是变量;上、下界应是整数,若不是,则奇数自动
5、四舍五入,偶上、下界应是整数,若不是,则奇数自动四舍五入,偶数五舍六入。数五舍六入。举例:Dim m as integer Const n=5 as integer Dim a(n)as integer Dim b(1 to 6.6)as integer Dim c(1 to 2*3)as integer Dim d(0 to m)as integer第6页/共63页7 of 633 3 数组的类型数组的类型可为任一简单数据类型可为任一简单数据类型4 4 数组的大小数组的大小E指数组中包含元素的个数。指数组中包含元素的个数。E一维数组元素个数:上界一维数组元素个数:上界-下界下界+1+1E二维
6、数组元素个数:二维数组元素个数:(上界(上界1 1-下界下界1 1+1+1)*(上界(上界2 2-下界下界2 2+1+1)第7页/共63页8 of 63.1.3 .1.3 数组的结构数组的结构 数组的所有元素是按一定数组的所有元素是按一定顺序顺序存放在存放在连续连续的内的内存单元中。存单元中。1.1.一维数组的结构一维数组的结构F例:例:Dim stra(3)As IntegerF逻辑结构:(stra(0),stra(1),stra(2),stra(3)F存储结构:按照下标从小到大依次存储存储结构:按照下标从小到大依次存储Stra(0)Stra(1)Stra(2)Stra(3)第8页/共63页
7、9 of 632 2 二维数组的结构二维数组的结构例:例:Option Base 1Option Base 1 Dim y(3,4)As Dim y(3,4)As IntegerInteger逻辑结构:逻辑结构:y(1,1),y(1,2),y(1,3),y(1,4)y(1,1),y(1,2),y(1,3),y(1,4)y(2,1),y(2,2),y(2,3),y(2,y(2,1),y(2,2),y(2,3),y(2,4)4)y(3,1),y(3,2),y(3,3),y(3,y(3,1),y(3,2),y(3,3),y(3,4)4)存储结构:存储结构:“按列存放按列存放”3 三维数组的结构l 行
8、、列和页组成的三维表。l 逻辑结构:见书P88l 存储结构:“逐页逐列”第9页/共63页10 of 63.2.2 数组的基本操数组的基本操作作.2.1 .2.1 数组元素的赋值数组元素的赋值.2.2 .2.2 数组元素的输出数组元素的输出.2.3 .2.3 数组元素的引用数组元素的引用第10页/共63页11 of 63.2.1.2.1 数组元素的赋值数组元素的赋值1 用赋值语句给单个数组元素赋值。Dim score(3)As Integer score(1)=90:score(2)=80 :score(3)=68 2 在循环结构中,用赋值语句逐一给数组元素赋值。Dim a(6)As Integ
9、er For i=1 to 6 a(i)=Int(99*Rnd)+1 a(i)=InputBox(“请输入a(”&i&”)”,”数组赋值”)利用InputBox函数给数组元素赋值 Print a(i);Next i一维数组用一层循环结构第11页/共63页12 of 63.2.2 .2.2 数组元素的输出数组元素的输出用用PrintPrint方法显示在窗体或图片框上方法显示在窗体或图片框上赋值给文本框的赋值给文本框的TextText属性,在文本框中显示属性,在文本框中显示调试时,调用调试时,调用DebugDebug的的PrintPrint方法在方法在“立即立即”窗口中显窗口中显示示.2.3 .2
10、.3 数组元素的引用数组元素的引用 注意:在引用数组元素时,元素的下标一定要在定注意:在引用数组元素时,元素的下标一定要在定义的上下界范围之内,否则义的上下界范围之内,否则“数组越界数组越界”出错。出错。第12页/共63页13 of 63Option Base 1Private Sub Form_click()Dim compare(12)as Integer,i as Integer Dim max as Integer,min as Integer Randomize For i=1 To 12 compare(i)=Int(90*Rnd)+10 Print compare(i);Next
11、 i Print Print 最大数是;max Print 最小数是;minEnd Submax=compare(1):min=compare(1)For i=2 To 12 If compare(i)max Then max=compare(i)ElseIf compare(i)min Then min=compare(i)End IfNext i例-1 产生12个两位数,从中找出最大值、最小值第13页/共63页14 of 63例:有一个一维数组a(20),要求按照每行6个元素的格式输出。数组元素为100-200之间的随机数。Option Base 1Private Sub Form_Cli
12、ck()Dim a(20)as Integer Dim i as Integer,j as Integer For i=1 To 20 a(i)=Int(101*Rnd)+100 Next iEnd Sub For i=1 To 20 Print a(i);j=j+1 Next iIf j Mod 6=0 Then Print第14页/共63页15 of 63二维数组引用必须用二重循环实现Option ExplicitOption Base 1Private Sub Form_Click()Dim i as Integer,j as Integer Dim a(3,4)as Integer R
13、andomize For i=1 To 3 For j=1 To 4 a(i,j)=Int(Rnd*31+20)Next j Next i For i=1 To 3 For j=1 To 4 Print a(i,j);Next j Print Next iEnd Sub程序分析:程序执行时,计数变量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,
14、2)(3,3)(3,4)正好和二维数组引用的下标一致。例:二维数组的赋值与输出For i=1 To 3 For j=1 To 4 Picture1.Print a(i,j);Next j Picture1.Print Next iFor i=1 To 3 For j=1 To 4 s=s&a(i,j)Next j s=s&Chr(13)&Chr(10)Next IText1.Text=svbCrLf第15页/共63页16 of 63例:下列程序完成在窗体上输出二维数组每行元素之和。回答问题:1、程序有没有错?2、错在哪里?3、输出语句应出现在什么地方?Option Base 1Private
15、Sub Form_Click()Dim a(4,5)as Integer Dim i as Integer,j as Integer Dim sum as Integer For i=1 To 4 For j=1 To 5 a(i,j)=Int(101*Rnd)+100 Print a(i,j);Next j Print Next i Print For i=1 To 4 For j=1 To 5 sum=sum+a(i,j)Next j Next I Print 第;i;行元素之和为:;sumEnd SubSum=0Print 第;i;行元素之和为:;sum程序执行结果界面第16页/共63页
16、17 of 63有关二维数组的常见题目:有关二维数组的常见题目:转置转置求对角线元素之和求对角线元素之和求周边元素之和求周边元素之和求上、下三角形元素之和求上、下三角形元素之和求鞍点、最大、最小元素求鞍点、最大、最小元素二维数组相乘二维数组相乘第17页/共63页18 of 63Option Base 1Private Sub Form_Click()Dim i as Integer,j as Integer,a(3,4)as Integer Randomize For i=1 To 3 For j=1 To 4 a(i,j)=Int(Rnd*31+20)Print a(i,j);Next j
17、Print Next IEnd Sub例:产生一个3行4列的矩阵,数据为20,50之间的随机数,然后将矩阵转置输出。For i=1 To 4 For j=1 To 3 Print a(j,i);Next j Print Next iFor j=1 To 4 For i=1 To 3 Print a(i,j);Next i PrintNext j思考题:求n阶方阵的转置矩阵,并输出?第18页/共63页19 of 63.1.4 数组函数及数组语句1、返回上、下界函数:上界:UBound(数组名,d)下界:LBound(数组名,d)说明:d代表维数。省略时表示返回第一维的值。Dim a(5)as I
18、nteger,B(2,3 to 5)as Integer a1=LBound(a)a2=UBound(a)b1=LBound(B,1)b2=LBound(B,2)b3=UBound(b,1)b4=UBound(b,2)Print a1;a2;b1;b2;b3;b4结果:0 5 0 3 2 5举例:第19页/共63页20 of 63格式:For Each Element In 语句块Exit For语句块 Next Element功能:依次(存储次序)处理每一个数组元数,直到数组结束。说明:Element是Variant变量,它逐个地代表数组中的每一个变量。2、For Each-Next 数组循
19、环结构第20页/共63页21 of 63Private Sub Form_Click()Dim E(2,3)as Integer,V as Variant Dim i as Integer,j as Integer For i=1 To 2 For j=1 To 3 E(i,j)=i*10+jPrint E(I,j);Next jPrint Next i For Each V In E Print V;Next VEnd Sub请注意:只能一行或一列输出,不能以矩阵形式输出。参见p90例:处理顺序为该数组的存储顺序按列!第21页/共63页22 of 63格式:变体变量名=array(n1,n2
20、,.)功能:将一个变体型变量创建成为一个一维数组,并包含指定的元素。元素的引用方式与一般数组一样。注意:array赋值函数只能给变体型变量赋值。不能给其他类型的变量及任何类型的数组赋值。Option Base 1Private Sub Form_Click()Dim a As Variant,b As Integer a=array(1,2,3,4,5,6,7,8,9,10)Print a(1),a(5),a(10)a=array Print a b=array(1,2,3,4,5,6,7,8,9,10)End Sub3、array赋值函数第22页/共63页23 of 63.3 .3 动态数组
21、动态数组定义:在程序运行过程中,可重新定义大小的数组。定义:在程序运行过程中,可重新定义大小的数组。说明语句:说明语句:Dim 数组名()数组名()As 类型类型 在变量说明部分在变量说明部分 ReDim Preserve(维界定义维界定义)在可执行语句在可执行语句中中Private Sub Form_Click()Dim Pin()as Integer 说明整型的动态数组PinDim x as IntegerX=Val(Text1.text)ReDim Pin(x)重新说明数组Pin .End Sub注意:-Redim 是可执行语句,只能出现在过程中 -重新定义动态数组时,不能改变数据类型
22、-重定义时,维界定义中可以有变量第23页/共63页24 of 63F 如果Redim重定义的数组不存在,可新建数组D 当缺省Preserve参数时,Redim定义后,原来存储在数组中 的数据全部丢失,此时可重新定义数组的维数和各维的上下界。C 当有Preserve参数时,可保留原数组中的数据,但不能改变数组的维数,且只能改变最后一维的维上界。G 用Dim语句声明过的动态数组,系统并没有给它分配内存空间,此时,不能对数组元素进行存取操作,否则出错。必须用ReDim语句重新定义其大小,系统才给它分配内存,用户才能对此数组元素进行操作。说 明第24页/共63页25 of 63Option Expli
23、citOption Base 1Private Sub Form_Click()Dim i as Integer,a()as Integer ReDim a(4)For i=1 To 4 a(i)=i Print a(i);Next i Print ReDim Preserve a(6)a(5)=5 a(6)=6 For i=1 To 6 Print a(i);Next iEnd Sub如果省去 Preserve,会怎样?举 例第25页/共63页26 of 63例:找出例:找出10001000以内的所有完数并以指定的格式在列表框中输出。以内的所有完数并以指定的格式在列表框中输出。所谓完数,是指
24、它的所有的质因子之和等于它本身的数,如所谓完数,是指它的所有的质因子之和等于它本身的数,如6=1+2+36=1+2+3。解题思路:解题思路:第一步:找出确定一个数是完数第一步:找出确定一个数是完数 的方法;的方法;第二步:从第二步:从1 1到到10001000依次判断。依次判断。算法实现算法实现:两层循环:两层循环:内层循环内层循环用于找出某数用于找出某数 m m 的所有因子并相加求和,的所有因子并相加求和,并在循环结束后依据因子和是否与该数相等来判断该数是并在循环结束后依据因子和是否与该数相等来判断该数是否是完数;否是完数;外层循环外层循环则用于穷举所有则用于穷举所有10001000以内的整
25、数。以内的整数。第26页/共63页Private Sub Command1_Click()Dim i as Integer,j as Integer,s as Integer,k as Integer Dim str1 as String,a()as Integer For i=1 To 1000 For j=1 To i 1 If i Mod j=0 Then 是因子,保存进数组并累加求和 s=s+j End If Next j If s=i Then 是完数,按指定格式输出 End If Next iEnd Sub注意s、k赋初值的位置s=0:k=0k=k+1ReDim Preserve
26、a(k)a(k)=jstr1=CStr(i)&=For j=1 To k str1=str1&CStr(a(j)&+Next jList1.addItem left(str1,len(str1)-1)完数第27页/共63页28 of 63格式:Erase a1,a2,.功能:对普通数组初始化(按数组类型给元素赋初值),对动态数组进行存储空间释放。例:p.89Option Base 1Private Sub Form_Click()Dim a(3)as Integer a(1)=1:a(2)=2:a(3)=3 Print a(1),a(2),a(3)Erase a Print a(1),a(2)
27、,a(3)End Sub2、Erase 初始化数组语句第28页/共63页29 of 63举例举例(判断错误判断错误):Option base 1Dim dynarry()as integerDim x as integer,y as integerDynarry(1)=1 Redim dynarry(9)Dynarry(1)=1x=2:y=4Redim dynarry(x,y)Dynarry(1,1)=1Erase dynarryDynarry(1,1)=1出错重定义重定义出错第29页/共63页30 of 63p.120 16 预习 实验7 练 习第30页/共63页31 of 63.5 .5
28、常用算法及程序示例常用算法及程序示例 选择排序 冒泡排序 顺序查找 二分查找排序查找常 用 算 法第31页/共63页32 of 63 快速排序 插入排序 双调排序 归并排序 直接排序 冒泡排序 传统排序算法动态排序Byte快速排序拓扑排序堆的新排序群组决策排序链接排序法数轴分段排序 新生排序算法第32页/共63页33 of 63分析:先将n个数存入数组a(n),第一轮比较:a(1)a(2),则交换,否则不交换;a(1)a(3),则交换,否则不交换;a(1)a(n),则交换,否则不交换;a(1)中为最大数。第二轮比较:a(2)a(3),则交换,否则不交换;a(2)a(4),则交换,否则不交换;a
29、(2)a(N),则交换,否则不交换;a(2)中为次大数。第N-1轮比较:a(n-1)a(n)则交换,否则不交换;a(n)中为最小的数。这样,经过n-1轮扫视,数组a中的n个元素按从大到小的顺序排列。选择法排序(从大到小排序)第33页/共63页34 of 63第二轮比较:6、2、1、3、4、56、3、1、2、4、56、4、1、2、3、56、5、1、2、3、4第三轮比较:6、5、2、1、3、46、5、3、1、2、46、5、4、1、2、3第四轮比较:6、5、4、2、1、36、5、4、3、1、2第五轮比较:6、5、4、3、2、1第一轮比较:a(1)a(2)a(3)a(4)a(5)a(6)2 1 3 4
30、 5 6 3 1 2 4 5 6 4 1 2 3 5 6 5 1 2 3 4 6 6 1 2 3 4 5实例说明:设无序数据为1、2、3、4、5、6,共有6个元素,进行6-1=5轮比较。5次比较情况如下:第34页/共63页35 of 63For i=1 to For j=to n If Then End If Next jNext i选择排序程序例6-6i用作为数组数的下标 j 用作为数组下标 n-1i+1a(i)a(j)Temp=a(i)a(i)=a(j)a(j)=Temp第35页/共63页36 of 63For i=1 to n-1 point=i For j=i+1 to n If a(
31、point)a(j)Then point=j Next j If i point then Temp=a(i):a(i)=a(point):a(point)=Temp End ifNext i优点:每轮扫视后只交换一次数据。选择排序选择排序(改进直接排序改进直接排序)第36页/共63页37 of 63分析:第一轮比较:a(1)a(2)则交换,否则不交换;a(2)a(3)则交换,否则不交换;a(n-1)a(n)则交换,否则不交换;a(n)中为最小的数。第二轮比较:a(1)a(2)则交换,否则不交换;a(n-2)a(n-1)则交换,否则不交换;a(n-1)中为次小的数。第N-1轮比较:a(1)a(
32、2)则交换,否则不交换;a(1)中为最大的数。这样,经过n-1轮扫视,数组a中的n个元素按从大到小的顺序排列。冒泡法排序(设从大到小排序)第37页/共63页38 of 63第一论扫视:2、1、3、4、5、62、3、1、4、5、62、3、4、1、5、62、3、4、5、1、62、3、4、5、6、1第二轮扫视:3、2、4、5、6、13、4、2、5、6、13、4、5、2、6、13、4、5、6、2、1第三轮扫视:4、3、5、6、2、14、5、3、6、2、14、5、6、3、2、1第五轮扫视:6、5、4、3、2、1第四轮扫视:5、4、6、3、2、15、6、4、3、2、1实例说明:设无序数据为1、2、3、4、
33、5、6,共有6个元素,进行6-1=5轮扫视。5次扫视情况如下:第38页/共63页39 of 63改写为冒泡排序程序第39页/共63页40 of 63For i=1 to n-1 For j=1 to n-i If a(j)a(j+1)Then Temp=a(j):a(j)=a(j+1):a(j+1)=Temp End If Next jNext i 冒泡排序程序第40页/共63页 选择法 冒泡法第42页/共63页顺序查找(例6-7)Private Sub Form_Click()Dim search(10)as Integer,i as Integer Dim S as Integer Ran
34、domize For i=1 To 10 search(i)=Int(Rnd*100)+100 Print search(i);Next i Print S=InputBox(输入要查找的数)For i=1 To 10 If search(i)=S Then Exit For Next i If i=10 Then Print 要找的数是Search(;i;)Else Print 没找到!End IfEnd Sub p.104例6-7search第43页/共63页44 of 63分析:前题是数据序列已排好序(从小到大)。Left-下界(下标),初值为1;Right-上界(下标),初值为n;查找
35、x;算法如下:(1)求中间位置Mid=Int(Left+Right)/2)(2)若a(Mid)=x,则找到,结束比较(3)若a(Mid)x,x在a(Left)到a(Mid-1)区间内,设置Right=Mid-1(5)重复执行以上操作(6)结束循环的条件有两个:已经找到;找不到-Left Right二分查找第44页/共63页341111059678x=8LeftRightMidLeftRightMidRightLeftMid231111049678x=5LeftRightMidMidRightLeftMidLeftLeftMidLeftMid终于找到你了 没 找到!第45页/共63页46 of
36、63 Left=LBound(a)Right=UBound(a)x=InputBox(请输入要查找的数据)Do While Left=Right Mid=Int(Left+Right)/2)If a(Mid)=x Then Exit Do ElseIf a(Mid)x Then Left=Mid+1 ElseRight=Mid-1 End If Loop If Left=“A And Ch=Z Then Idx=Asc(Ch)-Asc(“A)a(Idx)=a(Idx)+1 End IfNext I For I=0 To 25 If a(I)0 Then Text2=Text2&Chr(I+As
37、c(“A)&:&Str(a(I)&Js=Js+1 If Js Mod 5=0 Then Text2=Text2&Chr(13)&Chr(10)End If Next I 控制每行输出字符的个数转换为大写字符该字符与“A”的间隔既为其下标例6-11第56页/共63页程序示例例 找出5000以内的亲密对数。所谓亲密对数,是指甲数的所有因子之和等于乙数,而乙数的所有因子之和等于甲数。220的因子和:1+2+4+5+10+11+20+44+55+110=284284的因子和:1+2+4+71+142=220第57页/共63页58 of 63例 6-12 将一个数列中的重复数删除。ub=UBound(a
38、)n=1 是被比较数的下标Do While n ub 循环结束条件为被比较数是倒数第二个元素 i=n+1 比较数的下标,从N+1开始 Do While i=ub If a(n)=a(i)Then For j=i To ub 1 从a(i+1)到最后一个元素依次前移 a(j)=a(j+1)Next j ub=ub 1 数组大小减1 ReDim Preserve a(ub)Else i=i+1 若不相同,再与下一个元素比较 End If Loop n=n+1 被比较数下标加1Loop第58页/共63页59 of 63例例6-13 6-13 1515名学生按照已有的编号顺序围成一圈名学生按照已有的编
39、号顺序围成一圈,1-3,1-3报数报数,逢逢3 3出局出局,要求记录学生出局的先后顺序要求记录学生出局的先后顺序(即编号即编号).).算法分析算法分析:需解决如下一个几个问题需解决如下一个几个问题:1.1.如何记录如何记录1515个学生的编号个学生的编号,又如何围成一圈又如何围成一圈2.2.如何实现报数如何实现报数3.3.如何实现逢如何实现逢3 3出局出局,并记录下编号并记录下编号4.4.已出局的如何不参加报数已出局的如何不参加报数定义一个有15个元素的数组,元素下标即编号,当下标依次递增时,若大于15,就回到1.数组元素的初值为1,顺序对数组元素的值实现累加当累加和为3时,当前累加的元素出局
40、,记录下其下标将出局数组元素的值置为0,则累加时不起作用,即不参与报数第59页/共63页60 of 63For i=1 To 15 old_no(i)=1 Next iidx=0For i=1 To 15 count=0 累加和,起报数作用 Do While count 15 Then idx=1 围成一圈,循环 count=old_no(idx)+count 累加求和报数 Loop old_no(idx)=0 当前元素出局 new_no(i)=idx 记录其编号Next iFor i=1 To 15 Text1.Text=Text1.Text&Right(&CStr(i),3)Text2.Text=Text2.Text&Right(&CStr(new_no(i),3)Next i 例6-13第60页/共63页61 of 631、数组的定义和使用 2、动态数组 3、控件数组 4、常用算法 5、程序示例 本 章 小 结第61页/共63页62 of 63 作 业 p.120 715题预习实验8第62页/共63页63 of 63感谢您的观看。第63页/共63页