Skip to content

Практическая работа №6

Многомерные массивы и последовательности символов

Section titled “Многомерные массивы и последовательности символов”

Основные теоретические положения

Section titled “Основные теоретические положения”

1. Двумерные массивы

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

int a[3][4] = {
{2, 5, 3, 7},
{4, 1, 8, 6},
{9, 2, 5, 3}
};

Здесь a[0][0] равно 2, a[1][2] равно 8, а a[2][3] равно 3.

ИндексСтолбец 0Столбец 1Столбец 2Столбец 3
Строка 02537
Строка 14186
Строка 29253

Чтобы пройти по всем элементам, используют вложенные циклы:

for (int i = 0; i < 3; i++) { // Строки
for (int j = 0; j < 4; j++) { // Столбцы
cout << a[i][j] << " ";
}
cout << '\n';
}

Поиск суммы элементов каждой строки:

for (int i = 0; i < 3; i++) {
int sum = 0;
for (int j = 0; j < 4; j++) {
sum += a[i][j];
}
cout << "Строка " << i + 1 << ": " << sum << '\n';
}

Результат для приведённой матрицы: 17, 19, 19.

Поиск суммы элементов каждого столбца:

for (int j = 0; j < 4; j++) {
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += a[i][j];
}
cout << "Столбец " << j + 1 << ": " << sum << '\n';
}

Как определить число строк и столбцов обычного массива:

#include <iterator> // std::size, начиная с C++17
int rows = static_cast<int>(std::size(a));
int cols = static_cast<int>(std::size(a[0]));

Аналогично можно использовать sizeof(a) / sizeof(a[0]) и sizeof(a[0]) / sizeof(a[0][0]) соответственно. Эти способы применяются здесь к обычному массиву, для которого компилятору известны размеры.

2. Диагонали квадратной матрицы

Для квадратной матрицы размером N × N:

  • Главная диагональ: элементы с равными индексами i == j.
  • Побочная диагональ: элементы, для которых i + j == N - 1.

Например, в матрице 3 × 3 на главной диагонали стоят a[0][0], a[1][1], a[2][2].

3. Последовательности символов char[]

Символьный массив — это массив элементов типа char. C-строка — символьный массив, в котором текст заканчивается специальным нулевым символом \0.

char code[] = "room_A27";

В массиве хранятся символы r, o, o, m, _, A, 2, 7, \0. Длина текста — 8 символов, размер массива — 9 элементов.

Чтобы обработать текст посимвольно, можно использовать цикл:

int i = 0;
while (code[i] != '\0') {
cout << code[i] << '\n';
i++;
}

Пример: подсчёт цифр без готовых строковых функций.

#include <iostream>
using namespace std;
int main() {
char code[] = "room_A27";
int digits = 0;
for (int i = 0; code[i] != '\0'; i++) {
if (code[i] >= '0' && code[i] <= '9') {
digits++;
}
}
cout << "Цифр: " << digits << '\n';
return 0;
}

Результат: Цифр: 2.

Изменение символов выполняется через индекс, как в обычном массиве:

for (int i = 0; code[i] != '\0'; i++) {
if (code[i] == '_') {
code[i] = '-';
}
}
cout << code; // room-A27

Если требуется считать текст с пробелами, используется cin.getline(text, вместимость_массива):

char text[100]{};
cin.getline(text, 100);

В библиотеке <cstring> есть функция strlen(text) для определения длины C-строки. В данной работе длину и количество символов необходимо вычислять циклом, чтобы отработать алгоритм перебора.

4. Компиляция и запуск

Сохраните программу в файле practice6.cpp и скомпилируйте:

Terminal window
g++ -std=c++17 -Wall -Wextra -pedantic practice6.cpp -o practice6
./practice6

Для Windows итоговый файл может иметь расширение .exe.


Задания для выполнения

Section titled “Задания для выполнения”

Часть 1. Исследование массивов и символьных последовательностей

Задание 1.1. Индексы и вывод матрицы

Дана матрица:

int a[3][4] = {
{2, 5, 3, 7},
{4, 1, 8, 6},
{9, 2, 5, 3}
};
  1. Выведите матрицу построчно, используя два вложенных цикла for.
  2. Выведите значения a[0][2], a[1][3] и a[2][0].
  3. Измените a[1][1] на 10 и повторно выведите матрицу.
  4. Определите количество строк и столбцов с помощью std::size() либо sizeof.

Задание 1.2. Обработка строк и столбцов

Возьмите исходную матрицу из задания 1.1 (до изменения элемента). Найдите сумму в каждой строке и количество чётных элементов в каждом столбце. Не используйте готовые алгоритмы из библиотек.

Для самопроверки: суммы строк — 17, 19, 19; число чётных элементов по столбцам — 2, 1, 1, 1.

Задание 1.3. Исследование символьной последовательности

char code[] = "rack_A204";
  1. Выведите символы строки по одному, каждый на новой строке.
  2. Вычислите количество символов без учёта \0, перебирая массив циклом.
  3. Подсчитайте количество цифр и символов _.
  4. Выведите размер массива sizeof(code) и объясните, почему он отличается от длины текста.

Для самопроверки: длина — 9, цифр — 3, символов _ — 1, размер массива — 10 байт.

Задание 1.4. Изменение символьного массива

Для того же массива code замените каждый символ _ на -, выведите новую строку и убедитесь, что другие символы не изменились.

Ожидаемый результат: rack-A204.


Часть 2. Задания для самостоятельного выполнения

Общие требования:

  1. Составьте блок-схему (или псевдокод) основного алгоритма обработки матрицы. Отразите вложенные циклы и условия.
  2. Реализуйте обе части варианта на C++17: допускается одна программа с двумя разделами или два отдельных файла.
  3. Для матрицы применяйте обычный двумерный массив, для символьной последовательности — char[]; std::vector и std::string для решения индивидуального варианта не используйте.
  4. Для поиска, подсчёта и изменения элементов используйте циклы и условия. Для подсчёта длины C-строки не используйте strlen.
  5. Выводите понятные пояснения, а для изменённого массива — его итоговое содержимое.
  6. Проверьте работу программы как минимум на исходных данных и на одном изменённом наборе значений. Если значение отсутствует, должно выводиться понятное сообщение.
  7. Номера строк и столбцов при выводе пользователю начинаются с 1; индексы массива в коде — с 0.

Вариант 1. Контроль температуры серверной

Section titled “Вариант 1. Контроль температуры серверной”

Исходные данные:

int t[3][4] = {
{21, 23, 26, 22},
{19, 27, 25, 24},
{20, 21, 29, 23}
};
char room[] = "rack_A27";

А. Двумерный массив

  1. Найдите среднюю температуру для каждого из трёх датчиков.
  2. Определите наибольшее измерение и номер датчика, который его зафиксировал (при совпадении — первое найденное).
  3. Подсчитайте число измерений строго выше 25 градусов.

Б. Последовательность символов

  1. Найдите длину кода помещения без завершающего нулевого символа.
  2. Подсчитайте, сколько в коде цифр и сколько символов _.

Вариант 2. Бронирование мест в кинотеатре

Section titled “Вариант 2. Бронирование мест в кинотеатре”

Исходные данные:

int seats[4][5] = {
{0, 1, 0, 0, 1},
{1, 1, 0, 0, 0},
{0, 0, 1, 1, 0},
{1, 0, 0, 1, 0}
};
char hall[] = "Hall_A3";

А. Двумерный массив

  1. Подсчитайте общее количество свободных мест (0) и количество свободных мест в каждом ряду.
  2. Определите ряд с наибольшим количеством свободных мест (при совпадении — первый).
  3. Считайте номер ряда и места (нумерация с 1). Если место свободно, замените 0 на 1; иначе сообщите, почему бронирование невозможно. После операции выведите зал.

Б. Последовательность символов

  1. Подсчитайте количество цифр в коде зала.
  2. Замените _ на - и выведите изменённый код.

Вариант 3. Электронный журнал успеваемости

Section titled “Вариант 3. Электронный журнал успеваемости”

Исходные данные:

int grades[3][4] = {
{5, 4, 5, 3},
{3, 2, 4, 4},
{5, 5, 4, 5}
};
char group[] = "GR_5981";

А. Двумерный массив

  1. Вычислите средний балл каждого студента.
  2. Выведите номер студента с наибольшим средним баллом (при совпадении — первого).
  3. Подсчитайте общее количество неудовлетворительных оценок 2.

Б. Последовательность символов

  1. Подсчитайте число цифр в коде группы.
  2. Определите индекс первого символа _ в массиве и выведите его (индексация с 0); если символа нет — -1.

Вариант 4. Остатки на складе

Section titled “Вариант 4. Остатки на складе”

Исходные данные:

int stock[3][4] = {
{12, 0, 5, 9},
{4, 7, 0, 2},
{10, 8, 6, 0}
};
char item[] = "SSD_512";

А. Двумерный массив

  1. Найдите суммарный запас каждой категории (каждая строка — категория).
  2. Определите склад с наибольшим количеством единиц товара (каждый столбец — склад).
  3. Выведите координаты всех ячеек с нулевым остатком.

Б. Последовательность символов

  1. Найдите количество цифр в коде товара.
  2. Замените _ на - и выведите обновлённый код.

Вариант 5. Схема соединений локальной сети

Section titled “Вариант 5. Схема соединений локальной сети”

Исходные данные:

int links[4][4] = {
{0, 1, 1, 0},
{1, 0, 1, 0},
{1, 1, 0, 1},
{0, 0, 1, 0}
};
char host[] = "switch_03";

А. Двумерный массив

  1. Матрица симметрична: 1 означает соединение двух устройств, 0 — отсутствие. Найдите количество соединений у каждого устройства (сумму его строки).
  2. Определите устройство с наибольшим количеством соединений.
  3. Найдите общее число различных соединений: каждую связь между двумя устройствами считайте только один раз.

Б. Последовательность символов

  1. Подсчитайте цифры в имени устройства.
  2. Определите, присутствует ли символ _ (выведите Да либо Нет).

Вариант 6. Статистика посещений сайта

Section titled “Вариант 6. Статистика посещений сайта”

Исходные данные:

int visits[3][4] = {
{20, 25, 30, 15},
{18, 22, 35, 25},
{25, 20, 25, 40}
};
char file[] = "report_2026.csv";

А. Двумерный массив

  1. Каждая строка — раздел сайта, столбец — день. Подсчитайте посещения в каждый из четырёх дней.
  2. Определите самый посещаемый раздел по сумме за весь период.
  3. Найдите количество ячеек с посещаемостью строго выше 25.

Б. Последовательность символов

  1. Найдите индекс последней точки . в названии файла (если её нет — -1).
  2. Подсчитайте количество цифр в названии файла.

Вариант 7. Расход электроэнергии

Section titled “Вариант 7. Расход электроэнергии”

Исходные данные:

int energy[3][4] = {
{15, 18, 14, 20},
{12, 25, 19, 22},
{11, 17, 28, 16}
};
char meter[] = "floor_2_room_5";

А. Двумерный массив

  1. Найдите суммарный расход по каждому помещению (строке).
  2. Определите максимальный расход и номера строки и столбца, в которых он обнаружен.
  3. Подсчитайте, сколько значений превышают 20.

Б. Последовательность символов

  1. Подсчитайте количество символов _.
  2. Определите количество цифр в коде счётчика.

Вариант 8. Учёт выдачи книг

Section titled “Вариант 8. Учёт выдачи книг”

Исходные данные:

int loans[3][4] = {
{2, 0, 3, 4},
{1, 5, 2, 2},
{4, 3, 0, 1}
};
char book[] = "BOOK_124_A";

А. Двумерный массив

  1. Каждая строка — категория книг, столбец — день. Определите общее количество выдач в каждой категории.
  2. Определите день с наибольшим числом выдач по всем категориям.
  3. Подсчитайте, сколько дней у отдельных категорий не было выдач (сколько нулей в таблице).

Б. Последовательность символов

  1. Подсчитайте количество заглавных латинских букв A–Z.
  2. Замените _ на - и выведите новый код книги.

Вариант 9. Контроль влажности в теплице

Section titled “Вариант 9. Контроль влажности в теплице”

Исходные данные:

int humidity[3][4] = {
{45, 52, 61, 50},
{58, 64, 49, 55},
{40, 47, 53, 62}
};
char zone[] = "greenhouse_B2";

А. Двумерный массив

  1. Найдите минимальную влажность в каждой зоне (строке).
  2. Подсчитайте количество измерений, в которых влажность строго ниже 50.
  3. Определите номер зоны с наибольшей средней влажностью.

Б. Последовательность символов

  1. Найдите число символов _.
  2. Выведите индекс первого вхождения цифры в символьный массив; если цифр нет — -1.

Вариант 10. Игровое поле

Section titled “Вариант 10. Игровое поле”

Исходные данные:

int field[4][4] = {
{1, 0, 0, 1},
{0, 1, 0, 0},
{1, 0, 1, 0},
{0, 0, 0, 1}
};
char player[] = "user_007";

А. Двумерный массив

  1. Выведите игровое поле таблицей; 1 означает занятую клетку, 0 — пустую.
  2. Подсчитайте количество занятых клеток в каждой строке.
  3. Найдите сумму значений главной и побочной диагоналей по отдельности.

Б. Последовательность символов

  1. Подсчитайте количество цифр в имени игрока.
  2. Найдите длину имени без символа \0.

Вариант 11. Учёт приготовленных блюд

Section titled “Вариант 11. Учёт приготовленных блюд”

Исходные данные:

int meals[3][4] = {
{12, 10, 8, 14},
{6, 9, 0, 7},
{15, 13, 12, 10}
};
char menu[] = "MENU_2026";

А. Двумерный массив

  1. Подсчитайте общее число приготовленных порций каждого блюда (каждая строка — блюдо).
  2. Определите день (столбец), в который приготовили больше всего порций.
  3. Выведите номера блюд, которые готовили во все четыре дня (в строке нет нулей).

Б. Последовательность символов

  1. Подсчитайте количество цифр.
  2. Замените все символы _ на - и выведите код меню.

Вариант 12. Стоянка автомобилей

Section titled “Вариант 12. Стоянка автомобилей”

Исходные данные:

int parking[4][5] = {
{1, 1, 0, 1, 0},
{1, 0, 0, 1, 1},
{0, 1, 1, 1, 0},
{1, 1, 1, 0, 1}
};
char plate[] = "A123BC";

А. Двумерный массив

  1. 1 — занятое место, 0 — свободное. Найдите число свободных мест в каждом ряду.
  2. Найдите координаты первого свободного места при просмотре таблицы слева направо и сверху вниз.
  3. Считайте номера ряда и места (с 1) и попытайтесь занять его: измените свободное место на 1, либо объясните невозможность операции. Выведите новую таблицу.

Б. Последовательность символов

  1. Определите длину номера автомобиля.
  2. Подсчитайте отдельно цифры и заглавные латинские буквы.

Вариант 13. Результаты тестирования программы

Section titled “Вариант 13. Результаты тестирования программы”

Исходные данные:

int passed[3][5] = {
{1, 1, 0, 1, 0},
{1, 0, 0, 1, 1},
{1, 1, 1, 1, 0}
};
char build[] = "test_build_12";

А. Двумерный массив

  1. Строки — версии программы, столбцы — тесты. 1 — тест пройден, 0 — провален. Найдите число успешно пройденных тестов для каждой версии.
  2. Найдите номер версии, которая прошла наибольшее число тестов (при совпадении — первую).
  3. Подсчитайте количество проваленных тестов во всей таблице.

Б. Последовательность символов

  1. Подсчитайте количество символов _.
  2. Найдите индекс первого появления цифры в названии сборки; если её нет — -1.

Вариант 14. Таблица спортивных результатов

Section titled “Вариант 14. Таблица спортивных результатов”

Исходные данные:

int scores[3][4] = {
{7, 9, 6, 8},
{10, 6, 9, 7},
{8, 8, 8, 9}
};
char team[] = "team_A2";

А. Двумерный массив

  1. Строки — команды, столбцы — раунды. Найдите общую сумму очков каждой команды.
  2. Определите команду-победителя по общей сумме (при равенстве — первую).
  3. Для каждой команды найдите максимальное количество очков за один раунд.

Б. Последовательность символов

  1. Подсчитайте число цифр.
  2. Проверьте, начинается ли название с последовательности символов team_ (посимвольным сравнением).

Вариант 15. Электронный учёт посещаемости

Section titled “Вариант 15. Электронный учёт посещаемости”

Исходные данные:

int present[3][5] = {
{1, 1, 1, 0, 1},
{1, 0, 1, 0, 0},
{1, 1, 1, 1, 1}
};
char classCode[] = "class_5981";

А. Двумерный массив

  1. Строки — студенты, столбцы — дни. 1 означает присутствие, 0 — отсутствие. Определите количество пропусков у каждого студента.
  2. Найдите студента с наименьшим числом пропусков (при совпадении — первого).
  3. Определите, в какой день отсутствовало больше всего студентов (при совпадении — первый).

Б. Последовательность символов

  1. Определите количество цифр.
  2. Найдите индекс первого символа _; если его нет — -1.

Проверка правильности решения

Section titled “Проверка правильности решения”

Перед сдачей проверьте:

  • Работает ли программа со всеми строками и столбцами массива?
  • Корректно ли определяются первый/последний найденные элементы при одинаковых значениях?
  • Для поиска первого вхождения предусмотрена ли ситуация «элемент не найден»?
  • Не выходит ли программа за пределы таблицы при изменении клетки по координатам?
  • Правильно ли цикл обработки строки останавливается на \0?
  • Сохраняются ли остальные символы при замене одного символа другим?
  1. Исходный код: программы для заданий исследовательской части и для своего варианта.
  2. Одна блок-схема или псевдокод основной обработки двумерного массива из индивидуального варианта.
  3. Два результата проверки индивидуального варианта: на исходных данных и после осмысленного изменения хотя бы одного значения.
  4. Краткое объяснение, какой цикл отвечает за строки, какой за столбцы и как обрабатывается завершающий нулевой символ C-строки.
  1. Что называется двумерным массивом? Какие два индекса используются?
  2. Как объявить массив из трёх строк и четырёх столбцов типа int?
  3. Почему для обхода всей матрицы обычно используются вложенные циклы?
  4. Как найти сумму элементов отдельной строки? Чем отличается обход столбца?
  5. Чем отличаются главная и побочная диагонали квадратной матрицы?
  6. Что возвращает std::size(matrix)? А std::size(matrix[0])?
  7. Что такое символьный массив char[]?
  8. Для чего C-строка содержит завершающий символ \0?
  9. Чем отличаются длина текста и sizeof символьного массива?
  10. Как подсчитать цифры в строке без вызова готовых строковых функций?
  11. Почему нельзя записывать символы за пределами массива char[]?
  12. В чём ключевое отличие массива char[] от std::string?

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. LearnCpp — Introduction to C-style arrays.
  2. LearnCpp — Multidimensional C-style arrays.
  3. LearnCpp — C-style strings.
  4. cppreference — Arrays.
  5. Б. Страуструп. Язык программирования C++.