DDR爱好者之家 Design By 杰米
第五篇(共六篇): 

       请允许我县描述一下我现在的环境:气温高达37摄氏度, 而我忘记了图书馆开门的时间, 还要在这里站上一个小时, 在热带植物的包裹下, 各种奇怪的小飞虫围着我转来转去. 不过令我欣慰的是, 终于写到五了, 还有两课我们的"基础篇"就要结束了. 

       今天我们来了解语言本身的最后一个论题:数组. 

  要理解"数组", 这个概念我觉得另一种翻译对学习来说更加容易:"阵列", 没错, 数组就是一个阵列, 一个数据的阵列. 最简单的例子是数据库系统, 假设你要储存20名学生的英语成绩, 如果不是用数组, 你则要创建20个不同的变量, 累死. 数组就是类型相同(重要!)的一组数据(或者n组), 用来储存相关的量, 最简单的数组是一维数组, 我们就先来学习它吧. 

  什么是一维数组呢? 在3维以下,你可以利用几何知识来理解"维"的概念,一维相当于一条线, 二维则是一个矩形, 三维是一个长方体. 我知道这么讲是很抽象的, 我们先举个一维数组的例子就比较容易了解了. 

dim a(9) '从零开始 
for 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, 我们已经填充好了数据, 现在我们的小小数据库只能按顺序输入, 我们要让它看起来像点样子, 我们来给他设计查询功能: 

'接着上面的程序 
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,2,3) '一共24各数组元素. 

  今天因为要搬家(我喜欢Sengkang啊, 可是MM嫌交通不便, 谁不知道她只想去逛街),而GF要去和她的同学去参加什么试验半夜才回家, 所以下午我只能自己去押车搬家了, 5555~~好可怜, 这次就请大家原谅我少写一点, 我可是站在图书馆外写的啊, 

现在腿都软了~~~ 本来还要讲"动态数组"的, 但想了想还是放到"进阶部分"再说吧. 

要点: 

1) 一维数组是"线", 二维数组是"面", 三维数组是"体" (多维数组就乱套) 

2) 数组的下标从0开始 

3) for循环在数组的应用中起了很大作用, 二维数组需要嵌套循环 

作业: 

  上次出的"百鸡问题", 大家喜欢吗? 以后我们就做这种需要动脑的题目, 那些简单的实践, 大家一定要多做! 

1) 定义一个数组, 包含5个元素, 都是随机整数(随便输入), 要求把他们按照从大到小的顺序排列起来 

2) 有两个二维数组a(4,4)和b(4,4) (元素值随便), 交换两个数组(原来的a的所有元素值变成b的, b的所有元素值变成a的) 


DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米

P70系列延期,华为新旗舰将在下月发布

3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。

而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?

根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。