Динамические массивы | Размещение в памяти (11 кл. 136 ч.)

Планирование уроков на учебный год (по учебнику К.Ю. Полякова, Е.А. Еремина, полный углублённый курс, по 4 часа в неделю)


Уроки 69 - 70
Динамические массивы
(§40. Динамические массивы)



Содержание урока

Что это такое?

Размещение в памяти

Использование в подпрограммах

Расширение массива

Как это работает?

Вопросы и задания

Задачи


Размещение в памяти


Задача 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}


Следующая страница Использование в подпрограммах



Cкачать материалы урока







Наверх