Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
attachments_03-09-2012_10-20-12 / Массивы.doc
Скачиваний:
42
Добавлен:
21.05.2015
Размер:
149.5 Кб
Скачать

Ввод-вывод элементов двумерного массива.

Матрицы, как и массивы, нужно вводить (выводить) поэлементно. Блок-схема ввода элементов матрицы изображена на рис.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; // начальное значение суммы для icnhjrb

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-}, т.к. дополнительный код увеличивает размер исполняемого файла и замедляет работу программы.