Существует много способов сортировки массива по возрастанию. Самый понятный и простой (но далеко не самый быстрый!) – сортировка обменом. Суть его в следующем: Программа ищет наименьший элемент и обменивает его с первым. Затем ищет наименьший из оставшихся и обменивает со вторым… Для обмена мы пользуемся тем, что, кроме массива, наименьшее число находится ещё в переменной min, поэтому на его место в массиве мы копируем число из начальных элементов массива, а туда копируем число из переменной min.
program sortirovka_obmenom;
var
a:array[1..20] of integer;
i,k,min,Nmin:integer;
begin
randomize; {Сначала заполним массив}
for i:=1 to 20 do
begin
a[i]:=1+random(99); write(a[i]:3);
end; writeln;
{Отсортируем по возраст. методом обмена}
for i:=1 to 19 do
begin{i показывает начало поиска}
min:=a[i]; Nmin:=i;
{просмотрим все остальные (после i)}
for k:=i+1 to 20 do
if a[k]<min then
begin
min:=a[k]; Nmin:=k;
end;
{Нашли минимальное число. Обменяем его с i-м}
a[Nmin]:=a[i]; a[i]:=min;
end;
{Теперь распечатаем отсортированный массив}
for i:=1 to 20 do
write(a[i]:3);
end.
Второй по простоте (и тоже медленный) способ – сортировка методом пузырька. Суть её в том, что при первом проходе каждый элемент сравнивается со следующим, и если порядок неправильный, они обмениваются. Для обмена используется переменная b, в которой временно сохраняется число. После первого прохода наибольший элемент уже на своём месте (в конце массива), поэтому второй проход делается до предпоследнего элемента, и т.д. … В приведенном фрагменте программы, сортирующем массив a по возрастанию методом пузырька, первый цикл считает проходы, а его счётчикi указывает, до какого элемента делать проверку (поэтому i уменьшается).
Иногда данные имеют табличный вид. Можно, конечно, расположить их подряд (строка за строкой) в обычном (он называется одномерным или линейным) массиве, но будет неудобно обращаться к таким элементам: их номер придётся высчитывать с помощью формулы N=(НомерСтроки-1)*ДлинуСтроки+Номер Столбца. Это (кроме неудобства) ещё и замедлит работу с массивом. Вместо этого можно использовать двумерный массив (массив из одномерных массивов). Фактически в памяти элементы массива тоже расположены подряд, но поиск элемента массива берёт на себя сам Паскаль, а мы ему указываем два индекса: номер строки и номер столбца. Например: a[5,4]. При описании такого массива указывают два диапазона – для каждого индекса:
a:array[1..20,1..10] of integer;. (Примечание: Для Паскаля несущественно, что мы указываем первым - строку или столбец. Просто в первом случае в памяти элементы массива укладываются подряд, построчно, строка за строкой, а во втором «постолбцово», столбец за столбцом)
program Tab_Umn;
uses crt;
var
x,y:integer;
p:array[1..9,1..9] of byte;
begin
clrscr;
for x:=1 to 9 do
for y:=1 to 9 do
begin
p[x,y]:=x*y;
gotoxy(x*4; y*2);
write(p[x,y]);
end;
end.
В качестве примера приведём программу, которая заполняет двумерный массив таблицей умножения и распечатывает его:
Иногда набор данных представляет собой несколько таблиц одинаковой размерности. Тогда требуется третий индекс, чтобы задать номер таблицы. В таких случаях используются трёхмерные массивы(массив из двумерных массивов). Пример трёхмерного массива – классный журнал. Первый индекс – номер предмета, второй – номер ученика и третий – номер урока. А содержимое такого массива – оценки учеников. Описание и использование трёхмерных массивов – аналогично двумерным.
Точно так же существуют четырёхмерные (стопка журналов), пятимерные (несколько стопок на полке), шестимерные (несколько полок в шкафу) и т.д. массивы. Паскаль позволяет использовать до 255 индексов, хотя это никому не нужно: 10-мерного массива достаточно, чтобы охватить оценки всех учеников во Вселенной. В реальности чаще всего обходятся 1–3-мерными массивами.