VB程序设计第二版第六章
24
(3)引用第i个学生的信息: Score(1).StudNumber = "01" Score(1).StudName = "张三" Score(1).Math = 89 Score(1).English = 90
或写成: With Score(1)
.StudNumber = "01" .StudName = "张三" .Math = 89 .English = 90 End With
14
例1:要存储100个学生的英语成绩,可以定义 一维数组Eng如下: Dim Eng(1 to 100) As Integer 或: Option Base 1 Dim Eng(100) As Integer 例2:存储一个3行3列的矩阵,定义二维数组A 如下: Dim A(1 To 3, 1 To 3) As Single
27
【例6-1】 随机产生10个两位整数,放入数组a中。 考虑到要在不同的过程中使用数组,所以首先在模 块的通用段声明数组: Dim a(1 To 10) As Integer 随机整数的生成由窗体的Load事件代码完成: Private Sub Form_Load() Randomize For i = 1 To 10 a(i) = Int(Rnd * 90) + 10 Next End Sub
8
一维数组示例:
例如:一班40名学生的英语成绩可以表示成
Eng(1)、Eng(2)、Eng(3)、…、Eng(40),用
Eng(1)表示1号学生的成绩,用Eng(2)表示2号
学生的成绩……,这样处理起来很直观,需
要引用第I个学生的成绩时,直接使用Eng(I)
即可。
9
二维数组示例:
设有一个3行3列的矩阵:
20
【例】
Dim A() As Integer Private Sub Command1_Click() N=4 ReDim A(N) For I = 0 To N A(I) = 1: Print A(I); Next I Print N=8 ReDim A(N) For I = 0 To N 运行时输出结果为: 1 1 1 1 1 Print A(I); Next I 0 0 0 0 0 0 0 0 0 End Sub
3
下标变量:每个数组元素用来保存一个数
据,其使用与简单变量类似,在简单变量
允许出现的多数地方也允许出现数组元素。
例如,可以通过X=90给简单变量X赋值,
同样也可以通过Eng(1)=90给数组元素Eng(1)
赋值,所以,数组元素也起来。例如,将X(8) 表示成:X[8]、X{8}、或X8都是错误的。 (2)下标可以是常量、变量或表达式,其值必 须是整数,否则将被自动四舍五入为整数。
11
6.2.1 静态数组的定义
静态数组是指数组元素的个数在程序的执 行期间不能改变的数组。 格式:
Public|Private|Dim 数组名(维数定义) [As 类型],… 功能:声明数组,包括确定数组的名称、维 数、每一维的大小和数组元素的类型,并为 数组分配存储空间。
12
说明:
(1)数组的作用域 在模块通用声明段使用Public语句建立一 个全局级数组(注意,不能在窗体模块使 用Public定义数组); 在模块通用声明段中使用Private语句或 Dim语句建立一个模块级数组 在过程中用Dim/static语句建立一个过程级 数组。 (2)“数组名”必须符合标识符的命名规 则。 13
10
6.2 数组的定义
数组在使用之前必须先定义(声明) , 定义数组的主要目的是为数组分配存储空间。
数组名:存储空间的名称; 数组元素:存储空间的每一个单元。每个单元 的大小与数组的类型有关。
按数组占用存储空间的方式不同,Visual Basic有两种数组:
静态数组 动态数组
两种数组的定义方法不同,使用方法也略 有不同。
17
定义动态数组需要分两步完成: 1.在模块级或过程级定义一个无下标的数组: Public|Private|Dim 数组名()[As 类型],… 2.在过程级定义数组的实际大小。 ReDim [Preserve] 数组名(维数定义) [As 类型],…
ReDim语句只能出现在过程中。 “维数定义”通常包含变量或表达式,但 其中的变量或表达式应有明确的值。
28
多维数组元素的输入通过多重循环来实现。 由于VB中的数组是按行存储的,因此一般把 控制数组第1维的循环变量放在最外层的循 环中。 【例6-2】 设有一个5×5的方阵,其中的元 素是由计算机随机生成的小于100的整数。 考虑到要在不同的过程中使用数组,所以首 先在模块的通用段声明数组: Dim a(5,5) As Integer
a11 a 21 a 31
a12 a 22 a 32
a13 a 23 a 33
a( 1,1) a(1,2) a(1,3)
a( 2,1) a(2,2) a(2,3)
a( 3,1) a(3,2) a(3,3)
用二维数组A表示该矩阵的所有元素,用第 1个下标表示元素所在的行号,用第2个下标 表示元素所在的列号,则A(I,J)表示第I 行第J列的元素 A。
(3)下标的最小取值称为下界,下标的最大取 值称为上界,下界和上界的大小在定义数组时确 定。引用数组元素时,下标必须在其下界和上界 之间。
(4)数组名的命名规则与简单变量的命名规则 相同。
5
6.1.2 数组的类型
VB中数据类型较多,相应的数组类型也有多 种,可以声明任何基本数据类型的数组,包 括用户自己定义类型和对象变量,但是一个 数组中的所有元素应该具有相同的数据类型。 特殊情况:当数据类型为variant时,各个元 素能够包含不同类型的数据。
31
【例6-4】 将例6-2中的数组在窗体中按5行5列输出。 Private Sub Form_Activate() Cls For i = 1 To 5 For j = 1 To 5 Print a(i, j); Next Print Next End Sub
32
6.3.2 数组的删除
格式:
Erase 数组名
21
改为:
Dim A() As Integer Private Sub Command1_Click() N=4 ReDim A(N) For I = 0 To N A(I) = 1: Print A(I); Next I Print N=8 ReDim Preserve A(N) For I = 0 To N Print A(I); Next I 运行时输出结果为: End Sub 1 1 1 1 1
25
6.3 数组的基本操作
定义数组之后,就可以对数组进行各种 操作了,如输入数组元素的值,对数组元素 进行各种处理,输出数组元素的值等。 对数组的处理通常要结合循环进行,用循 环变量控制数组元素的下标,以便能够按一 定次序、有选择、快速地处理数组。
26
6.3.1 数组的输入和输出
输入:输入数组元素值可以有多种方法。 例如,可以使用赋值语句、文本框、 InputBox函数、Array函数等,可以对数组 的个别元素输入数据,也可以对整个数组 输入数据。 输出:数组元素的值,可以使用Print方法 输出数组元素,也可以使用控件输出数组 元素,如使用标签、文本框等。
18
例如,定义一个动态数组Eng,用来保存学 生的英语成绩。
Dim Eng( ) As Integer
Private Sub Command1_Click( ) N = Val(InputBox("请指定学生人数")) ReDim Eng(1 To N) …… End Sub
19
说明: 可以用ReDim语句多次改变数组元素的数目及维 数的数目。 在定义动态数组的两个步骤中,如果用步骤1定义 了数组的类型,则不允许用步骤2改变类型。 每次执行ReDim语句时,如果不使用Preserve,则 数组中的值全部被重新初始化;如果使用Preserve, 则保留数组中原有的元素值。 使用Preserve关键字的Redim语句只能改变多维数 组中最后一维的上界,且不能改变维数的数目。
6
6.1.3 数组的形式
VB中支持两种数组:静态数组和动态数组。 前者指的是数组元素个数固定不变,而后者 的大小在运行时可变。
7
6.1.4 数组的维数
数组中的元素可以用一个下标来定位,也 可以用多个下标来定位。 数组的维数:下标个数 一维数组: 由一个下标组成。 如 A(2),C(6) 二维数组: 由两个下标组成。 如 B(2,3) 三维数组: 由三个下标组成。 如 G(3,4,23) 三维以上的数组称为多维数组,最多60维
(3)“维数定义”形式为: [下界1 To] 上界1,[下界2 To] 上界2,… VB默认下界值为0,可以使用Option Base语 句将默认下界修改为1
Option Base {0|1} (4)“类型”:Integer、Long、Single、 Double、Boolean、String、String*n、 Currency、Byte、Date、…… 在编译时为静态数组分配固定大小的存储空 间,在运行期间静态数组的大小不能改变。
1 1 1 1 10 0 0 0
22
6.2.3 用户自定义类型的数组
用户自定义类型的数组:指数组中的每个 元素的类型都是用户自定义类型。 例如: 学生成绩表
学 号 01 02 … 姓 名 张三 李四 … 数 学 89 78 … 英 语 90 93 …
23
(1)可以定义数据类型StudScore:
同的、有序的数据需要处理。使用数组,结
合循环,在多数场合下可以很方便地表示和 处理这种数据。