例如:
DIM x(20,20) '假设x是动态数组
…
ERASE x '释放x数组的存储空间
DIM x(15,30) '重新进行分配
格式:
REDIM[SHARED]〈数组名〉[(〈维数定义〉)][AS〈类型说明词〉][,〈数组名〉[(〈维数定义〉)][AS〈类型说明词〉]]…
功能:重新定义已为动态数组分配的空间。
说明:
(1)使用REDIM重新定维时可以改变每维的大小,但不能改变数组的维数。
(2)用REDIM语句进行重新定维时,必须首先用ERASE语句释放已分配的存储空间。
[例8-8] 有如下程序,判断其运行后的输出结果。
'EXAMPLE 8
n=20
DIM x(n)
ERASE x
REDIM x(30)
x(n+2)=n+2:x(n+5)=n+5
PRINT x(22);x(25)
END
问题分析:在Quick BASIC中,可以对动态数组用REDIM语句进行重定维操作,还可用ERASE语句(释放语句)释放数组所占据的空间。该空间可以用来建立一个新的数组,也可以建立一个同名的数组,维数和大小均可重新指定。
本题中各语句的作用见下:
n=20 '给变量n赋值为20
DIM x(n) '定义一个一维动态数组x
ERASE x '用ERASE语句释放数组x所占据的空间
REDIM x(30) '用REDIM语句重定义了一维数组x,其下标上界为30
x(n+2)=n+2:x(n+5)=n+5 '给x(22)及x(25)这两个数组元素分别赋值22和25
PRINT x(22);x(25) '输出x(22)的值22,x(25)的值25
END
程序运行后输出结果为:
22 25
程序设计中常常会遇到在一批数据中找出其中某一元素。例如在一个学校的学生姓名中,查找某一学生。
查找的方法有两种:一是顺序查找,二是折半查找。
顺序查找(又称线性查找),把要查找的元素与整个数组的元素逐一比较,直到发现有与被查找元素相同的为止。
[例8-9] 有一批数:53,76,32,25,81,4,108,64,找出数据是32的数。
'EXAMPLE 9
CLS
INPUT"请输入这一批数的数量:";n
DIM num(1 TO n)
INPUT"你找什么数?";find
FOR i=1 TO n '输入每个数值
INPUT num(i)
NEXT i
flag=0
FOR i=1 TO n
IF num(i)=find THEN
PRINT find:"已被找到"
flag=1
EXIT FOR
END IF
NEXT i
IF flag=0 THEN PRINT "没有找到";find
END
折半查找又叫二分查找,使用这种方法查找必须要把数组先排序。
[例8-10] 将例8-9中的数采用折半法查找。
首先将这8个数排列成如下的顺序,例如要查找32,查找步骤见如图8-1所示:
折半查找的思路是:
(1)把整个数组对分,取第一个元素的下标为low,最后一个元素的下标为high,居中的元素为mid,则mid=INT((low+high)/2)。

图8-1 折半查找
将mid位置上的元素与被找的元素find比较,有3种情况:
n 中间元素大于find,去掉后一半,再从前一半中查找,把被找的区间缩短,这时新的区间最后一个元素的下标应该用mid代换high。
n 中间元素小于find,去掉前一半,再从后一半中查找,把被找的区间缩短,这时新的区间开始一个元素的下标应该用mid代换low。
n 中间元素等于find,这正是要查找的对象,这时就算找到了。
(2)如果发生前两种情况之一,查找的过程继续直到没有可查找的元素,或出现第三种情况为止,本例经过3次缩短区间,得到要查找的元素。
'EXAMPLE 10
DIM num(1 TO 8)
CLS
INPUT"你想找什么数?";find
FOR i=1 TO 8
READ num(i)
NEXT i
low=1
high=8
WHILE ABS(low-high)>1
mid=INT((low+high)/2)
IF find
high=mid
ELSEIF find>num(mid) THEN
low=mid
ELSE
low=high
END IF
WEND
IF low=high THEN
PRINT "num(";mid;")是找到的数为";find
ELSE
PRINT find;"没有找到"
END IF
DATA4,25,32,53,64,78,81,108
END
程序说明:
顺序查找,在最好的情况下,只需比较一次,即第一个元素;在最坏情况下,需要比较所有元素,因此平均的比较次数是数组元素的一半。对于大型数组,这种查找可能要花费相当长的时间,但是对于未排序的数组,只有用顺序查找。
二分查找并不查找数组中的各个元素,它比顺序查找要快得多,但它只适合于已排序好了的数组。
1.数组是相同类型数据的有序集合,用一个数组名代表数据的全体,用下标区别同一数组中的各个元素,数组元素又称下标变量,下标变量中下标个数就是该数组的维。
2.常用的数组多为一维数组、二维数组,可以有更高维的数组,在BASICA中,最高维不超过255,在Quick Basic中,最高维不超过60。
3.在BASIC中数组必须说明后使用,说明数组的维数和每维的大小(也即上下界)使用DIM语句。
在BASIC中,维的下界不能为负数,选择Option BASIC语句的时候,隐含下界为0。
在Quick BASIC中用关键字TO,可以把下界值扩充到-32768~32767。
4.数组可以分为静态数组和动态数组。一般用常量说明维的大小的数组是静态数组,用变量说明维的大小的数组是动态数组。
5.数组经过定维说明,只是在内存中开辟了一片连续的数据存储区。
6.数组的输入输出或处理,和循环结构分不开,通常用单循环作一维数组的处理,用双循环作二维数组的处理。
7.数组的处理,是通过下标变量进行的,因此,下标不能超出数组定义的范围,否则会发生下标出界(Subscript out of range)的错误。
8.数组是很重要的一种数据结构,为处理大批量数据提供了方便,对数组的操作有很多有用的算法,如矩阵运算、排序、查找等,应通过实例很好掌握。
1.任给一个实数矩阵Am×n(m<100,n<100),试找出其中一个最大元素。
2.设某学校某班共10名学生,为了评定某门课程的奖学金,按规定超过全班平均成绩10%者发给一等奖,超过全班成绩5%者发给二等奖。试设计程序,打印出应获奖学金的学生名单(包括姓名、学号、成绩、奖学金等级)。
3.求矩阵A的转置矩阵A'。
4.假设5个百货公司一月内销售电视机的情况如下表:
表8-3 百货公司一月内销售电视机的情况表
|
商店 |
兰花牌 |
梅花牌 |
菊花牌 |
|
第一百货公司 |
50 |
80 |
20 |
|
第二百货公司 |
105 |
92 |
20 |
|
第三百货公司 |
20 |
65 |
32 |
|
第四百货公司 |
80 |
150 |
98 |
|
第五百货公司 |
15 |
36 |
110 |
另外,假设各牌号电视机的价格如下:
表8-4 各牌号电视机的价格
|
牌号 |
价格(元) |
|
兰花牌 |
2500 |
|
梅花 |
3200 |
|
菊花牌 |
2850 |
试计算各百货公司的营业额。
5.某地区人口普查处理中,需要统计各种年龄下的人口数,以便制定合理的人口发展战略。若已知人类现有最高年龄为150岁,试设计程序,求以1,2,3,…,150岁为条件下的人口数。
6.在任给n个实数(n<2000),试找出其中的众数(即出现次数最多者)、众数的次数、众数频率(即其次数与总次数之比)以及众数首次出现的位置。
7.设某市某宾馆共有3层,每层共有2排各5个客房。试为该宾馆设计程序来统计住宿旅客总人数以及查询某一房间住宿旅客人数。