VB课件第六章数组.ppt_第1页
VB课件第六章数组.ppt_第2页
VB课件第六章数组.ppt_第3页
VB课件第六章数组.ppt_第4页
VB课件第六章数组.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章 数组,2,掌握数组的定义和使用 掌握动态数组的定义和使用 掌握控件数组的建立和使用 掌握常用算法,教学要求,3,教学内容,6.1 数组的概念 6.2 数组的基本操作 6.3 动态数组 6.4 控件数组 6.5 程序示例,4,6.1 数组的概念,6.1.1 数组命名与数组元素 6.1.2 数组定义 6.1.3 数组的结构 6.1.4 数组函数及数组语句,5,基本概念 前面所说的变量都是指简单变量,即一个变量名对应一个存储单元,只能存储一个值,各个变量之间无关联。 本章我们要介绍的是一种下标变量数组,是通过一个数组名和下标的组合来表示多个值。用一个相同的名字引用一组变量的数据。 数组,是V

2、B支持的一种复合结构的数据类型。 数组,是用于保存一组具有相同数据类型的有序的变量的集合。,6,6.1.1 数组命名与数组元素,命名规则与简单变量相同。(参阅P45) 数组名不是代表某一变量,而是一组变量。 数组元素: 由数组名和该元素在数组中的编号(索引、下标)唯一确定,下标是连续的整数。 数组元素的一般形式: 数组名(下标1,下标2,) 数组的维数: 一维数组只需一个下标即可唯一确定一个数组元素 多维数组有两个或两个以上下标的数组,每个下标对应一个“维”。,7,6.1.2 数组定义,数组必须先定义后使用。 定义数组时,确定其名称、数据类型、维数、每一维的上、下界。 数组定义时,系统分配连续

3、的内存空间,用于依次保存所有数组元素。 固定大小数组与动态数组。,8,1、数组说明语句,格式: Public|Private|Static|Dim 数组名( To , To,) As 类型 说明: 声明关键字决定作用域,见下页 TO 决定了每一维的大小,下界指下标的最小值,上界指下标的最大值,其中 TO可省略,此时,默认下界是0。 我们习惯于下标是从1开始,可在模块的“通用”声明段中使用如下语句 Option Base 1 则在缺省下界的情况下,默认下界是1。,9,注意:全局数组、 全局符号常量和全局定长字符串只能在标准模块中定义,10,举例,- Dim a(6) as integer Pri

4、vate Name(1999 to 2002) as string *8 Dim b(2,1 to 2) as integer,注意:在声明语句中的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 数组的上、下界,上、下界表示下标的最

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,12,3 数组的类型,可为任一简单数据类型 4 数组的大小 指数组中包含元素的个数。 一维数组元素个数:上界-下界+1 二维数组元素个数: (上界1-下界1+1)*(上界2-下界2+1

6、),13,6.1.3 数组的结构,数组的所有元素是按一定顺序存储在连续的存储单元的。 1.一维数组的结构 例:Dim stra(3) 逻辑结构:(stra(0),stra(1),stra(2) stra(3) 存储结构:按照下标从小到大依次存储,14,2 二维数组的结构,例:Option base 1 Dim y(3,4) as integer 逻辑结构: 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 三维数组的结构,行、列和页组成的三维

7、表。 逻辑结构:见书P88 存储结构:“逐页逐列”,16,6.1.4 数组函数及数组语句 1、返回上、下界函数: 上界:UBound(数组名,d) 下界:LBound(数组名,d) 说明:d代表维数。省略时表示返回第一维的值。,Dim A(5) As Integer, B(2, 3 to 5) As Integer a1=LBound(A) a1=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,举例:,17,格式: Eras

8、e a1,a2,. 功能:对普通数组初始化(按数组类型给元素赋初值), 对动态数组进行存储空间释放。例:p.89,Option Base 1 Private 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), a(3) End Sub,(3) Erase 初始化数组语句,18,格式: For Each Element In 语句块 Exit For 语句块 Next Element 功能:依次(存储次序)处理每一个数组

9、元数,直到数组结束。 说明: Element是Variant变量,它逐个地代表数组中的每一个变量。,(4) For Each-Next 数组循环结构,19,Private 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 + j Next j Next i For Each V In E Print V; Next V End Sub,请注意:只能一行或一列输出,不能以矩阵形式输出。

10、参见p90,例:,处理顺序为该数组的存储顺序按列!,20,6.2 数组的基本操作,6.2.1 数组元素的赋值 6.2.2 数组元素的输出 6.2.3 数组元素的引用,21,6.2.1 数组元素的赋值,1 用赋值语句给单个数组元素赋值。 Dim score(3) as integer score(1)=90 : score(2)=80 : score(3)=68 2 在循环结构中,用赋值语句逐一给数组元素赋值。 Dim a(1 to 6) as integer For i=1 to 6 a(i)=int(99*rnd)+1 Next i 3 在循环结构中,利用Inputbox函数给数组元素赋值。

11、,Dim a(1 to 6) as integer For i=1 to 6 a(i)=inputbox(“请输入a(” Next i Print Print 最大数是; max Print 最小数是; min End Sub,max = 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 If Next i,例5-1 产生12个两位数,从中找出最大值 、最小值,25,例: 有一个一

12、维数组a(20) ,要求按照每行6个元素的格式输出。数组元素为100-200之间的随机数。,Option Base 1 Private Sub Form_Click() Dim a(20) As Integer Dim i As Integer, j As Integer For i = 1 To 20 a(i) = Int(101 * Rnd) + 100 Next i End Sub,For i = 1 To 20 Print a(i) ; j = j + 1 Next i,If j Mod 6=0 Then Print,26,二维数组引用必须用二重循环实现,Option Explicit

13、 Option Base 1 Private Sub Form_Click() Dim i As Integer, j As Integer Dim a(3, 4) As Integer Randomize 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 i End Sub,程序分析: 程序执行时,计数变量i和j的变化为: i=1时,j从1变化到4,结束内层循环,i变成2

14、 i=2时,j从1变化到4,结束内层循环,i变成3 i=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) 正好和二维数组引用的下标一致。,例:二维数组的赋值与输出,For i = 1 To 3 For j = 1 To 4 Picture1.Print a(i, j) ; Next j Picture1.Print Next i,For i = 1 To 3 For j = 1 To 4 s=s Next j Print N

15、ext i Print For i = 1 To 4 For j = 1 To 5 sum = sum + a(i, j) Next j Next I Print 第; i; 行元素之和为:; sum End Sub,Sum=0,Print 第; i; 行元素之和为:; sum,程序执行结果界面,28,有关二维数组的常见问题:,转置 求对角线元素之和 求周边元素之和 求上、下三角形元素之和 求最大、最小元素 二维数组相乘,29,1、分别求一个3*3二维数组的主、付对角线元素之和。 2、求二维数组周边元素之和。,练 习,30,6.3 动态数组,定义:在程序运行过程中,可重新定义大小的数组。 说明

16、语句: Dim 数组名()as 类型 在变量说明部分 ReDim Preserve (维界定义)在可执行语句中,Private Sub Form_Click() Dim Pin( ) As Integer 说明整型的动态数组Pin Dim x as Integer X=Val(Text1.text) ReDim Pin(x) 重新说明数组Pin . End Sub,注意:- Redim 是可执行语句,只能出现在过程中 - 重新定义动态数组时,不能改变数据类型 - 重定义时,维界定义中可以有变量,31,- 如果Redim重定义的数组不存在,则相当于一个说明语句 - 当缺省Preserve参数时,

17、定义后,原来存储在数组中的数据全部丢失,此时可重新定义数组的维数和各维的上下界。 - 当有Preserve参数时,可保留原数组中的数据,但不能改变数组的维数,且只能改变最后一维的维上界。 - 用Dim语句声明过的数组,只是一个空数组,系统并没有给它分配内存空间,此时,不能对数组元素进行存取操作,否则出错。必须用ReDim语句重新定义其大小,系统才给它分配内存,用户才能对此数组元素进行操作。,说 明,32,举例:,Option base 1 Dim dynarry() as integer Dim x as integer,y as integer Dynarry(1)=1 Redim dyna

18、rry(9) Dynarry(1)=1 x=2:y=4 Redim dynarry(x,y) Dynarry(1,1)=1 Erase dynarry Dynarry(1,1)=1,非法语句,出错,给一维数组元素赋值,给二维数组元素赋值,非法语句,出错,33,Option Explicit Option Base 1 Private 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(

19、5) = 5 a(6) = 6 For i = 1 To 6 Print a(i); Next i End Sub,如果省去 Preserve,会怎样?,举 例,34,例:找出1000以内的所有完数并以指定的格式在列表框中输出。所谓完数,是指它的所有的质因子之和等于它本身的数,如6=1+2+3。,解题思路: 第一步:找出确定一个数是完数 的方法; 第二步:从1到1000依次判断。 算法实现: 两层循环: 内层循环用于找出某数 m 的所有因子并相加求和,并在循环结束后依据因子和是否与该数相等来判断该数是否是完数; 外层循环则用于穷举所有1000以内的整数。,Private Sub Command

20、1_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 i End Sub,注意s、k赋初值的位置,s = 0: k = 0,k = k + 1 ReDim Preserve a(k)

21、 a(k) = j,str1 = CStr(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 If End Sub,例6-4:顺序查找。 分析:所谓顺序查找,就是将要查找内容与一组数据中的每个元素,依次进行比较,最终得到所要查找内容“存在”或“不存在”的结论。,55,分析:二分查找是一种快捷有效的查找方法,使用二分查找的前提是数据序列已排好序。

22、 假设有n个数已经按照从小到大的顺序排列,并存放在数组A中,设Top为查找区间的下界下标,初值为1;Bot为查找区间的上界,初值为n;设需要查找的数为x;二分查找的算法如下: (1)求出查找区间的中间位置Mid=Int(Top+Bot)/2) (2)若A(Mid)=x,则找到,结束比较 (3)若A(Mid)x,则表明x在A(Top)到A(Mid-1)区间内,查找区间缩小一半,设置Bot=Mid-1 (5)重复执行以上操作 (6)结束循环的条件有两个:已经找到;找不到-TOPBOT,例6-5:二分查找。,x=8,x=5,57,Left = LBound(a) Right = UBound(a)

23、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 Else Right = Mid - 1 End If Loop If Left = Right Then Print 要查找的; x; 是A(; Mid; ) Else Print 没找到!; x End If,二分查找,58,例6-8 统计字母(不分大小写)在文本中出现的次数,P109,算法分析:建立一个有26个元素的

24、数组,分别保存每个字母出现的次数。下标即是该字母是第几个字母.,Private Sub Command1_Click() Dim St As String, Idx As Integer, I As Integer, Js As Integer Dim A(0 To 25) As Integer Dim Ch As String * 1, L As Integer St = Text1.Text: L = Len(St) End Sub,For I = 1 To L Ch = UCase(Mid(St, I, 1) If Ch = A And Ch = Z Then Idx = Asc(Ch)

25、 - Asc(A) A(Idx) = A(Idx) + 1 End If Next I,For I = 0 To 25 If A(I) 0 Then Js = Js + 1 Text2 = Text2 & Chr(I + Asc(A) & : & Str(A(I) & If Js Mod 5 = 0 Then Text2 = Text2 & Chr(13) & Chr(10) End If Next I,控制打印每行统计字符的个数,转换为大写字符,求该字符与“A”的间隔位置,以此作为下标,例6-10 找出5000以内的亲密对数。所谓亲密对数,是指甲数的所有因子之和等于乙数,而乙数的所有因子之和

26、等于甲数。如:220的因子和:1+2+4+5+10+11+20+44+55+110=284 284的因子和:1+2+4+71+142=220,算法分析:采用二层循环结构. 外层循环:遍历15000以内的所有整数,采用FOR循环,计数控制变量i既控制循环执行的次数,又可作为甲数。 内层循环:求出某数的所有因子,并求和,因为每个数的因子数不确定,所以用动态数组保存因子。 外层循环中:先求出i的因子之和sum1,然后再求出sum1的因子之和sum2,判断sum2是否等于 i,若相等,则输出i和sum1及其因子,不等则继续判断i+1。,61,例 6-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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论