编程小博士(22):数组,你的规律机器
软件世界
问:小博士,前几期你讲的循环真是有用。可我发现有些题目看来是有规律的,但用你讲的循环却难以解决问题。是不是还有其他的方法可以介绍呢?
小博士:你问得很好。有些问题看似可以用循环来解决,但却做不下去。这次我就来为你讲解一下数组及其用法,希望你能多学会一种解决问题的方法。我们先来看看下面这个。
前几期研究过两个数和三个数排序的题目,在分析这些题目的过程中,不知你有没有给自己提过下面的问题:如果是任意多个数该怎么排呢?这正是下面我们要研究的例子。
示例:一百个数,从大到小排序。
一个数时不用排,两个数时有2种情况,三个数时有6种情况。用数学规纳法做一下,或者发挥一下我们的想象,那100个数时情况就多了,算一下是99+98+……+1种情况。3个数时用了3个分支语句的顺序结构形式,4个数时需要3+2+1种,……而100个数时需99+98+……+1种,这么多的分支语句一个接一个立起来,真可以比做一座摩天大楼。我们好好动一下脑,应该有更简便的办法。对了,那就是用上期讲的循环方法。
但是如果我们设上a、b、c、d……等一百个量来,这种设法本身就很令人头痛,也让人难以操作。所以改变就从这里开始吧!我们可以通过a加上一个下标的形式来解决,这就是数组。例如:
输入a1、a2、a3、a4……a100等100个数,我们要做到在最后存储的数中,a1中的数最大,a2中的数第2大,a3中的数第3大,……,a100中的数最小。
怎样才能实现上述想法呢?
(1)使a1最大,则a1需和后面的a2、a3……a100比较99次,将最大的数存储在a1中。
(2)使a2第二大,则a2需和后面的a3、a4……a100比较98次,将第二大的数存储在a2中。
……
(99)使a99第99大,也就是倒数第二小。只要将a99与a100比较,将较大者存储在a99中。
(100)a100最小,不需比较。
从题目的分析中不难看出是两个循环在起作用:外部是a1到a100之间的循环,取值在1~99。内部还有一个循环,来完成比较出最大值的工作。但具体怎么解决这问题呢,在这之前我们必须加深对数组的了解。
什么是数组
上面的数和下标共同作用的形式,就是数组。数组是一个非常好的可以看做工具一样的东西,并且数组和循环配合起来,干起活来让人心动,用规律机器来形容它真不为过。而这规律机器里最值得讲的就是数组的下标,因为用数组其实就是用下标。正是有了这可爱的下标,才使我们对数组的访问和存储得心应手。
回到上面的排序问题。我们把题目改造一下,让它更形象更直观。来看看新的类似问题:我们有一百个房间来放置一百个数,房间号为1~100(这里的房间号就可看做是数组的下标),将来可将1号放最大的数字,二号放第二大的,……,100号放最小的。
我们可定义一个有100个元素的数组 a(100)。其中a(1)表示第1号房间,a(2)表示第2号房间,……,a(100)表示第100号房间。具体的规律分析我们在前面的数字排序中已经讲过,我们来看看具体实现的代码:
FOR i=1 to 99
For j=i+1 to 100