Добавил:
Только когда поступишь в технический вуз поймешь на сколько ты гуманитарий Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вариант 18 / ПР-11.docx
Скачиваний:
1
Добавлен:
07.12.2024
Размер:
378.41 Кб
Скачать

1 Основной раздел

Во время работы программы пользователь вводит код видеокассеты для поиска непротиворечащим условиям (0<n<=50).Дальше код работает следующим образом:

  1. Запрос кода:

  • Программа запрашивает у пользователя ввод кода видеокассеты, которую он хочет найти. Пользователь вводит значение, которое будет использоваться для поиска.

  1. Валидация ввода:

  • Программа проверяет, корректно ли введён код видеокассеты. Это может включать проверки на допустимый диапазон значений и на то, что пользователь ввёл действительно число, если это необходимо.

  1. Инициализация бинарного поиска:

  • Запускается бинарный поиск, который подходит, так как массив видеокассет уже отсортирован по коду. Бинарный поиск эффективен для отсортированных массивов, поскольку он позволяет значительно сократить количество необходимых сравнений.

  1. Определение границ поиска:

  • Устанавливаются начальные границы для поиска;

  • left обозначает начало массива (индекс первого элемента);

  • right обозначает конец массива (индекс последнего элемента).

  1. Цикл поиска:

  • Внутри цикла выполняются следующие шаги, пока границы поиска не пересекутся;

  • Вычисляется середина текущего диапазона (mid), основанная на текущих значениях left и right;

  • Код видеокассеты, расположенной в середине массива, сравнивается с вводимым пользователем кодом;

  • Если коды совпадают, это означает, что видеокассета найдена, и программа возвращает индекс, на котором она находится;

  • Если код в середине меньше искомого, это указывает на то, что видеокассета с таким кодом может находиться только в правой половине массива. Таким образом, граница left смещается вправо (в mid + 1);

  • Если код в середине больше, то видеокассету следует искать в левой половине массива, и граница right смещается влево (в mid - 1).

  1. Завершение поиска:

  • Если в процессе поиска найден соответствующий код, программа предоставляет пользователю информацию о найденной видеокассете (например, её название, режиссёра и год выпуска);

  • Если границы пересеклись и соответствующий код не найден, программа сообщает пользователю, что видеокассета с таким кодом отсутствует.

  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

Соседние файлы в папке Вариант 18