400 likes | 650 Views
第 6 章. 数 组. 本章要点: 固定数组 动态数组 数组的操作 控件数组. 6.1 数组概念. 数组是一组具有相同类型的有序变量的集合。数组可用于存储成组的有序数据。使用数组就是用一个相同的名字引用这一组变量中的数据,这个名字成为数组。 数组元素是带有下标的变量,其一般形式为“ 数组名(下标 1[, 下标 2 , ……] ) 如: A ( 2 ) B ( 2+2 , 1 ) C ( 1*2 , 3 , 1 ). 6.1.1 一维数组. 格式
E N D
第6章 数 组 • 本章要点: • 固定数组 • 动态数组 • 数组的操作 • 控件数组
6.1 数组概念 • 数组是一组具有相同类型的有序变量的集合。数组可用于存储成组的有序数据。使用数组就是用一个相同的名字引用这一组变量中的数据,这个名字成为数组。 • 数组元素是带有下标的变量,其一般形式为“ • 数组名(下标1[,下标2,……]) • 如:A(2) B(2+2,1) C(1*2,3,1)
6.1.1 一维数组 • 格式 • Dim︱Private︱Public︱static 数组名([维界定义]) [As 数组类型] • 功能 • 定义一个一维数组,并初始化所有数组元素。 • 说明 • (1)数组的维界定义必须为常量或符号常量,不能是表达式或变量。 • 例如: • Const k as integer=10 • Dim x(10) As Single 正确 • Dim a(k) As Long 正确 • 而 n=10 • Dim x(n) As Single 错误,下标不能是变量,只能是常量或者常量符号。
(2)下标的形式是:[下界 To]上界。一般情况下,当[下界 To]缺省时,默认值为0。下界<=上界。维的大小是:上界-下界+1。维界说明如果不是整数,将自动进行四舍五入处理。 • (3)As 数据类型:用来说明数组元素的类型,如果缺省,默认为是变体型(Variant)。 • 例如: • Dim a(12) As Single ‘声明a数组为单精度型,下标范围为0~12. • Dim x(1 To 50) As Integer ‘声明x数组为整型,下标范围为1~50. • Dim y(1 To 10) ‘声明y是一个下标范围为1到10的变体型数组。
(4)数组必须先声明后使用。 • (5)dim语句声明数组,该语句把数值数组中的全部元素都初始化为0,把变体字符串数组中的数组元素初始化为空字符串,把定长字符串数组的元素初始化为定长度的空格,把逻辑型数组元素初始化为False,变体型初始化为Empty。 • (6)dim语句中的维界定义可以是常数、也可以为空。下标为常数时为固定大小的数组,下标为空时则为动态数组。
(7)可以使用以下方法声明数组: • 建立公用数组,在模块的声明段用Public语句声明数组。 • 建立模块级数组,在模块的声明段用Private或Dim语句声明数组。 • 建立局部数组,在过程中用Dim或Static语句声明数组。 • 例如: • Public Counters(14) As Double • ‘定义Counters为15个元素的公用数组 • Private Sums(1 To 20) As Double • ‘定义Sums为20个元素的模块级数组
6.1.2 多维数组 • 格式 • Dim︱Private ︱Public ︱static 数组名([维界定义]) [As 数组类型] • 说明 • 此时的维界定义是对两维下标的定义。每一维的大小为:上界-下界+1;数组的大小为每一维大小的乘积。 • 例如: • Dim Arr(3,4) As Integer • ‘声明Arr是整型数组,4行5列,共20个元素。 • Dim MultiD(3,1 To 10,1 To 15) • ‘声明MultiD是一个变体数组,大小为4*10*15
格式 • Open Base n • 功能 • 改变数组下标的缺省下界 • 说明 • n为数组下标的下界,只能是0或1。该语句在程序中只能使用一次,且必须放在模块的通用部分,数组声明语句之前。 • 例如: • Option Base 1 • Private sub form_click() • Dim A(9) As Integer • …… • End sub
数组声明中定义的数组名,用来说明数组的名字、维数、大小和类型。数组元素是数组中的一个成员,只能放在可执行的语句中。两者虽然形式相同但意义不同。数组声明中定义的数组名,用来说明数组的名字、维数、大小和类型。数组元素是数组中的一个成员,只能放在可执行的语句中。两者虽然形式相同但意义不同。 • 例如: • Dim b(1,2) as Single • ‘声明2行3列的二维数组 • b(1,2) = 3.2 • ‘给数组元素b(1,2)赋值
例: Dim C(9) As Integer • 一维整型数组;下界0,上界为9 • 元素:C(0) C(1) C(2) …… C(9) • 例: Dim A(-4 TO 10) As Integer • 一维整型数值数组;下界 -4,上界 10 • 元素 A(-4) A(-3) ... A(0) A(1) ... A(10) • 例: Dim B(0 to 8,0 to 3) As String • → DIM B(8,3) As String • 二维字符串类型数组 • 第一维:下界0,上界 8; 第二维: 下界0,上界 3 • 元素 B(0,0) B(0,1) B(0,2) B(0,3) • B(1,0) B(1,1) B(1,2) B(1,3) • ... • B(8,0) B(8,1) B(8,2) B(8,3)
例: Dim C(-99 TO -5,-3 TO 0) As Boolean • 第一维下界-99 ,上界–5 ; 第二维下界–3, 上界0 • 元素: C(-99,-3) C(-99,-2) C(-99,-1) C(-99,0) • C(-98,-3) C(-98,-2) C(-98,-1) C(-98,0) • ... • C(-5,-3) C(-5,-2) C(-5,-1) C(-5,0) • 例: DIM S1(50) AS LONG • DIM M(-3 TO 10) • DIM ABC(20) AS STRING • DIM ST2(7,0 TO 14) AS STRING*20 • 例: CONST Y1=10 • CONST Y2=50 • DIM ABC(Y1 TO Y2) AS INTEGER
6.2固定数组 • 1.声明固定大小的数组 • 声明一个固定数组变量时,必须给定一个数组使用的有效范围。 • 类型(一维) • (1)局部数组:Private • (2)模块数组:Private • (3)全局数组:Public • 2.设定上下界 • 声明数组时,在数组名后跟一个用括号括起来的上界(默认下界为0),上界不超过Long数据类型的范围。 • 格式 • [Private︱Public] 数组名(数组长度) As 数组中元素类型 • 例如: • 声明一个元素为整型、长度为7的局部数组A • Private A (6) As Integer • 声明一个元素为整型、长度为7,索引范围从1~7的局部数组A • Private A (1 To 7) As Integer
3.包含其他数组的数组 • 也可以建立Variant数据类型数组,并与不同数据类型的数组共同使用。 • 例如: • Dim intX As Integer • Dim countersA(5) As Integer • For intX = 0 To 4 • countersA(intX) = 5 • Next intX • Dim countersB(5) As String • For intX = 0 To 4 • countersB(intX) = “hello” • Next intX • Dim arrX(2) As Variant • arrX (1) = countersA( ) • arrX(2) = countersB( )
4.多维数组 • 可用VB声明多维数组 • 例如: • Dim Matrix(9,9) as Double • 可用显式下界来声明两个维数或两个维数中的任何一个 • 例如: • Dim Matrix(1 To 9,1 To 9) as Double 注意:在增加数组的维数时,数组所占的存储空间会大幅度的增加,所以要慎用多维数组。使用Variant数组时更要格外小心,因为它们需要更大的存储空间。
6.3动态数组 • 在预先不知道要处理的数据量有多大时,如果使用静态数组,就需要在声明数组时使数组的大小尽可能达到最大,以适应不同的数据量。因为静态数组在整个程序的执行过程中一直占用存储空间,因此会浪费一定的内存空间,过度使用静态数组会影响整个系统的性能。 • 在解决实际问题时,所需要的数组到底应该有多大才合适,有时可能不得而知,所以希望能够在运行时改变数组的大小。使用动态数组就可以在任何时候改变其大小,并且可以在不需要时清除动态数组所占的存储空间。因此,使用动态数组更加灵活、方便,并有助于高效管理内存。
创建动态数组的步骤: • (1)声明数组为动态数组,只需给数组附以一个空维数表 • 例如: • Dim MatrixX ( ) • (2)在需要指定数组大小时,再使用ReDim语句分配数组中实际元素的个数 • ReDim 数组名(数组长度 - 1) • 例如: • ReDim MatrixX (8) • 通常是使用已经赋过值的整型变量来指定元素个数 • 例如: • X = 8,上面的语句等价为 • ReDim MatrixX (X) 注意:在重定义数组时,一般都会清除原来的元素,如果带Preserve关键词,则不清除原来的元素。例如,以下语句重定义MatrixX数组的大小,但没有清除原来其中的元素。 ReDim Preserve MatrixX (15)
6.4数组的操作 • 6.4.1数组元素赋值 • (1)用循环 • Dim A(10) As Integer • For i = 0 To 10 ‘使用循环,循环0-10共11次,i控制数组下标 • A (i) = 1 • ‘A(0)~A(10)各自赋值为1 • Next i • Private Sub Form _ Click() • Dim a(5) As Integer ‘声明一共有6个元素的数组 • For j = 0 To 5 ‘使用循环,循环0-5共6次,j控制数组下标 • a(j) = Val (InputBox (“请输入数据:”)) ‘使用InputBox给每个数组元素赋值 • Next • End Sub
(2)Array函数 • 用于为数组整体赋值,可以为动态数组或省略圆括号的数组赋值,但是类型只能是Variant. • 赋值之后,数组的大小由赋值的个数决定 • Option Base 1 ‘下界开始为1 • Private Sub Form _Click() • Dim a1,a2 • a1 = Array(1,3,5,7,9) ‘给a1和a2两个数组赋值 • a2 = Array(2,4,6,8,10) • For i = 1 To 5 ‘注意循环是从1开始,如果从0开始,出错! • Print a1(i);a2(i); • ‘依次输出a1(1)a2(1)a1(2)a2(2)……a1(4)a2(4) • Next • End Sub
(3)UBound和LBound函数 • 用UBound和LBound函数可以获得数组的上界和下界。 • UBound(<数组名>[,N]) • LBound(<数组名>[,N]) • 例如: • a2 = Array(2,4,6,8,10) • UBound (a2) • LBound (a2)
6.4.2数组元素的输出 • 数组胺素的输出可以用Print方法来实现 • 一维数组常用一重循环输出 • 二维数组常用二重循环输出 • 例6.1 • Option Base 1 ‘下界从1开始 • Dim M(4,4) As Integer ‘定义一个4*4=16的数组 注意它的下界为1 • Private Sub Form _ Click() • For i = 1 To 4 ‘双重循环负责输入二维数组 • For j = 1 To 4 ‘外层循环是i行下标,内层循环是j列下标控制 • M( i, j) = Val( InputBox (“请输入数据:”,“数组元素的输入”)) ’用inputbox任意输入16个数字 • Next j • Next i • For i = 1 To 4 ‘双层循环负责输出二维数组 • For j = 1 To 4 • Print “”+ Str ( M( i, j)); ‘每次输出空格和数字 • Next j • Print ‘内层循环每结束一次换行 即输出数组一行后换行 • Next i • End Sub
6.4.3 For Each...Next语句 1. 格式 For Each <变量> In <数组名> [<语句组1>] [Exit For] [<语句组2>] Next <变量> 只能是一个可变类型的变量 2. 功能: 首先将数组中的第一个元素赋给<变量>,然后进入循环体中执行其中的语句。如果数组中还有其他元素,则继续将下一个元素赋值给<变量>后执行循环体,当针对数组中的所有元素都执行完了,便会退出循环,然后执行Next之后的语句。
例: 以下程序段使用For Each...Next语句打印一维数组X中的所有元素。 Dim X(15) … For Each A In X Print A; Next A 例: 求二维数组Y的所有元素之和。 Dim Y(10, 10) … For Each A In Y Sum = Sum + A Next A Print Sum 使用For Each...Next循环处理数组时,适合于不关心数组元素的处理次序的问题。
6.4.4 清除数组 • 1. 格式 • Erase <数组名> • 2. 功能 • 对静态数组使用Erase语句将对其中的所有元素进行初始化(清除数组中的元素值)。 • 例如,将数值型数组元素值置为0;将可变长度字符串类型数组元素值置为零长度字符串。注意,Erase语句不能释放静态数组所占的存储空间。 • 对动态数组使用Erase语句将释放动态数组所占的存储空间,在下次引用该动态数组之前,必须使用ReDim语句重新定义该数组。
6.5数组控件 • 6.5.1控件数组的概念 • 如果在应用程序中用到一些类型相同且功能相近的控件,则可以把它们视为特殊的数组——控件数组。 • 特点: • (1)组成控件数组的元素是一组相同类型的控件,它们共用一个相同的控件名称,拥有相同的Name属性设置 • (2)数组中的每个控件都有一个唯一的下标索引号(Index Number)作为标识,下标值由Index属性指定
6.5.2运行时添加的控件数组 • 建立步骤如下: • 在窗体上画出某控件,设置该控件的Index值为0,表示该控件为数组,这是建立第一个元素 • 在编程过程时通过Load方法添加其余的若干元素,也可以通过Unlaod方法删除某个添加的元素 • 每个新添加的控件数组通过Left和Top属性确定其在窗体的位置,并将Visible属性设置为True
6.6常用算法 • 6.6.1排序算法 • 1.选择排序法(比较排序法) • 对N个数进行排序 • 1) 将第1个数与第2个数到第N个数依次比较,如果X(1)>X(J)(J=2,3,…,N),则交换X(1)、X(J)的内容; • 2) 将第2个数与第3个数到第N个数依次比较,如果X(2)>X(J)(J=3,4,…,N),则交换X(2)、X(J)的内容; • 3) 重复以上方法,将第I个数与第I+1个数到第N个数依次比较,如果X(I)>X(J)(J=I+1,…,N),则交换X(I)、X(J)的内容; • 共重复N-1轮。
Option Base 1 • Dim N As Integer, X() As Integer • Private Sub Command1_Click() ' 输入成绩 • N = Val(InputBox("请输入总人数", "", "")) • ReDim X(N) • Text1.Text = "" • For I = 1 To N • X(I) = Val(InputBox("请输入第" & Str(I)_ • & "个学生的成绩", "成绩排序", "")) • Text1.Text = Text1.Text & Str(X(I)) • Next I • End Sub
Private Sub Command2_Click() ' 排序 • For I = 1 To N – 1 • For J = I + 1 To N • If X(I) > X(J) Then • T = X(I) • X(I) = X(J) • X(J) = T • End If • Next J • Next I • Text2.Text = "" • For I = 1 To N • Text2.Text = Text2.Text & Str(X(I)) • Next I • End Sub 选择排序法 冒泡排序法
2.直接排序法 • 特点:比较后不立刻互换元素,而是记下其位置并在每一轮比较完毕后和S(i)互换。 • 首先,比较的元素不同,以降序为例,是当前元素与上次比较后的最大元素进行比较,因此,在进行比较之前,要有一个初始化最大元素的过程。 • 其次,确定完毕的元素的互换是在每一轮完成后进行的,而不是在比较后进行的。 • 再次,互换元素的不同,为S(i)和S(pointer)
3.冒泡排序法 • 如果按升序排序,则方法为: • 将相邻两个数比较,把小数对调到前边,如此进行一轮后,就会把最大的数互换到最后,再进行一次,则会把第二大的数排在倒数第二的位置上,进行N-1次后,整个数列即可排好。 • 在这种排序过程中,小数如同冒气泡一样逐层上浮,而大数逐个下沉,因此,被形象的喻为“冒泡”。
6.6.2常用的查找算法 • 1.顺序查找 • 顺序查找表现是把待查找的数与数组中的数从头到尾逐一比较,用一变量P来表示当前比较的位置,初始为1,当待查找的数与数组中P位置的元素相等时即可结束,否则P=P+1继续比较,当P大于数组的最大长度,也应该结束 • 注意退出的两种情况,分别为找到和未找到(P大于数组的最大长度)
2.二分(折半)查找 • 折半查找只能在排好序的数中查找。 • 1)设low为数组的下界,hig为数组的上界。 • 2)求[low,hig]区间的中间位置mid=(low + hig) / 2,mid取整数。 • 3) • 如果number<A(mid),且数列中存在number时,说明number在区间[low,mid-1]范围内,修改新的查找区间,即设hig= mid – 1,返回步骤2。 • 如果number>A(mid),且数列中存在number时,说明number在区间[mid+1,hig]范围内,修改新的查找区间,即设low = mid + 1,返回步骤2。 • 如果number=A(mid),则查找成功,mid即为所查找的位置。 注意:在此循环过程中low, hig , mid都是表示位置的整数,如果循环到low> hig ,则表明此数列中没有我们要找的数,应该退出循环。
6.6.3素数的判定和求法 • 素数的定义: • 除了1与本身之外,不能被其他正整数整除的数,叫做素数,也叫质数。 • 1.由定义判断素数 • 对于数M,从I = 2,3,4,5……到m-1判断m能否被I整除,如果全部不能整除,则m是素数,只要有一个能除尽,则m不是素数,为了压缩循环次数,可将判断范围从2-m-1改为2-int(sqr(m)).
2.用筛选法求素数 • 算法简介: • 首先把2~m内所有数放入筛选,然后找出筛中最小的素数,并将该数在范围之内的所有倍数的数去掉,依次进行,直到筛中的最小的素数已经超出m的范围。 • 理解: • 最小的素数去掉所有倍数以后的数中近邻的数即是下次循环的最小素数。 • 退出的条件是: • 最小素数已经等于最大的数,即指定的查找范围。 注意:在查找素数之前要初始化一个大小至少为m数组来进行比较,非素数标志可以把数值位置为零或者其他标志,最小素数从2开始。
6.7组合框 • 组合框的功能与列表框非常相近,但它一次只能选取或输入一个选项,而不能设定为多重选取模式,其主要特点是具有带向下箭头的方框。在程序运行时,按下此按钮就会下拉出一个列表框供用户选择项目。另外,还可以在组合框上方的框中输入数据。 • 1.常用属性 • 2.常用事件和方法 • 3.应用例子
6.7.1.常用属性 • (1)Style属性 • 返回或设置一个用来指示控件的显示类型和行为的值,在运行时刻是只读的 • (2)Text属性 • 在Style属性设置为0或1时,Text属性返回或设置编辑框中的文本,Style属性为2时,Text属性返回列表框中选择的项目
6.7.2常用事件和方法 • (1)Change事件 • 当组合框内容发生改变时发生 • (2)Click事件 • 当用户在一个组合框上单击鼠标按钮时发生 • (3)AddItem方法 • 添加一项到组合框控件中 • (4)Clear方法 • 清除组合框的内容 • (5)RemoveItem方法 • 从一个组合框控件中删除一项
6.8列表框 • 1.驱动器列表框常用属性 • 驱动器列表框常用属性是Drive,该属性用于设置或返回当前驱动器标识符。 • 2.目录列表框常用属性 • 目录列表框常用属性是Path,该属性设置目录列表框中所显示目录的路径。 • 3.文件列表框常用属性 • (1)Path属性 • (2)Pattern属性 • (3)Filename属性
本章小结 • 1. 数组概念 • 数组名、数组元素、下标、数组的维数 • 2. 固定数组 • Public|Private|Dim <数组名>[(<维数定义>)] • [As <类型>], … • 3. 动态数组 • 1) Public|Private|Dim <数组名>()[As <类型>], … • 2) ReDim <数组名>(<维数定义>) [As <类型>], … • 4. 数组的操作
5. 控件数组 • 1) 控件数组的表示: <控件数组名>(<索引>) • 2) 控件数组的建 • 在设计时如何建立;在运行时如何建立 • 3) 控件数组的使用 • 同一个控件数组的所有控件共享同一事件过 程。注意使用该过程返回的参数Index。