高等医药院校药学类第三轮规划教材——大学计算机基础 第六章 数组 高等医药院校药学类第三轮规划教材——大学计算机基础
目 录 沈阳药科大学计算中心 第一节 数组的概念 第二节 数组的基本操作 第三节 动态数组 第四节 控件数组 第五节 常用算法 2
大学计算机基础——沈阳药科大学 第一节 数组的概念 第一节 数组的概念
引例:编写一个读入30名学生的学号及其考试成绩,然后再按照考试成绩从高到低的顺序把他们的学号打印 。 大学计算机基础——沈阳药科大学 第一节 数组的概念 为什么要使用数组? 引例:编写一个读入30名学生的学号及其考试成绩,然后再按照考试成绩从高到低的顺序把他们的学号打印 。 按以前简单变量的使用和循环结构相结合的方法编写程序显然是件很麻烦的事。在许多场合,我们使用数组这样一个数据结构来处理数据量大、类型相同且有序排列的数据
第一节 数组的概念 6.1数组的概念 数组是一组具有相同类型的有序变量的集合。 大学计算机基础——沈阳药科大学 第一节 数组的概念 6.1数组的概念 数组是一组具有相同类型的有序变量的集合。 这些变量按照一定的规则排列,使用一片连续的存储单元。数组可用于存储成组的有序数据。 使用数组就是用一个相同的名字引用这一组变量中的数据,这个名字称为数组名。
第一节 数组的概念 6.1.1数组命名与数组元素 数组名:命名规则与简单变量一样。数组名不是代表一个变量,而是代表有内在联系的一组变量。 大学计算机基础——沈阳药科大学 第一节 数组的概念 6.1.1数组命名与数组元素 数组名:命名规则与简单变量一样。数组名不是代表一个变量,而是代表有内在联系的一组变量。 数组元素:数组内的每一个成员称为数组元素 。数组元素的类型也就是数组的类型。数组元素的一般形式如下: 数组名(下标1[,下标2,…]) 下标:每个数组元素都有各自的编号即下标,下标确定了数组元素在数组中的位置。下标可以是常量、变量或算术表达式。当下标的值为非整数时,会自动进行四舍五入处理。 维数:下标数就是数组的维数。 一个下标表示一维数组,两个下标表示二维数组,二维以上的数组称为多维数组。数组的维数不得超过60。 上界和下界:数组中第一个元素的下标称为下界,最后一个元素的下标成为上界。缺省时下界为0,若下标的取值超出上界或下界,将出现“下标越界”的出错信息。
第一节 数组的概念 6.1.2数组定义 定义一个数组,就是确定数组的名称和它的数据类型,指明数组的维数和每一维的上、下界的取值范围 。 大学计算机基础——沈阳药科大学 第一节 数组的概念 6.1.2数组定义 定义一个数组,就是确定数组的名称和它的数据类型,指明数组的维数和每一维的上、下界的取值范围 。 数组与简单变量不同,必须先定义,后使用。目的是告知计算机它将占用多少内存单元。 数组分为静态数组(定长)和动态数组(可变长)数组
第一节 数组的概念 1.数组的说明语句 Public、Private、Static、Dim是关键字,表示数组的作用范围。 大学计算机基础——沈阳药科大学 第一节 数组的概念 1.数组的说明语句 Public | Private | Static | Dim<数组名>([<维界定义>])[As<数据类型>] Public、Private、Static、Dim是关键字,表示数组的作用范围。 <维界定义>的格式如下: [<下界1>To] 上界1 [[,<下界2>To] 上界2…] 其中,“下界”和关键字“To”可以缺省。 缺省下界和关键字To时,则表示下标的取值是从0开始,等价于“0 To上界”。如果程序中使用了Option Base 1语句,下标的取值是从1开始,等价于“1 To上界”。
第一节 数组的概念 例: Dim A(6) As Integer 大学计算机基础——沈阳药科大学 第一节 数组的概念 例: Dim A(6) As Integer Private Name(1999 To 2002) As String *8 Dim B(2,1 to 2) As Integer
第一节 数组的概念 2.数组的上、下界 下界和上界分别表示该维的最小和最大的下标值。 大学计算机基础——沈阳药科大学 第一节 数组的概念 2.数组的上、下界 下界和上界分别表示该维的最小和最大的下标值。 维界的取值范围不得超过长整型(Long)数据的数据范围(-2,147,483,648到2,147,483,647),且下界≤上界。 在定义固定大小数组时,维的上、下界说明必须是常数表达式,不可以是变量名。 如果维界说明不是整数,VB将对其进行四舍五入处理。 例: Dim M As Integer Const N=5 As Integer Dim A(N) As Integer Dim B(1To 6.6) As Integer Dim C(1 To 2 * 3) As Integer Dim D(0 To M) As Integer ’错。普通变量不允许用来说明数组大小
第一节 数组的概念 3.数组的类型 数组说明语句中As <数据类型>是用来声明数组的类型。 大学计算机基础——沈阳药科大学 第一节 数组的概念 3.数组的类型 数组说明语句中As <数据类型>是用来声明数组的类型。 数组的类型可以是Integer、Long、Single、Double、Date、Boolean、String(变长字符串)、String*length(定长字符串)、Object、Currency、Variant和自定义类型。 若缺省As短语,则表示该数组是变体(Variant)类型。 例: Option Base 1 Dim Score(4),B(3,3) As Integer 还可根据需要用Static语句定义静态数组。 Static Starry(3) As Integer
第一节 数组的概念 4.数组的大小 数组的大小(数组的长度)就是这个数组所包含的数组元素的个数。上、下界取值范围确定了数组的大小。 大学计算机基础——沈阳药科大学 第一节 数组的概念 4.数组的大小 数组的大小(数组的长度)就是这个数组所包含的数组元素的个数。上、下界取值范围确定了数组的大小。 数组的大小=第一维大小×第二维大小×…×第N维大小 维的大小=维上界—维下界+1 例: Dim A(6) As Integer Dim B(3,-1 To 4) As Single A数组的大小=6-0+l=7(个数组元素) B数组的大小=(3-0+1)×[4-(-1)+1]=4×6=24(个数组元素)
第一节 数组的概念 6.1.3数组的结构 1.一维数组的结构 一维数组可以理解为线性存储数据,也可以用一维数组表示数学中的向量。 大学计算机基础——沈阳药科大学 第一节 数组的概念 6.1.3数组的结构 1.一维数组的结构 一维数组可以理解为线性存储数据,也可以用一维数组表示数学中的向量。 例:Dim A(8) As Integer 数组A的逻辑结构示意如下: A(8)=(A(0),A(1),A(2),…,A(6),A(7),A(8)) 一维数组在内存中存放时将会开辟连续的存储单元来依次存放这些数据,由于是整形数组,因此每个数据占两个字节。
大学计算机基础——沈阳药科大学 第一节 数组的概念 2.二维数组的结构 二维数组,可以理解为二维表存储数据,二维数组的数组元素需要用两个下标来标识,即要指明数组元素的行号和列号。 通常用二维数组表示数学中的矩阵。 例: Option Base 1 Dim T(3,4) As Integer 二维数组T的逻辑结构示意如下: 二维数组在内存中是“逐列存放” 。 第1列 第2列 第3列 第4列 T(1,1) T(1,2) T(1,3) T(1,4) T(2,1) T(2,2) T(2,3) T(2,4) T(3,1) T(3,2) T(3,3) T(3,4) T(4,1) T(4,2) T(4,3) T(4,4)
第一节 数组的概念 3.三维数组的结构 三维数组是由行、列和页组成的三维表。三维数组也可理解为几页的二维表,即每页由一张二维表组成。 大学计算机基础——沈阳药科大学 第一节 数组的概念 3.三维数组的结构 三维数组是由行、列和页组成的三维表。三维数组也可理解为几页的二维表,即每页由一张二维表组成。 三维数组的元素是由行号、列号和页号来标识。 例: Option Base 1 Dim P(2,3,2) As Integer 数组P的逻辑结构形式如下: 第1页 P(1,1,1) P(1,2,1) P(1,3,1) P(2,1,1) P(2,2,1) P(2,3,1) 第2页 P(1,1,2) P(1,2,2) P(1,3,2) P(2,1,2) P(2,2,2) P(2,3,2) 三维数组在内存中是“逐页存放” 。
大学计算机基础——沈阳药科大学 第二节 数组的基本操作 第二节 数组的基本操作
第二节 数组的基本操作 6.2数组的基本操作 1.用赋值语句给数组元素赋值。 例: 这种方法适合于数据量小的情况下使用。 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 6.2数组的基本操作 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)
第二节 数组的基本操作 2.通过循环逐一给数组元素赋值 这种方法适合于数据量大的情况下使用。 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 2.通过循环逐一给数组元素赋值 这种方法适合于数据量大的情况下使用。 例: Private Sub Form_Click() Dim A(6) As Integer,i As Integer Dim 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 I Print For i=1 To 2 ,利用二重循环给二维数组赋值并输出 For j=1 To 2 B(i,j)=i*10+j Print B(i ,j); Next j Next i End Sub
3.用lnputBox函数由键盘输入给数组元素赋值 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 3.用lnputBox函数由键盘输入给数组元素赋值 数据多时不适用 例: Private Sub Form_Click() Dim A(6) As Integer,i As Integer For i=0 To 6 A(i)=InputBox(“给数组元素赋值”,“数组A赋值”) Print A(i); Next i Print End Sub
第二节 数组的基本操作 4.用Array函数给数组赋值 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 4.用Array函数给数组赋值 利用Array函数可以把一个数据集赋值给一个Variant变量,再将该Variant变量创建成—个一维数组。 使用形式: <变体变量名>=Array([数据列表]) 注意: Array函数的括号内值与值之间用逗号分隔; Array函数将产生一个数组; 不可以用Array函数给非Variant类型的变量赋值 ; 接收完值后的变体型变量可以像数组一样,利用下标来引用每一个值; Array函数产生给变量型变量的数组下界由Option Base n决定,默认是0. 例: Option Base 1 Private 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
第二节 数组的基本操作 5.读取顺序文件中的数据给数组赋值 例: Private Sub Form_Click() 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 5.读取顺序文件中的数据给数组赋值 例: Private Sub Form_Click() Dim I as integer Dim a() as integer Open app.path & “\” & “in.dat” for input as #1 Do while not eof(1) I=i+1 Redim preserve a(i) Input #1,a(i) Loop Close #1 End Sub 注:假定”in.dat”为顺序文件并与项目工程文件存放在同一个文件夹中。
第二节 数组的基本操作 6.2.2数组元素的引用 数组元素的使用和普通变量一样,但是最应该注意的是下标是否合法,即不要发生下标越界的错误。 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 6.2.2数组元素的引用 数组元素的使用和普通变量一样,但是最应该注意的是下标是否合法,即不要发生下标越界的错误。 例6-1: 产生10个(1,50)之间的随机整数,并将其中的最大数和最小数打印出来,同时将其存放在顺序文件”out.dat”中。 运行结果:
第二节 数组的基本操作 例6-2: 生成一个如下形式的矩阵(见图),并按矩阵元素的排列次序将矩阵输出到图片框或文本框(同时输出也可)。 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 例6-2: 生成一个如下形式的矩阵(见图),并按矩阵元素的排列次序将矩阵输出到图片框或文本框(同时输出也可)。 运行结果:
第二节 数组的基本操作 6.2.3数组函数及数组语句 1.LBound函数 功能:返回数组某维的维下界的值。 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 6.2.3数组函数及数组语句 1.LBound函数 功能:返回数组某维的维下界的值。 调用形式: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
第二节 数组的基本操作 2.UBound函数 功能:返回数组某维的维上界的值 调用形式:UBound(数组名[,d]) 例: 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 2.UBound函数 功能:返回数组某维的维上界的值 调用形式: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
For Each Element In <array> 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 3.For Each-Next结构语句 功能:用来依次访问数组中的每一个元素。 调用形式: For Each Element In <array> [语句集] Next [Element] Element 是在For Each-Next结构内重复使用的Variant变量,实际上代表数组中每一个元素。 <array>是要处理的数组名。 循环次数则由数组中的元素的个数确定。 循环体内可以包含Exit For语句,用以退出循环。
第二节 数组的基本操作 例6-3 使用For Each-Next结构,找出10个能被9整除的两位数,并分两行输出。 运行结果: 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 例6-3 使用For Each-Next结构,找出10个能被9整除的两位数,并分两行输出。 运行结果: 例6-4 把下面的二维数组,用For Each-Next结构输出。观察输出结果。 程序验证: 二维数组在内存中存储时,按列优先存储
第二节 数组的基本操作 6.2.4数组应用 例6-5 统计字母(不分大小写)在文本中出现的次数。 运行结果: 大学计算机基础——沈阳药科大学 第二节 数组的基本操作 6.2.4数组应用 例6-5 统计字母(不分大小写)在文本中出现的次数。 运行结果: 提示:文本框中的内容可以在设计状态时,在文本框的Text属性中输入,可以避免程序调试时重复的文字输入。
大学计算机基础——沈阳药科大学 第二节 数组的基本操作 例6-6 20个小朋友按照编号顺序围成一圈,1~3循环报数,凡报到3者出圈,直到全部出圈为止。编写程序记录出圈小朋友的出圈顺序。 运行结果:
大学计算机基础——沈阳药科大学 第三节 动态数组 第三节 动态数组
第三节 动态数组 6.3动态数组 动态数组的定义: 例: Option Base 1 Dim DAry() As Integer 大学计算机基础——沈阳药科大学 第三节 动态数组 6.3动态数组 动态数组的定义: 首先定义不指明大小的数组: Public|Private|Dim|Static 数组名( )[As数据类型] 然后使用ReDim语句来动态地定义数组的大小、分配存储空间: ReDim [Preserve] 数组名(维界定义) 例: Option Base 1 Dim DAry() As Integer Private Sub Subl() Dim X As Integer,Y As Integer ReDim DAry(9) ’将动态数组DAry()定义为具有9个元素的一维数组 X=3 Y=5 ReDim DAry(X,Y) ’将动态数组DynArry重新定义为3×5的二维数组 End Sub
第三节 动态数组 ReDim的作用是重新定义或新声明一个数组;使用它可以任意指定某动态数组的大小,维数,但一般不改变动态数组的数据类型。 大学计算机基础——沈阳药科大学 第三节 动态数组 ReDim的作用是重新定义或新声明一个数组;使用它可以任意指定某动态数组的大小,维数,但一般不改变动态数组的数据类型。 每次ReDim将会使原动态数组中的内容清零或清空。 ReDim只能使用在过程中,不能出现在通用声明当中。 ReDim Preserve表示在重定义动态数组时,保留原数据;此时,只能改变最后一维的大小,不能改变维数。
例6-7 对数组重新定义时保留动态数组的内容。 运行结果: 大学计算机基础——沈阳药科大学 第三节 动态数组 例6-7 对数组重新定义时保留动态数组的内容。 运行结果:
第三节 动态数组 6.3.2Erase语句 功能:重新初始化固定大小数组的元素,或者释放动态数组的存储空间。 调用形式: 大学计算机基础——沈阳药科大学 第三节 动态数组 6.3.2Erase语句 功能:重新初始化固定大小数组的元素,或者释放动态数组的存储空间。 调用形式: Erase a1[,a2,…] 语句中的a1、a2为需要重新初始化的数组名。
第三节 动态数组 例:下面图中的程序段及其运行结果如图所示。 而打印B数组的语句出现下标越界错误。 大学计算机基础——沈阳药科大学 第三节 动态数组 例:下面图中的程序段及其运行结果如图所示。 而打印B数组的语句出现下标越界错误。 注意:下标越界是初学者使用数组时经常遇到的错误。要仔细检查数组的说明语句和对数组元素进行赋值操作语句中的下标值,若下标值超过了数组说明语句中的上、下界就会产生下标越界错误。
大学计算机基础——沈阳药科大学 第三节 动态数组 6.3.3动态数组应用 例6-8 找出100以内的所有素数,存放在数组Prime中,并将所找到的素数,按每行5个的形式显示在窗体上。 提示: 凡是只能被1和本身整除的数称为素数。除2以外的素数都是奇数,所以只需对100以内的每一个奇数进行判断即可。 由于编写程序时不能确定100以内有多少个素数,所以在定义数组时用动态数组,这样可以减少存储空间的浪费。 运行结果:
第三节 动态数组 例6-9 编写程序,删除一个数列中的重复数。 运行结果: 大学计算机基础——沈阳药科大学 第三节 动态数组 例6-9 编写程序,删除一个数列中的重复数。 运行结果: 思考:程序中用双重的Do循环处理删除数组中的重复的数。能否用For循环替代Do循环?为什么?
大学计算机基础——沈阳药科大学 第四节 控件数组 第四节 控件数组
大学计算机基础——沈阳药科大学 第四节 控件数组 6.4控件数组 6.4.1基本概念 控件数组是由一组具有共同名称和相同类型的控件组成,数组中的每一个控件共享同样的事件过程。 控件数组的名字由控件的Name属性指定,而数组中的每个元素的下标则由控件的Index属性指定,控件数组的第一个元素的下标是0,控件数组可用到的最大索引值为32767。 同一控件数组中的元素可以有相同的属性设置值,也可以有自己的属性设置值。 引用形式:控件数组名(下标) 例:Optionl(0) 表示控件数组Optionl的第0个元素。
第四节 控件数组 6.4.2 建立控件数组 控件数组的建立有三种方法: 1)创建同名控件 2)复制现存控件 3)运用代码产生控件数组 大学计算机基础——沈阳药科大学 第四节 控件数组 6.4.2 建立控件数组 控件数组的建立有三种方法: 1)创建同名控件 2)复制现存控件 3)运用代码产生控件数组 通过Load方法添加其余的若干个元素,也可以通过Unload方法删除某个添加的元素。 调用形式: Load 控件数组名(<表达式>) Unload 控件数组名(<表达式>)
大学计算机基础——沈阳药科大学 第四节 控件数组 例6-10 在程序运行时,通过Load语句创建名为Tl的控件数组。 运行结果:
第四节 控件数组 6.4.3控件数组应用 例6-11 编写一个能进行连续四则混合运算和百分比转换的简单运算器。 运行结果: 大学计算机基础——沈阳药科大学 第四节 控件数组 6.4.3控件数组应用 例6-11 编写一个能进行连续四则混合运算和百分比转换的简单运算器。 运行结果:
大学计算机基础——沈阳药科大学 第五节 常用算法 第五节 常用算法
第五节 常用算法 6.5常用算法 6.5.1排序 1、选择排序 基本思想:“逐个比较,逆序交换”。 大学计算机基础——沈阳药科大学 第五节 常用算法 6.5常用算法 6.5.1排序 1、选择排序 基本思想:“逐个比较,逆序交换”。 算法:设在数组Sort中存放n个无序的数,要将这n个数按升序重新排列。 第一轮比较:用Sort(1)与Sort(2)进行比较,若Sort(1)>Sort(2),则交换这两个元素中的值,然后继续用Sort(1)与Sort(3)比较,若Sort(1)>Sort(3),则交换这两个元素中的值;依次类推,直到Sort(1)与Sort(n)进行比较处理后,Sort(1)中就存放了n个数中的最小的数。 第二轮比较:用Sort(2)依次与Sort(3)、Sort(4)……Sort(n)进行比较,处理方法相同,每次比较总是取小的数放到Sort(2)中,这一轮比较结束后,Sort(2)中存放n个数中的第二小的数。 第n—1轮比较:用Sort(n-1)与Sort(n)比较,取小者放到Sort(n-1)中,Sort(n)中的数则是n个数中最大的数。经过n-1轮的比较后,n个数已按从小到大的次序排列好了。 总的比较次数是:n(n-1)/2次。
大学计算机基础——沈阳药科大学 第五节 常用算法 例6-12 用选择排序法对10个两位随机整数进行从小到大排序。 运行结果:
第五节 常用算法 2、冒泡排序——大量数据的排序方法 基本思想:“两两比较,逆序交换”。 大学计算机基础——沈阳药科大学 第五节 常用算法 2、冒泡排序——大量数据的排序方法 基本思想:“两两比较,逆序交换”。 算法:设在数组A中存放n个无序的数,要将这n个数按降序重新排列。 第一轮比较:将A(1)和A(2)比较,若A(1)<A(2)则交换这两个数组元素的值,否则不交换;然后再用A(2)和A(3)比较,处理方法相同;以此类推,直到A(N-1)和A(N)比较后,这时A(N)中就存放了N个数中最小的数。 第二轮比较:将A(1)和A(2)、A(2)和A(3),…,A(N-2)和A(N-1)比较,处理方法和第一轮相同,这一轮比较结束后A(N-1)中就存放了N个数中第二小的数。 第N-1轮比较:将A(1)和A(2)进行比较,处理方法同上,比较结束后,这N个数按从小到大的次序排列好。
大学计算机基础——沈阳药科大学 第五节 常用算法 例6-13 用优化的冒泡排序法对10个100以内的随机整数数进行从小到大排序。 运行结果:
大学计算机基础——沈阳药科大学 第五节 常用算法 6.5.2数据查找 1.顺序查找 例6-14 设计顺序查找程序。在顺序文件in.dat中存储有数据:23, 87, 98, 81, 36, 89, 83, 91, 88, 45,读入数组后进行查找。 运行结果:
第五节 常用算法 2.二分法查找——数据量大时的查找方法 大学计算机基础——沈阳药科大学 第五节 常用算法 2.二分法查找——数据量大时的查找方法 所谓“二分法”查找,就是每次操作都将查找范围一分为二,即将查找区间缩小一半,直到找到或查询了所有区间都没有找到要查找的数据为止。 注意使用二分法进行查找的前提是必须先将数据进行排序。
大学计算机基础——沈阳药科大学 第五节 常用算法 例6-15 设计二分法查找程序。在23, 87, 98, 81, 36, 89, 83, 91, 88, 45数列中进行查找。 运行结果:
End of the chapter 沈阳药科大学计算机教研室