数组与记录
| 前面介绍的都是属于基本数据类型(字符串、整形、实型等)的数据,可以通过简单变量名来访问它们的元素。VB除基本数据类型外,还提供了复合型数据类型。复合型数据类型是按照一定规则组成的元素类型的数据。元素类型又称基类型,他可以是简单数据类型,也可以是复合数据类型。对于符合数据类型来说,不能用一个简单变量名来访问它的元素。 |
| |
| 本章将介绍vb提供的两种复合数据类型,即数组和用户定义类型,其中用户定义类型习惯上称为记录类型。 |
数组的概念
| 在实际应用中,常常需要处理同一类型的成批数据。 |
| 例如,为了处理100个学生某门课程的考试成绩等场景。 |
| 一个数组,如果只用一个下标就能确定一个数组元素在数组中的位置,则称为一维数组。也可以说,由具有一个下标的下标变量所组成的数组称为一维数组,而由具有两个或多个下标的下标变量所组成的数组称为二维数组或多维数组。 |
静态数组的定义
| 数组应当先定义后使用。在计算机中,数组占据一块内存区域,数组名是这个区域的名称,区域的每个单元都有自己的地址,该地址用下标表示。定义数组的目的就是通知计算机为其留出所需要的空间。 |
| |
| 在VB中,可以用4个语句来定义数组,这4个语句格式相同,但适用范围不一样。 |
| 1. Dim 用在窗体模块或标准模块中,定义窗体或标准模块数组,也可用于过程中。 |
| 2. ReDim 用在过程中。 |
| 3. Static 用在过程中。 |
| 4. Public 用在标准模块中,定义全局数组。 |
| |
| 下面以Dim语句为例来说明数组定义的格式,当用其他语句定义数组时,其格式是一样的。 |
在定义数组时,VB提供了两种格式。
| 1. Dim 数组名(下标上界)As 类型名称 |
| 例如: |
| `Dim ArrayDemo(5) As Integer` 定义了一个一维数组,该数组的名字为ArrayDemo,类型为Integer,占据6个整型变量的空间。 |
| |
| 对于二维数组,格式如下: |
| `Dim 数组名(第一维下标上界,第二维下标上界)As 类型名称 |
| 例如: |
| `Dim Test(2,3) As Integer` 定义了一个二维数组,名字为Test,类型为Integer,该数组有3行4列,占据12个整型变量的空间。 |
| |
| 拓展说明: |
| 1. 数组必须先定义后使用。 |
| 2. 当用Dim 语句定义数组时,该语句把整数组中的全部元素都初始化为0,而把字符串数组中的全部元素都初始化为空字符串。对于用Dim 语句定义的记录变量中的元素以及定长字符串,也进行类似的处理。 |
| 3. 一般情况下,下标的下标默认为0。如果希望下标从1开始,可以通过`Option Base` 语句来设置,其格式为:`Option Base n` Option Base语句用来指定数组下标的默认下界,只能是0或1,如果不使用该语句默认值为0。该语句只能出现在窗体层或模块层,不能出现在过程中,并且必须在数组定义之前。此外,如果定义的是多维数组,则下标的默认下界对每一维都有效。 |
| 4. 定义数组时如为给出数组内的元素,默认类型为Variant。 |
| 2. Dim 数组名([下界To]上界[,[下界To]上界]···) |
| 例如: |
| `Dim Arr(-2 To 3)` 定义了一个一维数组Arr,其下标的下届为-2,上界为3,该数组可以使用的下标值在-2到3之间,数组元素为Arr(-2),Arr(-1),Arr(0),Arr(1),Arr(2),Arr(3),共有6个元素。 |
| 可以看出,第二种格式实际上已经包含了第一种格式,只要省略模式中的“下届To”,即变为第一种格式。当下标为0或1时,可以省略“下界To”。因此如果不使用Option Basc语句,则下述数组中说明语句时等效的: |
| Dim A(8,3) |
| Dim A(0 To 8,0 To 3) |
| Dim A(8,0 To 3) |
| |
动态数组的概念
| 定义数组后,为了使用数组,必须为数组开辟所需要的内存区。根据内存区开辟时机的不同,可以把数组分为静态(static)数组和动态(dynamic)数组。通常把需要在编译时开辟内存区的数组叫做静态数组,而把需要在运行时开辟内存区的数组叫做动态数组。 |
| 当程序没有运行时,动态数组不占据内存,因此可以把这部分内存用于其他操作。 |
| |
| 静态数组和动态数组由其定义方式决定,即: |
| · 用数值常数或符号常量作为下标定维的数组是静态数组。 |
| · 用变量作为下标定维的数组是动态数组。 |
动态数组的定义
| 静态数组的定义比较简单,在前面的例子中,使用的都是静态数组。下面主要介绍动态数组的定义。 |
| 动态数组以变量作为下表值,在程序运行过程中完成定义,通常分为两步: |
| 首先在窗体层、标准模块或过程中用Dim或Public声明一个没有下标的数组(括号不能省略),然后在过程中用ReDim语句定义带下标的数组。 |
| |
| 如:`Dim arr() As Integer`在窗体层声明。 |
| Private Sub Command1_Click() |
| Dim size |
| size = 10 |
| ReDim Arr(size) As Integer |
| For i = 1 To 10 |
| Print Arr(i) |
| Next i |
| End Sub |
| 该例就是在程序过程中根据变量size定义的动态数组Arr。 |
| |
| ReDim 语句的格式为: |
| ReDim 变量(下标) As 类型 |
| |
| ReDim只能出现在事件过程或通用过程中,用它定义的数组是一个“临时”数组,即在执行数组所在的过程时为数组开辟一定的内存空间,当过程结束时,这部分内存即被释放。 |
数组的赋值
| Private Sub Command1_Click() |
| Dim a(3) As Integer |
| a(0) = 0 |
| a(1) = 1 |
| a(2) = 2 |
| For i = 1 To 3 |
| Print a(i) |
| Next i |
| End Sub |
| Private Sub Command1_Click() |
| ReDim stuname(4) As String |
| For i = 1 To 4 |
| temp$ = InputBox$("Enter name:") |
| stuname(i) = temp$ |
| Next i |
| |
| For i = 1 To 4 |
| Print stuname(i) |
| Next i |
| End Sub |
| |
数组的清除和重定义
| 数组一经定义,便在内存中分配了相应的存储空间,其大小是不能改变的。也就是说,在一个程序中,同一个数组只能定义一次。有时候,可能需要清除数组的内容或对数组重新定义,这可以用`Erase` 语句来实现,其格式为:`Erase 数组名`。 |
| 用于静态数组时置0,字符串数组置空字符串,如果是记录数组则根据每个元素(包括定长字符串)的类型重新进行设置。 |
| 用在动态数组时将删除整个数组结构并释放数组所占用的内存。也就是说清除后该数组不复存在。 |
| |
| 案例: |
| Private Sub Command1_Click() |
| Dim Test(1 To 20) As Integer |
| For i = 1 To 20 |
| Test(i) = i |
| Print Test(i); |
| Next i |
| Erase Test |
| Print |
| Print "Erase Test()" |
| Print "Now the Test Array is Filled with zeros```" |
| For i = 1 To 20 |
| Print Test(i) |
| Next i |
| End Sub |
数组的基本操作
数组元素的输入、输出和复制
| 1. 引用 |
| 数组的引用通常是指对数组元素的引用,其方法是,在数组后面的括号中指定下标,`x(1), y(2,3)` |
| 2. 数组元素的输入 |
| 数组元素一般通过For循环语句及InputBox函数输入。 |
| ReDim Test(1 To 20) As Integer |
| Test(1) = InputBox("enter name") |
| Print Test(1) |
数组元素的输出
| Dim Test(1 To 20) As Integer |
| Test(1) = 1 |
| Print Test(1) |
数组元素的复制
| 单个数组元素可以像简单变量一样从一个数组复制到另一个数组。例如: |
| Dim B(3),A(3) |
| · |
| · |
| B(1) = A(2) |
For Each···Next 和 For···Next 语句
| 用于执行指定重复次数的一组操作。但`For Each ··· Next`语句专门用于数组或对象“集合”。例如: |
| For Each 成员 In 数组 |
| 循环体 |
| [Exit For] |
| · |
| · |
| Next [成员] |
| |
| Dim Arr(1 to 5) |
| For Each x in Arr |
| Print x; |
| Next x |
数组的初始化
| 数组的初始化,就是给每个数组元素赋初始值。通过InputBox等方式。 |
| `数组变量名 = Array(数组元素值)` |
| Dim Arr As Integer |
| Arr = Array(1,2,3,4,5) |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2020-11-08 UML面向对象分析、建模与设计
2020-11-08 Shell 脚本
2020-11-08 早做打算,不要随遇而安。
2020-11-08 编程人员成长模型