当前位置:
文档之家› 第5章存储多个同类型的数据——数组与集合
第5章存储多个同类型的数据——数组与集合
F1=1 F2=2 Fn=Fn-2+Fn-1
这是一个有序的一维数列,我们可以声 明一个数组来存放它,并将其第一个元 素和第二个元素赋值为1。
构建“Fibonacci”应用程序
Step1:新建一个Windows Form应用程 序工程,并命名为“Fibonacci”。 Step2:进行窗体界面设计。
例子
下面代码声明了一个整型的含有10个元 素的一维数组。 Dim intA(9)As Integer
在中,将数组作为对象看待,因 此数组可以在声明时不指明其长度,而 是在使用之前使用New关键字创建,分 配相应的内存空间,其语法格式如下。
◦ Dim 数组名( ) As Integer ◦ 数组名=New 类型名(下标上界){ }
◦ Dim intA As Array = New Integer(9){ }
Array类的常用属性与方法
Rank属性返回数组的维数。 Length属性返回数组的元素总数。
GetLength 方法返回指定维度的长度。 GetUpperBound方法返回指定维度的最大索引 值。每个维度的最小索引值始终为0。 Sort方法对数组的元素进行排序。 Reverse方法方法用于反转一维数组中的元素 顺序。 Copy方法用于在数组之间复制元素,并自动 处理强制类型转换。
数组元素的引用
பைடு நூலகம்
通过数组名和下标来引用数组元素,语 法格式如下。
◦ 数组名(下标)
其使用方式与单个变量很相似,可以出 现在任何可以使用单个变量的地方。
例子
例如,下面代码引用了intA数组中的第1 个元素,并将其赋值给另外一个变量a。 Dim a As Integer a=intA(1)
区分数组对象和数组变量
数组变量保存指向数组对象的指针,而 数组变量一旦声明,就不能再更改它的 秩或元素数据类型。但是,在数组变量 的生存期内,可以将一系列不同的数组 对象分配给它,这些数组对象可以具有 不同的维长度。 数组对象保存的是数组元素、秩和长度 信息,数组对象一旦创建,就不能再更 改它的维数、维长度或元素的数据类型 ,只能更改其元素的内容
章节内容
5.1 5.2 5.3 5.4 5.5 5.6
什么是数组 一维数组 多维数组 动态数组 Array类 使用集合代替数组
5.1
什么是数组
以存储全班60个学生的成绩为例。在数 学中,对于这样的一个数字序列,常会 用这样的方法表示:S1,S2,S3,…… ,S60。 显然,对于这样一批同类型的数据来说 ,完全可以只取一个名称S,然后使用 下标来区分它们。
5.3 多维数组 5.3.1 二维数组
有两个下标的数组称为二维数组。二维 数组的声明和创建、元素引用、初始化 等与一维数组均类似,唯一不同之处在 于,二维数组需要通过两个下标来引用 其元素,因此其处理常需要使用双重的 For循环。
二维数组声明
语法格式
◦ Dim 数组名(下标1上界,下标2上界) As 类 型
下面代码声明了两个二维数组。
◦ Dim populations(200, 3) As Long ◦ Dim matrix(5, 15, 10) As Single
应用示例:盘点某商店一年的销 售情况
问题:某商店经营了一年后,在年终盘 点的时候,需要计算该商店今年总的销 售额、每天的平均销售额以及销售额最 大的月份。
在中,可以使用数组来表示这样 的一组数据,名称相同,仅使用下标( 也成为索引)来区分这些数据。每一个 数据称为数组的元素,这些元素的下标 都是连续的,数组中包含元素的个数称 为数组的长度。
一个由10个元素组成的Integer类 型数组
数组名,注意该数组中所 有元素都使用相同的名字 intA intA(0) intA(1) intA(2) intA(3) intA(4) intA(5) intA(6) 数组intA中元素的下标, 代表了该元素在该数组中的 位置 intA(7) intA(8) intA(9) 1 10 45 478 12 16 55 0 75 90
分析:首先需要使用数组来保存该商店 每天的实际销售额。学习了前面内容后 ,读者可能马上会想到,是否可以用一 维数组呢?因为一年有365天。这里请 注意,题目中还需要求销售额最大的月 份,这意味着存储的数据需要按月存放 。这样,仅一维数组就不够用了。我们 可以声明一个二维数组:第一维表示月 份,第二维表示每个月份的每天实际销 售额。
示例:模拟学生数据库 StudentDatabase
该示例中需要使用一个结构数组来模拟 实现一个处理学生信息的数据库应用程 序,可以动态录入学生的相关信息,包 括学号、姓名和成绩,并且可以根据学 生成绩排序。
Step1:新建一个Windows Form应用程 序工程,并命名为 “StudentDatabase”。 Step2:进行窗体界面设计
(5)最后在文本框中显示计算结果。
1 2 3 4 ' 在文本框中显示计算数据 txbMaxMonth.Text = maxMonth txbTotalAmount.Text = lngTotal txbDayAverage.Text = lngTotal / 365
运行结果
5.3.2
多维数组
动态数组
允许使用Redim语句为之前创建 的数组重新分配存储空间。
◦ Redim[Preserve]数组名(下标上界列表) ◦ Preserve是可选的修饰符,当仅更改最后 一个维度的大小时,用来保留现有数组中 的数据。 ◦ 下标上界列表中列出了重新定义的数组各 个维度的下标上界。 ◦ Redim语句仅适用于数组。
示例1:Fibaonacci数列
题目:如果一对兔子每月能生一对小兔 (一雄一雌),而每对小兔在它出生后 的第三个月里,假定在不发生死亡的又 生了一对小兔,情况下,由一对出生的 小兔开始,50个月后会有多少对兔子?
若把上述数列继续写下去,得到的数列 便称为斐波那契(Fibonacci)数列。 该数列的规律为:
随着数组维数的增多,数组包含的元素 个数也急剧增多,所需的存储空间也急 剧增,因此在使用多维数组时需要谨慎 。一般常用数组为一维和二维数组,超 过三维以上的数组比较少用到。 三维数组,甚至N维数组的声明、创建 、使用、初始值设定项等均与一维、二 维数组类似,区别仅在于下标个数的不 同。
5.4
Step3:编写代码。
计算Fib数列中的项
运行结果
示例2:使用Eratosthenes筛选法 求素数
问题:使用Eratosthenes筛选法求1000 以内的素数。所谓Eratosthenes筛选法 ,是指首先留下2(第一个素数),而 后把2的倍数统统删除;再留下3(第二 个素数),而后把3的倍数统统从数组 中删去;再往下是5,7……像筛子一样 ,把不需要的数逐步筛去,留下的就是 所求的素数。
数组初始化
也可以在创建时不指明初始值,而在后 面使用赋值语句,代码如下。
◦ Dim strComments( ) = New String(20){ } ◦ strComments(1)="First" ◦ strComments(10)="Tenth"
数组应用
数组通常应用于对有序数据的处理。 从代码层面来说,在使用数组时,常与 循环语句,尤其是For语句结合使用。
构建“SalesAverage”应用程序
Step1:新建一个Windows Form应用程 序工程,并命名为SalesAverage。 Step2:进行窗体界面设计。
Step3:进行编码。 (1)声明变量
(2)生成随机数来模拟销售额。 首先,需要创建一个Random类的实例。
1 ' 创建一个伪随机数对象 2 Dim objRnd As Random = New Random( )
之后就可以使用该对象的方法来生成伪 随机数了
◦ objRnd.Next():用于生成非负的伪随机数 。 ◦ objRnd.NextDouble():用于生成0.0到1.0 之间的随机数。
(3)累加求年度总销售额和每个月的 月份销售额。
(4)求销售额最大的月份。 这实际上是求数组lngMonthSales中最大 元素对应的月份。
数组声明与创建
语法格式如下。
◦ Dim 数组名(下标上界) As 元素类型
◦ 数组名后面的圆括号表明这是一个数组,而不是 单个变量。 ◦ 仅有一个下标,表示这是一个一维数组。下标必 须是常量或者常量表达式,而不能是变量。数组 下标从0开始,因此数组可以包含元素的总数,即 数组的长度应该为下标上界加1。 ◦ As后面的类型指明数组元素的类型,如果省略, 则默认为Object类型。
分析:首先需要声明一个数组来保存这 1000个数,下标应当从0到999。 其次,从数组中将不需要的数字筛选出 去。这个筛选的过程显然应当使用循环 结构来实现。 最后,如何实现筛选的过程呢?最简单 的做法,是直接在该数组中将需要筛选 出去的数改为0。
构建“PrimeOfEratosthenes”应 用程序
Step3:创建结构,并声明结构数组。 结构的定义通常都是放在模块中的。 中的模块(Module)是用于封装 定义在其中的成员的一种引用类型,使 用Module关键字标识,其基本语法格式 如下。
◦ Module 模块名 ◦ 成员声明 ◦ End Module
(1)添加模块。单击菜单栏中的【项 目】→【添加模块】命令,打开【添加 新项-StudentDabase】窗口,如图5-16 所示。在名称文本框中输入 MyStruct.vb,这是模块文件的名称, 同时MyStruct也会作为模块的名称。如 果有需要,也可以在代码中直接修改。