
vb之-数组及其使用课件.ppt
22页单击此处编辑母版标题样式单击此处编辑母版副标题样式*1第7章 数组 o西南交通大学峨眉校区o唐加胜第七章第七章 数数 组组 本章要求: 1.理解数组的概念 2.掌握数组的定义及其引用 3.掌握控件数组的建立及使用 4. 理解常用的排序方法本章重点:数组定义及引用方法,排序算法本章难点:动态数组、排序算法p数组是具有相同数据类型的一组有序数据p数组中的变量称为数组元素p数组元素的表示 :数组名(下标1,下标2)p例如:a(1) 、 a(1,2)p只有一个下标的数组叫一维数组p有两个下标的数组叫二维数组, ,最多可达60维p数组在使用前必须先声明(数组名、类型、维数和数组的大小)p 数组声明时,指定了数组的维数和大小指定了数组的维数和大小的数组称为的数组称为静态数组 没有指定维数和大小的数组称为动态数组前者大小固定,后者在使用前需要重定义7.1 数组的定义和使用一、数组的定义oo静态数组的声明:静态数组的声明:n n格式:格式:Dim Dim 数组名数组名( ( 下界下界 To To 上界上界 ,),) As As 数据类型数据类型n也可以使用Public和Private来定义数组n数组定义举例:oDim Counter(1 To 14) As Integer 1414个元素的局部数组。
个元素的局部数组oPrivate Sum (20) As Double 2121个元素的模块级数组个元素的模块级数组oDim x(3,4) as Integer 2020个元素的二维数组个元素的二维数组oDim A(-5 To 20) As Integer n数组定义说明o数组名的命名规则与变量命名相同o一维数组的元素个数:上界-下界+1o缺省下界为0 若希望缺省下界设为1,可在模块的通用部分使用语句: Option Base 1o下界和上界不能使用变量,必须是常量(整型常量)o数组定义后自动获得默认值:数值为0,字符为“”,逻辑为False一、数组的定义oo数组的存放顺序数组的存放顺序n数组中各元素在内存占一片连续的存储空间n二维数组则按先行后列的顺序A(0)A(1)A(2)A(n). 一维数组A在内存中存放的顺序一维数组S(2,3)在内存中存放的顺序1 1、数组元素的引用、数组元素的引用 n数组的引用通常是指对数组元素的引用n格式为: 数组名 (下标1 , 下标2)n下标可以是常量、变量或表达式,但表达式的值必须介于定义数组时指定的下标的下界和上界之间,否则将导致“下标越界”的错误。
n例如: A(1)=A(1)+B(1) 取数组元素运算 A(i)=B(i) 下标使用变量 B(i+1)=A(i+2) 下标使用表达式 C(3,4)=100 下标使用常量二、数组的使用2 2、给数组元素赋值、给数组元素赋值 静态数组只能逐个元素赋值如果赋值有规律,可以使用循环结构循环结构n用=直接赋值A(1)=10A(2)=20n如果赋值有规律,使用循环结构循环结构赋值o例如,给数组A(4)的元素赋值 For i = 1 To 4For i = 1 To 4 A(i) = iA(i) = i Next i Next in通过InputBox函数输入值例如:For i = 1 To 4For i = 1 To 4 A(i)= inputbox(“ A(i)= inputbox(“请输入第请输入第” & i & “” & i & “个整数个整数”)”)NextNextn通过文本框输入值例如:A(1)=Text1.textA(2)=Text2.text二、数组的使用3 3、数组间的赋值、数组间的赋值n静态数组之间不能整体赋值,只能逐个元素赋值可使用循环结构n可以将一个静态数组整体赋值给一个动态数组,并自动确定动态数组的大小。
n n注意:注意:相互赋值的两个数组的类型必须相同n例如: Dim A(4) As integerinteger , B() As integerinteger A(0)=0 : A(1)=1 : A(2)=2: A(3)=3 : A(4)=4 B =A 将将A A数组整体赋值给数组整体赋值给B B数组且大小确定为数组且大小确定为5 5 4 4、数组的输出、数组的输出n输出数组中的全部或部分元素,一般使用循环结构循环结构例如:例如: For i = 1 To 4For i = 1 To 4 print A(i)print A(i) Next i Next i二、数组的使用5 5、For each NextFor each Next语句语句nFor Each Next 语句与 For Next 语句类似,都是实现循环结构的语但 For Each Next 语句是专用于数组和对象集合的 n语法格式:For Each For Each 成员成员 In In 数组数组 循环体循环体 Exit For Exit For Next Next 成员成员o成员:为一个Variant变量,在For Each Next 语句中代表数组中的每个元素,数组中有几个元素,此成员就重复使用几次,循环体就执行几遍。
o数组:在此之前经过定义的数组,用在此处时仅仅是一个数组名,没有括号和上下界o不能在For Each Next中使用用户自定义数据类型o使用For Each Next的好处是不用知道数组的大小和维数,就可输出数组的所有元素二、数组的使用示例:Dim A(1 To 4)For Each x In A Print x ; Next x求1! + 2! + 3! + 10!1! + 2! + 3! + 10!Private Sub Command1_Click()Private Sub Command1_Click() Dim a(1 To 10) As Long, sum As Long, t As Long Dim a(1 To 10) As Long, sum As Long, t As Long Dim n As Integer, x Dim n As Integer, x t = 1 t = 1 For n = 1 To 10 For n = 1 To 10 t = t * n t = t * n a(n) = t a(n) = t Next n Next n sum = 0 sum = 0 For Each For Each x x In In a a sum = sum + x sum = sum + x Next x Next x Print 1! + 2! + 3! + 10! =; sum Print 1! + 2! + 3! + 10! =; sum End SubEnd Sub二、数组的使用7.2 7.2 动态数组的声明和使用动态数组的声明和使用o动态数组的声明:Dim Dim 数组名数组名( ) As ( ) As 数据类型数据类型o动态数组大小的说明: Redim Redim preservepreserve 数组名数组名( ( 下界下界 To To 上界上界 , ) , )nPreserve :选择Preserve时,保留数组中原来的数据,但只允许ReDim 语句改变动态数组最后一维的上界。
n例如: Option Base 1Option Base 1 Dim A() AS integer Redim A(4,5) Redim Preserve A(4,UBound(Str,2)+4UBound(Str,2)+4)n注意:Redim语句可以多次使用,但只能改变数组的维数和大小,不能改变数组的类型动态数组举例o输入n个整数,存入动态数组,再输出这些数与数组有关的函数与数组有关的函数1. Array函数nArray函数可以对Variant类型的动态数组或变量整体赋值赋值后的数组大小由赋值的个数决定n例如,要将1,3,4,6,7 这些值赋值给数组a,可使用下面的方法赋值 Dim a() A=array(1,3,4,6,7)或 Dim a A=array(1,3,4,6,7)Array函数举例:自动抽题系统与数组有关的函数与数组有关的函数2. Ubound( ) 和Lbound( )函数 n n格式:格式:UBound( UBound( 数组名数组名,N ) ,N ) 求数组的上界n n格式:格式:LBound( LBound( 数组名数组名 , N ) , N ) 求数组的下界oN:可选;一般是整型常量或变量。
指定返回哪一维的上界1 表示第一维,2 表示第二维,如此等等如果省略默认是1n例如:不知道数组A的元素个数,要用FOR循环输出数组A的全部元素值For i=Lbound(a) to Ubound(a) print a(i)Next i 数据的排序就是将一批数据由小大到(升序)或由大到小(降序)进行排列常用的有选择法、冒泡法1.1.冒泡法排序:冒泡法排序:v 冒泡排序是常用的一种排序方法假设n个元素按递增的顺序排序,排序思想为:vv 第一轮:第一轮:从数组的第一项开始,每一项(i)都与下一项(i+1)进行比较如果下一项的值较小,就将这两项的位置交换,直到最后第n-1与第n项进行比较,将最大的数排列在最后vv 第二轮:第二轮:从数组的第一项开始,每一项(i)都与下一项(i+1)进行比较如果下一项的值较小,就将这两项的位置交换,直到最后第n-2与第n-1项进行比较,将第二大的数排列在倒数第二位vv 依此类推,依此类推,直到只有第一项与第二项进行比较交换,完成递增法排序 7.3 7.3 数组的排序数组的排序例:随机产生10个10100的整数,从小到大顺序输出冒泡排序法(升序)程序冒泡排序法(升序)程序 Const N=10Const N=10 Randomize Dim a(1 To N) As Integer Print 原始数据: For i = 1 To N 产生10个随机数 a(i) = Int(91 * Rnd + 10) Print a(i); Next i For i = 1 To N-1 For j = 1 To N - i If a(j) a(j + 1) Then t = a(j): a(j) = a(j + 1): a(j + 1) = t 交换位置 End If Next j Next i Print: Print 排序结果: For i = 1 To N Print a(i); Next i 数组的排序数组的排序思考思考: :产生产生7 7个个0-90-9之间的随机数如何改程序之间的随机数如何改程序? ?a,ba,b间的数间的数=int (b-a+1)*rnd+a=int (b-a+1)*rnd+a2.2.选择法排序(升序)选择法排序(升序)v选择法排序是最为简单且易理解的算法,其基本思想是每次将最小(或最大)的数找出来放在序列的最前面。
假设按递增法将有n个数的数组A(1To n)进行排列,步骤为:(1)假定最小值Temp,将Temp与A(2)进行比较,若A(2) a(j) Then t = a(i): a(i) = a(j): a(j) = t 交换位置 End If Next j Next i Print: Print 排序结果: For i = 1 To N Print a(i);Next i 数组的排序数组的排序选择法排序(升序)的改进:选择法排序(升序)的改进:For i = 1 To N - 1 p = i For j = i + 1 To N If a(p) a(j) Then p = j Next j t = a(i): a(i) = a(p): a(p) = tNext i 7.4 7.4 控件数组控件数组o控件数组:具有相同的名称和事件过程的一组同类型控件n控件数组中的每一个控件具有一个唯一的索引值index属性值,它相当于数组的下标n控件数组中的所有控件共享同一事件过程例如,假定。
