
- •Массивы. Основные операции над ними. Алгоритмы обработки массивов. Структурные типы данных. Способы представления в памяти.
- •Описание статических массивов в программе. Доступ к элементам.
- •Массивы констант.
- •Операции с элементами массива.
- •Ввод-вывод элементов одномерного массива.
- •Алгоритм нахождения суммы и произведения элементов массива.
- •Нахождения максимального элемента массива и его номера.
- •Упорядочивание массива по возрастанию
- •Поиск в массиве.
- •Ввод-вывод элементов двумерного массива.
- •Динамические массивы.
- •Задачи.
Ввод-вывод элементов двумерного массива.
Матрицы, как и массивы, нужно вводить (выводить) поэлементно. Блок-схема ввода элементов матрицы изображена на рис.7, построчного вывода на рис.8
Рис.7 Ввод элементов матрицы.
|
Рис.8 Вывод элементов матрицы.
|
Пример -Ввод элементов матрицы
constn=3;m=5;
var A: array [1..n,1..m] of integer;{матрица А из n строк и m столбцов}
i,j:integer;
begin
for i:=1 to n do // цикл по строкам
for j:=1 to m do // цикл по элементам i-й строки
begin
write(‘A[‘ , i ,’,’ , j , ’] = ’); readln(A[i,j])
end;
end.
Пример -Вывод элементов матрицы
constn=3;m=5;
var A: array [1..n,1..m] of integer;{матрица А из n строк и m столбцов}
i,j:integer;
begin
…….
for i:=1 to n do // цикл по строкам
begin
for j:=1 to m do // цикл по элементам i-й строки
write(A[i,j]:4);
writeln; // после вывода элементов строки переводим курсор на новую строку
end;
end.
Пример – Фрагмент программы, вычисляющей сумму элементов строк матрицы.
for i:=1 to n do // цикл по строкам
begin
s:=0; // начальное значение суммы для i-й cnhjrb
for j:=1 to m do // цикл по элементам i-й строки, суммируем элементы
s:=s+A[i,j];
writeln(‘Сумма строки №’,i,’ = ‘,s); // вывод суммы
end;
Динамические массивы.
Динамические массивы не имеют фиксированного размера или длины. Память для динамического массива выделяется при вызове процедуры SetLength(var S; NewLength:Integer), где параметрыS - динамический массив, аNewLength– новое число элементов. Динамический массив определяется следующей структурой:
array of baseType;
Например, такое объявление:
Var MyArray :array of Real;
задает одномерный динамический массив вещественных чисел. Декларация не распределяет память под элементы массива MyArray. Сама переменнаяMyArrayхранит адрес, по которому располагаются элементы массива. В начале программы самого массива не существует. Для того чтобы создать массив в памяти, необходимо вызвать процедуруSetLength().Например, такой вызов:
SetLength(MyArray,20);
распределяет массив MyArrayиз 20-ти вещественных чисел, пронумерованных от 0 до 19. Индекс у динамических массивов всегда целочисленный и начинается с нуля. В процессе выполнения программы размер массиваMyArray можно увеличить с помощью процедураSetLength(), задав новое значение числа элементов -SetLength(MyArray,40).Число элементов увеличивается до 40, причем значения первых 20-ти элементов останутся без изменения. В программе не рекомендуется часто увеличивать размер массива на малое число элементов, т.к. изменение размера в большую сторону связано с новым выделением области памяти и копированием туда старых значений массива, с последующим освобождением области памяти, которое они занимали. Такие процедуры могут замедлить выполнение программы. Поэтому лучше увеличивать размер с некоторым запасом.
Для освобождения динамического массива необходимо присвоить переменной массива значение nil (пустой адрес). Динамический массив длины 0 имеет ссылкуnil. В программе можно проверить, задан массив или нет сравнив со значениемnil. Например:
If MyArray=nil then SetLength(MyArray,20);
При работе с динамическими массивами всегда следует помнить, что переменные хранят ссылки (адреса) на массивы. Поэтому еслиXиY– динамические массивы, то операторX:=Yприведет не к копированию элементов изYвX, а к распределению элементовXпо длинеY(т.е. две переменные будут ссылаться на одну физическую область памяти). Например, после выполнения следующего кода:
Var A, B: array of integer;
Begin
SetLength(A,1);
A[0]:=1;
B:=A;
B[0]:=2;
End.
получаем, что величина А[0] будет равна 0. Если бы А и В были статическими массивами, то А[0] было бы равно единице. Доступ к элементам динамического массива не отличается от доступа к элементам статического массива. Выход за допустимый диапазон индексов не сообщается во время компиляции. В отличие от статических массивов, динамические массивы можно сравнивать на = и <>, при этом будут сравниваться ссылки. Таким образом, после выполнения кода:
Var A, B: array of integer;
Begin
SetLength(A,1); SetLength(B,1);
A[0]:=2;B[0]:=2;
End.
имеем А <> B, ноA[0] =B[0].
Для того чтобы усечь динамический массив, можно использовать функцию Copy(). Например, присваиваниеA:=Copy(A,0,10) оставляет первые 10 элементов массива А.
Если динамический массив распределен, можно использовать стандартные функции Lenght(),High() иLow(). ФункцияLenght() возвращает количество элементов в массиве,High() возвращает самое большое значение индекса массива (равноеLenght()-1), аLow() всегда возвращает 0.
Для объявления многомерного динамического массива повторно используют конструкцию arrayof…, например, выражение:
Type Matrix = array of array of integer;
Var A:Matrix
или
Type Vector = array of integer;
Matrix = array of vector;
Var A:Matrix
объявляет двумерный массив (матрицу) А из целых чисел.
Чтобы выделить память для этого массива, необходимо вызвать процедуру SetLength(A,n,m)с двумя целочисленными параметрамиnиm, которые определяют число строк и столбцов в матрице А. Можно создать и непрямоугольный динамический массив. На первом шаге необходимо задать число строк в матрицеSetLength(A,9) (задаем 10 строк), далее в цикле зададим число элементов в каждой строке.
For i:=Low(A) to High(A) do
SetLength(A[i],i+1);
После выполнения цикла в первой строке матрицы А – 1 элемент, во второй – 2 элемента и т.д.
Директива компилятора {$R+}
Директива {$R+} -включить (отключить) контроль границ диапазона.
Синтаксис {$R+} или {$R-}
{$RANGECHECKSON} или {$RANGECHECKSOFF}
Значение по умолчанию {$R-}
{$RANGECHECKS OFF}
При включенной директиве в программу добавляется специальный код, проверяющий все операции с массивами на предмет допустимости заданного индекса. Если при обращении к элементу массива задан индекс, выходящий за диапазон допустимых значений, то программа останавливается и выводит сообщение об ошибке. Директиву {$R+} применяют на стадии отладки программы для выявления ошибок при работе с массивами. В окончательном варианте программы директива должна быть выключена{$R-}, т.к. дополнительный код увеличивает размер исполняемого файла и замедляет работу программы.