第七章数组与记录

Download Report

Transcript 第七章数组与记录

Slide 1

第7章

数组与记录

数组
















数组的应用

用户自定义数据类型











Slide 2

主要内容及要求
数组的基本概念
一维数组和二维数组的应用
动态数组和控件数组的概念及简单应用
记录类型的定义和应用
学会使用简单的数据结构编写复杂应用程序。
掌握数组的概念,数组的声明格式,数组的不
同类型;了解动态数组和控件数组;了解For
Each … Next语句的应用;学会使用数组进行查
找、排序等基本程序的编写;掌握用户自定义
类型 ---记录的概念及应用。



Slide 3

教学重点和难点
教学重点



数组的概念、定义及应用
记录的定义及应用

教学难点



数组的概念、定义及应用
记录的定义及应用


Slide 4

7.1 数组
数据类型决定了数据在计算机中的存储方式及在其上的
运算规则,同样,批量的数据需要结构化的存储方法以及
这种结构上的数据运算和处理,这就需要一种特殊的数据
类型。高级语言都有“数组”这样的结构类型,这种结构
就是一种简单的数据结构。
7.1.1 数据结构的基本概念
7.1.2 数组的声明和引用
7.1.3 数组的清除
7.1.4 控件数组


Slide 5

7.1.1 数据结构的基本概念
1. 数据结构
数据结构(Data Structure) 反映数据的内部构成,即数据由哪些成分数
据构成,以什么方式构成,呈现什么结构。
数据是对客观事物的符号表示。在计算机科学中其含义是指所有能够输入
到计算机中并被计算机程序处理的符号集合。数据元素是数据集合中的一个实
体,是计算机程序中加工处理数据的基本单位。数据元素按其组成可分为简单
型数据元素和复杂型数据元素。简单型数据元素由一个数据项组成,所谓数据
项就是数据中不可再分割的最小数据单位;复杂型数据元素由多个数据项组成,
它通常携带着一个概念的多方面信息。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。常见的
数据结构有:线性结构、树形结构和图形结构。数据结构由数据的逻辑结构、
存储结构(或称物理结构)及其运算三部分组成。数据的逻辑结构反映数据元素
之间的逻辑关系,数据的存储结构是指在反映数据逻辑关系的原则下,数据在
存储器中的存储方式,即数据的逻辑结构在存储空间中的存放形式。


Slide 6

7.1.1 数据结构的基本概念
使用数据结构的目的是提高程序的处理速度、节省计算机存储
空间。具体地讲,在对数据进行处理时,可以根据所做的运算
不同而将数据组织成不同的结构形式。
2. 数组
数组使用相同名字引用一系列变量,并用数字(索引)来识
别它们。 一个数组中的所有元素具有相同的数据类型。
数组是一种简单的数据结构,称为顺序结构,其存储结构称
为顺序存储结构,即一个数组是一组地址连续的存储单元,用
来存储若干个数据。
3.VB中的数组种类
数组按其下标的数量来划分,可以分为一维数组、二维数组或
多维数组。按数组中元素个数的可变与否,又可分为静态数组
和动态数组。按数组中各元素的数据类型是否相同来划分,又
可以分为变体类型数组(又称默认数组)和普通数据类型数组。


Slide 7

7.1.2 数据的声明和引用

字符串型、整数型、浮点型等数据类型是VB的基本数据类型,
数组存放一组数据,而每个数据又是一个基本的数据,所以
数组又称为构造类型的数据类型。
在VB中,以下四个关键字用于数组声明语句:
Dim:常用于窗体模块或过程中定义局部变量类型数组,使用
格式同变量声明。
ReDim:用于过程中动态数组的重新定义。
Static:用于过程中定义静态变量类型数组,同变量声明。
Public(或Global):用于标准模块中定义全局变量类型数组,
同变量声明。
1. 静态数组声明
定义或声明数组的语法格式为:
Dim数组名([下界 To]上界[,[下界 to],上界]……) As 类型名称


Slide 8

7.1.2 数据的声明和引用
声明数组时,在数组名之后跟一个用括号括起来确定上界、下
界。上界、下界取值在Long 数据类型所确定的范围内。缺省的下
界为 0。如果想使下标的下界默认值为1,则应先在窗体模块中的
声明部分输入如下的语句:
Option Base 1
数组名的命名同变量命名,下标的上下界是常量或符号常量,
不能是变量。
例如:
Dim Sums (100 To 120) As String
Dim A(39) As Integer
Dim B(4,5) As Integer
2. 数组元素的引用

数组必须先定义后使用。
引用数组元素就是存取数组元素的值,引用的基本格式是:
数组名(<表达式>)


Slide 9

7.1.2 数据的声明和引用

引用时必须将“表达式”所表示的有效下标用圆括号括起来,
如果表达式的值超过定义的上下界范围,则会出现运行时错误。
【例7.1】利用数组来处理10个数值,比如这10个数代表身高,
从中获得平均身高、个子最高和最低的信息。相当于计算这10个
数的平均值,并求出最大值和最小值。
3. 动态数组
动态数组在声明时只定义数组名,不指定数组中元素的个数,
如Dim A(),括号不能省略,否则定义的是变量。在程序运行
过程中,再根据需要,通过ReDim语句来重新定义数组的大小。
因此,使用动态数组,定义数组时并不为该数组分配存储空间,
而要等到程序运行 ReDim 语句时再给数组分配存储空间。
ReDim 语句使用的格式为:
ReDim [Preserve] 数组名(下标1,下标2……)
功能:定义或重新定义动态数组的大小。其中:


Slide 10

7.1.2 数据的声明和引用

①下标可以是常量,也可以是有了确定值的变量。
②如果数组名事先没有声明,ReDim将声明一个新的动态数组。
③ 当定义一个已经指定数据类型动态数组的大小时,不能在
ReDim语句中重新指定该数组的数据类型。
④ 根据需要可多次使用ReDim 语句重新分配存储空间。如果
省略关键字Preserve,则重新初始化数组的元素,数组中原有的数
据丢失。Preserve 关键字的作用是在重新定义数组时,保存数组
元素中先前存储的数据。
【例7.2】编写程序,找出200~400之间所有能被8整除的数。
可以通过Lbound和Ubound函数得到一个数组中指定维数的上界和下
界。格式:
Lbound(数组[,维数]) ---下界值
Ubound (数组[,维数])---上界值


Slide 11

7.1.2 数据的声明和引用
4. 变体类型数组
在声明语句中如果没有使用关键字“As”指明变量类型,则定义
的数组为Variant类型,即变体类型数组。变体类型数组只适用于
局部变量,不宜在模块级变量和全局变量中声明。
【例7.3】定义变体类型数组并赋值。
数组的初始化:
Vb提供了array函数,利用该函数在程序运行之前初始化数组。
格式:

数组变量名=array(数组元素值)

数组变量名:预先定义的数组名,之后无括号。之所以称为
“数组变量”是因为它作为数组使用,但作为变量定义,既无维数
也无上下界。
例如:static num as variant
num=array(1,2,3,4,5)


Slide 12

7.1.2 数据的声明和引用
5.

For Each …Next语句引用数组

For Each…Next 语句,可以遍历数组或对象中的每个元素,对元素
进行查询、显示或读取等操作。语句格式为:
For Each 成员 In 数组名或对象名
循环体
[Exit For]
Next [成员]
“ 成 员 ” 是 一 个 变 体 变 量 , 它 是 为 循 环 体 提 供 的 , 并 在 For
Each …Next结构中重复使用,它实际上代表的是数组中元素。
“数组”是一个数组名,没有括号和上界。
语句所重复执行的次数由数组中的元素的个数确定。如:
Dim a(1 to 5)
For Each x in a
print x;
Next x


Slide 13

7.1.3 数组的清除
无论是静态数组还是动态数组,一经定义,系统便在内存中为它们分
配了相应的存储空间,为了方便用户对已定义的数组空间再利用,VB
提供一个Erase语句,用来清除数组的值或数组元素个数。Erase语句
作用的格式为:
Erase 数组名1[,数组名2]…
说明:1.在Erase语句中只要给出要刷新的数组名即可。
2.Erase语句对静态数组的影响:
数组类型

影响

数值数组

将每个元素设为零

字符串数组(变长)

将每个元素设为零长度字符串

字符串数组(定长)

将每个元素设为零

Variant数组

将每个元素设为空

用户定义类型的数组

将每个元素作为单独的变量来设置

对象数组

将每个元素设为nothing


Slide 14

7.1.3 数组的清除
3.当把erase语句用于动态数组时,将删除整个数组结构并释放
该数组所占用的内存。也就是说,动态数组经erase后,即不复
存在,而静态数组经erase后仍然存在,只是其内容被清空。

4. 当 把 erase 语 句 用 于 变 体 数 组 时 , 每 个 元 素 将 被 重 新 置 为
“空”。
5. Erase释放动态数组所使用的内存,在下次引用该动态数组
之前,必须用redim语句重新定义该数组变量的维数。
【例7.4】数组的清除语句应用举例。


Slide 15

7.2 控件数组
控件数组的概念
一组相同类型的控件组成。它们共用一个控件名,具有相同
的属性,建立时系统给每个元素赋一个唯一的索引号(Index)。
控件数组共享同样的事件过程,通过返回的下标值区分控件数
组中的各个元素。
例: Private Sub cmdName _Click(Index
As Integer)

If Index=3 then
‘ 处理第四个命令按钮的操作
End If

End Sub
控件数组的建立;【例7.5】。


Slide 16

7.2 数组的应用
7.2.1 排序问题
排序是计算机程序设计的基本应用之一,排序的方法有插入排
序、选择排序、冒泡排序、堆排序等多种,这里介绍常用的两
种排序 ----- 选择排序和冒泡排序。
1.选择法排序
基本思想:将要排序的数放在数组中,然后从数组中选出最大(小)
数作为数组的第一个元素;再从剩余数中选出最大(小)数,作为
数组的第2个元素…依次类推到最后一个数.
算法:(设要排序的数放在数组A(n)中)
[1]用数组a(1)与数组的其他元素比较,一旦有小于a(1)的,即将
a(1)与之交换位置。一轮比较完后,数组中的最小数放在a(1)
[2]对a(2),a(3)…a(n-1)重复执行[1]相似的操作。


Slide 17

7.2 数组的应用

原始数据
第1趟交换后
第2趟交换后
第3趟交换后
第4趟交换后
第5趟无交换

8
2
2
2
2
2

6
6
3
3
3
3

9
9
9
6
6
6

图 交换过程

3
3
6
9
7
7

2
8
8
8
8
8

7
7
7
7
9
9


Slide 18

7.2 数组的应用
选择法排序(升序)的VB程序:
For i = 1 To n - 1
p = i
For j = i + 1 To n
If a(p) > a(j) Then p = j
Next j
temp = a(i)
a(i) = a(p)
a(p) = temp
Next i


Slide 19

7.2 数组的应用
1.冒泡排序
基本思想: (将相邻两个数比较,小的调到前头)。
算法:(设要排序的数放在数组a(n)中)
1)第一趟将每相邻两个数比较,小的调到前头,经n-1次两
两相邻比较后,最大的数已“沉底”,放在最后一个位置,
小数上升“浮起”;
2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法
比较,经n-2次两两相邻比较后得次大的数;
3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次
两两比较。


Slide 20

7.2 数组的应用


Slide 21

7.2 数组的应用
冒泡法排序(升序)的VB程序:
For i = 1 To n - 1
For j = 1 To n-i
If a(j) > a(j+1) Then
temp=a(j)
a(j)=a(j+1)
a(j+1)=temp
End if
Next j
Next i


Slide 22

7.2 数组的应用
7.2.2 查找问题

顺序查找法:
基本思想:用要查找的数和数组中的数一一比较,直到
找到该数或确认不存在为止。
二分查找法:
基本思想:假设要查找的数为x,在数组a(n)中查找,
a(n)必须已排序,查找时先取a(1)~a(n)中的元素
a(int((n+1)/2)),看它是否与x相等,如果大于x则只需
在int((n+1)/2)+1~n之间继续查找;反之,则只需在
1~int((n+1)/2)-1间继续查找.查找方法与前同……如
此循环,直到找到或找遍整个数组.


Slide 23

7.3 用户自定义数据类型
在Vb中,用户可以用TYPE语句定义自己的数据类型,即将若
干个基本数据类型的数据项组合起来成为一个整体的复合类型。
此类型的一个变量,占用一块地址连续的存储区域,区域的大
小有每个基本类型的数据项大小之和确定。
7.3.1

用户自定义数据类型的语法

定义:
[Public|Private] Type
数据类型名
数据项1
AS 类型名
数据项2
AS 类型名
……
END Type


Slide 24

7.3 用户自定义数据类型
例如: TYPE

STUDENT
NAME
AS STRING*8
SEX
AS STRING
BRITHDAY
AS DATE
GRADE AS SINGLE
END TYPE

注意:
记录类型中的元素可以是变长字符串也可以使定长字符串。
记录类型的定义必须放在模块的声明部分,在使用记录类型前,必
须用TYPE语句加以定义。在一般情况下,记录类型在标准模块定义时,
其变量可以出现在工程的任何地方。当在标准模块中定义时,关键字
TYPE前可以有PUBLIC(默认)或PRIVATE,而如果在窗体模块中定义,
则必须在前面加上关键字PRIVATE。
在记录类型中不能使用动态数组


Slide 25

7.3 用户自定义数据类型
例如:WITH STUDENT
.NAME=“王刚”
格式: 变量名.数据项名
.SEX=“男”
如:STUDENT.NAME=“王刚”
.BRITHDAY=#1985-5-8#
STUDENT.SEX=“男”
.GRADE=520
STUDENT.BRITHDAY=#1985-5-8#
END WITH
STUDENT.GRADE=520
使用WITH和END WITH语句可以在引用时省略变量或对象,形式
为:
WITH 变量名
.数据项=表达式
END WITH

7.3.2 自定义类型的引用


Slide 26

教材习题

教材P144
习题7:
7.1,7.2,7.3,7.4(1、3、4、5)


Slide 27

实验八

数组与记录(I)

实验九 数组与记录(II)
1.
2.

3.
4.
5.
6.

掌握一维数组、二维数组和记录的概念。
熟悉一维数组、二维数组、记录类型和记录变量的说
明方法。
掌握数组元素和记录元素的引用、赋值。
掌握一维数组、二维数组和记录变量的输入、输出方
法。
初步掌握使用单重或多重循环结构控制数组元素的下
标。
初步掌握可调数组和控件数组的使用。