Двумерные массивы в языке Ада. Введение

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

  1  2  3  4  5
  6  7  8  9 10
 11 12 13 14 15

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

Объявление типа двумерного массива выглядит следующим образом:

type Matrix is array(1..N, 1..M) of Integer;

где N и M - количество строк и столбцов двумерного массива соответственно.

Если N и M - не конкретные числовые значения, как, например:

type Matrix is array(1..10, 1..20) of Integer;

а типы, то такой тип будет определять массив с неуточнёнными границами:

type N is range 1..10;
type M is range 1..20;
type Matrix is array(1..N, 1..M) of Integer;
...

При объявлении массива такого типа, как и в случае с одномерными массивами, необходимо будет указывать, сколько строк и столбцов будет содержать создаваемый массив.

Бывает, что размер массива становится известным только в ходе выполнения программы, тогда тип массива можно объявить так:

type Matrix is array(Integer range <>, Integer range <>) of Integer;

Далее для объявления самого массива, как и в случае с одномерными массивами, используется блок declare…begin…end.

Двумерные массивы также поддерживают работу со срезами (вырезками): пусть V - одномерный массив (вектор), а M - двумерный массив (матрица). Тогда, например, в результате операции:

V(5..9) := M(2)(6..10);

элементы 2 строки матрицы с индекса 6 по индекс 10 будут равны элементам вектора с индекса 5 по индекс 9. Срез по столбцам таким образом получить нельзя.

Рассмотрим некоторые атрибуты многомерных массивов:

Matrix'First(I)  --нижняя граница I-го индекса для типа Matrix.
                 --В случае двумерного массива I = 1 будет означать строку, I = 2 - столбец
Matrix'Last(I)   --верхняя граница I-го индекса для типа Matrix.
Matrix'Length(I) --длина по I-му индексу для типа Matrix.

Рассмотрим обращение к элементам матрицы и использование атрибутов на примере вывода её на экран:

...
--Цикл для обхода строк (1, 2, 3 и т.д):
for i in Matrix'First(1)..Matrix'Last(1) loop
    --Цикл для обхода столбцов (каждого элемента строки):
    for j in Matrix'First(2)..Matrix'Last(2) loop
        Put(Item => Matrix(i, j); Width => 0);
        Put(" ");
    end loop;
    New_Line; --Переход на новую строку
end loop;
...

Рассмотрим решение задачи:

Задача: Найдите индексы первого вхождения максимального элемента. Программа получает на вход размеры массива n и m, затем n строк по m чисел в каждой. n и m не превышают 100. Выведите два числа: номер строки и номер столбца, в которых стоит  наибольший элемент в двумерном массиве. Если таких элементов несколько, то выводится тот, у которого меньше номер строки, а если номера строк равны то тот, у которого меньше номер столбца.

Пример:
Размеры массива: 3 4
0 3 2 4
2 3 5 5
5 1 2 3
Ответ: 2 3

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
 
procedure main is
    --По условию количество строк и столбцов не превышает 100
    type Mas_Size is new Integer range 1..100;
    type Matrix is array(Mas_Size range <>, Mas_size range <>) of Integer;
    n, m : Mas_Size; --n - количество строк, m - количество столбцов
    iMax, jMax : mas_Size; --номера строки и столбца, на пересечении которых стоит
                           --максимальный элемент
begin
    Put("Размеры массива: ");
    Get(Integer(n));
    Get(Integer(m));
    declare
        mas : Matrix(1..n, 1..m);
    begin
        Put_Line("Массив: ");
        --атрибут mas'Last(1) означает количество строк двумерного массива:
        for i in mas'First(1)..mas'Last(1) loop
            --атрибут mas'Last(2) означает количество столбцов двумерного массива:
            for j in mas'First(2)..mas'Last(2) loop
                Get(mas(i, j));
            end loop;
        end loop;
 
        iMax := 1;
        jMax := 1;
 
        for i in mas'Range(1) loop
            for j in mas'Range(2) loop
                if mas(i, j) > mas(iMax, jMax) then
                    iMax := i;
                    jMax := j;
                end if;
            end loop;
        end loop;
        Put("Ответ: ");
        Put(Item => Integer(iMax), Width => 1);
        Put(" ");
        Put(Item => Integer(jMax), Width => 1);
    end;
end main;

 

2 comments on “Двумерные массивы в языке Ада. Введение

  1. Объясните пожалуйста что означают цифры 1 и 2 в скобках после атрибутов ?
    for i in mas'First(1)..mas'Last(1) loop

    • В случае двумерного массива 1 будет означать, что будет проход по строкам, 2 - по столбцам. Т.е. если рассматривать массив как прямоугольник в двумерной системе координат, то 1 => будем пробегать по координате Y, 2 => по X.
      Если бы был трёхмерный массив, то было бы уже 3 цифры, 3 означала бы глубину. Представьте параллелепипед и трёхмерную систему координат (добавится координата Z). И т.д.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *