Многомерные массивы
Массив массивов массивов
Двумерный массив — это таблица. Трёхмерный — несколько таблиц, сложенных в стопку: как кубик Рубика из слоёв. Каждый слой — обычная таблица, а всего слоёв столько, сколько задано первым размером.
#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) | статический массив не помещается в память |
Что запомнить
- Трёхмерный массив — это «стопка таблиц»; элемент задаётся тремя индексами
a[слой][строка][столбец]. - Для полного обхода нужны три вложенных цикла.
- Реальные размеры храним отдельно, обходим только используемую часть.
- Для вариантов высокого уровня по трёхмерным массивам достаточно размеров до 10 по каждому
измерению (
MAX_SIZE 10).