现在我们来了解语言本身的最后一个论题《数组》
要理解"数组"这个概念我觉得另一种翻译对学习来说更加容易:"阵列",没错,数组就是一个阵列,一个数据的阵列.最简单的例子是数据库系统,假设你要储存20名学生的英语成绩,如果不是用数组,你则要创建20个不同的变量,累死.
数组就是类型相同的一组数据(或者n组),用来储存相关的量, 最简单的数组是一维数组,我们就先来学习它吧.
什么是一维数组呢? 在3维以下,你可以利用几何知识来理解"维"的概念,一维相当于一条线,二维则是一个矩形,三维是一个长方体. 我知道这么讲是很抽象的, 我们先举个一维数组的例子就比较容易了解了.
dim a(9) //dim 数组名(元素数量)
or i=0 to 9
a(i)=i //填充每一个数组元素
msgbox(a(i)) //输出数组元素
next
我们可以看到,定义一个数组的方法和定义一个变量没有什么不同, 同样是使用dim语句. 定义一维数组的方法如下:
dim 数组名(元素数量),这里大家要注意一点,这里定义的元素数量总是比你要的要少一个,因为一个数组的起点是0号数据而不是1, 所以大家一定要小心: 你需要10个数据, 就定义"9", 需要100个就定义99, 依此类推. 数组的元素可以看成一个个独立的变量, 你可以像独立的变量那样使用他们. 数组元素的量可能是毫无关系的, 比如第一个数组元素储存你的年龄, 第二个储存今年西瓜的销售量, 但这种做法是不鼓励的, 甚至是不被接受的, 不要这么干, 这样的情况请定义独立的变量. for(循环)语句在数组中可算是大显身手, 还记得for吗? 它累加一个变量, 我们可以把这个变量应用在数组中正好用来读取或者填充按照顺序排列的数组元素, 上面就是这样一个例子. 数组其实是很简单的东西(在BASIC语言里面),
语文老师真不容易~~~, 数组难的是怎么捣弄这些循环,让他们按照你的要求运转.这个等到二维数组再说
现在先看如何手工填充数组:
dim name(7),str //一共八个学生, str变量是用来把他们储存成一个字符串以便输出
for i=0 to 7
name(i)=inputbox("请输入第" & i+1 & "个学生的名字")
str=str & " " & name(i)
next
msgbox(str)
这样我们就有了一个小小的数据库, 它们的数据排列可以看成这样:
name(0),name(1),name(2).....name(7)
看到了吧, 所以我说我们可以把它看成是"一条线", 等到我们学到了文件操作, 就可以把他们输出到文件中去了. 一维数组有很多用处, 我们来看一下一个复杂的例子. 我们要储存3各学生的名字, 身高, 成绩这三种数据, 由于名字是字符串, 而身高可能是浮点数(带小数点的数), 成绩则可能是整数,所以我们不能把他们储存在一个数组里面(不要忘记, 数组只能存储同类的数据所以我们要建3个数组:
dim name(2), high(2), mark(2) //定义三个数组分别储存3个人的名字, 身高和得分
dim ctr '计数器
for ctr=0 to 2
name(ctr)=inputbox("请输入第" & ctr+1 & "个学生的姓名")
high(ctr)=inputbox("请输入第" & ctr+1 & "个学生的身高")
mark(ctr)=inputbox("请输入第" & ctr+1 & "个学生的得分")
next
OK, 我们已经填充好了数据, 现在我们的小小数据库只能按顺序输入,
诛仙2变态sf, 我们要让它看起来像点样子, 我们来给他设计查询功能:
//接着上面的程序:
dim cname, temp //要查询的名字, 和一个临时变量, 用来储存数据的位置
cname=inputbox("请输入你要查询的名字:")
for ctr=0 to 2 //遍历所有name数组的成员, 寻找要查询的名字
if name(ctr)=cname then
temp=ctr //记录数据位置
exit for //退出循环, 和exit do的用法一样
end if //不要忘了end if
next
msgbox("姓名:" & name(temp) & " " & "身高:" & high(temp) & " " & "得分:" & mark(temp))
嘿嘿,有意思吧,其实在这个程序里面, 那个temp变量完全没有必要, 只是为了更清楚地说明问题. 因为当exit for以后ctr变量的值就不会改变, 储存的正好是对应数据在数组中的位置, 写这个temp变量是为了照顾到以后要学C++的朋友(C++可以在for语句里声明新变量, 只在这个for结构中有效, 所以到了外部就不能访问了).
也就是说可以简化成如下:
dim cname
cname=inputbox("请输入你要查询的名字:")
for ctr=0 to 2
if name(ctr)=cname then exit for //因为只有exit for就不需要块if了
next
msgbox("姓名:" & name(ctr) & " " & "身高:" & high(ctr) & " " & "得分:" & mark(ctr))
这是最直接的路子. 好好重读一下上面所有的源代码, 然后自己写几个程序, 完全搞清楚一维数组及其应用以后再看后面的二位数组. 二维数组好像是一个一维数组的集合, 就好像"线积成面"一样, 由n各一维数组组成二维数组, 这是初学者比较好理解的办法(比较精确的是用"编号"的概念去理解, 因为4维以上的数组就比较难以用几何概念去解释了).
二维数组是很好解释的, 我们来看一下:
dim a(2,2) //从零开始, 一共有3 X 3 = 9 个数据
dim i,j //需要两个计数器
for i=0 to 2
for j=0 to 2 //使用嵌套循环
a(i,j)="X"
next
next
我们创建了一个这样的二维数组(那些","是我用来分割元素的,实际是并不存在的),了解二维数组的了吗?不清楚我们再讲一下:
编号 0 1 2
0 X,X,X
1 X,X,X
2 X,X,X
二维数组的看起来是不是就是一个矩形呢?(你在内存中看不到这样的矩形, 只是便于你理解), 每个数据都有编号, 由两个数来定位, 这个很像在国际象棋棋盘上寻找一个格, 我们用类似"C6","A2"这样的"垂直坐标"进行定位, 对, "垂直坐标", 很确切. 我们要使用一个二维数组元素的时候可以和普通变量一样使用, 只要指定数组元素的"定位点"就可以了
例如:
a(0)(1)=1, b(2)(1)="你好",诸如此类.要注意的是二维数组也只能储存类型相同的元素, 而且上标(起点)也从0开始. 计算一个二维数组的元素个数只要把两个下标+1(以得到实际的值)再乘起来就可以了,非常类似于求一个矩形的面积.
假如需要储存的都是同一类型的数据,我们就可以用二维数组。
比如要储存5个人的姓名,国籍,民族,就可以使用二维数据:
dim info(4,2) //一共五个人, 要储存的数据类型有3项
dim i,j
for i=0 to 4
for j=0 to 2
dim opt '定义一个变量用于存储数据项提示
select case j //判断应该输入的是什么数据
case 0
opt="姓名"
case 1
opt="国籍"
case 2
opt="民族"
end select
info(i,j)=inputbox("请输入第" & i+1 & "个人的" & opt)
next
next
这样就不需要定义3个一维数组了.
多位数组(三维以上)的定义和使用方法与二维数组一样, 但不太好在(欧几里德)几何空间里加以解释, 幸好我们并不太常用那些多维的数组.定义一个三位数组:dim a(1,
全国36天连发5起校园血案 各地急补安全漏洞,2,3) //一共24个数组元素(暂时先了解下就行了)!
那么先到这里结束吧,大家多练习下今天的内容。
要点:
(1) 一维数组是"线", 二维数组是"面", 三维数组是"体" (多维数组就乱套)
(2) 数组的下标从0开始
(3) for循环在数组的应用中起了很大作用, 二维数组需要嵌套循环
作业:
(1) 定义一个数组,
九个王八蛋(笑话), 包含5个元素, 都是随机整数(随便输入), 要求把他们按照从大到小的顺序排列起来
(2) 有两个二维数组a(4,4)和b(4,4) (元素值随便), 交换两个数组(原来的a的所有元素值变成b的, b的所有元素值变成a的)