利用数组可以有效地存储和处理成批数据本章主要内容数组课件.ppt
第6章,数组,1,感谢你的观看,2019年8月21,利用数组可以有效地存储和处理成批数据 本章主要内容 数组的概念 数组的声明和应用 动态数组 For Each.Next循环语句 控件数组 程序举例,第6章 数 组,2,感谢你的观看,2019年8月21,6.1.1 数组与数组元素 简单变量用一个变量名标识,不同的变量使用不同的变量名表示。处理成批的数据时,必须使用数组来处理表示100个学生的成绩,采用简单变量来表示:s1,s2,s3,s99,s100 采用数组来表示:t(0),t(1),t(2),t(98),t(99)t(k)(k=0,1,2,99)为数组元素(或称下标变量),它表示第k个学生的成绩,k称为下标变量的下标 数组的一个主要特点是通过下标(相当于索引)来引用数组元素,6.1 数组的概念,3,感谢你的观看,2019年8月21,例如计算这100个学生成绩的平均分,可用:S0 For k=0 To 99 S=S+t(k)累加分数 Next k Aver=S/100 求平均分,4,感谢你的观看,2019年8月21,数组是一组按一定顺序排列的数据的集合 例如,学生成绩t(0),t(1),t(99)是一个数组 三元一次方程组的系数矩阵 a11 a12 a13 A a21 a22 a23 a31 a31 a33 也是一个数组 数组名(不能与简单变量同名);数组类型,5,感谢你的观看,2019年8月21,又称有序的变量下标变量 默认情况下,下标从0开始,option base n 必须在定义数组前使用。例如,由一行共5个元素组成的数组x,它的5个下标变量为:x(0)x(1)x(2)x(3)x(4)由三行四列元素组成的数组y,它的12个下标变量可表示为:y(0,0)y(0,1)y(0,2)y(0,3)y(1,0)y(1,1)y(1,2)y(1,3)y(2,0)y(2,1)y(2,2)y(2,3)下标变量与简单变量具有基本相同的性质和作用,数组元素,6,感谢你的观看,2019年8月21,下标用来标明该下标变量在数组中的位置 下标可以是常数值,也可以是变量(包括下标变量)或数值表达式 例如:若x(2)=10,k=2,则y(x(2)就是y(10),y(x(2)+k)就是y(12)只要有规则地改变下标值,就可以很方便地使下标变量(如a(i)成为所需要的具体下标变量 数组的维数,6.1.2 下标和数组的维数,7,感谢你的观看,2019年8月21,6.2.1 数组声明语句 使用数组之前,一般需要定义数组,以便让系统分配相应的存储单元。格式为:Dim 数组名(下界1 to上界1,下界2 to上界2)As 数据类型 功能:指定数组的维数、各维的上下界和数据类型 举例:dim a%(10),b!(2 t0 8),c#(15),b(3,4)as Long Dim Sum(10)As Long 下标号从010,共11个元素Dim Ary(1 to 20)As Integer 下标号从120,共20个元素Dim d(1 to 5,1 to 10)As Double 定义二维数组 dim c(-2 to 2)as string*20 还可以使用Public、Static、Private等语句来声明数组,6.2 数组的声明和应用,8,感谢你的观看,2019年8月21,数组下标测试函数,Ubound(数组名,维)Lbound(数组名,维)Dim y(1 to 12,5 to 20,-3 to 6)Print Lbound(y,1),Ubound(y,1)Print Lbound(y,2),Ubound(y,2)Print Lbound(y,3),Ubound(y,3),9,感谢你的观看,2019年8月21,设定下界的方法 Option Base 1 设定下界为1 Dim Data(10)As Single 下标号从110 6.2.2 Array函数 使用Array函数可以为数组元素赋值 示例 Dim D As Variant 定义数组名(变体类型)D=Array(1,2,3,4)执行结果:1D(0),2D(1),3D(2),4D(3),10,感谢你的观看,2019年8月21,数组刷新语句可以作用于动态数组和静态数组 格式:Erase 数组名,数组名 功能:该语句用来清除静态数组的内容,或者释放动态数组占用的内存空间 例如:Dim Array1(20)As Integer Dim Array2()As Single ReDim Array2(9,10)Erase Array1,Array2 对静态数组,Erase语句将数组重新初始化;对动态数组,Erase语句将释放动态数组所使用的内存,6.3.2 数组刷新语句(Erase),11,感谢你的观看,2019年8月21,Erase 数组名,数组名,重新对静太数组进行初始化,数值置0,字符为空字符串,而原数组存在。释放动态数组存储空间,原有数组不再存在。变体数组,每个元素重新置为空。,12,感谢你的观看,2019年8月21,数组的引用和赋值:,Option Base 1 Dim B1 As VariantB1=Array(89,96,81,67,79,90,63,85,95,83)y=B1(3)C=B1(5)+B1(7)数组的引用下标不能越界数组的赋值:使用循环语句:,13,感谢你的观看,2019年8月21,dim k(10)For k=0 To 10 t(k)=2*k+1 Next kDim d(5)As Integer For i=1 To 5 输入成绩 d(i)=Val(InputBox(请输入第&Str(i)&_ 个学生的成绩,输入成绩)Next i,14,感谢你的观看,2019年8月21,数组输出For i=1 To 5 Print d(i);Next i,15,感谢你的观看,2019年8月21,与前面的循环语句For.Next类似,都是用来执行指定重复次数的循环。但For Each.Next语句专门作用于数组或对象集合中的每一成员。语法格式:For Each 成员 In 数组名 循环体 Exit For Next 成员“成员”是一个Variant变量,它实际上代表数组中每一个元素 本语句可以对数组元素进行读取、查询或显示,它所重复执行的次数由数组中元素的个数确定 在不知道数组中元素的数目时非常有用,6.4 For Each.Next循环语句,16,感谢你的观看,2019年8月21,Private Sub Form_Load()Dim a(1 To 10)As Long,sum As Long,t As Long Dim n As Integer Show t=1 For n=1 To 10 t=t*n a(n)=t Next n sum=0 For Each x In a sum=sum+x Next x Print 1!+2!+3!+10!=;sumEnd Sub,输出结果:1!+2!+3!+10!4037913,例6.6 求1!+2!+10!的值,17,感谢你的观看,2019年8月21,两种形式的数组:静态数组和动态数组 静态数组是指数组元素的个数固定不变;动态数组的元素个数,在程序运行时可以改变 动态数组可以在运行过程中改变数组的大小,提高存储区的使用效率 6.3.1 建立动态数组 建立动态数组的步骤:第一步:声明一个没有下标(或称空维数)的数组为动态数组 第二步:在过程中用ReDim语句重新定义带下标的动态数组 ReDim语句格式:ReDim Preserve 数组名(下界1 T0 上界1,下界 T0 上界2)As数据类型 功能:重新定义动态数组,按定义的上下界重新分配存储单元,6.3 动态数组,18,感谢你的观看,2019年8月21,声明F为动态数组的示例:Private Sub Command1_Click()Dim F()As Integer 声明一个整型动态数组 Size=20 ReDim F(Size)End Sub 每次执行ReDim时,系统会清除指定数组的内容 若采用:ReDim Preserve F(Size)则能保留数组中原有的数据,19,感谢你的观看,2019年8月21,Private Sub Form_Load()Dim a()As Integer Show ReDim a(800)k=0 For x=200 To 600 Step 3 If x Mod 8=0 Then k=k+1 a(k)=x End If Next x ReDim Preserve a(k)For i=1 To k Print a(i)Next iEnd Sub,例6.5 ReDim语句应用示例,20,感谢你的观看,2019年8月21,两类数组:一般数组和控件数组 6.5.1 控件数组的概念 控件数组是一组具有相同名称、类型和事件过程的控件 例如,Label1(0),Label1(1),Label1(2),但Label1,Label2,Label3,不是控件数组 控件数组具有以下特点:(1)相同的控件名称(即Name属性);(2)控件数组中的控件具有相同的一般属性;(3)所有控件共用相同的事件过程。以下标索引值(Index)来标识各个控件,第一个下标索引号为0,6.5 控件数组,21,感谢你的观看,2019年8月21,6.5.2 控件数组的建立,建立控件数组有三种方法:(1)给控件起相同的名称(2)将现有的控件复制并粘贴到窗体等上面(3)将控件的Index属性设置为非Null数值 6.5.3 控件数组的使用,22,感谢你的观看,2019年8月21,例6.7 按图6.4设计窗体,其中一组(共5个)单选按钮构成控件数组,要求当单击某个单选按钮时,能够改变文本框中文字的大小,控件数组,23,感谢你的观看,2019年8月21,设计步骤:(1)设计控件数组Option1,其中包含5个单选按钮对象 具体操作方法:画出第一个单选按钮控件,名称采用默认的Option1。此时该控件处于选定状态。单击工具栏上的“复制”按钮(或按Ctrl+C)。单击工具栏上的“粘贴”按钮(或按Ctrl+V),此时系统弹出一个如图6.5所示的对话框 单击“是”,就建立一个控件数组元素,其Index属性为1,而已画出的第一个控件的Index属性值为0。通过鼠标拖放可以调整新控件的位置,24,感谢你的观看,2019年8月21,继续单击“粘贴”按钮(或按Ctrl+V)和调整控件位置,可得到控件数组中的其他三个控件,其Index属性值分别为2,3和4(即从上而下为0,1,2,3,4)设置控件数组各元素(从上而下)的Caption属性分别为10,14,18,24和28(2)建立一个文本框Text1,其Text属性设置为“控件数组的使用”。再建立一个标签,其Caption属性为“字号控制”(3)编写程序代码,25,感谢你的观看,2019年8月21,Private Sub Form_Load()Option1(0).Value=True 选定第一个单选按钮 Text1.FontSize=10 设定文本框中的字号End SubPrivate Sub Option1_Click(Index As Integer)Select Case Index 系统自动返回Index值 Case 0 Text1.FontSize=10 Case 1 Text1.FontSize=14 Case 2 Text1.FontSize=18 Case 3 Text1.FontSize=24 Case 4 Text1.FontSize=28 End Select End Sub,26,感谢你的观看,2019年8月21,例6.1 输入某小组5个同学的成绩,计算总分和平均分(取小数后一位)本例利用InputBox函数来输入成绩,输入完毕后经过计算,再采用Print直接在窗体上输出结果,6.2.3 数组的应用,27,感谢你的观看,2019年8月21,Private Sub Form_Load()Dim d(5)As Integer Dim i As Integer,total As Single,average As Single Show For i=1 To 5 输入成绩 d(i)=Val(InputBox(请输入第&Str(i)&_ 个学生的成绩,输入成绩)Next i total=0 For i=1 To 5 计算总分和平均分 total=total+d(i)Next i average=total/5 Print 总分:&total Print 平均分:&Format(average,#.0)End Sub,28,感谢你的观看,2019年8月21,程序中,先通过Dim语句为数组d定义维数及下标范围,也即为数组安排一块连续的内存存储区,但这并不意味着内存里该数组已建立了应有的内容 本例中输入数组中的数据是由InputBox函数来实现的,共循环了五次,输入的五个数依次赋值给下标变量d(1)d(5)建立了数组中的数据后,就可以按要求进行处理,29,感谢你的观看,2019年8月21,(1)创建应用程序的用户界面和设置对象属性,例6.2 输入10名学生的成绩,求出最高分和最低分,30,感谢你的观看,2019年8月21,功能要求:通过Array函数输入10个分数;单击“查找”按钮(Command2)后,开始查找最高分和最低分,找到后显示在标签Label1上 Option Base 1 Dim score As Variant Private Sub Form_Load()Label1.Caption=单击“查找”按钮开始查找最高分和最低分 score=Array(89,96,81,67,79,90,63,85,95,83)End Sub,(2)编写程序代码,31,感谢你的观看,2019年8月21,Private Sub Command1_Click()Dim max As Integer,min As Integer max=score(1)设定初值 min=score(1)For i=2 To 10 If max score(i)Then 找最低分 min=score(i)End If Next i Chr(13)起换行作用 Label1.Caption=最高分:+Str(max)+_ Chr(13)+最低分:+Str(min)End Sub,32,感谢你的观看,2019年8月21,例6.3 分别计算5个学生和3门课的平均分,某学习小组有5名学生,成绩如表6.1所示 分析:用一个二维数组a(5,3)来描述。程序中设置两重循环,用以实现每行和每列上的累加。本例采用赋值语句来输入学生成绩,并采用Print直接在窗体上输出结果,r=1 c=1,2,3r=2 c=1,2,3r=3 c=1,2,3r=4 c=1,2,3r=5 c=1,2,3,求5个学生的平均分 下标使用情况,33,感谢你的观看,2019年8月21,Option Base 1 Private Sub Form_Load()Dim a(5,3)As Integer Dim r As Integer,c As Integer,s As Integer k=Array(数学,英语,计算机)输入课程名 a(1,1)=69:a(1,2)=89:a(1,3)=74 输入学生成绩 a(2,1)=94:a(2,2)=80:a(2,3)=90 a(3,1)=57:a(3,2)=62:a(3,3)=73 a(4,1)=98:a(4,2)=94:a(4,3)=90 a(5,1)=73:a(5,2)=76:a(5,3)=63,例6.3,34,感谢你的观看,2019年8月21,Show Print 学生,平均分“输出20个减号“-”Print String(20,-)For r=1 To 5 s=0 累加前清0 For c=1 To 3 累加同一行数据 s=s+a(r,c)Next c Print r,Format(s/3,#.0)Next r Print,Print 课程,平均分 Print String(20,-)For c=1 To 3 s=0 For r=1 To 5 累加同一列数据 s=s+a(r,c)Next r Print k(c),Format(s/5,#.0)Next cEnd Sub,35,感谢你的观看,2019年8月21,程序运行结果,36,感谢你的观看,2019年8月21,解题方法:(1)利用Int(91*Rnd+10)产生值为10到100的随机整数 使用Randomize得到不同的随机数序列(2)按值从小到大进行排序。排序方法:将10个数放入数组a中,对下列下标变量进行排序处理:a(1),a(2),a(3),,a(10)从这10个下标变量中,选出最小值,通过交换把该值存入a(1)中 除a(1)之外(a(1)已存放最小值),从其余9个下标变量中选出最小值(即10个数中的次小值),通过交换把该值存入a(2)中 选出a(3)a(10)中的最小值,通过交换,把该值存入a(3)中 重复上述处理,至a(8),可使a(1)a(8)按小到大排列 第9次处理,选出a(9)及a(10)中的最小值,通过交换把该值存入a(9)中,此时a(10)存放的就是最大值,例6.4 随机产生十个10100的整数,用“选择排序法”按值从小到大顺序排序,最后输出结果,37,感谢你的观看,2019年8月21,排列要求 小 大 示例:a(1)a(2)a(3)a(4)90 64 65 59 1.a(1)与a(2)a(4)比较,选出最小值,结果 59 90 65 64 2.a(2)与a(3)a(4)比较,选出次小值,结果 59 64 90 65 3.a(3)与a(4)比较,选出较小值,结果 59 64 65 90 i=1 j=2,3,4 i=2 j=3,4 i=3 j=4,For i=1 to 3 For j=i+1 to 4 Next jNext i,程序结构,38,感谢你的观看,2019年8月21,完成上述比较及排序处理过程,可以采用两重循环结构,外循环的循环变量i从1到9,共循环九次;内循环的循环变量j从i+1到10。本例采用默认的用户界面,所需数据由随机函数产生,处理后结果信息通过Print方法直接输出在窗体上。Private Sub Form_Load()Show Randomize Dim a(1 To 10)As Integer Print 原始数据:For i=1 To 10 产生10个随机数 a(i)=Int(91*Rnd+10)Print a(i);Next i,(3)程序结构,39,感谢你的观看,2019年8月21,Print:Print For i=1 To 9 For j=i+1 To 10 If a(i)a(j)Then t=a(i):a(i)=a(j):a(j)=t 交换位置 End If Next j Next i Print 排序结果:For i=1 To 10 Print a(i);Next i End Sub,40,感谢你的观看,2019年8月21,改写中间程序段“For i=1 To 9”“Next i”(共7个程序行)For i=1 To 9 k=i k用来记录每次选择的最小值的下标 For j=i+1 To 10 If a(k)a(j)Then k=j End If Next j t=a(k):a(k)=a(i):a(i)=t 交换位置 Next i 变量k记录每一次选出的最小值的下标,在本次比较结束后,使a(i)与a(k)一次换位即可,41,感谢你的观看,2019年8月21,6.6 程序举例,例6.8 查找考场教室号 某课程统考凭准考证入场,考场教室安排如表6.2。编制程序,查找准考证号码所对应的教室号码(1)分析:为便于查找,通过二维数组rm建立这两种号码对照表。数组rm由Form_Load事件过程来建立,它的每一行存放了一个教室资料(包含准考证号码范围和教室号码)。当判断到某个给定准考证号码落在某一行的准考证号码范围内时,则该行中的教室号码为所求(2)创建应用程序的用户界面和设置对象属性,42,感谢你的观看,2019年8月21,(3)编写程序代码 功能要求:用户在文本框Text1中输入准考证号码,单击“查找”按钮(Command1)后,则查找出对应的教室,并将教室号码输出在文本框Text2中 Dim rm(6,3)As Integer Private Sub Form_Load()输入数组数据 rm(1,1)=2101:rm(1,2)=2147:rm(1,3)=102 rm(2,1)=1741:rm(2,2)=1802:rm(2,3)=103 rm(3,1)=1201:rm(3,2)=1287:rm(3,3)=114 rm(4,1)=3333:rm(4,2)=3387:rm(4,3)=209 rm(5,1)=1803:rm(5,2)=1829:rm(5,3)=305 rm(6,1)=2511:rm(6,2)=2576:rm(6,3)=306 End Sub,43,感谢你的观看,2019年8月21,Private Sub Command1_Click()Dim no As Integer,flag As Integer flag=0 查找标记,0表示未找到 no=Val(Text1.Text)For i=1 To 6 If no=rm(i,1)And no=rm(i,2)Then Text2.Text=rm(i,3)显示教室号码 flag=1 1表示找到 Exit For End If Next i If flag=0 Then Text2.Text=无此准考证号码 End If Text1.SetFocus 设置焦点 End Sub,44,感谢你的观看,2019年8月21,某学习小组10名学生的成绩情况如表6.3所示,现要求采用折半查找法,通过学号查询学生成绩(1)分析:折半查找法也称对半查找法,是一种效率较高的查找方法。对于大型数组,它的查找速度比顺序查找法(例6.8采用的是顺序查找法)快得多 在采用折半查找法之前,要求将数组按查找关键字(如本例的学号)排好序(从大到小或小到大),例6.9 采用折半查找法查询学生成绩,45,感谢你的观看,2019年8月21,先从数组中间开始比较,判别中间的那个元素是不是要找的数据:是,则查找成功 否,若被查找的数据是在该数组的上半部,则从上半部的中间继续查找,否则从下半部的中间继续查找 照此进行下去,不断缩小查找范围 至最后,因找到或找不到而停止查找 对于n个数据,若用变量Top、Bott分别表示每次“折半”的首位置和末位置,则中间位置M为 M=Int(Top+Bott)/2)这样就将Top,Bott分成两段,即Top,M-1和M+1,Bott,若要找的数据小于由M指示的数据,则该数据在Top,M-1范围内,反之,则在M+1,Bott范围内,折半查找法的过程,46,感谢你的观看,2019年8月21,折半查找法的过程,学号 h(),1201120212031205120612071209121012111215,先排好序,数学 d(x,1)语文 d(x,2),92 8678 7183 7467 7571 5562 8098 8399 8057 6780 78,m=Int(Top+Bott)/2)要找的学号No h(m)=m为所求 m Top=m+1,Top=1,Bott=10,47,感谢你的观看,2019年8月21,(2)创建应用程序的用户界面和设置对象属性(3)编写程序代码,48,感谢你的观看,2019年8月21,Dim h(10)As Integer,d(10,2)As Integer Private Sub Form_Load()学号存放在数组h()中 h(1)=1201:h(2)=1202:h(3)=1203 h(4)=1205:h(5)=1206:h(6)=1207 h(7)=1209:h(8)=1210:h(9)=1211:h(10)=1215 成绩存放在数组d(,)中 d(1,1)=92:d(1,2)=86 d(2,1)=78:d(2,2)=71 d(3,1)=83:d(3,2)=74 d(4,1)=67:d(4,2)=75 d(5,1)=71:d(5,2)=55 d(6,1)=62:d(6,2)=80 d(7,1)=98:d(7,2)=83 d(8,1)=99:d(8,2)=80 d(9,1)=57:d(9,2)=67 d(10,1)=80:d(10,2)=78 End Sub,49,感谢你的观看,2019年8月21,Private Sub Command1_Click()Dim no As Integer,flag As Integer Dim m As Integer,top As Integer,bott As Integer flag=-1 置未找到标志 top=1:bott=10 设定范围 no=Val(Text1.Text)取学号 If no h(bott)Then flag=-2 若超出学号范围,置特殊标志-2 End If,50,感谢你的观看,2019年8月21,Do While flag=-1 And top h(m)大于中间数据 top=m+1 下半部 End Select Loop,51,感谢你的观看,2019年8月21,If flag 0 Then 判是否找不到 Text2.Text=Text3.Text=Text4.Text=Text5.Text=MsgBox 无此学生!End If Text1.SetFocus End Sub,52,感谢你的观看,2019年8月21,(1)解题方法 数据排序的常用方法:“选择排序法”及“起泡排序法”“起泡法”排序就是每次将两个相邻的数进行比较,然后将大数调换(或称“下沉”)到下面。例如,若有4个数,则通过三次外循环来完成排序过程:,7534,初始 第1次 第2次 第3次,寻 找 最 大 数(第一次外循环),5734,5374,5347,大数“沉底”,小数“浮起”;如有n 个数,则要进行n-1趟比较;需要两重循环,例6.10 起泡排序法演示程序,53,感谢你的观看,2019年8月21,(1)创建应用程序的用户界面和设置对象属性,54,感谢你的观看,2019年8月21,(2)创建应用程序的用户界面和设置对象属性 窗体上含有一个文本框控件数组和一个命令按钮 文本框控件数组(Text1(1)Text1(8))用来显示演示的8个数(3)编写程序代码 功能要求:程序运行后自动产生8个两位随机整数 单击“排序”按钮(Command1)时,即启动排序过程 通过MsgBox函数来暂停程序运行,55,感谢你的观看,2019年8月21,Const n=8 声明符号常量 Option Base 1 Private Sub Form_Load()Randomize For i=1 To n 产生n 个随机数 Text1(i).ForeColor=RGB(0,0,0)用黑色显示 Text1(i).Text=Int(90*Rnd+10)Next i End Sub,56,感谢你的观看,2019年8月21,Private Sub Command1_Click()For j=1 To n-1 外循环 MsgBox 准备进行第+Str(j)+次比较,按回车键继续 For i=1 To n-j 内循环 If Val(Text1(i).Text)Val(Text1(i+1).Text)Then t=Text1(i).Text Text1(i).Text=Text1(i+1).Text Text1(i+1).Text=t End If Next i 沉底数用红色表示 Text1(n-j+1).ForeColor=RGB(255,0,0)Next j MsgBox 排序完毕“End Sub,57,感谢你的观看,2019年8月21,