free pascal大师们那个能仔细教我一下数组的含义啊???

例如一题中有这样的循环:vara:array[1..10]oflongint;i,j,t:longint;beginfori:=1to9doforj:=i+1to10doifa[i]<a[j]thenbegint:=a[i];a[i]:=a[j];a[j]:=t;end;fori:=1to10dowrite(a[i... 例如一题中有这样的循环: var a:array[1..10] of longint; i,j,t:longint; begin for i:=1 to 9 do for j:=i+1 to 10 do if a[i]<a[j] then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; end; for i:=1 to 10 do write(a[i]); end. 这个是大小排序的主体,但是我不明白的是,假如当i=1时,那么j=2那a[i]是小于a[j]但是为什么就交换啊?这样子的话a[i]:=a[j]那a[i]岂不就是更大了?能不能仔细讲解一下这题???本人愚笨,请多包含。。 还有我觉得会不会是我想错了,可能是不是[i]要循环9次,而[j]要循环i+1到10次啊?可以在跟我说一下数组有什么好处和涵义吗????谢谢了!! 展开

第1个回答  2020-02-17
数组就是一串带有编号(即下标)的变量组合。
这个排序程序里,数组中共有10个变量:a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,每个变量中存储的数大小是无规律的,不妨依次假定为3,10,4,1,6,76,53,25,6,8。
(本程序中你少写了一开始给数组中的每个变量赋值的语句,所以按你的程序,输出的全是0。因为数组一开始定义时就默认变量值为0,这样的程序是没有意义的。稍后我把修改过的程序写出来。)
外圈循环变量i,从1扫描到9;内圈循环变量j,从i+1扫描到10。这是什么意思呢?举例说明最好理解:
当i=1时,j从2扫到10。a[i]就是a1=3,a[j]分别是a2=10,a3=4,a4=1,a5=6,......a10=8。
这时程序要将a1的值依次与a2~a10进行比较,如果发现a[j]中有比a[i]大的数,就进行位置交换。一路扫描到队尾,最终a[i]即a1中就是整个队列中最大的数。
当i=2时,j从3扫到10。a[i]就是a2=3,a[j]分别是a3=4,a4=1,a5=6,......a10=8。
这时程序要将a2的值依次与a3~a10进行比较,如果发现a[j]中有比a[i]大的数,就进行位置交换。一路扫描到队尾,最终a[i]即a2中是整个队列中次大的数。
不妨打个比方,10个高矮不齐的学生站成一队,老师在旁边,首先指定第一个位置a1,然后将a2~a10位置上的人逐个跟a1比较,发现有比a1高的人,就命令两人交换一下位置。这下一路下来,肯定是最高个的人站在了a1上是不是?
比完第一轮,接着指定a2位置,老师将a3~a10位置上的每个人逐个跟a2比较,有比a2高的就交换位置。比完后,次高个的人就站在a2位置上了。
.......
以次类推。
外圈循环变量i负责指定每次排“队头”的那个位置,内圈循环变量j负责将后续队列中的每个数取出来,以便与“队头”的数比较。(注意这里说的“队头”不是整个队列的第一位,而是特指每一轮扫描时未排序队列的头位,因为实在不好表达,就只好用“队头”这个词了)
使用数组的好处就是可以通过下标获取数组中某个变量的值。因为下标是有序的,就便于程序使用下标变量循环操作。
你不妨弄10张小方块纸,每张纸上写一个数字,排成一列,模拟数组。动动手就明白了。
修改过的程序:
var
a:array[1..10] of longint;
i,j,t:longint;

begin
for i:=1 to 10 do read(a[i]); //给数组中的变量赋值

for i:=1 to 9 do //指定队头数
for j:=i+1 to 10 do //依次扫描后续队列
if a[i]<a[j] then //有比队头大的就交换到队头
begin
t:=a[i]; a[i]:=a[j]; a[j]:=t;
end;

for i:=1 to 10 do write(a[i]); //输出结果
end.
相似回答