Шаг 32.
Пример использования двумерного массива


    Составим программу нахождения минимального элемента в двумерном массиве В, состоящем из 4 строк и 3 столбцов. Элементами массива являются целые числа.

    Алгоритм решения этой задачи может быть следующим:

    На данный момент мы можем записать на языке программирования Pascal первый шаг алгоритма. Он может выглядеть, например, так:


    For i:=1 To 4 Do
      For j:=1 To 3 Do
         B[i, j]:=Random(30);        .


Если в теле цикла расположен другой цикл, то такая конструкция называется циклом в цикле или вложенным циклом.

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


    For i:=1 To 4 Do
      For j:=1 To 3 Do
         WriteLn(B[i,j]);         .

    Однако в этом случае элементы массива будут выведены "в столбик". Нам же хотелось напечатать элементы в виде таблицы: сначала элементы первой строки, затем, начиная со следующей, элементы второй строки и т. д. Поэтому вместо оператора WriteLn нужно использовать оператор Write, а переход на следующую строку осуществлять после завершения вывода элементов текущей строки. Перепишем приведенную выше последовательность операторов так, чтобы она удовлетворяла указанным условиям:


Рис.1. Вывод значений двумерного массива

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


Рис.2. Пример "плавающей" границы

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


    <имя переменной>: 
        <общее число позиций>: 
               <количество позиций после запятой>  

    Если, например, указана такая конструкция: x:6:2, то формат вывода значения переменной x будет следующим (рис.3):


Рис.3. Формат вывода


Замечания.
    1. При задании формата выводимое значение округляется. В нашем случае значение переменной x будет округлено до двух знаков после запятой.
    2. Если указанный формат меньше выводимого значения, то он игнорируется.
    3. Если выводимое число целое, то количество цифр после запятой не указывается.

    Перепишем операторы вывода элементов массива В с указанием формата:


   For i:=1 To 4 Do
    Begin
       For j:=1 To 3 Do
           Write(B[i,j]:3);
     WriteLn;
    End;

Так как массив В состоит из чисел на промежутке от 0 до 29, то достаточно двух позиций для вывода значения, а одна позиция будет пустой - это разделитель между элементами. Приведем изображение элементов массива с использованием указанного формата (рис.4):


Рис.4. Использование формата вывода

    Как видно из приведенного рисунка, заполнение формата осуществляется справа налево, то есть свободными остаются левые ячейки формата.

    Третий шаг алгоритма практически совпадает с аналогичным шагом алгоритма нахождения минимального элемента в одномерном массиве:


   Minimum:=B[1,1];
   For i:=1 No 4 Do
      For j:=1 To 3 Do
         If Minimum>B[i,j] Then Minimum:=B[i,j]; 

    Отметим только одну особенность: в качестве начального значения минимума берется первый элемент первой строки, а сравнение элементов массива со значением переменной Minimum начинается также с первого элемента первой строки, а не со второго элемента первой строки, как можно было бы предположить. Такое отступление от предыдущего алгоритма объясняется тем, что пришлось бы писать отдельный цикл для сравнения элементов первой строки со значением переменной Minimum:


   Minimum:=B[1,1];
   For j:=2 No 3 Do
      If Minimum>B[1,j] Then Minimum:=B[1,j]; 
   For i:=2 To 4 Do
      For j:=1 To 3 Do
       If Minimum>B[i,j] Then Minimum:=B[i,j]; 

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

    Четвертый шаг алгоритма пояснений не требует.

    "Соберем" все рассмотренные шаги в программу.

   

Program Minimum_v_Massive1;
Var
  i,j: Byte;
  B: Array[1..4,1..3] Of  Integer;
  Minimum: Integer;
Begin
  {Заполнение массива}
  Randomize;
  For i:=1 To 4 Do
    For j:=1 To 3 Do
     B[i,j]:=Random(30);
  {Вывод элементов массива}
  WriteLn('Исходный массив:');
  For i:=1 To 4 Do
    Begin
      For j:=1 To 3 Do
         Write(B[i,j]:3);
      WriteLn;
    End;
  {Нахождение минимального элемента}
  Minimum:=B[1,1];
  For i:=1 To 4 Do
     For j:=1 To 3 Do
       If Minimum>B[i,j] Then Minimum:=B[i,j];
  WriteLn('В заданном массиве минимальный элемент равен ', Minimum);
End.

   

    На следующем шаге мы решим еще несколько задач, где используются двумерные массивы.


Предыдущий шаг Содержание Следующий шаг