最大数n= 91 最小数m= 18
[例8-3] 编一程序输入n个数据,将其排序后按从小到大的顺序输出。
问题分析:利用数组依次输入n个数据,逐个进行比较,把较小数排在前面,较大数排在后面。
程序为:
'EXAMPLE 3
REM 从小到大排序
INPUT "请输入N=",n
DIM a(1TO n) '定义数组
FOR i=1TO n '数组的输入
PRINT "a(";i;")="; '显示输入第几个元素
INPUT a(i) ’输入
NEXT i
FOR i=1 TO n-1
FOR j=i+1 TO n
IF a(i)THEN SWAP a(i),a(j)
NEXT j
NEXT I
PRINT "按从小到大排序后:"
FOR i=1 TO n '显示已排序数组
PRINT a(i);
NEXT i
END
程序运行结果为:
请输入 N= 8
a(1)= 60
a(2)= 33
a(3)= 45
a(4)= 25
a(5)= 19
a(6)= 90
a(7)= 4
a(8)= 78
按从小到大排序后:
4 19 25 33 45 60 78 90
[例8-4] 有一个已按升序排序的数组,现在输入一个数,要求按原来的排序规律将它插入数组中。
问题分析:根据题意,现在已有一个按升序排序的数组,假设该数组有14个元素,把这14个元素放在DATA语句中,利用READ语句来读取其中的内容。从键盘输入指定的数据个数n,但不能超过14个,因为DATA语句中只有14个数。由于要在原数组中插入一个数,所以在用DIM语句定义数组单元个数时,定义为DIMa(n+1),其下标上界为n+1。
从DATA语句中顺序读入n个数据,放在a(1)元素中,读完一个数即输出此数,然后从键盘输入要插入的数x。将其依次与a(i)相比,如果x>a(1),则不作任何处理然后再与a(2)相比,…,直到遇到某一个a(i)大于x为止。将a(i)以后的各处元素顺序向后移动一个位置,就完成了插入工作。
另外,还有两种特殊情况需要考虑:
(1)当x最小时,即x<a(1),可以与一般情况同时考虑。
(2)当x比所有数都大时,即x>a(n),则应该直接将x的值赋给a(n+1)。
程序如下:
'EXAMPLE 4
INPUT "n=";n
DIM a(n+1)
FOR i=1 TO n
READ a(i)
PRINT a(i);
NEXT i
INPUT"请输入一个数:";x
FOR i=1 TO n
IF x<a(i)THEN
FOR j=n TO i STEP -1
a(j+1)=a(j)
NEXT j
EXIT FOR
END IF
IF x>a(n)THEN a(n+1)=x
NEXT i
DATA 2,4,6,8,10,12,14,16,18,20,22,24,26,28
END
[例8-5] 利用一维数组统计一个班学生0~9、10~19、20~29、…90~99及100各分数段的人数。
问题分析:定义一个有11个元素的一维数组a(0 TO 10),把0~9分的学生人数存入a(10)中。
程序为:
'EXAMPLE 5
INPUT "请输入学生数N=",n
DIM a(0 TO 10)
i=1
DO WHILE i<=n
PRINT "请输入第";i;"名学生的成绩";
INPUT x
p=INT(x/10)
a(p)=a(p)+1
i=i+1
LOOP
p=0
DO WHILE p<=10
IF P<=9 THEN
PRINT p*10;";p*10+9;"分的人数为:";a(p)
ELSE
PRINT "100分的人数为:";a(10)
END IF
p=p+1
LOOP
END
[例8-6] 有一个n×m的矩阵,各元素的值由键盘输入,求全部元素的平均值,并把高于平均值的元素以及它们的行列号打印出来。
问题分析:首先应定义一个n×m的二维数组a(n,m),用双重循环输入二维数组的各元素值,并将这些值进行累加,由此可以求得平均值av(累加和/总元素数)。然后按行i、列j逐个元素判断其值a(i,j)是否大于av,如果为真,则输出其值a(i,j)、所在行i、所在列j。
程序如下:
'EXAMPLE 6
OPTION BASE 1
INPUT "请输入行列数n,m=";n,m
PRINT "这是一个有";n;"行";m;"列组成的矩阵"
DIM a(n,m)
s=0
PRINT "请输入各元素的值:"
FOR i=1 TO n
FOR j=1 TO m
PRINT "a(";i;",";j;")=";
INPUT a(i,j)
s=s+a(i,j)
NEXT j
NEXT i
av=s/(n*m)
PRINT "高于平均值的元素","行号","列号"
FOR i=1 TO n
FOR j=1 TO m
IF a(i,j)>av THEN PRINTa(i,j),i,j
NEXT j
NEXT i
END
程序运行结果为:
请输入行列数n,m= ? 2,3
这是一个有2行3列组成的矩阵
请输入元素的值:
a(1,1)= 10
a(1,2)= 20
a(1,3)= 30
a(2,1)= 20
a(2,2)= 10
a(2,3)= 30
高于平均值的元素 行号 列号
30 1 3
30 2 3
[例8-7] 将两个3×3的矩阵a和b相加。即将相应位置上的元素相加,放到c数组的相应位置上。
问题分析:本题需要先定义3个二维数组,每个二维数组的行和列都为3,即a(3,3)、b(3,3)和c(3,3)。根据题意,数组a(3,3)和数组b(3,3)的各元素值是已知的,只需用READ语句从DATA语句中读出即可。相应位置上的元素相加,放到c数组上的相应位置,其实就是将a(i,j)+b(i,j)的值赋给c(i,j)。
程序如下:
'EXAMPLE 7
OPEION BASE 1
DIM a(3,3),b(3,3),c(3,3)
PRINT "数组a:"
FOR i=1 TO 3
FOR j=1 TO 3
READ a(i,j)
PRINT a(i,j),
NEXT j
PEINT
NEXT i
PRINT "数组b:"
FOR i=1 TO 3
FOR j=1 TO 3
READ b(i,j)
PRINT b(i,j),
NEXT j
NEXT i
PRINT "数组c:"
FOR i=1 TO 3
FOR j=1 TO 3
c(i,j)=a(i,j)+b(i,j),
NEXT j
NEXT i
DATA 1,2,3,4,5,6,7,8,9
DATA 2,4,6,8,10,12,14,16,18
END
程序运行结果为:
数组a:
1 2 3
4 5 6
7 8 9
数组b:
2 4 6
8 10 12
14 16 18
数组c:
3 6 9
12 15 18
21 24 27
在Quick BASIC中,数组的应用灵活方便,其主要原因就是在静态数组之外引进了动态数组的概念。我们知道,计算机的内存是有限的,程序在运行的过程中,数据占了很大一部分存储空间,有时会使得一些程序因内存不够而不能正常运行。Quick BASIC中的动态数组,通过在程序运行的过程中动态地分配与释放内存,更有效地利用内存空间,使得Quick BASIC的功能进一步得到加强和完善。
计算机在程序执行前,系统进行编译的时候,根据数组说明语句开辟的固定存储空间,直到程序执行完毕,在整个过程中不再改变,这种数组就叫静态数组。
在静态数组中,数组一经定义直到程序运行结束,该数组的维数和大小不再改变,因此,它所占用的内存单元也不改变。这是各种高级语言有关数组所共同具有的基本特点。
在Quick BASIC语言中规定,在用DIM语句定义数组的时候,如果下标的上下界用的是常数,则这样的数组是静态数组。
计算机在执行过程中才给数组开辟存储空间,当不需要时,可以用ERASE语句删除它,收回分配给它的存储空间,还可以用REDIM(或DIM)语句再次分配存储空间。这样的数组就叫动态数组。
Quick BASIC语言规定,在用DIM语句定义数组的时侯,如果下标的上下界用的是变量或者表达式,这样的数组为动态数组。动态数组是Quick BASIC语言对数组功能的扩充。
在程序未运行时,动态数组不占用内存,可以将这部分存储空间移作他用。而对于静态数组,编译程序将为它在Quick BASIC数据段据预留空间。
判断静态数组和动态数组的方法主要有:
n 数值常量和CONST语句中说明的常量定维的数组是静态数组。
n 用变量作为下标定维的数组是动态数组。
用变量它维的动态数组,在使用DIM语句说明前必须先对变量赋值,否则会出错。
静态数组的大小不能超过64KB,如果超过会发生“Overflow”的错误。动态数组可以超过64KB,只是在进入Quick BASIC环境时必须使用/ah命令行参数。
格式:
ERASE〈数组名〉[,〈数组名〉]…
功能:重新初始化静态数组元素,释放动态数组的存储空间。
说明:
(1)该语句对静态数组和动态数组的作用不一样。
对于静态数组不能删除,只能进行初始化,即把数组的数值元素置为0,或把字符串元素置为空;
对于动态数组就能删除,释放该数组所占用的内存,释放后的内存可以重新定维。
(2)DIM语句本身不具备再定义的功能,但当动态数组通过ERASE语句操作,释放数组空间后,就可以用DIM语句对该数组进行再定义。