




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 数 组,1,数组的基本概念,数组一组相同类型的变量,使用同一个名字来组织 一个班(48个)学生的成绩 Score 30种图书的名字 BookName 100种商品的价格 Cost 数组元素数组中的各个变量 使用唯一的下标(索引)来标识 Score(1)、 Score(2)Score(48) BookName(0) BookName(29) Cost(0) Cost(99) 数组的长度数组元素的个数,数组的基本概念,数组的维数 一维数组 多维数组 二维数组 三维数组 ,(2,5,7,9,10,4,8),行,行列,行列层,数组的基本概念,数组的分类 按维数分: 一维、二维、三维 按在内存分
2、配是否可变分: 静态数组 动态数组(可重新定义数组的维数和长度),静态数组的声明-一维数组,格式:Dim|Public|Static 数组名(下标) As 类型名,只能由常数表示,Dim Score(1 to 48) As Integer Dim Cost(100) As Single Static BookName(30) As String,下标的格式,下界 to 上界 省略下界,则默认为0 如:Dim Score(1 to 48) As Integer数组元素: Score(1)、 Score(2)Score(48) Dim Cost(100) As Single 数组元素: Cost(
3、0)、 Cost(1) Cost(100),格式:Dim 数组名(下标1,下标2) As 类型名 二维数组: Dim db(3,1 to 5) As Integer Public N(5,5) As Single 三维数组: Dim Tr(3,4,4) As Long Dim A(1 to 5,1 to 5,1 to 5) As Long 元素: 数组db共有4行5列4520个元素,静态数组的声明-多维数组,二维数组在内存中的存放,以列为单位存放!,动态数组的声明,格式:Dim 数组名( ) As 类型名 如:Dim s( ) As Single,声明时未指定数组的大小,动态数组在需要时使用R
4、edim语句指定维数和大小,格式:Redim Preserve 数组名(下标1,下标2)As 类型名 如:Redim s(10) Redim s(2,3),下标可以是常量、变量和表达式; 与静态数组的声明不同之处! Dim a() As Single, i As Integer k=5 Redim a(3) Redim a(k) Redim a(k*3+1) ,Redim的注意点,As 类型名可以省略 不省略则必须与Dim语句声明的类型一致; Preserve保留数组中原有的数据 使用Preserve的Redim只能改变最后一维的大小且不能改变维数 Dim b() As Integer Red
5、im b(1,2) Redim Preserve b(1,4),二维数组按列存放,Redim的注意点,Redim语句只能出现在过程内部原因:是VB的执行语句,不是声明语句 Private Sub Form_Click() Dim A( ) As Integer, i As Integer Print “一维数组:” ReDim A(1 To 10) 重新指定数组A为一维数组,大小为10 For i = 1 To 10 使用一维数组A A(i) = Int(Rnd * 101) Print A(i), Next i PrintEnd Sub,若没有Redim语句而直接使用数组的元素,则:无论引用
6、哪个元素都将出错, 出错类型为:下标越界,Redim的注意点,Private Sub Form_Click() Dim A( ) As Integer, i As Integer Print “二维数组:” ReDim A(1 To 9, 1 To 5) 重新指定数组A为二维数组,大小为95 For i = 1 To 9 使用二维数组A For j = 1 To 5 A(i, j) = 10 + Int(Rnd * 21) Print A(i, j), Next j Print Next i End Sub,二重循环:i控制行,j控制列,但是切不可思维定势!,动态数组求某个正整数的所有因子,X
7、 : 27,For I=1 to 13,因子个数k 动态数组a,x=val(text1.text)k=0 ,目前没有因子,Private Sub Command1_Click() Dim a() As Integer :k = 0:x = Val(Text1.Text),For i = 1 To x 2 If x Mod i = 0 Then k = k + 1 :ReDim Preserve a(k) a(k) = i End If Next i,动态数组求某个正整数的所有因子,要求将输入的10进制正整数 根据用户的输入转换为n进制 n=2,8,16,动态数组进制转换 102/8/16,10
8、1100101,357,2,.1,178,2,.0,89,2,.1,44,2,.0,22,2,.0,11,2,.1,5,2,.1,2,2,.0,1,2,.1,0,10101,21,2,.1,10,2,.0,5,2,.1,2,2,.0,1,2,.1,0,动态数组进制转换 102/8/16,33,27,8,.3,3,8,.3,0,1F,31,16,.15,1,16,.1,0,动态数组进制转换 102/8/16,假设使用动态数组 bin() as string 存储每 一个余数 变量k代表余数的个数 Num代表要转换的10进制正整数 N代表要转换为的进制,动态数组进制转换 102/8/16,K=0
9、目前余数个数为0 Do Loop unitl num=0 当商为0结束循环,求出余数,存放在bin数组中 num=numn,将数组元素从尾到头组合,输出,数量 k=k+1 数组bin重新定义大小 bin(k)=num取n的余数,动态数组进制转换 102/8/16,问题:求得的余数是10进制的,对于16进制而言, 要完成10A 11B 15F 的转换,解决:使用一个字符数组chr dim ch (15) as string来完成,利用下标与数组元素内容的对应完成转换,动态数组进制转换 102/8/16,k = 0 Do k = k + 1 ReDim Preserve bin(k) r = nu
10、m Mod n bin(k) = ch (r) num = num n Loop Until num = 0,For i = k To 1 Step 1 颠倒输出 ch = ch + bin(i) Next i,动态数组进制转换 102/8/16,Option Base语句,格式:Option Base n ( n : 0 , 1 ) 如:Option Base 1 位置:模块的通用部分 跟Option Explict语句一样是设置的功能语句; 如: Option Base 1 Dim a(5) 元素a(1)a(5) Dim b(3,4) 3行4列,b(1,1)b(3,4),Option Ba
11、se 1Dim a(2 To 5) 元素a(2)a(5)Dim b(3,4) 3行4列,b(1,1)b(3,4),LBound(aname , d),Private Sub Form_Click( ) Dim A(5) As Integer , B(3 to 8,200 to 208) Print Lbound(A), Lbound(B,1),Lbound(B,2) End Sub,0 3 200,UBound(aname , d),Private Sub Form_Click( ) Dim A(5) As Integer , B(3 to 8,200 to 208) Print Ubound
12、(A), Ubound(B,1),Ubound(B,2) End Sub,5 8 208,数组的基本操作,数组的输入 数组的输出 数组的查找 数组的排序 数组的插入 数组的删除,数组的输入,给数组元素赋值 (一般采用循环结构 ) 键盘读入 使用InputBox()函数实现 静态数组Dim A(1 To 10) As Integer, i As IntegerFor i = 1 To 10 A(i) = Val(InputBox(“请输入第” Next L Next K,A. 1 2 1 B. 1 2 3 C. 2 4 6 D. 1 3 1,练 习,Dim A(1 To 100) As Inte
13、ger Dim B(1 To 10, 1 To 10 ) As Integer For I=1 To _ A(I)=Int(Rnd*5+1) Next I For I=1 To _ For J=1 To _ B(I,J)= _ Print B(I,J); Next J Print Next I,以下程序代码将具有100个元素的数组A按每行10个数的形式赋值给二维数组B。即将A(1)到 A(10)依次赋值给B(1,1)到B(1,10);将A(11)到A(20)依次赋值给B(2,1)到B(2,10);.将A(91)到A(100)依次赋值给B(10,1)到B(10,10)。,100,10,10,A(
14、I-1)*10+J),数组的查找,在已知数组中寻找是否存在关键值为Key的元素 若找到则给出元素所在的位置,否则给出失败信息 1.顺序法查找 2.二分法查找,顺序法查找,基本思想: 从第一个元素开始逐个判断,直到找到或数组结束 实现 - a(1)a(N) For i = 1 To N If a(i) = key Then Exit For Next i If i = N + 1 Then Print “数组中没有元素” & key Else Print key & “是数组中的第” & i & “个元素” End If,二分法查找 (折半查找),仅适用于有序数组! 基本思想:在下标区间left
15、,right间,用mid将区间一分为二,根据mid位置元素和key的大小关系,确定下一次查找区间, amidkey 则 right=mid-1 amid=key 找到! amidkey 则 left=mid+1,结束条件: 找到 未找到(leftright),Left = 1 : Right = N Do While Left Key Then Right = Mid 1 Else Left = Mid + 1 End If Loop If Left Right Then Print “数组中没有元素” & Key Else Print Key & “是数组中的第” & Mid & “个元素”
16、 End If,求一个二维数组中的鞍点元素,鞍点元素 该元素在所在行中最大, 且所在列中最小, 它可能存在,也可能不存在,Private Sub Form_Click() Dim a(3, 3) As Integer, i As Integer, j As Integer Dim maxvr As Integer, col As Integer, flg As Integer a(1, 1) = 1: a(1, 2) = 9: a(1, 3) = 6 a(2, 1) = 15: a(2, 2) = 10: a(2, 3) = 4 a(3, 1) = 4: a(3, 2) = 12: a(3,
17、3) = 18 End Sub, 初始化数组,求一个二维数组中的鞍点元素,针对每一行循环(For i = 1 To 3) 找出该行最大的元素 判断其是否在一列中最小 如果最小,打印出来,如果所有行都不存在鞍点元素, 则打印 不存在,求一个二维数组中的鞍点元素,2) 找出该行最大的元素,maxvr = a(i, 1) For j = 2 To 3 If maxvr a(i, j) Then maxvr = a(i, j) End If Next j,2) 判断其是否在一列中最小,For j = 1 To 3 If maxvr a(j, ?) Then Exit For End ifNext j,
18、问题1: 只是求出了该行的最大值 忘了记载下他所在的列号,求一个二维数组中的鞍点元素,问题1解决:利用变量col,记载最大值所在的列号。,maxvr = a(i, 1) : col = 1 For j = 2 To 3 If maxvr a(i, j) Then maxvr = a(i, j) : col = j End If Next j,求一个二维数组中的鞍点元素,2) 判断其是否在一列中最小 3) 如果最小,打印出来,For j = 1 To 3 If maxvr a(j, col) Then Exit For Next j If j = 4 Then Print a( & i & ,
19、& col & )= & a(i, col) End If,求一个二维数组中的鞍点元素,For i = 1 To 3 找出该行最大的元素 判断其是否在一列中最小 如果最小,打印出来 Next I,求一个二维数组中的鞍点元素,如果所有行都不存在鞍点元素,则打印 不存在,问题2:如何判断所有行都不存在鞍点元素,使用变量flg, 如果刚才循环中每一行找到一个鞍点元素,就flg=1 循环结束后,如果还是flg=0, 则表示不存在鞍点元素,求一个二维数组中的鞍点元素,For j = 1 To 3 If maxvr a(j, col) Then Exit For Next j If j = 4 Then
20、Print a( & i & , & col & )= & a(i, col) End If,flg = 1,求一个二维数组中的鞍点元素,For i = 1 To 3 找出该行最大的元素 判断其是否在一列中最小 如果最小,打印出来,并且改变flg Next I 如果所有行都不存在鞍点元素, 则打印 不存在,If flg = 0 Then Print “鞍点元素不存在”,求一个二维数组中的鞍点元素,数组的排序,将一维数组按各元素值的一定规律(升序或降序 )重新排放的过程 1.冒泡法排序 2.选择法排序,If a(j) a(j + 1) Then temp = a(j) a(j) = a(j +
21、1) a(j + 1) = temp End If,冒泡法排序,基本思想: 类似于水泡,每趟排序将一个最大(小)值沉到最后 使用相邻元素的两两比较实现每趟排序,元素:(12、7、3、10、18、15、1、5、25、9),12,A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9),A(10),7,3,10,18,15,1,5,25,9,12,7,12,3,10,12,18,12,15,18,1,18,5,18,18,25,25,9,第1趟,3,7,7,10,10,12,12,15,1,15,5,15,15,18,9,18,3,25,结论:N个元素需要N1趟排序
22、,For 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 j Next i,冒泡法排序,选择法排序,基本思想: 对每一趟排序,都在数组的无序部分找到一个最小(大)值放在无序部分的第一个 即:每趟确定一个数的位置,For i = 1 To N - 1 For j = i+1 To N If a(i) a(j) Then temp = a(i) a(i) = a(j) a(j) = temp End If Next j Ne
23、xt i,注意:与冒泡法的区别!,数组的插入,已知一数组和一待插入的数据e,根据要求将其插入到数组的相应位置。 1.已知插入位置k 2.在有序数组中插入,已知插入位置k,在数组a的第k个位置插入一元素e,已知插入位置k, 数组长度加一(动态数组),N = N + 1 数组的长度加1 ReDim Preserve a(N),保留原有的数组元素,在最后添加一个元素,若使用静态数组,则需在声明时将添加的元素空间事先考虑在内。, 将数组中a(k)a(N)向后移一个元素,For i = N To k + 1 Step -1 a(i) = a(i - 1) Next i,问题:为什么移动要从最后一个位置开
24、始向前处理?,答:若从第k个位置向后处理, 则会把未处理数据覆盖。, 将e放入a(k)位置 a(k) = e,已知插入位置k,在有序数组中插入,已知数组b有序,插入元素e后,使得数组保持原序 分析:(设b中元素按从小到大排列),e,步骤:找到插入位置 按已知位置插入的方法实施插入操作, 找到插入位置,则:b(k)eb(k+1) 即:b(k+1)为第一个比e大的元素,For k = 1 To N If b(k) e Then Exit For Next k k为插入位置,在有序数组中插入,若从后往前找呢?, 按已知位置插入的方法实施插入操作,N = N + 1 ReDim Preserve b(
25、N) For i = N To k + 1 Step -1 b(i) = b(i - 1) Next i b(k) = e,在有序数组中插入,数组的删除,已知一数组,根据要求将其中某个位置的元素删除 要求数组元素保持连续存放,步骤: 将数组中a(k+1)a(N)向前移一个元素 数组长度减一,将数组中a(k+1)a(N)向前移一个元素,For i = k To N - 1 a(i) = a(i + 1) Next i,问题:1.为什么移动不使用向前处理? 2.这里为什么不使用a(i-1)=a(i)?,答:会把未处理数据覆盖,答:结合i的取值,不是处理a(k+1)a(N),数组长度减一,N = N
26、 - 1 ReDim Preserve a(N),数组的删除,删除整个数组Erase函数 格式: Erase 数组名1,数组名2 功能:重新初始化静态数组的元素 释放动态数组的存储空间 如:Dim a(10) As Integer,Dim b() As Integer Erase a,b 将a(0)a(10)都置为0 释放b数组空间,数组的删除,Private Sub Form_Click( ) Dim A(5) As Integer , B( ) As Integer A(1)=1: A(2)=2: A(3)=3: Redim B(4): B(2)=9 Print A(1),A(2),A(3
27、),B(2) Erase A, B Print A(1),A(2),A(3) End Sub,B(2),数组的删除,约瑟夫问题,15个学生,从1到15号排列,依次1-3报数,报到3者出圈,直到所有学生都出列为止,显示出学生出列的顺序,问题1,如何解决15个学生的表示?,dim Old_No(15) as integer Old_No(1)代表1号学生, Old_No(2)代表2号学生,,问题2,如何表示出列还是在队伍中,若在队列中,Old_No(1)=1,若出列 ,Old_No(1)=0 ,问题3,如何显示出出列的顺序,Dim New_No(15) As Integer, 第1个出列的学生的编
28、号存放在New_No(1) 中 第2个出列的学生的编号存放在New_No(2) 中 ,约瑟夫问题,约瑟夫问题,认为报数13为一轮,每一轮出列1名,总共要进行15轮,For I= 1 to 15 还没有人报数 找到报到3的学生 将该学生出列,并且New_No(i)=它的编号 Next i,约瑟夫问题,使用变量idx代表当前报数的学生的编号 使用count来代表当前报的数,还没有人报数 2) 找到报到3的学生,count = 0 还没有人报数,Do While count 3 当还没有报到3 idx指向下个报数的学生,count+1 如果下个学生已经出列,跳过他的位置 Loop,idx = idx + 1 下一个人报数 If idx 15 Then idx = 1,coun
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年营养师考试试题及答案
- 2025年信息系统项目的合作模式试题及答案
- 2025年度“全国安全生产月”《安全知识》培训备考模拟题及答案
- 2025年教师师德师风考试模拟题库及答案解析
- 一般工业固废分中心项目环境影响评价报告表
- 新建输送分拣设备及输送带项目报告表
- 2025年“互联网+”开放合作公需科目考试试题及答案
- 体育器材知识产权保护与电子商务平台责任研究考核试卷
- 光学玻璃抗冲击性能优化设计考核试卷
- 印刷企业品牌宣传的跨渠道整合营销案例分析考核试卷
- 2025年医院感染管理办法试题与答案
- 小型农场基础规划方案(3篇)
- 角膜内皮失代偿个案护理
- 胃癌课件完整版本
- 《陆上风电场工程设计概算编制规定及费用标准》(NB-T 31011-2019)
- (高清版)DZT 0426-2023 固体矿产地质调查规范(1:50000)
- 2022年十堰市丹江口市社区工作者招聘考试试题
- 钢轨超声波探伤课件
- 脑卒中专用生活质量量表
- 北京积分落户解读课件
- 长沙有色院浮选柱介绍课件
评论
0/150
提交评论