Размещение в памяти
Задача 1. Требуется ввести с клавиатуры целое значение N, затем N целых чисел и вывести на экран эти числа в порядке возрастания.
Поскольку для сортировки все числа необходимо удерживать в памяти, нужно заводить массив, в который будут записаны все элементы. Поэтому алгоритм решения задачи на псевдокоде выглядит так:
прочитать данные из файла в массив отсортировать их по возрастанию вывести массив на экран
Все эти операции для обычных массивов подробно рассматривались в курсе 10 класса, поэтому здесь мы остановимся только на главной проблеме: как разместить в памяти массив, размер которого до выполнения программы неизвестен.
Для подобных случаев в версии языка Паскаль, которая поддерживается в среде FreePascal, существуют динамические массивы, которые объявляются без указания размера:
var A: array of integer;
Использовать сразу такой массив нельзя, поскольку его размер неизвестен. Попытка обращения к элементу, например А[1], вызывает ошибку и аварийный останов программы.
Когда значение переменной N введено, можно фактически разместить массив в памяти, используя процедуру SetLength (англ. set length. — установить длину):
SetLength(A,N);
Далее массив А используется так же, как и обычный (статический) массив. Остаётся один вопрос: в каком диапазоне находятся его индексы?
Вы помните, что границы изменения индексов обычного (статического) массива задаются при его объявлении, причём начальный индекс может быть любым. Индексы динамического массива всегда начинаются с нуля, так что к начальному элементу нужно обращаться как А[0], а к последнему — как A[N-1]. Например, чтение данных с клавиатуры выполняется в цикле:
for i:=0 to N-l do read(A[i]);
Кроме того, массив «знает» свою длину, которая вычисляется с помощью стандартной функции Length (в переводе с англ. — длина), и максимальный индекс, который возвращает функция High (в переводе с англ. — высокий). Поэтому предыдущий цикл можно заменить на такой:
for i:=0 to High(A) do read(A[i]);
Размер массива (количество элементов в нём) можно вычислить как Length(А)или High(А)+1.
Как только массив станет не нужен, можно удалить его из памяти, установив нулевую длину:
SetLength(А,0);
Для такого (удалённого) массива нулевой длины функция Length(А) вернёт значение 0.
Таким же образом можно работать и с динамическими матрицами. Они объявляются как «массив массивов»:
var A: array of array of integer;
Для определения её размеров в процедуре SetLength нужно указать два параметра — количество строк и количество столбцов:
SetLength(А,4,3);
Функция High возвращает максимальный индекс строки (минимальный индекс всегда равен 0):
writeln(High(А)); {= 3}
Для определения границ изменения второго индекса (максимального номера столбца) нужно вызывать эту функцию для отдельной строки:
writeln(High(А[0])); {= 2}
Следующая страница Использование в подпрограммах