Двумерные массивы
Некоторые данные образуют таблицу со строками и столбцами: места в кинотеатре, шахматная доска, школьное расписание. Для таких данных в C есть двумерные массивы — массивы с двумя размерами:
int seats[3][4] = {
{1, 1, 0, 0},
{0, 1, 1, 1},
{0, 0, 0, 1}
};Этот массив — маленький кинотеатр с 3 рядами по 4 места: 1 означает, что место занято, 0 — что оно свободно. Первое число в квадратных скобках — число строк, второе — число столбцов. В фигурных скобках у каждой строки своя пара скобок, а от следующей строки её отделяет запятая. Не обязательно писать каждую строку на отдельной строке кода, но так таблицу легче увидеть.
У элемента два индекса: сначала строка, потом столбец, оба отсчитываются от 0. seats[1][2] — элемент во второй строке (индекс 1) и третьем столбце (индекс 2). Читать и менять его можно, как любой другой элемент:
printf("%d\n", seats[1][2]);
seats[2][0] = 1;
printf("%d\n", seats[2][0]);Это выведет:
1
1Чтобы пройти по всей таблице, нужны два вложенных цикла. Внешний проходит по строкам, а для каждой строки внутренний проходит по её столбцам. Вы знаете это по уроку о циклах, где вложенные циклы выводили строки и столбцы:
const int ROWS = 3;
const int COLS = 4;
for (int row = 0; row < ROWS; row++) {
for (int col = 0; col < COLS; col++) {
printf("%d ", seats[row][col]);
}
printf("\n");
}После изменения выше это выведет:
1 1 0 0
0 1 1 1
1 0 0 1 Для каждой строки внутренний цикл выводит её четыре места на одной строке, а printf("\n") после внутреннего цикла завершает строку. Затем внешний цикл переходит к следующей строке. Имена row (строка) и col (столбец) показывают, какой индекс какой. С i и j их легко перепутать.
Индекс за пределами массива здесь тоже ошибка: seats[3][0] не компилируется (error: array index 3 is past the end of the array (that has type 'int[3][4]')), а цикл с row <= ROWS останавливается с RuntimeError: unreachable.
Задание
- 1
Покупатель купил второе место в третьем ряду. Под строкой вывода напишите инструкцию, которая меняет этот элемент массива
seatsна1. - 2
Выведите весь кинотеатр двумя вложенными циклами, по одному ряду на строке, с местами через пробел:
1 1 0 0 0 1 1 1 0 1 0 1 - 3
Посчитайте свободные места: создайте переменную
free_seatsсо значением0, снова переберите кинотеатр двумя вложенными циклами и увеличивайтеfree_seatsдля каждого0. После циклов выведите результат в видеСвободных мест: 5.