Система программирования Турбо паскаль 7.0

       

Двумерные массивы


Двумерные массивы в математике представляются матрицей:

Двумерные массивы

или сокращенно можно записать:

Двумерные массивы
,  где

Двумерные массивы
число строк;

Двумерные массивы
число столбцов;

Двумерные массивы
индексы (номера) текущих строки и столбца, на пересечении которых находится элемент
Двумерные массивы
.

Описание двумерного массива

Описание матрицы в разделе VAR задается структурным типом вида:

<имя массива>: ARRAY [m1..m2, n1..n2] OF <тип элементов>;

m1..m2 – диапазон значений индекса i, определяющий число строк;

 n1..n2 – диапазон значений индекса j, определяющий число столбцов.

По описанию матрицы во внутренней памяти компьютера выделяется область из (

Двумерные массивы
) последовательных ячеек, в которые при работе программы записываются значения элементов матрицы. Например, по описанию:

                   Var

                     A: array [1..3, 1..5] of real;

в памяти компьютера выделяется область, состоящая из

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

Обращение к отдельным элементам матрицы осуществляется с помощью переменной с двумя индексами, например:

                 

Двумерные массивы
;

                 

Двумерные массивы
;

                 

Двумерные массивы
.

Ввод-вывод двумерного массива

Для поэлементного ввода и вывода матрицы используется двойной цикл FOR. Если задать индекс

Двумерные массивы
 как параметр внешнего цикла, а индекс
Двумерные массивы
 как параметр внутреннего цикла, то ввод-вывод матрицы осуществляется по строкам.

Пример 1.

Организовать ввод целочисленной матрицы

Двумерные массивы
по строкам.

Двумерные массивы
.

Описание матрицы вместе с текущими индексами имеет вид:

                               Var

                                    M: array [1..2, 1..3] of integer;

                                    i, j: integer;

Ввод  в программе реализуется в форме диалога, т.е. сопровождается соответствующим сообщением:

                     Begin {начало программы}

                          writeln(‘Введите матрицу М’);

                          for i := 1 to 2 do

                  for j := 1 to 3 do read(m[i, j]);

           …………


На клавиатуре  нагляднее всего набирать элементы матрицы по строкам.
                          1   2   3 <Enter>
                          4   5   6 <Enter>
Пример 2.
Организовать вывод матрицы M на экран.
Вывод матрицы надо реализовать в удобном для чтения виде, т.е. чтобы на одной строке экрана располагалась одна строка матрицы. С этой целью в тело внешнего цикла, помимо внутреннего, включается еще оператор WRITELN, который переводит курсор к началу следующей строки экрана после вывода текущей строки матрицы.
                         for i := 1 to 2 do
                             begin
                       for j := 1 to 3 do write(m[i, j]:3);
                       writeln
                             end;
Вид матрицы на экране будет следующим:
                           1    2    3
                           4    5    6
                           Обработка матриц
Базовыми алгоритмами обработки матриц являются те же алгоритмы, которые используются при обработке одномерных массивов. Однако реализацию этих алгоритмов можно условно рассматривать для двух типов задач.
1.      Алгоритмы реализуются при обработке всех элементов матрицы.
2.      Алгоритмы реализуются внутри каждой строки или каждого столбца матрицы.
Реализация алгоритмов  для задач первого типа
Задача 1. Дана матрица вещественных чисел
Двумерные массивы
. Вычислить значение
Двумерные массивы
, где P1 и P2 – произведения положительных и отрицательных элементов матрицы соответственно.
                    Program DМ_1;
                    Var
                        A: array [1..4, 1..6] of  real;
                        i, j: integer;
                        P1, P2, Z: real;
                    Begin
                   writeln(‘Введите матрицу А’);
                   for i := 1 to 4 do
                      for j := 1 to 6 do read(a[i,j]);
                   P1 := 1;
                   P2 := 1;
                   for i := 1 to 4 do
                 for j :=1 to 6 do


                begin
               if  a[i,j]>0 then P1 := P1 * a[i,j];
               if  a[i,j]<0 then P2 := P2 * a[i,j];
           end;
    Z := P1/abs(P2);                                                                                                                                 
   writeln(‘Z=’,  Z:10:2);
                    End.
       Задача 2. В квадратной целочисленной матрице
Двумерные массивы
  вычислить модуль разности между числом нулевых элементов, стоящих ниже главной диагонали, и числом нулевых элементов, стоящих выше главной диагонали.
Введем обозначения:
L1 – число нулевых элементов ниже главной диагонали;
L2 – число нулевых элементов выше главной диагонали;
L= |L1-L2|.
            Program DМ1_2;
            Var
                 B: array [1..5, 1..5] of  integer;
                  i, j, L1, L2, L: integer;
            Begin
            writeln(‘Введите матрицу B’);
            for i := 1 to 5 do
            for j := 1 to 5 do read(b[i,j]);
            L1 := 0;
            L2 := 0;
            for i := 1 to 5 do
          for j := 1 to 5 do
         if b[i,j]=0 then
          begin
            if  i>j then L1 := L1+1;
            if  i<j then L2 := L2 +1;
           end;
                  L := abs(L1 – L2);
  writeln(‘L=’, L);
            End.
Реализация алгоритмов для задач второго типа
          Задача 1. В матрице
Двумерные массивы
 вещественных чисел первый элемент каждой строки поменять местами с минимальным элементом этой строки. Вывести матрицу Х после обмена.
                      Program DМ2_1;
                      Var
                           X: array [1..3,1..6] of  real;
                           i, j, jmin: integer;
                           min: real;
                      Begin
                     writeln(‘Введите матрицу X’);
                     for  i:= 1 to 3 do
                        for j := 1 to 6 do read(x[i,j]);
                    for i:=1 to 3 do
              begin
             min:=+1E6;


             for j:=1 to 6 do
                 if x[i,j]<min then
                    begin
                  min:=x[i,j];
                  jmin:=j;
                    end;
              x[i,jmin]:=x[i,1];
              x[i,1]:=min;
              end;
          for i:=1 to 3 do
               begin
              for j:=1 to 6 do write (x[i,j]:6:1);
              writeln;
               end;
                       End.
       Задача 2. Дана матрица вещественных чисел
Двумерные массивы
. Вычислить среднее арифметическое  каждого столбца. Результат оформить в виде одномерного массива
Двумерные массивы
.
                              Program DМ2_2;
                              Var
                                  C: array [1..8, 1..4] of  real;
                                  S: array [1..4] of  real;
                                   i, j: integer;
                              Begin
                             writeln(‘Введите матрицу C’);
                             for i := 1 to 8 do
                             for j := 1 to 4 do read(c[i,j]);
                             for j := 1 to 4 do
                            begin
                              s[ j ] := 0;
                              for i := 1 to 8 do s[ j ]:= s[ j ] + c[i,j];
                                                   s[ j ] := s[ j ]/8;
                            end;
                          for j := 1 to 4 do write(s[ j ]:8:2)
                          writeln;
                             End.
В данной программе следует обратить внимание на то, что при вычислении каждого элемента s[j] организован двойной цикл, в котором индекс
Двумерные массивы
 является внешним параметром цикла, а индекс
Двумерные массивы
внутренним. Это обеспечивает обработку элементов матрицы по столбцам.
ГЛАВА 8.  Подпрограммы

Содержание раздела