VB教学ppt课件第6章 数组医药版.ppt
第六章 数组,高等医药院校药学类第三轮规划教材大学计算机基础,第一节 数组的概念,目 录,第二节 数组的基本操作,第三节 动态数组,第四节 控件数组,第五节 常用算法,大学计算机基础沈阳药科大学,第一节 数组的概念,第一节 数组的概念,大学计算机基础沈阳药科大学,第一节 数组的概念,为什么要使用数组?,引例:编写一个程序,读入30名学生的考试成绩,然后打印出比平均分高的学生的考试成绩。,方法一:简单变量和循环结构相结合。虽然处理变得简单, 但无法输出比平均值高的成绩。方法二:使用多个变量。虽然可以输出比平均值高的成绩, 但程序的编写很麻烦,处理很复杂。,(1)定义一次即可定义很多变量(2)通过循环来处理这些变量,数组,因此处理大批量的类型相同的数据我们通常使用数组这样一种数据结构.,大学计算机基础沈阳药科大学,第一节 数组的概念,6.1数组的概念,说明:(1)这些变量使用一片连续的存储单元。(2)使用数组就是用一个相同的名字引用这一组变量中的 数据,这个名字称为数组名。(3)数据类型 VS 数组:数据类型指的是数据的取值范 围,而数组通常是表示相同数据类型的数据的集合。 利用数组,可以方便灵活地处理批量的数据。,在Visual Basic中,把一组具有同一名字、相同类型的变量组成的集合称为数组。例如:dim mark(1 to 100) as singlemark称为数组名,1跟100都是下标,这个数组具有100个元素。通过下标指出某个具体的数组元素,即指出它在数组中的位置。例如,mark(6)代表mark数组中的第6个元素。,大学计算机基础沈阳药科大学,第一节 数组的概念,6.1.1数组命名与数组元素,例如:dim mark(1 to 100) as single数组名:命名规则与简单变量一样。数组名不是代表一个变量,而是代表有内在联系的一组变量。 数组元素:数组内的每一个成员称为数组元素 。数组元素的类型也就是数组的类型。数组元素的一般形式如下数组名(下标1,下标2,) 例如:mark(20) 下标:每个数组元素都有各自的编号即下标,下标确定了数组元素在数组中的位置。 维数:下标数就是数组的维数。 一个下标表示一维数组,两个下标表示二维数组,二维以上的数组称为多维数组。数组的维数不得超过60。上界和下界:数组中第一个元素的下标称为下界,最后一个元素的下标成为上界。缺省时下界为0,若下标的取值超出上界或下界,将出现“下标越界”的出错信息。,大学计算机基础沈阳药科大学,第一节 数组的概念,6.1.2数组定义,注意:数组与简单变量不同,必须先定义(声明),后使用。(目的是告知计算机它将占用多少内存单元。),使用数组分两个阶段:声明(定义)数组和使用数组元素。,数组的声明,数组元素的使用,大学计算机基础沈阳药科大学,(1)静态数组的声明与使用,形式1: Dim 数组名(下标1,下标2) As 类型 下标: 下界 To 上界 省略下界为0 , 上下界必须为常数或常量,绝对不允许出现变量。 维数:几个下标为几维数组,最多60维。 每一维大小: 上界下界+1 数组大小: 每一维大小的乘积声明了数组的名、维数、大小、类型 ,同时还将数组初始化。,静态数组:声明的时候即确定数组中元素的个数(数组中元素的个数是固定不变的)。,另外一种声明形式: Dim 数组名类型符号(下标1,下标2)例: Dim mark!(1 to 100),例:Dim mark(1 to 100) As single,例子,第一节 数组的概念,大学计算机基础沈阳药科大学,第一节 数组的概念,例: Dim A(6) As Integer Private Name(1999 To 2002) As String *8 Dim B(2,1 to 2) As Integer,Dim M As IntegerConst N=5 As Integer Dim A(N) As Integer Dim B(1To 6.6) As Integer Dim C(1 To 2 * 3) As IntegerM=5 Dim D(0 To M) As Integer Dim Score(4),B(3,3) As IntegerDim A(6) As IntegerDim B(3,-1 To 4) As Single,返回,大学计算机基础沈阳药科大学,(1)静态数组的声明与使用,数组元素的使用:,例如:Dim mark(1 to 10) As Integer mark(2) =100,注意:下标只能在下界与上界之间,如:mark(11) 会出现下标越界的错误,例如:定义单精度类型、5个元素的数组,Dim m(1 to 5) as single 或者 Dim m! (1 to 5),第一节 数组的概念,大学计算机基础沈阳药科大学,例:Dim seat( 1 To 3, 1 To 4) As .。(声明数组时一个下标的为一维数组,两个下标的为二维数组),二维、三维数组,例:Dim seat( 1 To 2,1 to 3, 1 To 4) As .。该三维数组共有 234个元素,该二维数组共有 34个元素,6.1.3数组的结构,一维数组的结构 一维数组可以理解为线性存储数据,开辟连续的存储单元来依次存放数组的各个元素。,第一节 数组的概念,大学计算机基础沈阳药科大学,总结:看一个数组中有多少个元素,要注意 首先看一下程序的开头是否有Option base 语句 (1)无或者Option base 0 下标从0开始 (2)Option base 1 下标从1开始,Option base 语句的使用,书写简便而又不浪费内存空间,Dim seat( 1 To 3, 1 To 4) As 。,Dim seat(3, 4) As 。,练习,Option base 1Private Sub Command1_Click()Dim seat(3, 4) as 。Dim mark(10) as singleEnd Sub,第一节 数组的概念,大学计算机基础沈阳药科大学,静态数组的声明与使用,注意:(1)下界缺省为0,也可重新定义默认的数组的下界。例如: Option Base 1 (2)错误的声明,下标是变量 。如: n =Inputbox(“输入n”):Dim x(n) As Single(3)在数组声明中的下标说明了数组的整体,即每维的大小; 而在程序其他地方出现的下标表示数组中的一个元素。例如: Option Base 1 Dim seat(2,3) As Integer 声明了seat为二维数组,第一维的 大小为2,第二维的大小为3 seat(1,2)=100 对seat (1,2)这个数组元素赋值(4)在使用数组元素的时候,下标只能在下界与上界之间。,大学计算机基础沈阳药科大学,建立一个数组之后,可以对数组或数组元素进行操作。数组的基本操作包括输入、计算出来及输出,这些操作都是对数组元素进行的。此外,Visual Basic中数组经常与For Next结合使用。,数组元素赋值,数组元素操作,数组元素输出,第二节 数组的基本操作,第二节 数组的基本操作,输入数据,计算处理,数据输出,计算处理,数据输出,输入数据,大学计算机基础沈阳药科大学,第二节 数组的基本操作,6.2.1数组元素的赋值,1.用赋值语句给数组元素赋值。 (直接赋一个数据或者文本框中的内容) 这种方法适合于数据量小的情况下使用。 例: Dim Score(3) As Integer Dim Two(1, 1 to 2) As Integer Score(0)=80 Score(1)=75 Score(2)=91 Score(3)=68 Two (0,1)= Score(0),大学计算机基础沈阳药科大学,第二节 数组的基本操作,6.2.1数组元素的赋值,2.通过循环逐一给数组元素赋值(在循环当中直接将计算的数据或者产生的随机数赋值)这种方法适合于数据量大的情况下使用。Dim A(6) As Integer,i As IntegerDim B(1 to 2,1 to 2) As Integer,j As Integer For i=0 To 6 使用循环给一维数组赋值并输出 A(i)=Int(99*Rnd)+1 Print A(i);Next IFor i=1 To 2 ,利用二重循环给二维数组赋值并输出 For j=1 To 2 B(i,j)=i*10+j Print B(i ,j); Next j PrintNext i,大学计算机基础沈阳药科大学,第二节 数组的基本操作,例:Private Sub Form_Click()Dim A(6) As Integer,i As IntegerFor i=0 To 6 A(i)=InputBox(“给数组元素赋值”,“数组A赋值”) Print A(i);Next IEnd Sub,6.2.1数组元素的赋值,3.通过循环逐一给数组元素赋值(在循环当中lnputBox函数由键盘输入给数组元素赋值)这种方法数据量大的情况下不适用。,大学计算机基础沈阳药科大学,第二节 数组的基本操作,6.2.1数组元素的赋值,4.用Array函数给数组赋值,利用Array函数可以把一个数据集赋值给一个Variant变量,再将该Variant变量创建成个一维数组。使用形式: =Array(数据列表),注意:Array函数的括号内值与值之间用逗号分隔;接收完值后的变体型变量可以像数组一样,利用下标来引用每一个值;Array函数产生给变量型变量的数组下界由Option Base n决定,默认是0;Array函数将产生一个数组;不可以用Array函数给非Variant类型的变量赋值。,大学计算机基础沈阳药科大学,第二节 数组的基本操作,6.2.1数组元素的赋值,4.用Array函数给数组赋值,例:Option Base 1Private Sub Form_Click() Dim A As Variant Dim B(4) As Variant A=Array(5,4,3,2,1) Print A(1);A(2);A(3);A(4);A(5) A=Array(1.51,2.31,3.61,4.11) Print A(1);A(2);A(3);A(4) A=”NO Array” Print A B=Array(1,2,3,4,5,6) 该语句是一条错误语句End Sub,大学计算机基础沈阳药科大学,第二节 数组的基本操作,6.2.1数组元素的赋值,5.读取顺序文件中的数据给数组赋值,例:Private Sub Form_Click() Dim i as integer Dim a(1 to 30) as integer Open app.path & “” & “in.dat” for input as #1 Do while not eof(1) i=i+1 Input #1,a(i) Loop Close #1End Sub,大学计算机基础沈阳药科大学,Dim b As Variant 变体类型的变量或字符型动态数组 b = Split(“20, 5, 68”, “,”) 分隔后每个元素都是字符若要变成数字可用val函数 For i = 0 To 2 Print b(i) Next i无论有没有Option Base 1 语句,下界都从0开始,join函数 Dim b As Variant 变体类型的变量或字符型数组 b = Split(20, 5, 68, ,) c=join(b, :) Print c 将数组b的各个元素用指定字符连接为一个字符串,6.2.1数组元素的赋值,6. Split函数给数组赋值,大学计算机基础沈阳药科大学,第二节 数组的基本操作,6.2.2数组元素的引用,数组元素的使用和普通变量一样,但是最应该注意的是下标是否合法,即不要发生下标越界的错误。,例6-1:产生10个(1,50)之间的随机整数,并将其中的最大数和最小数打印出来,同时将其存放在顺序文件”out.dat”中。运行结果:,大学计算机基础沈阳药科大学,第二节 数组的基本操作,例6-2:生成一个如下形式的矩阵(见图),并按矩阵元素的排列次序将矩阵输出到图片框或文本框(同时输出也可)。 运行结果:,大学计算机基础沈阳药科大学,第二节 数组的基本操作,6.2.3数组函数及数组语句,1LBound函数功能:返回数组某维的维下界的值。调用形式:LBound(数组名,d) 参数d为维数,若缺省则函数返回数组第一维的维下界的值或一维数组的下界。,例:Private Sub Form_Click()Dim A(4) As Integer,B(3 to 6,10 to 20)Print LBound(A),LBound(B,1),LBound(B,2)End Sub程序执行结果是:0 3 10,大学计算机基础沈阳药科大学,第二节 数组的基本操作,2UBound函数功能:返回数组某维的维上界的值调用形式:UBound(数组名,d),例:Private Sub Form_Click()Dim A(4) As Integer,B(3 to 6,10 to 20)Print UBound(A),UBound(B,1),UBound(B,2)End Sub程序执行结果是:4 6 20,大学计算机基础沈阳药科大学,第二节 数组的基本操作,3For Each-Next结构语句功能:用来依次访问数组中的每一个元素。调用形式: For Each Element In 语句集 Next Element,说明: Element 是在For Each-Next结构内重复使用的 Variant变量,实际上代表数组中每一个元素。 是要处理的数组名。 循环次数则由数组中的元素的个数确定。 循环体内可以包含Exit For语句,用以退出循环。,大学计算机基础沈阳药科大学,第二节 数组的基本操作,例6-3 找出10个能被9整除的两位数,分两行输出,使用For Each-Next结构。 运行结果:,例6-4 把下面的二维数组,用For Each-Next结构输出。观察输出结果。运行结果:,程序验证:二维数组在内存中存储时,按列优先存储,大学计算机基础沈阳药科大学,第二节 数组的基本操作,提示:文本框中的内容可以在设计状态时,在文本框的Text属性中输入,可以避免程序调试时重复的文字输入。,6.2.4数组应用,例6-5 统计字母(不分大小写)在文本中出现的次数。运行结果:,大学计算机基础沈阳药科大学,第二节 数组的基本操作,例6-6 20个小朋友按照编号顺序围成一圈,13循环报数,凡报到3者出圈,直到全部出圈为止。编写程序记录出圈小朋友的出圈顺序。运行结果:,经典:猴子选大王,一共有n只猴子围成一圈,开始数数,数到m时退出圈,剩下的重新开始数,直到最后一只猴子为大王。,大学计算机基础沈阳药科大学,第三节 动态数组,第三节 动态数组,大学计算机基础沈阳药科大学,例:求一个班级中学生数学成绩的平均值并输出大于平均分的成绩.,Dim mark(1 to 32) as singleOpen app.path & “” & “math.dat” for input as #1Do while not eof(1) i=i+1 Input #1,a(i) LoopClose #1,sum=0For i=1 to 32 sum=sum+mark(i)Next Iavg = sum/32,For i=1 to 32 if mark(i)avg then print mark(i)Next i,赋值,求平均值,输出大于平均分的成绩,Dim mark!(1 to 32),静态数组的缺陷,当实际元素个数少,浪费空间当实际元素个数多,不够用,程序出错,元素个数可动态变化的数组,动态数组,大学计算机基础沈阳药科大学,在声明数组时未给出数组的大小(省略括号中的下标),当要使用它时,随时用ReDim语句重新指出数组的维数以及大小(以方便为数组元素分配存储空间)。形式如下:ReDim 数组名(下标,下标2) As 类型,动态数组:声明的时候没有指出数组中元素的个数(数组中元素的个数是动态变化的)。,例 :Sub Form_Load( ) Dim x( ) As Single例 求若干个学生的平均分。 n =Inputbox(“输入n”) ReDim x(n) End Sub,练习,6.3动态数组,大学计算机基础沈阳药科大学,第三节 动态数组,说明:(1)静态数组(元素个数固定)在程序编译(声明)时分配存储单元,动态数组(元素个数不固定)只有在运行(Redim语句)时分配存储单元。 (2) 当数组中元素个数可以确定的时候,则使用ReDim语句来重新定义这个数组;在过程中可多次使用ReDim来改变数组的大小和维数,但一般不改变动态数组的数据类型。 ReDim 中的下标可以是常量,也可以是有了确定值的变量。(3)每次ReDim将会使原动态数组中的内容清零或清空。可以在ReDim语句后加Preserve参数来保留数组中的数据。使用Preserve只能改变最后一维的大小,前面几维大小和维数不能改变,不用 Preserve 时前面几维大小和维数可以改变。(4)Dim、Private、Public变量声明语句是说明性语句,可出现在过程内或通用声明段;ReDim语句是执行语句,只能出现在过程内。,大学计算机基础沈阳药科大学,第三节 动态数组,例:求一个班级中学生数学成绩的平均值并输出大于平均分的成绩. 改进使程序对于任意一个班级都适用。,例6-7 对数组重新定义时保留动态数组的内容。运行结果:,大学计算机基础沈阳药科大学,第三节 动态数组,6.3.2Erase语句,功能:对于静态数组使用Erase语句将重新初始化数组元素,对于动态数组使用Erase语句将释放动态数组的存储空间。,调用形式:Erase a1,a2, 语句中的a1、a2为需要重新初始化的数组名,例子,注意:下标越界是初学者使用数组时经常遇到的错误。要仔细检查数组的说明语句和对数组元素进行赋值操作语句中的下标值,若下标值超过了数组说明语句中的上、下界就会产生下标越界错误。,大学计算机基础沈阳药科大学,第三节 动态数组,运行结果:,提示:凡是只能被1和本身整除的数称为素数。除2以外的素数都是奇数,所以只需对100以内的每一个奇数进行判断即可。 由于编写程序时不能确定100以内有多少个素数,所以在定义数组时用动态数组,这样可以减少存储空间的浪费。,6.3.3动态数组应用 例6-8:找出100以内的所有素数,存放在数组Prime中,并将所找到的素数,按每行5个的形式显示在窗体上。,大学计算机基础沈阳药科大学,标志变量的使用在编程中经常用到,例如下面题目:随机产生30个不重复的两位数,存入数组中并分5行显示出来,Option Base 1Dim a%(30),Temp%,n%,i%,Flag As Boolean a(1) = Int(Rnd*90 + 10) 第一个是不可能重复的 n = 2 Do While n=30 Temp = Int(Rnd*90 + 10) Flag = False 假设没重复 For i = 1 To n-1 If Temp = a(i) Then Flag = True : Exit For 退出内层循环,没必要 End If Next i If Not Flag Then a(n) = Temp:n = n+1 Loop,实验6.6 P98,大学计算机基础沈阳药科大学,(1) 插入 查找要插入的位置k(1=k=n-1)腾出位置,把最后一个元素开始到第K个元素往后移动一个位置第k个元素的位置腾出,就可将数据插入,(2) 删除 要找到欲删除的元素的位置k;然后从k+1到n个位置开始向前移动;最后将数组元素减1。,注意:redim preserve的应用,数组元素的插入与删除,大学计算机基础沈阳药科大学,第三节 动态数组,对有序数列的插入、删除元素。,思想:首先找到要插入(删除)的数据在数组当中的位置,然 后做插入(删除)操作。,插入:,删除:,例子:,大学计算机基础沈阳药科大学,第三节 动态数组,注意:思想:依次取出数组的一个个元素与其后续的所有元素比较(通过双重的Do循环实现)。删除数组中的元素通过将其后续的元素依次前移即可实现重复的数据。思考:能否用For循环替代Do循环?为什么?,例6-9 编写程序,删除一个数列中的重复数。运行结果:,大学计算机基础沈阳药科大学,第四节 控件数组,第四节 控件数组,大学计算机基础沈阳药科大学,第四节 控件数组,6.4控件数组6.4.1基本概念,引入,控件数组是由一组具有共同名称和相同类型的控件组成,数组中的每一个控件共享同样的事件过程。 控件数组的名字由控件的Name属性指定,而数组中的每个元素的下标则由控件的Index属性指定,控件数组的第一个元素的下标是0,控件数组可用到的最大索引值为32767。,同一控件数组中的元素可以有相同的属性设置值,也可以有自己的属性设置值。引用形式:控件数组名(下标)例:Optionl(0)表示控件数组Optionl的第0个元素。,大学计算机基础沈阳药科大学,第四节 控件数组,6.4.2 建立控件数组控件数组的建立有三种方法:1)创建同名控件 2)复制现存控件 3)运用代码产生控件数组 通过Load方法添加其余的若干个元素,也可以通过Unload方法删除某个添加的元素。调用形式: Load 控件数组名() Unload 控件数组名(),大学计算机基础沈阳药科大学,第四节 控件数组,例6-10 在程序运行时,通过Load语句创建名为Tl的控件数组。运行结果:,大学计算机基础沈阳药科大学,第三节 动态数组,数组 常用的算法,大学计算机基础沈阳药科大学,1.分类统计,Select Case a(i) Case Is 60 b(5) = b(5) + 1 Case Is 70 b(6) = b(6) + 1 Case Is = 100 b(9) = b(9) + 1End Select,例:随机产生20个学生的成绩,统计5059、6069、7079、8089、90100各分数段的人数。,方法一,j = a(i) 10 If j = 10 Then j = 9 b(j) = b(j) + 1 For i = 5 to 8 输出各分数段人数 Print i*10;“”;i*10+9;“的人数: ”;b(i) Next iPrint “90100的人数:”;b(9),方法二,大学计算机基础沈阳药科大学,第二节 数组的基本操作,提示:文本框中的内容可以在设计状态时,在文本框的Text属性中输入,可以避免程序调试时重复的文字输入。,6.2.4数组应用,例6-5 统计字母(不分大小写)在文本中出现的次数。运行结果:,大学计算机基础沈阳药科大学,2. 求极值(最大、最小),例:求一批数中的最大值。,方法一:max=最小值,min=最大值,方法二:max=第一个元素的值,min=第一个元素的值,改进:max、min保存最大、最小元素的下标,这时只能求出最大、最小值,但若是问那个同学成绩最高、最低,很显然不知道,因此在求最大、最小值时最好记录下标。,程序,大学计算机基础沈阳药科大学,3. 数组元素逆序,For i =1 To n2 t=num(i) num (i)=num (n-i+1) num (n-i+1)=tNext i,大学计算机基础沈阳药科大学,数组的输出往往体现在对数组中已存数据的打印输出效果,主要是二维数组,如各种矩阵的输出样式,也是考试的热点。,矩阵For i = 0 To 4 5次 For j = 0 to 4 5次 sc(i,j) = i*5 + j Print sc(i,j); Next j Print 换行Next i,已知数组sc(0 To 4,0 To 4),4. 输出矩阵,大学计算机基础沈阳药科大学,左下三角矩阵For i = 0 To 4 5次 For j = 0 to i i+1次 sc(i,j) = i*5 + j Print sc(i,j); Next j Print 换行Next i,已知数组sc(0 To 4,0 To 4),大学计算机基础沈阳药科大学,左上三角矩阵For i = 0 To 4 5次 For j = 0 to 4-i 5-i次 sc(i,j) = i*5 + j Print sc(i,j); Next j Print 换行Next i,已知数组sc(0 To 4,0 To 4),大学计算机基础沈阳药科大学,右上三角矩阵For i = 0 To 4 5次 For j = i to 4 5-i次 sc(i,j) = i*5 + j Print Tab(4*j);sc(i,j); Next j Print 换行Next i,大学计算机基础沈阳药科大学,右下三角矩阵For i = 0 To 4 5次 For j = 4-i to 4 i+1次 sc(i,j) = i*5 + j Print Tab(10 + 4 * j);sc(i,j); Next j Print 换行Next i,大学计算机基础沈阳药科大学,数组排序(选择法)例6-5.8 对已知存放在数组中的n个数,用选择法按递增顺序排序。(1) 从n个数的序列中选出最小的数(递增),与第1个数交换位置;(2) 除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置;(3) 重复(1)n-1遍,最后构成递增序列。,大学计算机基础沈阳药科大学,For i = 1 To n - 1 iMin= i For j = i+1 To n If iA(j) iA(iMin) Then iMin = j Next j t= iA(i): iA(i) = iA(iMin) : iA(iMin) = tNext I,大学计算机基础沈阳药科大学,排序(冒泡法)例6-5.9 选择法排序在每一轮排序时找最小(递增次序)数的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法排序在每一轮排序时只要将第一个与其它几个比较,只要次序不对,就交换,出了内循环,最小数已冒出。排序进行的过程见下表。,大学计算机基础沈阳药科大学,For i = 1 To n-1 进行n-1轮比较 For j = 1 To n-i 从1n-i个元素进行两两比较 If iA(j) iA(j+1) Then 若次序不对,则马上进行交换位置t = iA(j) : iA(j) = iA(j+1) : iA(j+1) = t End If Next j 出了内循环,一轮排序结束,最大数已冒到最上面 Next i,大学计算机基础沈阳药科大学,数组元素的插入与删除 (1) 插入 例6-5.10 在有序数组a(1 to n)(原有n-1个元素)插入一个值Key元素,算法:查找要插入的位置k(1=k=n-1)腾出位置,把最后一个元素开始到第K个元素往后移动一个位置第k个元素的位置腾出,就可将数据Key插入,注意:redim preserve的应用,大学计算机基础沈阳药科大学,(2) 删除 要找到欲删除的元素的位置k;然后从k+1到n个位置开始向前移动;最后将数组元素减1。,注意:redim preserve的应用,End of the chapter,沈阳药科大学计算机教研室,