Лаб. работа “Обзор базовых конструкций и основных элементов языка”
Цель работы
Освоить инструменты разработки Qt (Qt Creator, CMake/qmake), закрепить знания синтаксиса языка C++, базовых типов данных, операторов и управляющих конструкций путём разработки консольного приложения, обрабатывающего пользовательский ввод и выводящего результаты вычислений.
Теоретические сведения
Структура проекта в Qt Creator
Проект на C++ в Qt Creator создаётся через шаблон Non-Qt Project → Plain C++ Application. Система сборки — CMake (рекомендуется) или qmake. Основные файлы проекта:
Базовый файл CMakeLists.txt
Переменные и типы данных
Преобразование и приведение типов
Управляющие конструкции
// Условный оператор
if (port > 1024) {
cout << "Пользовательский порт" << endl;
} else if (port > 0) {
cout << "Системный порт" << endl;
} else {
cout << "Некорректный порт" << endl;
}
// Цикл for
for (int i = 0; i < devices.size(); i++) {
cout << devices[i] << endl;
}
// Цикл range-based for
for (const auto& dev : devices) {
cout << dev << endl;
}
// Цикл while
while (connected) {
// обработка
}
// Оператор switch
switch (choice) {
case 1: process(); break;
case 2: configure(); break;
default: cout << "Неизвестная команда" << endl;
}Массивы и строки
Структурированная привязка (C++17)
Задание для выполнения
Разработать консольное приложение для работы с информацией о сетевых подключениях. Программа должна предоставлять текстовое меню, обрабатывать пользовательский ввод и выполнять вычисления с использованием базовых конструкций языка C++.
Требования к программе
Создать проект C++ в Qt Creator с использованием CMake.
Определить структуру данных для хранения информации о сетевом подключении:
- IP-адрес (строка)
- порт (целое число)
- протокол (строка: TCP/UDP)
- статус подключения (логическое значение)
Реализовать функции:
void addConnection(vector<...>& list)— ввод данных о подключении с клавиатуры и добавление в списокvoid showConnections(const vector<...>& list)— вывод всех подключений в табличном видеvoid findConnection(const vector<...>& list)— поиск по IP-адресу (вывод порта, протокола, статуса)void calculateSubnet(const string& ip, const string& mask)— вычисление адреса подсети и широковещательного адресаvoid validatePort(int port)— проверка корректности номера порта (1–65535, вывод: системный/пользовательский/динамический)
Реализовать текстовое меню:
1. Добавить подключение 2. Показать все подключения 3. Найти подключение по IP 4. Вычислить адрес подсети 5. Проверить номер порта 0. ВыходИспользовать
vector,string, управляющие конструкции (if/else,for,while,switch), преобразование типов.
Пример вычисления адреса подсети
Для IP 192.168.1.100 и маски 255.255.255.0: - Разбить IP и маску на октеты, преобразовать в целые числа - Побитовое И: адрес подсети = 192.168.1.0 - Инвертировать маску, побитовое ИЛИ с IP: широковещательный = 192.168.1.255
Пример ожидаемого вывода
=== Сетевые подключения ===
| # | IP-адрес | Порт | Протокол | Статус |
|---|----------------|------|----------|---------|
| 1 | 192.168.1.1 | 8080 | TCP | Подключен |
| 2 | 10.0.0.1 | 53 | UDP | Отключен |
| 3 | 172.16.0.100 | 443 | TCP | Подключен |
Всего: 3
Вычисление подсети:
IP: 192.168.1.100, Маска: 255.255.255.0
Адрес подсети: 192.168.1.0
Широковещательный: 192.168.1.255
Проверка порта:
Порт 8080: пользовательский (1024–49151)
Порт 80: системный (0–1023)
Порт 50000: динамический (49152–65535)
Индивидуальные задания
В каждом варианте необходимо разработать консольное приложение с текстовым меню, использующее vector, string, управляющие конструкции (if/else, for, while, switch), преобразование типов и базовые операции с массивами и строками.
Вариант 1. Учёт сетевых интерфейсов
Структура: имя интерфейса (eth0/wlan0/…), MAC-адрес, IP-адрес, скорость (Мбит/с), статус (up/down).
| Пункт меню | Функция |
|---|---|
| 1. Добавить интерфейс | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по имени | Поиск интерфейса, вывод MAC, IP, скорости |
| 4. Активные интерфейсы | Вывод только интерфейсов со статусом up |
| 5. Общая пропускная способность | Сумма скоростей всех активных интерфейсов |
| 0. Выход | Завершение программы |
Вариант 2. Конвертер единиц передачи данных
Структура: название подключения, скорость (в Мбит/с), тип (Ethernet/Wi-Fi/Оптоволокно).
| Пункт меню | Функция |
|---|---|
| 1. Добавить подключение | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Мбит/с → КБ/с | Перевод скорости: Мбит/с × 1000 / 8 |
| 4. Время загрузки файла | Ввод размера файла (МБ) и скорости → время в секундах |
| 5. Сравнение скоростей | Ввод двух скоростей → какая выше и на сколько % |
| 0. Выход | Завершение программы |
Вариант 3. Учёт пользователей чата
Структура: логин, IP-адрес, время подключения (минуты), статус (в сети/не в сети).
| Пункт меню | Функция |
|---|---|
| 1. Добавить пользователя | Ввод данных, добавление в vector |
| 2. Показать всех | Табличный вывод всех записей |
| 3. Поиск по логину | Поиск пользователя, вывод IP и времени |
| 4. Время в формате ЧЧ:ММ | Ввод минут → часы и минуты |
| 5. Статистика | Общее количество, количество онлайн, среднее время |
| 0. Выход | Завершение программы |
Вариант 4. Журнал запросов DNS
Структура: доменное имя, IP-адрес, тип записи (A/AAAA/CNAME), время отклика (мс).
| Пункт меню | Функция |
|---|---|
| 1. Добавить запись | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по домену | Поиск записей, вывод IP и типа |
| 4. Среднее время отклика | Вычисление среднего значения по всем записям |
| 5. Фильтр по типу | Ввод типа записи → вывод только записей этого типа |
| 0. Выход | Завершение программы |
Вариант 5. Таблица маршрутизации
Структура: адрес сети, маска подсети, шлюз, интерфейс, метрика.
| Пункт меню | Функция |
|---|---|
| 1. Добавить маршрут | Ввод данных, добавление в vector |
| 2. Показать таблицу | Табличный вывод всех записей |
| 3. Поиск по сети | Поиск маршрута, вывод шлюза и интерфейса |
| 4. Вычисление подсети | Ввод адреса и маски → адрес подсети |
| 5. Минимальная метрика | Вывод маршрута с наименьшей метрикой |
| 0. Выход | Завершение программы |
Вариант 6. Биллинг интернет-трафика
Структура: IP-адрес, объём трафика (МБ), стоимость за МБ, дата (строка).
| Пункт меню | Функция |
|---|---|
| 1. Добавить запись | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Стоимость трафика IP | Поиск по IP → объём × стоимость |
| 4. Общая стоимость | Сумма по всем записям |
| 5. Топ-3 по объёму | Сортировка и вывод 3 записей с наибольшим трафиком |
| 0. Выход | Завершение программы |
Вариант 7. Сканер открытых портов (имитация)
Структура: IP-адрес, номер порта, статус (открыт/закрыт/фильтруется), сервис (SSH/HTTP/FTP/…).
| Пункт меню | Функция |
|---|---|
| 1. Добавить результат | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Открытые порты IP | Поиск по IP → только открытые порты |
| 4. Статистика портов | Количество открытых, закрытых, фильтруемых |
| 5. Известные порты | Ввод номера → вывод названия сервиса (80→HTTP, 22→SSH, 21→FTP, 53→DNS, 443→HTTPS, 25→SMTP) |
| 0. Выход | Завершение программы |
Вариант 8. Мониторинг серверов
Структура: имя сервера, IP-адрес, загрузка CPU (%), использование RAM (%), статус (online/offline).
| Пункт меню | Функция |
|---|---|
| 1. Добавить сервер | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по имени | Поиск сервера, вывод всех параметров |
| 4. Средняя загрузка | Средний CPU и RAM по всем серверам |
| 5. Критические серверы | Вывод серверов с CPU > 80% или RAM > 80% |
| 0. Выход | Завершение программы |
Вариант 9. Лог-файл HTTP-запросов
Структура: IP-адрес клиента, метод запроса (GET/POST/PUT/DELETE), URL, код ответа (200/404/500/…), размер ответа (байт).
| Пункт меню | Функция |
|---|---|
| 1. Добавить запись | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Фильтр по коду | Ввод кода → вывод записей с этим кодом |
| 4. Статистика кодов | Количество записей для каждого кода ответа |
| 5. Общий объём данных | Сумма размеров ответов по всем записям |
| 0. Выход | Завершение программы |
Вариант 10. Адресная книга протоколов
Структура: название протокола, номер порта, транспорт (TCP/UDP), описание (строка).
| Пункт меню | Функция |
|---|---|
| 1. Добавить протокол | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по порту | Поиск протокола по номеру порта |
| 4. Фильтр по транспорту | Ввод TCP/UDP → только записи этого транспорта |
| 5. Сортировка по порту | Вывод всех записей, отсортированных по номеру порта |
| 0. Выход | Завершение программы |
Вариант 11. Справочник сетевых подключений
Структура: IP-адрес, порт, протокол (TCP/UDP), статус (подключён/отключён).
| Пункт меню | Функция |
|---|---|
| 1. Добавить подключение | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по IP | Поиск записи, вывод порта и протокола |
| 4. Адрес подсети | Ввод IP и маски → подсеть и broadcast |
| 5. Категория порта | Ввод порта → системный / пользовательский / динамический |
| 0. Выход | Завершение программы |
Вариант 12. База данных Wi-Fi сетей
Структура: SSID, BSSID (MAC), канал, уровень сигнала (дБм), безопасность (WPA2/WPA3/Open).
| Пункт меню | Функция |
|---|---|
| 1. Добавить сеть | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по SSID | Поиск сети, вывод канала и безопасности |
| 4. Сети по уровню сигнала | Сортировка по убыванию уровня сигнала |
| 5. Фильтр по безопасности | Ввод типа → только сети с этой защитой |
| 0. Выход | Завершение программы |
Вариант 13. Учёт DHCP-аренд
Структура: MAC-адрес клиента, IP-адрес, время начала аренды (часы), длительность аренды (часы), статус (активна/истекла).
| Пункт меню | Функция |
|---|---|
| 1. Добавить аренду | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по MAC | Поиск аренды, вывод IP и оставшегося времени |
| 4. Активные аренды | Вывод только записей со статусом «активна» |
| 5. Количество свободных IP | Ввод начального IP, размера пула, вычисление свободных адресов |
| 0. Выход | Завершение программы |
Вариант 14. Статистика пакетов
Структура: IP-источник, IP-назначение, протокол, размер пакета (байт), временная метка (строка).
| Пункт меню | Функция |
|---|---|
| 1. Добавить пакет | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Пакеты от IP | Поиск по IP-источнику |
| 4. Статистика по протоколу | Количество пакетов и общий объём для каждого протокола |
| 5. Средний размер пакета | Вычисление среднего размера по всем записям |
| 0. Выход | Завершение программы |
Вариант 15. Конвертер адресов
Структура: IP-адрес, маска подсети, префикс (число 0–32).
| Пункт меню | Функция |
|---|---|
| 1. Добавить запись | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Префикс → маска | Ввод числа (0–32) → десятичная маска подсети (например, 24 → 255.255.255.0) |
| 4. Маска → префикс | Ввод маски → число префикса |
| 5. Количество хостов | Ввод префикса → максимальное количество хостов в подсети |
| 0. Выход | Завершение программы |
Вариант 16. Журнал подключений VPN
Структура: имя пользователя, IP-адрес, сервер подключения, длительность сеанса (минуты), объём трафика (МБ).
| Пункт меню | Функция |
|---|---|
| 1. Добавить запись | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по пользователю | Поиск записей, вывод серверов и длительности |
| 4. Общий трафик пользователя | Сумма трафика по всем сеансам пользователя |
| 5. Самый длительный сеанс | Вывод записи с максимальной длительностью |
| 0. Выход | Завершение программы |
Вариант 17. Реестр IoT-устройств
Структура: ID устройства, тип (датчик/камера/лампа/…), IP-адрес, состояние (online/offline), значение (строка).
| Пункт меню | Функция |
|---|---|
| 1. Добавить устройство | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по типу | Ввод типа → все устройства этого типа |
| 4. Устройства онлайн | Вывод только устройств со статусом online |
| 5. Количество по типам | Подсчёт устройств каждого типа |
| 0. Выход | Завершение программы |
Вариант 18. Таблица контейнеров Docker
Структура: имя контейнера, образ, порт, статус (running/stopped), объём памяти (МБ).
| Пункт меню | Функция |
|---|---|
| 1. Добавить контейнер | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по образу | Все контейнеры с указанным образом |
| 4. Контейнеры по статусу | Фильтр: running или stopped |
| 5. Общая память | Суммарный объём памяти всех запущенных контейнеров |
| 0. Выход | Завершение программы |
Вариант 19. База почтовых ящиков
Структура: адрес почты, POP3-сервер, порт POP3, SMTP-сервер, порт SMTP.
| Пункт меню | Функция |
|---|---|
| 1. Добавить ящик | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по адресу | Поиск ящика, вывод серверов и портов |
| 4. Проверка портов | Проверка: POP3-порт = 110/995, SMTP-порт = 25/587/465 |
| 5. Ящики на сервере | Ввод имени SMTP-сервера → все ящики на этом сервере |
| 0. Выход | Завершение программы |
Вариант 20. Учёт firewall-правил
Структура: номер правила, IP-адрес источника, IP-адрес назначения, порт, действие (ALLOW/DENY), протокол (TCP/UDP/ANY).
| Пункт меню | Функция |
|---|---|
| 1. Добавить правило | Ввод данных, добавление в vector |
| 2. Показать все | Табличный вывод всех записей |
| 3. Поиск по IP | Все правила, где IP встречается как источник или назначение |
| 4. Статистика действий | Количество ALLOW и DENY правил |
| 5. Правила для порта | Ввод порта → все правила, связанные с этим портом |
| 0. Выход | Завершение программы |
Порядок выполнения
- Запустить Qt Creator, создать проект: File → New → Non-Qt Project → Plain C++ Application, выбрать CMake.
- В файле
main.cppподключить необходимые заголовочные файлы:<iostream>,<string>,<vector>,<sstream>. - Определить структуру
Connectionи реализовать все требуемые функции. - Реализовать главное меню в функции
main()с использованием циклаwhileи оператораswitch. - Протестировать все пункты меню: добавить минимум 3 подключения, вывести список, выполнить поиск, вычислить подсеть, проверить порты.
- Убедиться в корректной работе преобразования типов при вводе порта и разборе IP-адресов.
- Скомпилировать и запустить программу, сохранить скриншоты результатов.
Контрольные вопросы
- Какие базовые типы данных языка C++ вы использовали в программе?
- Чем отличается
intотunsigned int? Какие типы целых чисел существуют в C++? - Что такое автоматический вывод типа (
auto)? В каких случаях его следует использовать? - Чем отличается
static_cast<double>(7)/2от7/2? - Какие виды циклов существуют в C++? В каких случаях предпочтительнее использовать range-based
for? - Как работает оператор
switch? Почему необходимbreakв каждомcase? - Чем отличается
vectorот обычного массива? Какие преимущества он предоставляет? - Какие методы класса
stringвы использовали? Опишите их назначение. - Что такое структурированная привязка (structured binding) и когда она применяется?
Содержание отчёта
- Тема, цель и задание лабораторной работы.
- Структура проекта (скриншот дерева файлов в Qt Creator).
- Текст программы (
main.cpp) с комментариями. - Скриншоты результата выполнения программы (демонстрация всех пунктов меню).
- Ответы на контрольные вопросы.
