1、1构造数据类型:数组构造数据类型:数组数组名数组名25.1.1数组与数组元素数组与数组元素 1.数组概念数组概念 数组就是一组数组就是一组相同类型数据相同类型数据的集合,这一组数的集合,这一组数中的每一个组成元素就叫做中的每一个组成元素就叫做数组元素数组元素。用一个统一的名字(用一个统一的名字(数组名数组名)代表逻辑上相关的一)代表逻辑上相关的一批数据,每个元素用批数据,每个元素用下标变量下标变量来区分;下标变量代来区分;下标变量代表元素在数组中的位置。表元素在数组中的位置。例如:例如:dim mark(1 to 100)As Integer 第一个学生成绩用第一个学生成绩用mark(1)来表
2、示,其值为来表示,其值为95 第二个学生成绩用第二个学生成绩用mark(2)来表示,其值为来表示,其值为8032.数组的命名数组的命名 命名规则和简单变量的命名规则相同。例如:用命名规则和简单变量的命名规则相同。例如:用 mark 来代表来代表100个学生的成绩个学生的成绩 3.数组维数数组维数数组中下标的个数称为数组的维数数组中下标的个数称为数组的维数一维数组:例如一维数组:例如mark(100)二维数组:有两个下标二维数组:有两个下标例如例如:x(2,3)二维数组相当于一个矩阵二维数组相当于一个矩阵三维数组:有三个下标,例如:三维数组:有三个下标,例如:m(3,4,5)5.1.1数组与数组
3、元素数组与数组元素44.数组元素数组元素5.1.1数组与数组元素数组与数组元素如何确定如何确定100个学生和这个数据组中的各个成绩对应关系呢个学生和这个数据组中的各个成绩对应关系呢?给数组中的数据编号,也就是顺序号,从而出现了数组中给数组中的数据编号,也就是顺序号,从而出现了数组中的下标变量,所以的下标变量,所以数组元素也称为下标变量数组元素也称为下标变量.数组元素表示数组元素表示为:为:()例如:例如:mark(1)、mark(99)例如例如:c(2,3)表示数组表示数组c中第中第2行第行第3列的那个元素列的那个元素56 5.数组的类型数组的类型 Visual Basic中的数组,按不同的方
4、式可分为以下几类:中的数组,按不同的方式可分为以下几类:v 按数组的大小(元素个数)是否可以改变来分为:按数组的大小(元素个数)是否可以改变来分为:定长数组、动态(可变长)数组,也称为静态数组或定长数组、动态(可变长)数组,也称为静态数组或动动 态数组。态数组。v 按元素的数据类型可分为:数值型数组、字符串数组、按元素的数据类型可分为:数值型数组、字符串数组、日期型数组、变体数组等。日期型数组、变体数组等。v 按数组的维数可分为:一维数组、二维数组、多维数组。按数组的维数可分为:一维数组、二维数组、多维数组。v 对象数组:菜单对象数组、控件数组对象数组:菜单对象数组、控件数组。7 静态数组是指
5、固定大小的数组,类型、维数静态数组是指固定大小的数组,类型、维数和大小将不得改变。和大小将不得改变。5.2.1 5.2.1 静态数组及声明静态数组及声明数组名数组名(下标下标1,下标下标2)As 类型类型下界下界 to 上界上界 8每一维大小每一维大小:上界下界上界下界+1Dim lArray(0 To 3,0 To 4)As Long必须为常数。必须为常数。5.2.1 5.2.1 静态数组及声明静态数组及声明9Dim lArray(0 To 3,0 To 4)As Long 等价于:Dim lArray(3,4)As Long 5.2.1 5.2.1 静态数组及声明静态数组及声明错误的声错误
6、的声明,下标明,下标是变量是变量105.2.1 5.2.1 静态数组及声明静态数组及声明 声明了声明了x数组有数组有11个元素个元素 对对x(10)这个数组元素赋值这个数组元素赋值在数组声明中的下标说明了数组的整体在数组声明中的下标说明了数组的整体,即每一维即每一维的大小的大小;而在程序其他地方出现的下标表示数组中而在程序其他地方出现的下标表示数组中的一个元素。两者写法形式相同,但意义不同。的一个元素。两者写法形式相同,但意义不同。声明了数组的名、维数、大小、声明了数组的名、维数、大小、类型类型,并且对数组进行并且对数组进行初始化初始化11补充补充 与数组操作有关的几个函数与数组操作有关的几个
7、函数1.Array函数函数2.(1)Array函数可方便地对数组整体赋值,但它只能给函数可方便地对数组整体赋值,但它只能给声明声明Variant的变量或仅由括号括起的动态数组赋值。的变量或仅由括号括起的动态数组赋值。=Array()(2)数组的下界由数组的下界由option base控制语句决定,上界由控制语句决定,上界由Array函数括号内的参数个数决定,也可通过函数函数括号内的参数个数决定,也可通过函数Ubound获得获得例如,要将例如,要将1,2,3,4,5,6,7 这些值赋值给数组这些值赋值给数组a,可使用下面,可使用下面的方法赋值。的方法赋值。Dim a()a=array(1,2,3
8、,4,5,6,7)Dim a a=array(1,2,3,4,5,6,7)12 2.求数组的上界求数组的上界Ubound()函数、函数、下界下界 Lbound()函数函数 作用:分别用来确定数组某一维的上界和下界值。作用:分别用来确定数组某一维的上界和下界值。使用形式如下:使用形式如下:UBound(,)LBound(,)补充补充 与数组操作有关的几个函数与数组操作有关的几个函数Dim score(3,4)as integerUBound(score,2)其中:其中:必需的,遵循标准变量命名约定。:必需的,遵循标准变量命名约定。:可选的;一般是整型常量或变量。指定返回哪一:可选的;一般是整型常
9、量或变量。指定返回哪一维的上界。维的上界。1 表示第一维,表示第一维,2 表示第二维,如此等等。表示第二维,如此等等。如果省略默认是如果省略默认是1。4LBound(score,2)0135.2.2 数组的引用数组的引用 使用数组就是对数组元素进行操作,对数组元使用数组就是对数组元素进行操作,对数组元素的操作类似于对简单变量的操作。素的操作类似于对简单变量的操作。引用数组元素需要注意的问题:引用数组元素需要注意的问题:引用数组元素的方法:在数组名后的括号中指引用数组元素的方法:在数组名后的括号中指明下标明下标例如例如a(5),b(3,4)a(5),b(3,4)引用数组元素时,数组名、数组类型必
10、须与数组引用数组元素时,数组名、数组类型必须与数组声明时一致声明时一致 引用数组元素时,下标值应在数组声明时所指定引用数组元素时,下标值应在数组声明时所指定的范围内的范围内 在同一过程中,数组与简单变量不能同名在同一过程中,数组与简单变量不能同名141.1.数组元素的输入(赋初值)数组元素的输入(赋初值)(1)赋值语句赋值语句 Dim iA(1 To 10)As String iA(1)=“张三张三”:iA(2)=“李四李四”再如再如:for i=1 to 10 a(i)=int(Rnd*90)+10 循环加赋值循环加赋值 next i (2)在运行时通过)在运行时通过 inputbox函数输
11、入函数输入for i=1 to 10 a(i)=inputbox(“请输入请输入”)next i 15(3)用循环用循环 For i =1 To 10 a(i)=0 Next i 1.1.数组元素的输入(赋初值)数组元素的输入(赋初值)(4)Array函数函数 Dim ib()用用array函数给动态数组赋值时不能指定数组类型函数给动态数组赋值时不能指定数组类型 ib=Array(abc,def,67)For i=0 To UBound(ib)form1.Print ib(i);Next i161.1.数组元素的输入(赋初值)数组元素的输入(赋初值)一维数组一维数组在输入时可用在输入时可用一重
12、循环一重循环,二维数组二维数组要用要用二重循环二重循环,多维数组多维数组用用多重循环多重循环。在在VB中,中,数据按行存储数据按行存储,所以一般将数组第一维的循,所以一般将数组第一维的循环变量放在外重循环中环变量放在外重循环中例例5.1 求数组中的最小元素及下标求数组中的最小元素及下标要求:要求:创建一个包含创建一个包含10个元素的数组,从键盘输入个元素的数组,从键盘输入10个个数,找出其中最小的数,并且输出最小数的下标。数,找出其中最小的数,并且输出最小数的下标。数据分析数据分析:除了声明包含除了声明包含 10个元素的数组外个元素的数组外,还应该声明几还应该声明几个变量个变量,分别是什么类型
13、分别是什么类型?求最大值最小值算法分析求最大值最小值算法分析:?17Private Sub Form_Click()Dim a(1 To 10)As Integer Dim min As Integer,p As IntegerFor i=1 To 10 a(i)=Val(InputBox(请输入一个数请输入一个数,输入数输入数,0)Next imin=a(1):p=1For i=2 To 10 If a(i)选择法选择法 原原始始数数据据 8 6 9 3 2 7 a(1)a(2)a(3)a(4)a(5)a(6)第第1趟趟交交换换后后 2 6 9 3 8 7 a(2)a(3)a(4)a(5)a
14、(6)第第2趟趟交交换换后后 2 3 9 6 8 7 a(3)a(4)a(5)a(6)第第3趟趟交交换换后后 2 3 6 9 8 7 a(4)a(5)a(6)第第4趟趟交交换换后后 2 3 6 7 8 9 a(5)a(6)第第5趟趟无无交交换换 2 3 6 7 8 9 图图1.3.25 排排序序过过程程示示意意图图 外重循环变量外重循环变量i:比较的趟数比较的趟数,n个数需要个数需要n-1趟比较趟比较,n从从1变化变化到到n-1内重循环内重循环j:每一趟比较的次数每一趟比较的次数,j从从i+1变化到变化到n23输入输入n个数据给个数据给a(1)到到 a(n)For i=1 to n-1For
15、j=i+1 to na(j)a(i)YN打印输出打印输出a(1)到到a(n)交换交换a(i)和和a(j)这个算法能这个算法能化简吗化简吗24输入输入n个数据给个数据给a(1)到到 a(n)For i=1 to n-1imin=iFor j=i+1 to na(j)选择法改进选择法改进25例例53 由计算机产生由计算机产生10个个0100之间的随机整数,使用之间的随机整数,使用选择法排序,将这些数按递增的顺序排列。选择法排序,将这些数按递增的顺序排列。(纠正课本错纠正课本错误误)Dim a(1 To 10)As IntegerFor i=1 To 10 a(i)=Int(Rnd*100)+1 P
16、rint a(i);Next iFor i=1 To imin=i For j=To 10 If a(j)冒泡排序冒泡排序(1)比较第一个数与第二个数,若为逆序)比较第一个数与第二个数,若为逆序a(0)a(1),则交,则交换;然后比较第二个数与第三个数;依次类推,直至第换;然后比较第二个数与第三个数;依次类推,直至第n-1个个数和第数和第n个数比较为止个数比较为止第一趟冒泡排序第一趟冒泡排序,结果,结果最大的最大的数数被安置在被安置在最后一个元素最后一个元素位置上位置上(2)对前)对前n-1个数进行第二趟冒泡排序,结果使个数进行第二趟冒泡排序,结果使次大次大的数被的数被安置第安置第n-1个元素
17、位置个元素位置(3)重复上述过程,共经过)重复上述过程,共经过n-1趟冒泡排序后,排序结束趟冒泡排序后,排序结束272冒泡排序冒泡排序28冒泡法排序(升序)的冒泡法排序(升序)的VB程序:程序:2冒泡排序冒泡排序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 temp=a(j)temp=a(j)a(j)=a(j+1)a(j)=a(j+1)a(j+1)=temp a(j+1)=temp End if End if Next j Next jNext iNe
18、xt i293.二维数组的应用Dim StuScore(1 to 10,1 to 5)定义定义105的二维数组的二维数组可以使用可以使用For循环嵌套处理多维数组循环嵌套处理多维数组.二维数组中的元素的存储顺序是二维数组中的元素的存储顺序是按行存储按行存储的,的,因此因此外循环对应行的变化,内循环对应列的变化外循环对应行的变化,内循环对应列的变化比较合适比较合适。30例例5.4 设定一个设定一个5行行5列的矩阵,首先给这个矩阵赋列的矩阵,首先给这个矩阵赋值,其值为对应的行坐标和列坐标之和,然后在窗值,其值为对应的行坐标和列坐标之和,然后在窗体上以五行五列的方式输出。体上以五行五列的方式输出。数
19、组定义:数组定义:Dim a(1 To 5,1 To 5)As IntegerFor i=1 To 5 For j=1 To 5 a(i,j)=i+j Next jNext i赋值:赋值:输出:输出:For i=1 To 5 For j=1 To 5 Print a(i,j);Next j Print 作用是什么?作用是什么?Next i3.二维数组的应用演示演示313.二维数组的应用3233创建动态数组的过程创建动态数组的过程创建动态数组的步骤如下:创建动态数组的步骤如下:Public、Dim或或Static语句声明一个空维数组。语句声明一个空维数组。格式:格式:Dim 数组名数组名()As
20、 数据类型数据类型 可以省略可以省略 在过程中用在过程中用ReDim语句分配实际的元素个数语句分配实际的元素个数(维数和每维下标范围)。(维数和每维下标范围)。形式形式:ReDim 数组名数组名(下标下标1,下标,下标2)As 类型类型 Sub Form_Load()Dim sArray()As Single ReDim sArray(4,8)End Sub34说明:说明:(1)Dim、Private、Public变量声明语句是说明性语句,可变量声明语句是说明性语句,可出现在过出现在过 程内或通用声明段;程内或通用声明段;ReDim语句是执行语句,只语句是执行语句,只能出现在过程内。能出现在过
21、程内。(2)ReDim语句可以改变数组的维数、上界和下界,但是,语句可以改变数组的维数、上界和下界,但是,不能改变数组的类型不能改变数组的类型。同时数组的维数只能改变一次,由。同时数组的维数只能改变一次,由第一次出现的第一次出现的Redim语句定义的维数来决定语句定义的维数来决定。(3)在过程中可多次使用在过程中可多次使用ReDim来改变数组的大小,来改变数组的大小,每次使每次使用用ReDim语句都会使原来数组中的值丢失语句都会使原来数组中的值丢失,可以在,可以在ReDim语句后加语句后加Preserve参数用来保留数组中的数据,参数用来保留数组中的数据,但使用但使用Preserve只能改变最
22、后一维的大小,前面几维大小不能改只能改变最后一维的大小,前面几维大小不能改变。变。35 例如:例如:Dim aa()As Integer Redim aa(2,3,4)Redim Preserve aa(2,3,7)Dim MyArray()As Interger Redim MyArray(10)Redim Preserve MyArray(15)(4)ReDim中的下标可以是常量,也可以是有了确定值的变量。中的下标可以是常量,也可以是有了确定值的变量。36Private Sub Command1_Click()Dim a()As Integer Dim sum As Integer Dim
23、 n As Integer Dim p As String n=Val(Text1.Text)ReDim a(1 To n)For i=1 To n a(i)=i Next i p=For i=1 To n-1 p=p&i&+sum=sum+a(i)Next p=p&i sum=sum+a(n)Label2.Caption=p&=&sumEnd Sub例例:用动态数组求和用动态数组求和37附加内容附加内容:For EachNext语句语句:它是一个循环语句,用来执行指定次数的循环,它是一个循环语句,用来执行指定次数的循环,但但For EachNext语句专门用于数组或对象集合语句专门用于数组或
24、对象集合中的每个元素中的每个元素。1.语法格式语法格式For Each In Exit For Next 2.2.执行过程执行过程 可以对数组中的元素可以对数组中的元素进行查询、显示和读取。进行查询、显示和读取。执行的循环次数由数组元执行的循环次数由数组元素的个数决定。素的个数决定。说明:说明:1成员是一个成员是一个Variant 型变量型变量2数组是一个数组是一个数组名数组名,没有上下界,也可以没,没有上下界,也可以没 有括号有括号38例:例:7-12用用For EachNext语句,求语句,求1+2+3+100的值的值Private Sub Command1_Click()Dim x(1
25、to 100)As Integer Dim a 定义变量定义变量a,默认的,默认的 数据类型为数据类型为Variant 型型 Dim s As Integer 和变量和变量 s=0 求和初始化求和初始化 For i=1 To 100 给数组赋初值给数组赋初值 x(i)=i Next iEnd Sub For Each a In x s=s+a Next a Label1.Caption=sEnd Sub 代表着数组代表着数组x中确定的中确定的元素值元素值执行次数?执行次数?395.4 5.4 控件数组控件数组 一组一组相同类型相同类型的控件组成。的控件组成。它们它们共用一个控件名共用一个控件名
26、,具有具有相同的属性相同的属性,建立时系统给每个元素赋一个唯一的,建立时系统给每个元素赋一个唯一的索引号索引号(Index)。控件数组共享同样的事件过程,通过控件数组共享同样的事件过程,通过返回的下标值返回的下标值区分控件数组中的各个元素区分控件数组中的各个元素。例:例:Private Sub cmdName _Click(Index As Integer)If Index=3 then 处理第四个命令按钮的操作处理第四个命令按钮的操作 End If End Sub402 2 选择以下方法之一创建控件数组:选择以下方法之一创建控件数组:为控件起相同的名字为控件起相同的名字 复制现有的控件复制现
27、有的控件 指定控件的索引值指定控件的索引值演示演示5.4.2 控件数组的建立1.设计阶段在窗体中创建控件数组的步骤为:设计阶段在窗体中创建控件数组的步骤为:1 在窗体上添加一个新的控件(如命令按钮在窗体上添加一个新的控件(如命令按钮Command1),),以决定以决定控件的类型控件的类型和控件数组中的第和控件数组中的第1个控件。个控件。设置控件的设置控件的Name属性值属性值,为控件命名。,为控件命名。412.运行时添加控件数组成员运行时添加控件数组成员 控件数组必须是设计时创建的,在程序运行时,可控件数组必须是设计时创建的,在程序运行时,可以通过以通过Load方法向控件数组中添加新的控件成员
28、方法向控件数组中添加新的控件成员,并,并设置其属性值,也可以通过设置其属性值,也可以通过Unload方法删除控件数组方法删除控件数组中的控件中的控件。Load方法和方法和Unload方法的格式是:方法的格式是:Load 控件数组名(控件数组名(Index)Unload 控件数组名(控件数组名(Index)Index为控件为控件数组元素的下数组元素的下标标42例:建立含有四个命令按钮的控件数组,当单击例:建立含有四个命令按钮的控件数组,当单击某个命令按钮,分别显示不同的图形或结束操作。某个命令按钮,分别显示不同的图形或结束操作。43 Private Sub Command1_Click(Inde
29、x As Integer)Select Case Index Case 0 画直线画直线 Case 1 画矩形画矩形 Case 2 画圆画圆 Case Else End End Select End Sub演示演示44【例【例】设计一个简易计算器,能进行整数的加、减、】设计一个简易计算器,能进行整数的加、减、乘、除运算。其运行界面如图所示。乘、除运算。其运行界面如图所示。界面设计:界面设计:一个标签一个标签用于计算器输出用于计算器输出,名称改名称改为为dataout;数字按钮控件数组数字按钮控件数组Number 09;操作符控件数组操作符控件数组Operator +-*/;一个一个“=”按钮用
30、按钮用于计算结果于计算结果,名称改为名称改为result;一个一个“Cls”按钮用于清屏按钮用于清屏演示演示4546474849 数组中常见错误和注意事项数组中常见错误和注意事项1.1.静态数组声明下标出现变量静态数组声明下标出现变量 n=InputBox(输入数组的上界输入数组的上界)Dim a(1 To n)As Integer2 2数组下标越界数组下标越界 引用的下标比数组声明时的下标范围大或小。引用的下标比数组声明时的下标范围大或小。Dim a(1 To 30)As Long,i%a(1)=1:a(2)=1 For i=3 To 40 a(i)=a(i-2)+a(i-1)Next i5
31、0作业:作业:p1303(2)3(3)3数组维数错数组维数错 数组声明时的维数与引用数组元素时的维数不一数组声明时的维数与引用数组元素时的维数不一致。致。Dim a(3,5)As Long a(i)=104Aarry函数使用问题函数使用问题 只能对只能对Variant 的变量或动态数组赋值。的变量或动态数组赋值。数组中常见错误和注意事项数组中常见错误和注意事项5152Private Sub Command1_Click()水仙花数,用两重循选环实现算法水仙花数,用两重循选环实现算法Dim a As Integer,b As Integer,c As IntegerDim n As Intege
32、rText1.FontSize=36Text1.Text=此句可省略此句可省略For n=100 To 999 a=n 100 百位百位 b=(n 10)Mod 10 十位十位 c=n-100*a-10*b 个位个位 If a 3+b 3+c 3=n Then Text1.Text=Text1.Text&n&Chr(13)&Chr(10)此句中的此句中的text1.text不可省不可省End IfNext nEnd Sub53Private Sub Command1_Click()水仙花数,用三重循选环实现算法水仙花数,用三重循选环实现算法 Dim a As Integer,b As Inte
33、ger,c As Integer Dim n As Integer Text1.FontSize=36 Text1.Text=此句可省略此句可省略 For a=1 to 9 百位百位 for b=0 to 9 十位十位 for c=0 to 9 个位个位 n=100*a+10*b+c If a 3+b 3+c 3=n Then Text1.Text=Text1.Text&n&Chr(13)&Chr(10)此句中的此句中的text1.text不可省不可省 End If Next c Next b Next aEnd Sub54Private Sub Command1_Click()马克思问题,在
34、窗体上输出马克思问题,在窗体上输出 Dim x As Integer,y As Integer,z As Integer FontSize=24 Print 男人男人,女人女人,小孩小孩 For x=1 To 15 For y=1 To 23 z=30-x-y If 3*x+2*y+z=50 Then Print x,y,z End If Next y Next xEnd Sub55Private Sub Command1_Click()马克思问题,在文本框上输出马克思问题,在文本框上输出 Dim x As Integer,y As Integer,z As Integer For x=1 T
35、o 15 For y=1 To 23 z=30-x-y If 3*x+2*y+z=50 Then Text1.Text=Text1.Text&x&y&z&Chr(13)&Chr(10)End If Next y Next xEnd Sub56第五章习题第五章习题3(2)Dim a(),b(),c()在通用段声明在通用段声明Dim Dim Private Sub Command1_Click()Dim i As Integera=Array(2,4,6,8,10)用用array函数给数组赋初值函数给数组赋初值b=Array(1,3,5,7,9)For i=0 To 4 输出两个数组输出两个数组
36、Text1.Text=Text1.Text&a(i)&Text2.Text=Text2.Text&b(i)&Next iEnd Sub57Private Sub Command2_Click()Dim i As Integer ReDim c(0 To 4)此语句不可省此语句不可省 For i=0 To 4 c(i)=a(i)+b(i)Next i For i=0 To 4 输出第三个数组输出第三个数组 Text3.Text=Text3.Text&c(i)&NextEnd Sub58第五章习题第五章习题3(3)Dim a()As Integer 生成动态数组生成动态数组Dim b()As In
37、tegerDim m As Integer 行数为行数为m+1Dim n As Integer 列数为列数为n+1Dim i As Integer 循环变量循环变量Dim j As IntegerPrivate Sub Command1_Click()m=Val(Text1.Text)行数为行数为m+1 n=Val(Text2.Text)列数为列数为n+1 ReDim a(m,n)指定动态数组指定动态数组a的大小的大小59输出输出a数组数组 For i=0 To m For j=0 To n Print a(i,j);Next j Print 换行换行Next i PrintEnd Sub给给a数组赋值数组赋值 For i=0 To m For j=0 To n a(i,j)=Int(Rnd*50)+50 Next j Next i 60Private Sub Command2_Click()ReDim b(n,m)指定动态数组指定动态数组b的大小的大小转置算法转置算法 For i=0 To m For j=0 To n b(j,i)=a(i,j)Next j Next i 输出输出b数组数组 For i=0 To n For j=0 To m Print b(i,j);Next j Print 换行换行Next iEnd Sub61