1 Основной раздел
Во время работы программы пользователь вводит код видеокассеты для поиска непротиворечащим условиям (0<n<=50).Дальше код работает следующим образом:
Запрос кода:
Программа запрашивает у пользователя ввод кода видеокассеты, которую он хочет найти. Пользователь вводит значение, которое будет использоваться для поиска.
Валидация ввода:
Программа проверяет, корректно ли введён код видеокассеты. Это может включать проверки на допустимый диапазон значений и на то, что пользователь ввёл действительно число, если это необходимо.
Инициализация бинарного поиска:
Запускается бинарный поиск, который подходит, так как массив видеокассет уже отсортирован по коду. Бинарный поиск эффективен для отсортированных массивов, поскольку он позволяет значительно сократить количество необходимых сравнений.
Определение границ поиска:
Устанавливаются начальные границы для поиска;
left обозначает начало массива (индекс первого элемента);
right обозначает конец массива (индекс последнего элемента).
Цикл поиска:
Внутри цикла выполняются следующие шаги, пока границы поиска не пересекутся;
Вычисляется середина текущего диапазона (mid), основанная на текущих значениях left и right;
Код видеокассеты, расположенной в середине массива, сравнивается с вводимым пользователем кодом;
Если коды совпадают, это означает, что видеокассета найдена, и программа возвращает индекс, на котором она находится;
Если код в середине меньше искомого, это указывает на то, что видеокассета с таким кодом может находиться только в правой половине массива. Таким образом, граница left смещается вправо (в mid + 1);
Если код в середине больше, то видеокассету следует искать в левой половине массива, и граница right смещается влево (в mid - 1).
Завершение поиска:
Если в процессе поиска найден соответствующий код, программа предоставляет пользователю информацию о найденной видеокассете (например, её название, режиссёра и год выпуска);
Если границы пересеклись и соответствующий код не найден, программа сообщает пользователю, что видеокассета с таким кодом отсутствует.
Вывод результата:
После завершения алгоритма поиска результаты выводятся в консоль: информация о найденной видеокассете или уведомление о том, что видеокассеты с данным кодом не существует.
После завершения программа вывод найдена ли видеокассета, данные записаны в двоичный файл и вывод данных из него, программа заканчивает работу.
2 Блок–схема алгоритма
Представим описание алгоритма в графическом виде на рисунке 2.1.
Рисунок 2.1 – Блок-схема алгоритма программы
Продолжение описание алгоритмов в графическом виде на рисунке 2.2
Рисунок 2.2 – Блок-схема алгоритма программы
3 Исходный код
Программная реализация алгоритма для решения задачи представлена ниже.
Листинг 3.1 – Процедура выполнение кода по поставленной задачи
#include <iostream> #include <fstream> #include <string> #include <algorithm> // Для std::sort
const int MAX_TAPES = 50;
struct VideoTape { int code; // Код видеокассеты std::string title; // Название фильма std::string director; // Режиссер int year; // Год выпуска };
// Функция для чтения данных из текстового файла void readFromFile(const char* filename, VideoTape tapes[], int& n) { std::ifstream fin(filename); n = 0;
while (n < MAX_TAPES && fin >> tapes[n].code) { fin.ignore(); // Игнорируем пробел перед названием std::getline(fin, tapes[n].title); // Считываем название фильма std::getline(fin, tapes[n].director); // Считываем имя режиссера
fin >> tapes[n].year; // Считываем год выпуска fin.ignore(); // Игнорируем пробел/новую строку перед след. строкой
n++; } fin.close(); }
// Функция для сортировки массива по коду видеокассеты void sortTapes(VideoTape tapes[], int n) { std::sort(tapes, tapes + n, [](const VideoTape& a, const VideoTape& b) { return a.code < b.code; });
Продолжение
Листинга
3.1
// Функция для вывода данных о видеокассетах void displayTapes(const VideoTape tapes[], int n) { for (int i = 0; i < n; i++) { std::cout << "Код: " << tapes[i].code << ", Название: " << tapes[i].title << ", Режиссер: " << tapes[i].director << ", Год выпуска: " << tapes[i].year << std::endl; } }
// Бинарный поиск по коду видеокассеты int binarySearch(const VideoTape tapes[], int n, int code) { int left = 0, right = n - 1; while (left <= right) { int mid = left + (right - left) / 2; if (tapes[mid].code == code) return mid; if (tapes[mid].code < code) left = mid + 1; else right = mid - 1; } return -1; // Если элемент не найден }
// Запись данных в двоичный файл void writeToBinaryFile(const char* filename, const VideoTape tapes[], int n) { std::ofstream fout(filename, std::ios::binary); fout.write(reinterpret_cast<const char*>(tapes), sizeof(VideoTape) * n); fout.close(); }
// Чтение данных из двоичного файла void readFromBinaryFile(const char* filename, VideoTape tapes[], int& n) { std::ifstream fin(filename, std::ios::binary); n = 0; while (fin.read(reinterpret_cast<char*>(&tapes[n]), sizeof(VideoTape)) && n < MAX_TAPES) { n++; } fin.close(); }
int main() { VideoTape tapes[MAX_TAPES]; int n = 0;
const char* textFilename = "videotapes.txt"; readFromFile(textFilename, tapes, n);
sortTapes(tapes, n); std::cout << "Отсортированные видеокассеты:" << std::endl; displayTapes(tapes, n);
int searchCode; std::cout << "Введите код видеокассеты для поиска: "; std::cin >> searchCode; int index = binarySearch(tapes, n, searchCode); if (index != -1) { std::cout << "Видеокассета найдена: " << tapes[index].title << std::endl; } else { std::cout << "Видеокассета не найдена." << std::endl; }
const char* binaryFilename = "videotapes.bin"; writeToBinaryFile(binaryFilename, tapes, n); std::cout << "Данные записаны в двоичный файл." << std::endl;
VideoTape readTapes[MAX_TAPES]; int readCount = 0; readFromBinaryFile(binaryFilename, readTapes, readCount); std::cout << "Данные из двоичного файла:" << std::endl; displayTapes(readTapes, readCount); return 0; } |
Продолжение
Листинга
3.1
