Многомерные массивы

Массив массивов массивов

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

#define MAX_SIZE 10

int a[MAX_SIZE][MAX_SIZE][MAX_SIZE];    /* максимум 10 × 10 × 10 */

Элемент задаётся тремя индексами:

a[слой][строка][столбец]

Например, a[1][2][3] — слой 1, строка 2, столбец 3 (нумерация с нуля).

На пальцах. Одномерный массив — полка; двумерный — шкаф с полками; трёхмерный — несколько одинаковых шкафов, стоящих рядом. Чтобы назвать ячейку, нужно сказать: какой шкаф, какая полка, какое место на полке.

Объявление и размеры

#define MAX_SIZE 10

int c[MAX_SIZE][MAX_SIZE][MAX_SIZE];     /* максимум 10 × 10 × 10 */

Как и раньше, размеры известны заранее, а используется только часть: например, объявили 10 × 10 × 10, а работаем с 2 × 3 × 4. Поэтому реальные размеры храним отдельно:

int layers = 2;   /* слои */
int rows = 3;     /* строки */
int cols = 4;     /* столбцы */

Обход: три вложенных цикла

Внешний цикл идёт по слоям, средний — по строкам, внутренний — по столбцам:

for (int k = 0; k < layers; k++)        /* слои */
{
    for (int i = 0; i < rows; i++)      /* строки */
    {
        for (int j = 0; j < cols; j++)  /* столбцы */
        {
            /* работаем с a[k][i][j] */
        }
    }
}

Так же удобно печатать массив послойно — после каждого слоя выводим пустую строку:

for (int k = 0; k < layers; k++)
{
    printf("Слой %d:\n", k + 1);
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            printf("%4d", a[k][i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

Ввод и сумма элементов

/* ввод */
for (int k = 0; k < layers; k++)
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++)
            scanf("%d", &a[k][i][j]);

/* сумма всех элементов */
int sum = 0;
for (int k = 0; k < layers; k++)
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++)
            sum += a[k][i][j];

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

Частые ошибки

ОшибкаЧто не так
перепутаны индексы a[i][j][k] и a[k][i][j]не тот слой/строка/столбец
циклы идут до MAX_SIZE, а не до реальных размеровчитаются лишние ячейки
забыли один цикл при обходеобрабатывается только один слой
слишком большой размер (например, 1000 × 1000 × 1000)статический массив не помещается в память

Что запомнить

  1. Трёхмерный массив — это «стопка таблиц»; элемент задаётся тремя индексами a[слой][строка][столбец].
  2. Для полного обхода нужны три вложенных цикла.
  3. Реальные размеры храним отдельно, обходим только используемую часть.
  4. Для вариантов высокого уровня по трёхмерным массивам достаточно размеров до 10 по каждому измерению (MAX_SIZE 10).

Подтверждение

—