首页 果壳精灵教程 当前文章

【新手入门】第 12 讲:数组

xLeaves(xxrpa) 发布于 2022年05月27日 22:28:30


学习编程的最终目标是为了处理数据,电脑可以帮助我们做很多事情。

我们可以计算 1 + 1 = 2 这样简单的学前班课题,也可以进行得到 π 几千万位之后的内容这样复杂的科学计算。

但这并没有脱离单个数据计算的范畴,而很多时候数据的结构可以很复杂,复杂的数据结构中,数组是最简单的一种。


有时候我们需要用变量保存一堆数据,例如一个班级50人,我们需要保存所有人的身高,如果要用变量实现这个功能,我们需要定义50个变量。

这里我们让问题再简单一点,假设这个班级只有5个人,我们可以通过一个命令【获取成绩】来获取每个人的成绩,它有一个参数,就是这个学生的序号。

现在我们要实现它了:

Function 获取成绩() As Long
	Return 100
End Function

Function Main() As Long
	Dim 成绩1 As Long
	Dim 成绩2 As Long
	Dim 成绩3 As Long
	Dim 成绩4 As Long
	Dim 成绩5 As Long
	成绩1 = 获取成绩(1)
	成绩2 = 获取成绩(2)
	成绩3 = 获取成绩(3)
	成绩4 = 获取成绩(4)
	成绩5 = 获取成绩(5)
End Function

代码似乎并不复杂,但这只是 5 个人的代码,如果是 50 个人,或者更多,比如人口普查,13亿人,我们要获取这些数据,代码岂不是要写上 26 亿行?


小学生物课程中,我们学习了总结不同物种之间的相同点和不同点,这是一项非常重要的技能,长大了我们也需要在很多场合里使用这种能力,例如现在。

我们看代码,相同点是我们定义的变量,都带有【成绩】,不同点是成绩后面的序号不一样。

再看获取成绩命令调用的代码,【成绩* = 获取成绩(*)】,这里 * 可以替换为一个代表学生序号的数组,其他部分就是相同点了。

假设我们可以让这里的数字代入某个数据的话,问题就变的简单起来了,可以直接用我们上一节课学到的知识来解决问题,即使13亿人口的处理,也不在话下:

Function 获取成绩() As Long
	Return 100
End Function

Function Main() As Long
	// 13亿数据处理并不困难
	For i As Long = 1 To 1300000000
		成绩i = 获取成绩(i)
	Next
End Function

但是这段代码并不能正确运行,因为【成绩i】没有定义,也定义不了,按照变量的定义规则,【成绩i】只是一个普通的变量。


但是我们可以换一种类似的写法来解决问题:定义数组

数组的定义和变量定义的写法类似:

Function 获取成绩() As Long
	Return 100
End Function

Function Main() As Long
	// 13亿数据处理并不困难,这回是真的了
	Dim 成绩(1300000000) As Long
	For i As Long = 1 To 1300000000
		成绩(i) = 获取成绩(i)
	Next
End Function

在变量名的后面加一个括号,括号内写上这个数据的数量,就可以定义一个数组啦,现在这个数组的范围是从 1 到 1300000000。

【成绩(i)】在这个范围内,每更换一个 i 的数值,都代表了一个全新的变量。

数组和 For 循环语句可是一对绝配哟!


定义数组的时候,我们也可以用表达式来表示数组的大小,例如下面的代码,可以定义含有两个变量的数组:

Function Main() As Long
	Dim 成绩(1 + 1) As Long
End Function

有时候我们的数据是完全动态的,也可以先不告诉果壳精灵要定义一个多大的数组,这样可以定义一个没有初始化的数组:

Function Main() As Long
	Dim 成绩() As Long
End Function

没有初始化的数组不包含任何数据,不能直接拿来用,必须重新定义一下,给他赋予一个大小才可以:

Function Main() As Long
	Dim 成绩() As Long
	ReDim 成绩(20)		// 现在这个数组有 20 个元素了
End Function

ReDim 语句能够改变一个数组的大小,而且可以改变很多次,但每次改变数组大小的时候,都会清空其内部的数组,我们可以加一个 Preserve 语句来保留数组内部的数据:

Function Main() As Long
	Dim 成绩() As Long
	ReDim 成绩(20)		// 现在这个数组有 20 个元素了
	成绩(1) = 123
	ReDim 成绩(10)		// 现在这个数组只剩下 10 个元素了,并且刚刚给元素 1 设置的成绩消失了
	成绩(2) = 456
	ReDim Preserve 成绩(15)	// 现在这个数组有 15 个元素,成绩 2 的数据仍然保留
End Function

和 Dim 语句一样,ReDim 语句也可以指定变量类型,重新定义数组的时候,也可以用表达式来指定数组的长度,以获得更好的灵活性。


数组也可能不是我们创建的,比如一些函数,就会改变一个数组的值,例如 Split 函数。

这个函数的作用是将一个文本分割成很多份,可以自己定义分隔符:

Function Main() As Long
	Dim 数组() As String
	Split("123|456|789|000", "|", 数组)
	Dim iCount As Long = UBound(数组)
	For i As Long = 1 To iCount
		TracePrint 数组(i)
	Next
End Function

这种情况下,我们就需要获取这个数组的大小,来确定文本被分割成了多少份(当然,实际上 Split 函数的返回值就可以告诉你这个数组的大小了,这里我们先假装不知道)。

可以用 UBound 或 CountOf 函数获取一个数组的大小,如果一个数组还没有初始化,这两个函数会返回 0,如果已经初始化过了,则会返回这个数组的上限,这个数据一般我们称之为【下标】

还有一个函数 LBound 可以获取数组的【上标】,对于果壳精灵来说,这个函数没有意义,因为数组的上标始终为 1,如果数组没有初始化过的话,这个函数会返回 0。

Function Main() As Long
	Dim 数组() As String
	Split("123|456|789|000", "|", 数组)
	Dim iCount As Long = UBound(数组)
	For i As Long = 1 To iCount
		TracePrint 数组(i)
	Next
End Function

果壳精灵还提供了许多数组的便捷操作,这些命令在 【命令大全 - 标准库 - 数组操作】 分类下。

例如我们可以给一个数组批量赋值:

Function Main() As Long
	Dim 数组(10) As Long
    Array Assign 数组() = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
	TracePrint "数组批量赋值:"
	For i As Long = 1 To 10
		TracePrint 数组(i)
	Next
End Function

还可以将一个数组的内容顺序打乱,这个操作被称为【洗牌】:

Function Main() As Long
	Dim 数组(10) As Long
    Array Assign 数组() = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
	TracePrint "数组批量赋值:"
	For i As Long = 1 To 10
		TracePrint 数组(i)
	Next
	
	TracePrint "数组洗牌:"
	Array Shuffle 数组()
	For i As Long = 1 To 10
		TracePrint 数组(i)
	Next
End Function

现在我们可以将一个被打乱的数组重新整理好顺序,这个操作被称为【排序】:

Function Main() As Long
	Dim 数组(10) As Long
    Array Assign 数组() = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
	TracePrint "数组批量赋值:"
	For i As Long = 1 To 10
		TracePrint 数组(i)
	Next
	
	TracePrint "数组洗牌:"
	Array Shuffle 数组()
	For i As Long = 1 To 10
		TracePrint 数组(i)
	Next
	
	TracePrint "数组重新排序(降序):"
	Array Sort 数组() , Descend
	For i As Long = 1 To 10
		TracePrint 数组(i)
	Next
	
	TracePrint "数组重新排序(升序):"
	Array Sort 数组() , Ascend
	For i As Long = 1 To 10
		TracePrint 数组(i)
	Next
End Function

这里并没有展示数组快捷操作的所有用法,你可以查看果壳精灵集成帮助,了解这些命令的更多用法,很多东西都是需要主动看帮助文档来学习的。

看帮助文档并不需要什么门槛,而且帮助文档的内容充满干货,往往看一分钟的帮助文档,再未来它能够为你节省十分钟甚至更多时间。

养成良好的习惯,不走捷径,踏踏实实把基本功练好,才是学习编程的不二法门。


若无特殊声明,上述内容为本站原创,未经授权禁止转载!