Описание регулярного типа (массива), страница 2

            begin

For i:=1 to 3 do

                        Write(a[i,j],’ ‘);

            WriteLn;

            end;

end.

Обратите внимание: мы не делали никаких преобразований с самим массивом, мы просто поменяли порядок прохождения циклов (теперь сначала проматывается i, а потом уже j).

Работая с матрицами как с массивами, всегда следует искать какие-либо определенные закономерности в индексах, чтобы облегчить решение поставленной задачи. Вот несколько примеров:

Элементы главной диагонали матрицы                            i=j

Элементы выше главной диагонали матрицы                 i<j

Элементы ниже главной диагонали матрицы                  i>j

Элементы побочной диагонали                                         i+j=n+1 (n - порядок матрицы)

Используя эти закономерности в операторах условного перехода, можно решать задачи по выводу определенных элементов матрицы.

Пример:

Вывести элементы главной диагонали матрицы 9х9.

Решение

Program example_2

Var

i,j : integer;

a: array[1..9,1..9] of integer;

begin

For i:=1 to 9 do

For j:=1 to 9 do

                        Read(a[i,j]);

For i:=1 to 9 do

For j:=1 to 9 do

                        If i=j then write(a[i,j],’ ‘);

end.

 


Иногда в условии не сказано прямо, какого порядка должна быть матрица. В этих случаях следует писать программу, являющуюся общим решением для разных размеров матрицы. Размеры же следует задавать в разделе констант. Переделаем пример 1 для матрицы произвольного размера (однако не следует брать ширину слишком большой,  памятуя об ограничениях экрана):

Program example_3;

Const

n=9, m=7

Var

i,j : integer;

a: array[1..n,1..m] of integer;

begin

For i:=1 to n do

For j:=1 to m do

                        Read(a[i,j]);

For j:=1 to n do

            begin

For i:=1 to m do

                        Write(a[i,j],’ ‘);

            WriteLn;

            end;

end.

Заметьте, все места в коде, где явно задавались пределы матрицы, были заменены на константы, определяемые в начале программы. Теперь, меняя значение в одном месте кода программы – в разделе констант, мы можем проделывать эту операцию для различных матриц.

В случае, когда размеры матрицы, необходимо также вводить в начале программы, нужно просто использовать массив заведомо большего размера:

Program example_4;

Var

i,j,n,m : integer;

a: array[1..25,1..25] of integer;

begin

Read(n,m);

For i:=1 to n do

For j:=1 to m do

                        Read(a[i,j]);

For j:=1 to n do

            begin

For i:=1 to m do

                        Write(a[i,j],’ ‘);

            WriteLn;

            end;

end.

Здесь n и m уже становятся переменными целочисленного типа, вводимыми с клавиатуры. Далее мы просто используем только часть массива, ограниченную этими размерами. Такой подход обусловлен тем, что границы массива необходимо задавать на этапе создания программы, поэтому мы не можем изменить их в процессе ее выполнения.

Часто приходится не просто вывести определенные элементы массива, но и сделать что-либо еще: подсчитать их количество, поменять местами и т.д. Для этого вводятся дополнительны переменные: счетчики, переменные для временного хранения данных. Вот пример, в котором в каждой строке матрице mxn выделяются минимальные и максимальные значения, которые потом меняются  местами.

В фигурные скобки заключены комментарии к коду программы.

program example_5;

var

i,j,m,n: byte;

a: array[1..20,1..20] of integer;

{переменные для сохранения координат искомых значений}

xmin,ymin,xmax,ymax : byte;

{буфер для сохранения одного из значений при обмене}

buf : integer;

begin

{Размерность матрицы считываем прямо во время работы программы. Однако следует отдавать себе отчет в том, что это значение не может превышать заданные нами размеры массива (20х20)}

Read(m,n);

for i:=1 to n do

for j:=1 to m do

   Read(a[i,j]);

{в главном цикле увеличивается номер строки – первый индекс элемента}

for i:=1 to n do

begin

{устанавливаем начальные значения переменным – номер текущей строки и1}

xmax:=i;

ymax:=1;

xmin:=i;

ymin:=1;

{Во внутреннем цикле увеличивается второй индекс элемента}

for j:=2 to m do

begin

        {Если просматриваемый элемент больше предыдущего выделенного, он                считается максимальным, и переменным присваиваются номера его                      индексов}

if a[xmax,ymax]<a[i,j] then begin

xmax:=i;

ymax:=j;

end;

         {Аналогично для поиска минимального элемента}

if a[xmin,ymin]>a[i,j] then

begin

xmin:=i;

ymin:=j;

end;

end;

{Для обмена двух переменных значениями: 1.Запоминаем значение одной из них в третью переменную (буфер). 2 Присваиваем первой переменной значение второй. 3. Присваиваем второй переменной значение буфера}

buf:=a[xmin,ymin];

a[xmin,ymin]:=a[xmax,ymax];

a[xmax,ymax]:=buf;

{Выводим обработанную строку. В каждом проходе главного цикла мы обрабатываем по одной строке}

for j:=1 to m do Write(a[i,j],' ');

WriteLn;

end;

end.

Если необходимо вычислить определенные элементы и сохранить в каком-либо виде их индексы, можно сохранить индексы в виде десятичных чисел. Например, вот как можно запомнить в виде массива y индексы элементов массива x, значения которых меньше 0:

For i:=1 to n do

            For j:=1 to m do        

                        if x[i,j] < 0 then

                                    begin

                                    k:=k+1;

                                    y[k]:=10*i+j;

                                    end;

Здесь индекс 1-1, например, сохраняется в виде числа одиннадцать, индекс 2-3 – в виде числа двадцать три. Однако следует учесть, что если ширина матрицы превысит 9, то номера элементов будут сохраняться некорректно. Тогда следует придумать более хитрый способ, воспользовавшись проверкой этого значения на превышение 9. Попробуйте сделать это самостоятельно.

Задания

А