数组及其应用.ppt
数组及其应用数组及其应用现在学习的是第1页,共47页 输入10个数,输出它们的平均值及大于平均值的那些数?引例:引例:。输入 A当 NAve Then Print A1 IF A2Ave Then Print A2 IF A3Ave Then Print A3 IF A4Ave Then Print A4 .实际程序是不能这样写实际程序是不能这样写 现在学习的是第4页,共47页 引例:引例:思考:思考:如果能使用如果能使用Ai (i=1,2,.10)的形式?的形式?使用循环来写程序使用循环来写程序 VB中表示下标变量就是通过定义中表示下标变量就是通过定义数组数组来来实现的。实现的。现在学习的是第5页,共47页4.1 概概 述述 数组的概念:数组的概念:数组并不是一种数据类型,而是数组并不是一种数据类型,而是一组一组相同类型数据相同类型数据的集合。用一个统一的名字(的集合。用一个统一的名字(数组名)数组名)代代表逻辑上相关的一批数据,每个元素用表逻辑上相关的一批数据,每个元素用下标变量下标变量来区分;来区分;下标变量代表元素在数组中的位置。下标变量代表元素在数组中的位置。VB中数组的表示形式:中数组的表示形式:A(1),A(10)一维数组一维数组 X(1,1),X(2,10)二维数组二维数组 Y(0,0,0),Y(1,2,5)三维数组三维数组 第第4章章 数数 组及其应用组及其应用现在学习的是第6页,共47页Visual Basic中的数组分类:中的数组分类:按数组的大小(元素个数)是否可以改变来分为:定长数组、动态(可变长)数组定长数组、动态(可变长)数组。按元素的数据类型可分为:数值型数组、字符串数组、逻辑数组、数值型数组、字符串数组、逻辑数组、日期型数组、变体数组等、对象数组。日期型数组、变体数组等、对象数组。按数组的维数可分为:一维数组、二维数组、多维数组。一维数组、二维数组、多维数组。4.1 概概 述述 现在学习的是第7页,共47页一维数组形式一维数组形式:Dim 数组名数组名(to)As 或:或:Dim 数组名数组名(to)例:例:Dim a(1 to 10)As Integer 声明了声明了a数组有数组有10个元素个元素1是下标的下界是下标的下界10是下标的上界是下标的上界数组元数的数据类型数组元数的数据类型与上面声明等价形式:与上面声明等价形式:Dim a%(1 to 10)4.2 一维数组一维数组4.2.1 一维数组的声明一维数组的声明 现在学习的是第8页,共47页说明:说明:1数组名的命名规则与变量的命名相同。数组名的命名规则与变量的命名相同。2数组的元素个数:数组的元素个数:上界上界-下界下界+1。3缺缺省省为为0,若若希希望望下下标标从从1开开始始,可可在在模模块块的的通通用用部部分分使使用用Option Base语句将设为语句将设为1。其使用格式是:。其使用格式是:Option Base 0|1 后面的参数只能取后面的参数只能取 0 或或 1 例如:例如:Option Base 1 将数组声明中缺省将数组声明中缺省下标设为下标设为 1 4.2.1 一维数组的声明一维数组的声明4和和不能使用变量不能使用变量,必须是常量,常量可以是,必须是常量,常量可以是直接常量、符号常量,一般是整型常量。直接常量、符号常量,一般是整型常量。现在学习的是第9页,共47页4.如果省略As子句,则数组的类型为变体类型。6数组中各元素在内存占一片连续的存储空间。4.2.1 一维数组的声明一维数组的声明Dim N As IntegerN=Val(InputBox(“Enter N=?”)Dim A(N)As Integer A(0)A(1)A(2)A(n).一维数组在内存中存放的顺序一维数组在内存中存放的顺序现在学习的是第10页,共47页使用形式:使用形式:数组名数组名(下标下标)其中:下标可以是整型变量、常量或表达式。其中:下标可以是整型变量、常量或表达式。例如:例如:设有下面的数组定义:设有下面的数组定义:Dim A(10)As Integer,B(10)As Integer 则下面的语句都是正确的。则下面的语句都是正确的。A(1)=A(2)+B(1)+5 取数组元素运算取数组元素运算 A(i)=B(i)下标使用变量下标使用变量 B(i+1)=A(i+2)下标使用表达式下标使用表达式第五章第五章 数数 组组 4.2.2 一维数组元素的引用一维数组元素的引用现在学习的是第11页,共47页1.可通过循环给数组元素的初值可通过循环给数组元素的初值 For i=1 To 10 A数组的每个元素值为数组的每个元素值为1 A(i)=1 Next i 2.数组的输入数组的输入 输入输入10个数,并存入到数组个数,并存入到数组A中中For i=1 To 10 A(i)=Val(InputBox(“输入输入A(”&i&“)的值的值”)Next i第五章第五章 数数 组组 4.2.3 4.2.3 一维数组的基本操作一维数组的基本操作现在学习的是第12页,共47页3.求数组中最大元素及所在下标求数组中最大元素及所在下标 Dim Max As Integer,iMax As Integer Max=A(1):iMax=1 For i=2 To 10 If A(i)Max Then Max=A(i)iMax=i End If Next i Print A(&iMax&)=;A(iMax)第五章第五章 数数 组组 4.2.3 4.2.3 一维数组的基本操作一维数组的基本操作现在学习的是第13页,共47页4.将数组元素倒置将数组元素倒置For i=1 To 102 t=A(i)A(i)=A(10-i+1)A(10-i+1)=tNext I(演示)(演示)4.2.3 4.2.3 一维数组的基本操作一维数组的基本操作现在学习的是第14页,共47页一、统计问题一、统计问题 例例4.1例例4.1 编编程程求求某某班班60个个学学生生某某门门课课程程考考试试的的平平均均成成绩绩及及高高于于平平均成绩的学生人数。均成绩的学生人数。例例4.2 在在例例4.1中中如如果果还还要要统统计计09,1019,2029,.8089,9099分数段及分数段及100分的学生人。分的学生人。则可另用数组则可另用数组bn来存各分数段的人数,并用来存各分数段的人数,并用bn(0)存存09分的人分的人数,数,bn(1)存存1019分的人数,分的人数,bn(9)存存9099分的人数,分的人数,bn(10)存存100分的人数。分的人数。4.2.4 一维数组的应用一维数组的应用现在学习的是第15页,共47页 二、排序问题二、排序问题 数据的排序就是将一批数据由小大到数据的排序就是将一批数据由小大到(升序)(升序)或由大到小或由大到小(降序)(降序)进行排列。常用的有进行排列。常用的有选择法、冒泡法。选择法、冒泡法。1选择法排序选择法排序753468 91算法算法 (升序升序)(设有设有n个数,存放在数组个数,存放在数组A(1).A(n)中)中)1)第)第1遍遍:从中选出最小的数,与第:从中选出最小的数,与第 1个数交换位置;个数交换位置;(演示)(演示)第五章第五章 数数 组组 4.2.4 一维数组的应用一维数组的应用数据排序数据排序现在学习的是第16页,共47页 2)第)第2遍遍:除第除第1 个数外,其余个数外,其余n-1个数中选最小的数,与个数中选最小的数,与第第2个数交换位置;个数交换位置;(演示)(演示)753468 91 71 3)依次类推)依次类推,选择了,选择了n-1次后,这个数列已按升序排次后,这个数列已按升序排列。列。第五章第五章 数数 组组 4.2.4 一维数组的应用一维数组的应用数据排序数据排序现在学习的是第17页,共47页 选择法排序选择法排序算法的流程图:算法的流程图:第五章第五章 数数 组组 4.2.4 一维数组的应用一维数组的应用数据排序数据排序现在学习的是第18页,共47页For i=1 To n-1For i=1 To n-1 p=i p=i For j=i+1 To n For j=i+1 To n If a(p)a(j)Then p=j If a(p)a(j)Then p=j Next j Next j t=a(i):a(i)=a(p):a(p)=t t=a(i):a(i)=a(p):a(p)=tNext iNext i选择法排序(选择法排序(升序升序)的)的VB程序程序:思考:如果按思考:如果按降序降序排,程序如何修改?排,程序如何修改?第五章第五章 数数 组组 4.2.4 一维数组的应用一维数组的应用数据排序数据排序现在学习的是第19页,共47页 例例4.3 用随机函数产生用随机函数产生50个个10100的随机整数,并的随机整数,并按由小到大的顺序打印出来。按由小到大的顺序打印出来。演示演示第五章第五章 数数 组组 4.2.4 一维数组的应用一维数组的应用数据排序数据排序现在学习的是第20页,共47页2冒泡法排序(升序)冒泡法排序(升序)算法算法:(将相邻两个数比较,大数交换到后面将相邻两个数比较,大数交换到后面)1)第第 1 趟趟:将将每每相相邻邻两两个个数数比比较较,大大数数交交换换到到后后面面,经经n-1次次两两两两相相邻邻比比较较后后,最最大大的的数数已已交交换换到到最最后后一一个个位位置。置。演示演示 4.2.4 一维数组的应用一维数组的应用数据排序数据排序2)第)第 2 趟:将前趟:将前n-1个数(最大的数已在最后)按上法比个数(最大的数已在最后)按上法比较,经较,经n-2次两两相邻比较后得次大的数;次两两相邻比较后得次大的数;3)依次类推,)依次类推,n个数共进行个数共进行n-1趟比较,趟比较,在第在第j趟中要进行趟中要进行n-j次两两比较。次两两比较。现在学习的是第21页,共47页冒泡法排序冒泡法排序算法的流程图:算法的流程图:第五章第五章 数数 组组 4.2.4 一维数组的应用一维数组的应用数据排序数据排序现在学习的是第22页,共47页For i=1 To n-1For i=1 To n-1 For j=1 To n-i For j=1 To n-i If a(j)a(j+1)Then If a(j)a(j+1)Then t=a(j)t=a(j):a(j)=a(j+1)a(j)=a(j+1):a(j+1)=ta(j+1)=t End if End if Next j Next jNext iNext i冒泡法排序(升序)程序冒泡法排序(升序)程序:演示演示第五章第五章 数数 组组 4.2.4 一维数组的应用一维数组的应用数据排序数据排序现在学习的是第23页,共47页3、两种排序方法的比较、两种排序方法的比较结论:结论:选择法排序比冒泡法排序选择法排序比冒泡法排序算法优算法优问题:问题:两种排序方法那一种好?两种排序方法那一种好?第五章第五章 数数 组组 4.2.4 一维数组的应用一维数组的应用数据排序数据排序现在学习的是第24页,共47页4.3 二维数组及多维数组二维数组及多维数组 4.3.1 二维数组的声明二维数组的声明声明格式如下:声明格式如下:Dim 数组名数组名(to,to)As 其中的参数与一维数组完全相同。例如:例如:Dim a(2,3)As Single 二二维维数数组组在在内内存存的的存存放放顺顺序序是是“先先行行后后列列”。例例如如数数组组a的的各各元素在内存中的存放顺序是:元素在内存中的存放顺序是:a(0,0)a(0,1)a(0,2)a(0,3)a(1,0)a(1,1)a(1,2)a(1,3)a(2,0)(2,1)a(2,2)a(2,3)现在学习的是第25页,共47页4.3.2 二维数组的引用二维数组的引用 引用形式:引用形式:数组名数组名(下标下标1,下标,下标2)例如:例如:a(1,2)=10 a(i+2,j)a(2,3)*2 在程序中常常通过二重循环来操作使用二维数组元素。在程序中常常通过二重循环来操作使用二维数组元素。4.3.3 二维数组的基本操作二维数组的基本操作 1.二维数组数据的输入二维数组数据的输入 2.求最大元素及其所在的行和列求最大元素及其所在的行和列 3.计算两矩阵相乘计算两矩阵相乘 4.矩阵的转置矩阵的转置 4.3 二维数组及多维数组二维数组及多维数组 现在学习的是第26页,共47页1.二维数组数据的输入二维数组数据的输入 Const N=4,M=5,L=6Dim a(1 to N,1 to M)As Integer,i%,j%,k%1.给二维数组给二维数组a输入数据的程序段如下:输入数据的程序段如下:For i=1 to 4 For j=1 to 5 A(i,j)=Val(InputBox(a(&I&,&j&)=?)Next j Next i4.3 二维数组及多维数组二维数组及多维数组 现在学习的是第27页,共47页2.求最大元素及其所在的行和列求最大元素及其所在的行和列 用变量用变量max存放最大值,存放最大值,row,col存放最大值所在行列号存放最大值所在行列号 Max=a(1,1):row=1:Col=1 For i=1 To N For j=1 To M If a(i,j)a(row,Col)Then Max=a(i,j)row=i Col=j End If Next jNext iPrint 最大元素是最大元素是;MaxPrint 在第在第&row&行行,;第第&Col&列列4.3 二维数组及多维数组二维数组及多维数组 现在学习的是第28页,共47页3.计算两矩阵相乘(略)计算两矩阵相乘(略)4.矩阵的转置矩阵的转置 方阵的转置的程序代码如下:方阵的转置的程序代码如下:For i=2 2 To For j=1 1 To I-1 Temp=a(i,j)a(i,j)=a(j,i)a(j,i)=Temp Next j Next i 设A是M*N的矩阵,要重新定义一个N*M的二级数组B,将A转置得到B的程序代码如下:For i=To For j=To N b(j,i)=a(i,j)Next jNext i 4.3 二维数组及多维数组二维数组及多维数组 现在学习的是第29页,共47页 例例4.4 设某一个班共有设某一个班共有60个学生,期末考试个学生,期末考试5门课程,门课程,请编一程序评定学生的奖学金,要求打印输出一、二请编一程序评定学生的奖学金,要求打印输出一、二等奖学金学生的学号和各门课成绩。(奖学金评定标等奖学金学生的学号和各门课成绩。(奖学金评定标准是:总成绩超过全班总平成绩准是:总成绩超过全班总平成绩20%发给一个奖学金,发给一个奖学金,超过全班总平成绩超过全班总平成绩10%发给二个奖学金。)发给二个奖学金。)4.3 二维数组及多维数组二维数组及多维数组 4.3.4 二维数组应用举例二维数组应用举例 现在学习的是第30页,共47页4.3.5 多维数组的声明和引用多维数组的声明和引用定义多维数组的格式如下:定义多维数组的格式如下:Dim 数数组组名名(to,to,)As 例如:例如:Dim a(5,5,5)As Integer 声明声明a是三维数组是三维数组 Dim b(2,6,10,5)As Integer 声明声明b是四维数组是四维数组 4.3 二维数组及多维数组二维数组及多维数组 现在学习的是第31页,共47页 动态数组:在声明时未给出数组的大小。在程序执行时分配存储空间。动态数组:在声明时未给出数组的大小。在程序执行时分配存储空间。4.4.1 动态数组的建立及使用动态数组的建立及使用 建立动态数组包括声明和大小说明两步:建立动态数组包括声明和大小说明两步:1在使用在使用Dim、Private或或Public语句声明括号内为空的数组。语句声明括号内为空的数组。格式:格式:Dim|Private|Public 数组名()数组名()As 数据类型数据类型 例:例:Dim a()As Integer 2在过程中用在过程中用ReDim语句指明该数组的大小。语句指明该数组的大小。格式:格式:ReDim Preserve 数组名(下标数组名(下标1,下标,下标2)Preserve参数:保留数组中原来的数据 例:例:Redim A(10)Redim Preserve A(20)4.4 动态数组动态数组 现在学习的是第32页,共47页说明:说明:(1)ReDim语语句句是是一一个个可可执执行行语语句句,只只能能出出现现在在过过程程中中,并并且且可以多次使用,改变数组的维数和大小。可以多次使用,改变数组的维数和大小。(2)定长数组声时中的下标只能是常量,而动态数组)定长数组声时中的下标只能是常量,而动态数组ReDim 语语句中的下标是常量,也可以是有了确定值的变量。句中的下标是常量,也可以是有了确定值的变量。例:例:Private Sub Form_Click()Dim N As Integer N=Val(InputBox(“输入输入N=?”)Dim a(N)As Integer .End sub4.4 动态数组动态数组 现在学习的是第33页,共47页 (3)在过程中可以多次使用)在过程中可以多次使用ReDim来改变数组的大小,也可来改变数组的大小,也可 改变数组的维数。改变数组的维数。例:例:ReDim x(10)ReDim x(20)x(20)=30 Print x(20)ReDim x(20,5)x(20,5)=10 Print x(20,5)(4)每次使用)每次使用ReDim语句都会使原来数组中值丢失,可以在语句都会使原来数组中值丢失,可以在ReDim后加后加Preserve 参数来保留数组中的数据。但此时参数来保留数组中的数据。但此时 只能改变最后一只能改变最后一维的大小。维的大小。4.4 动态数组动态数组 现在学习的是第34页,共47页 例例4.5 通通过过输输入入对对话话框框输输入入一一批批正正整整数数,将将其其中中的的偶偶数数和和奇奇数数分分别别存存入入数数组组a和和数数组组b中中,然然后后分分别别以以每每行行10个输出数组个输出数组a和和b。4.4 动态数组动态数组 现在学习的是第35页,共47页 4.4.2 与数组操作有关的几个函数与数组操作有关的几个函数1.Array函数函数Array函数可方便地对数组整体赋值,但它只能给声明函数可方便地对数组整体赋值,但它只能给声明Variant的的变量或仅由括号括起的动态数组赋值。赋值后的数组大小由赋值的个数变量或仅由括号括起的动态数组赋值。赋值后的数组大小由赋值的个数决定。决定。例如,要将例如,要将1,2,3,4,5,6,7 这些值赋值给数组这些值赋值给数组a,可使用下面的方,可使用下面的方法赋值。法赋值。Dim a()A=array(1,2,3,4,5,6,7)Dim a A=array(1,2,3,4,5,6,7)4.4 动态数组动态数组 现在学习的是第36页,共47页 2 求数组的上界求数组的上界Ubound()函数、函数、下界下界 Lbound()函数函数 Ubound()函数和函数和Lbound()函数函数分别用来确定数组某一维的上界和下界值。分别用来确定数组某一维的上界和下界值。使用形式如下:使用形式如下:UBound(,)LBound(,)其中:其中:数组变量的名称,遵循标准变量命名约定。数组变量的名称,遵循标准变量命名约定。:可可选选的的;一一般般是是整整型型常常量量或或变变量量。指指定定返返回回哪哪一一维维的的上上界。界。1 表示第一维,表示第一维,2 表示第二维,如此等等。如果省略默认是表示第二维,如此等等。如果省略默认是1。4.4 动态数组动态数组 现在学习的是第37页,共47页3Split函数函数使用格式:使用格式:Split(,)说明:说明:使用使用Split函数可从一个字符串中,以某个指定符号为分隔符,分离若函数可从一个字符串中,以某个指定符号为分隔符,分离若干个子字符串,建立一个下标从零开始的一维数组。干个子字符串,建立一个下标从零开始的一维数组。补充例题:补充例题:通过一文本框中输入若于个数据,数据之间用通过一文本框中输入若于个数据,数据之间用“,”分隔。分隔。将这些数据按升序出到窗体上。将这些数据按升序出到窗体上。4.4 动态数组动态数组 现在学习的是第38页,共47页4.4.3 应用用举例例 例例4.6 在在一一个个文文本本框框中中,输输入入多多个个用用“,”分分隔隔的的整整数数,按按回回车车键键后后,将将各各数数据据按按升升序序打打印印输输出出在在窗窗体体上上。程程序序运运行行情情况况如如图图4-4所示。所示。4.4 动态数组动态数组 图4-5 程序运行情况 现在学习的是第39页,共47页第五章第五章 数数 组组 本章小结本章小结1数组的概念数组的概念 通通常常数数组组用用来来存存放放具具有有相相同同性性质质的的一一组组数数据据,即即数数组组中中的的数数据据必必须须是是同同一一个个类类型型。数数组组元元素素是是数数组组中中的的某某一一个个数数据据项项,引引用用数数组组通通常是引用数组元素,数组元素的使用同简单变量的使用类似。常是引用数组元素,数组元素的使用同简单变量的使用类似。数组可以被看作一组带下标的变量集合,系统分配一块连续数组可以被看作一组带下标的变量集合,系统分配一块连续的内存空间来存放数组中的元素。当所需处理的数据个数确定时,的内存空间来存放数组中的元素。当所需处理的数据个数确定时,通常使用定长数组,否则应该考虑使用动态数组。通常使用定长数组,否则应该考虑使用动态数组。现在学习的是第40页,共47页第五章第五章 数数 组组 本章小结本章小结2数组的声明数组的声明声明一个已确定数组元素个数的数组:声明一个已确定数组元素个数的数组:Dim 数组名数组名(下界下界 To 上界上界,下界下界 To 上界上界,)As 类型关键字类型关键字它它声声明明了了数数组组名名、数数组组维维数数、数数组组大大小小、数数组组类类型型。下下界界、上上界界必必须须为为常常数数,不不能能为为表表达达式式或或变变量量,若若省省略略下下界界,则则默默认认为为 0,也也可可用用 Option Base语句将默认下界设置为语句将默认下界设置为1。声明一个长度可变的动态数组:声明一个长度可变的动态数组:Dim 数组名()数组名()As 类型关键字类型关键字ReDim Preserve 数组名数组名(下界下界 To 上界上界,下界下界 To 上界上界,)现在学习的是第41页,共47页第五章第五章 数数 组组 本章小结本章小结3数组的操作数组的操作 对数组的操作通常需要使用循环控制结构来实现。对数组的操作通常需要使用循环控制结构来实现。数数组组的的基基本本操操作作有有:数数组组初初始始化化、数数组组输输入入、数数组组输输出出、求求数数组组中中的的最最大(最小)元素及下标、求和、数据倒置等。大(最小)元素及下标、求和、数据倒置等。应用数组解决的常用问题有:复杂统计、平均值、排序和查找等。应用数组解决的常用问题有:复杂统计、平均值、排序和查找等。现在学习的是第42页,共47页第五章第五章 数数 组组 作作 业:业:现在学习的是第43页,共47页29746538101交换交换92745683110A(1)A(10)29746538101For i=1 To 102 t=A(i):A(i)=A(10-i+1):A(10-i+1)=tNext IA(i)=A(N-i+1):A(N-i+1)=tN2现在学习的是第44页,共47页753468 91 71A(1)A(8)第第 1 遍遍i=1 p=1排序前排序前A(p)A(j)?p=6j=2j=3j=4j=5j=6交换交换p=2p=3j=7j=8i=1:p=iFor j=i+1 to 8 If A(p)A(j)Then p=jNext J t=A(I):A(I)=A(p):A(p)=t实现这一过程实现这一过程的程序:的程序:成立成立成立成立成立成立按升序排序按升序排序现在学习的是第45页,共47页753468 91 71A(1)A(8)A(p)A(j)j=3j=4j=5j=6交换交换p=3j=7j=8i=2:p=iFor j=i+1 to 8 If A(p)A(j)Then p=jNext J t=A(i):A(i)=A(p):A(p)=t实现这一过程的实现这一过程的程序如下:程序如下:第第 2 遍遍 i=2 p=253第第 1 遍结遍结束后的数束后的数据据现在学习的是第46页,共47页753468 91A(1)A(8)第第 1 遍遍排序前排序前For j=1 To 7For j=1 To 7 If a(j)a(j+1)Then If a(j)a(j+1)Then t=a(j)t=a(j):a(j)=a(j+1)a(j)=a(j+1):a(j+1)=ta(j+1)=t End if End ifNext jNext j按升序排序按升序排序75637199753468 9169 49最大数已到最后最大数已到最后N-1现在学习的是第47页,共47页