Практическая работа №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 |
|---|---|---|---|---|
| Строка 0 | 2 | 5 | 3 | 7 |
| Строка 1 | 4 | 1 | 8 | 6 |
| Строка 2 | 9 | 2 | 5 | 3 |
Чтобы пройти по всем элементам, используют вложенные циклы:
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 и скомпилируйте:
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}};- Выведите матрицу построчно, используя два вложенных цикла
for. - Выведите значения
a[0][2],a[1][3]иa[2][0]. - Измените
a[1][1]на10и повторно выведите матрицу. - Определите количество строк и столбцов с помощью
std::size()либоsizeof.
Задание 1.2. Обработка строк и столбцов
Возьмите исходную матрицу из задания 1.1 (до изменения элемента). Найдите сумму в каждой строке и количество чётных элементов в каждом столбце. Не используйте готовые алгоритмы из библиотек.
Для самопроверки: суммы строк — 17, 19, 19; число чётных элементов по столбцам — 2, 1, 1, 1.
Задание 1.3. Исследование символьной последовательности
char code[] = "rack_A204";- Выведите символы строки по одному, каждый на новой строке.
- Вычислите количество символов без учёта
\0, перебирая массив циклом. - Подсчитайте количество цифр и символов
_. - Выведите размер массива
sizeof(code)и объясните, почему он отличается от длины текста.
Для самопроверки: длина — 9, цифр — 3, символов _ — 1, размер массива — 10 байт.
Задание 1.4. Изменение символьного массива
Для того же массива code замените каждый символ _ на -, выведите новую строку и убедитесь, что другие символы не изменились.
Ожидаемый результат: rack-A204.
Часть 2. Задания для самостоятельного выполнения
Общие требования:
- Составьте блок-схему (или псевдокод) основного алгоритма обработки матрицы. Отразите вложенные циклы и условия.
- Реализуйте обе части варианта на C++17: допускается одна программа с двумя разделами или два отдельных файла.
- Для матрицы применяйте обычный двумерный массив, для символьной последовательности —
char[];std::vectorиstd::stringдля решения индивидуального варианта не используйте. - Для поиска, подсчёта и изменения элементов используйте циклы и условия. Для подсчёта длины C-строки не используйте
strlen. - Выводите понятные пояснения, а для изменённого массива — его итоговое содержимое.
- Проверьте работу программы как минимум на исходных данных и на одном изменённом наборе значений. Если значение отсутствует, должно выводиться понятное сообщение.
- Номера строк и столбцов при выводе пользователю начинаются с 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";А. Двумерный массив
- Найдите среднюю температуру для каждого из трёх датчиков.
- Определите наибольшее измерение и номер датчика, который его зафиксировал (при совпадении — первое найденное).
- Подсчитайте число измерений строго выше 25 градусов.
Б. Последовательность символов
- Найдите длину кода помещения без завершающего нулевого символа.
- Подсчитайте, сколько в коде цифр и сколько символов
_.
Вариант 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";А. Двумерный массив
- Подсчитайте общее количество свободных мест (
0) и количество свободных мест в каждом ряду. - Определите ряд с наибольшим количеством свободных мест (при совпадении — первый).
- Считайте номер ряда и места (нумерация с 1). Если место свободно, замените
0на1; иначе сообщите, почему бронирование невозможно. После операции выведите зал.
Б. Последовательность символов
- Подсчитайте количество цифр в коде зала.
- Замените
_на-и выведите изменённый код.
Вариант 3. Электронный журнал успеваемости
Section titled “Вариант 3. Электронный журнал успеваемости”Исходные данные:
int grades[3][4] = { {5, 4, 5, 3}, {3, 2, 4, 4}, {5, 5, 4, 5}};char group[] = "GR_5981";А. Двумерный массив
- Вычислите средний балл каждого студента.
- Выведите номер студента с наибольшим средним баллом (при совпадении — первого).
- Подсчитайте общее количество неудовлетворительных оценок
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";А. Двумерный массив
- Найдите суммарный запас каждой категории (каждая строка — категория).
- Определите склад с наибольшим количеством единиц товара (каждый столбец — склад).
- Выведите координаты всех ячеек с нулевым остатком.
Б. Последовательность символов
- Найдите количество цифр в коде товара.
- Замените
_на-и выведите обновлённый код.
Вариант 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означает соединение двух устройств,0— отсутствие. Найдите количество соединений у каждого устройства (сумму его строки). - Определите устройство с наибольшим количеством соединений.
- Найдите общее число различных соединений: каждую связь между двумя устройствами считайте только один раз.
Б. Последовательность символов
- Подсчитайте цифры в имени устройства.
- Определите, присутствует ли символ
_(выведитеДалибоНет).
Вариант 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";А. Двумерный массив
- Каждая строка — раздел сайта, столбец — день. Подсчитайте посещения в каждый из четырёх дней.
- Определите самый посещаемый раздел по сумме за весь период.
- Найдите количество ячеек с посещаемостью строго выше 25.
Б. Последовательность символов
- Найдите индекс последней точки
.в названии файла (если её нет —-1). - Подсчитайте количество цифр в названии файла.
Вариант 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";А. Двумерный массив
- Найдите суммарный расход по каждому помещению (строке).
- Определите максимальный расход и номера строки и столбца, в которых он обнаружен.
- Подсчитайте, сколько значений превышают 20.
Б. Последовательность символов
- Подсчитайте количество символов
_. - Определите количество цифр в коде счётчика.
Вариант 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";А. Двумерный массив
- Каждая строка — категория книг, столбец — день. Определите общее количество выдач в каждой категории.
- Определите день с наибольшим числом выдач по всем категориям.
- Подсчитайте, сколько дней у отдельных категорий не было выдач (сколько нулей в таблице).
Б. Последовательность символов
- Подсчитайте количество заглавных латинских букв
A–Z. - Замените
_на-и выведите новый код книги.
Вариант 9. Контроль влажности в теплице
Section titled “Вариант 9. Контроль влажности в теплице”Исходные данные:
int humidity[3][4] = { {45, 52, 61, 50}, {58, 64, 49, 55}, {40, 47, 53, 62}};char zone[] = "greenhouse_B2";А. Двумерный массив
- Найдите минимальную влажность в каждой зоне (строке).
- Подсчитайте количество измерений, в которых влажность строго ниже 50.
- Определите номер зоны с наибольшей средней влажностью.
Б. Последовательность символов
- Найдите число символов
_. - Выведите индекс первого вхождения цифры в символьный массив; если цифр нет —
-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означает занятую клетку,0— пустую. - Подсчитайте количество занятых клеток в каждой строке.
- Найдите сумму значений главной и побочной диагоналей по отдельности.
Б. Последовательность символов
- Подсчитайте количество цифр в имени игрока.
- Найдите длину имени без символа
\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";А. Двумерный массив
- Подсчитайте общее число приготовленных порций каждого блюда (каждая строка — блюдо).
- Определите день (столбец), в который приготовили больше всего порций.
- Выведите номера блюд, которые готовили во все четыре дня (в строке нет нулей).
Б. Последовательность символов
- Подсчитайте количество цифр.
- Замените все символы
_на-и выведите код меню.
Вариант 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— занятое место,0— свободное. Найдите число свободных мест в каждом ряду.- Найдите координаты первого свободного места при просмотре таблицы слева направо и сверху вниз.
- Считайте номера ряда и места (с 1) и попытайтесь занять его: измените свободное место на
1, либо объясните невозможность операции. Выведите новую таблицу.
Б. Последовательность символов
- Определите длину номера автомобиля.
- Подсчитайте отдельно цифры и заглавные латинские буквы.
Вариант 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— тест пройден,0— провален. Найдите число успешно пройденных тестов для каждой версии. - Найдите номер версии, которая прошла наибольшее число тестов (при совпадении — первую).
- Подсчитайте количество проваленных тестов во всей таблице.
Б. Последовательность символов
- Подсчитайте количество символов
_. - Найдите индекс первого появления цифры в названии сборки; если её нет —
-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";А. Двумерный массив
- Строки — команды, столбцы — раунды. Найдите общую сумму очков каждой команды.
- Определите команду-победителя по общей сумме (при равенстве — первую).
- Для каждой команды найдите максимальное количество очков за один раунд.
Б. Последовательность символов
- Подсчитайте число цифр.
- Проверьте, начинается ли название с последовательности символов
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означает присутствие,0— отсутствие. Определите количество пропусков у каждого студента. - Найдите студента с наименьшим числом пропусков (при совпадении — первого).
- Определите, в какой день отсутствовало больше всего студентов (при совпадении — первый).
Б. Последовательность символов
- Определите количество цифр.
- Найдите индекс первого символа
_; если его нет —-1.
Проверка правильности решения
Section titled “Проверка правильности решения”Перед сдачей проверьте:
- Работает ли программа со всеми строками и столбцами массива?
- Корректно ли определяются первый/последний найденные элементы при одинаковых значениях?
- Для поиска первого вхождения предусмотрена ли ситуация «элемент не найден»?
- Не выходит ли программа за пределы таблицы при изменении клетки по координатам?
- Правильно ли цикл обработки строки останавливается на
\0? - Сохраняются ли остальные символы при замене одного символа другим?
Требования к сдаче
Section titled “Требования к сдаче”- Исходный код: программы для заданий исследовательской части и для своего варианта.
- Одна блок-схема или псевдокод основной обработки двумерного массива из индивидуального варианта.
- Два результата проверки индивидуального варианта: на исходных данных и после осмысленного изменения хотя бы одного значения.
- Краткое объяснение, какой цикл отвечает за строки, какой за столбцы и как обрабатывается завершающий нулевой символ C-строки.
Контрольные вопросы
Section titled “Контрольные вопросы”- Что называется двумерным массивом? Какие два индекса используются?
- Как объявить массив из трёх строк и четырёх столбцов типа
int? - Почему для обхода всей матрицы обычно используются вложенные циклы?
- Как найти сумму элементов отдельной строки? Чем отличается обход столбца?
- Чем отличаются главная и побочная диагонали квадратной матрицы?
- Что возвращает
std::size(matrix)? Аstd::size(matrix[0])? - Что такое символьный массив
char[]? - Для чего C-строка содержит завершающий символ
\0? - Чем отличаются длина текста и
sizeofсимвольного массива? - Как подсчитать цифры в строке без вызова готовых строковых функций?
- Почему нельзя записывать символы за пределами массива
char[]? - В чём ключевое отличие массива
char[]отstd::string?
Рекомендуемая литература
Section titled “Рекомендуемая литература”- LearnCpp — Introduction to C-style arrays.
- LearnCpp — Multidimensional C-style arrays.
- LearnCpp — C-style strings.
- cppreference — Arrays.
- Б. Страуструп. Язык программирования C++.