Advertisement
baadgeorge

Untitled

Oct 20th, 2021
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.52 KB | None | 0 0
  1. // Реализация класса аэропорта для хранения
  2. // информации о рейсах в бинарном файле
  3. // Автор: Ляпин Г. А.
  4. // IP Lyapin GA & Co, 2019 - 2021
  5. // © All Rights Reserved.
  6.  
  7. #include <iostream>         // Потоковый ввод-вывод в строку
  8. #include <fstream>          // Потоковый ввод-вывод в файл
  9. #include <string>           // Строка (для хранения переменных)
  10. #include <vector>           // Вектор (массив)
  11. #include <unordered_map>    // Хэш-таблица
  12. #include <iomanip>
  13.  
  14. using namespace std;        // Для удобства
  15.  
  16. const int m = 100;          // Магическая константа для хэш-функции
  17.  
  18. // Класс с хэш-функцией
  19. // (передаем в unordered_map)
  20. class HashFunction {
  21. public:
  22.     // Эта перегрузка оператора необходима для unordered_map
  23.     int operator()(const int& FlightNumber) const
  24.     {
  25.         // По условию. Магическая константа выше
  26.         return FlightNumber / m;
  27.     }
  28. };
  29.  
  30. // Структура, реализующая хранение информации о рейсе
  31. // Number       - целое число, номер рейса
  32. // Destination  - строка, название пункта назначения рейса
  33. // AircraftType - строка, тип самолета
  34. struct Flight {
  35.  
  36.     int Number;             // Целое число, номер рейса
  37.     string Destination;     // Строка, название пункта назначения рейса
  38.     string AircraftType;    // Строка, тип самолета
  39.  
  40.     // Дефолтный конструктор без параметров
  41.     Flight() :
  42.         Number(0),
  43.         Destination(""),
  44.         AircraftType("")
  45.     {
  46.         //cout << "\tFlight Default Constructor\n";
  47.     }
  48.     // Конструктор с инициализацией по параметрам
  49.     Flight(const int& _Number, const string& _Destination, const string& _AircraftType) :
  50.         Number(_Number),
  51.         Destination(_Destination),
  52.         AircraftType(_AircraftType)
  53.     {
  54.         //cout << "\tFlight Parameter Constructor\n";
  55.     }
  56.     // Конструктор копирования
  57.     Flight(const Flight& other) :
  58.         Number(other.Number),
  59.         Destination(other.Destination),
  60.         AircraftType(other.AircraftType)
  61.     {
  62.         //cout << "\tFlight Copy Constructor\n";
  63.     }
  64.     // Деструктор
  65.     ~Flight()
  66.     {
  67.         //cout << "\tFlight Destructor\n";
  68.     }
  69.     // Оператор присваивания
  70.     Flight& operator=(const Flight& other)
  71.     {
  72.         Number = other.Number;
  73.         Destination = other.Destination;
  74.         AircraftType = other.AircraftType;
  75.  
  76.         return *this;
  77.     }
  78.  
  79. };
  80.  
  81. // Класс, реализующий аэропорт
  82. // FlightsInfo  - строка, содержит название бинарного файла, в котором хранится информация о рейсах
  83. // Hashtable    - хэш-таблица, из которой по ключу ищем номер записи с рейсом в бинарном файле
  84. class Airport {
  85. public:
  86.     // Дефолтный конструктор без параметров
  87.     Airport() :
  88.         FlightsInfo("info.bin")
  89.     {}
  90.     // Конструктор с инициализацией по параметрам
  91.     Airport(const string& file) :
  92.         FlightsInfo(file)
  93.     {}
  94.     // Деструктор
  95.     ~Airport()
  96.     {
  97.         // Очистка хэш-таблицы
  98.         HashTable.clear();
  99.     }
  100.     // Метод, реализующий запись рейса в конец бинарного файла
  101.     void PrintFlightToBinFile(const Flight& flight)
  102.     {
  103.         // Открытие бинарного файла с именем FlightsInfo в режиме добавления данных к уже имеющимся
  104.         ofstream output(FlightsInfo, ios::binary | ios_base::app);
  105.         // Запись в бинарный файл
  106.         output << flight.Number << '\n'
  107.             << flight.Destination << '\n'
  108.             << flight.AircraftType << '\n';
  109.     }
  110.     // Метод, реализующий чтение по номеру рейса соответствующей записи из бинарного файла
  111.     Flight GetFlightFromBinFile(const int& number)
  112.     {
  113.         int index;
  114.         //проверка на наличие ключа в хэш-таблице
  115.         if (HashTable.find(number) != HashTable.end()){
  116.             // Получаем номер записи из хэш-таблицы
  117.             index = HashTable[number];
  118.         }
  119.         else {
  120.             Flight* flight = new Flight(-1, "none", "none");
  121.             return *flight;
  122.         }
  123.        
  124.         // Открытие бинарного файла с именем FlightsInfo в режиме чтения
  125.         ifstream input(FlightsInfo, ios::binary);
  126.         // Пропуск записей до нужной
  127.         for (int i = 0; i < index; ++i) {
  128.             string tempString;
  129.             input >> tempString >> tempString >> tempString;
  130.         }
  131.  
  132.         // NUMBER 00 STR1SIZE 00 STR1 00 STR2SIZE 00 STR2 00 ...
  133.  
  134.         // Чтение информации о рейсе из бинарного файла
  135.         int _Number = 0;
  136.         string _Destination = "";
  137.         string _AircraftType = "";
  138.         input >> _Number >> _Destination >> _AircraftType;
  139.         // Выделение памяти в куче под новую запись
  140.         Flight* flight = new Flight(_Number, _Destination, _AircraftType);
  141.         return *flight;
  142.     }
  143.  
  144.     //// Метод, реализующий вывод на экран информации о всех рейсах
  145.     void PrintAllFlights()
  146.     {
  147.         int size = HashTable.size(); // количество записей в хэш-таблице
  148.        
  149.         // проверка хэш-таблицы на пустоту
  150.         if (size == 0)
  151.         {
  152.             cout << "No flights in the hash table" << endl;
  153.             return;
  154.         }
  155.  
  156.         // Открытие бинарного файла с именем FlightsInfo в режиме чтения
  157.         ifstream input(FlightsInfo, ios::binary);
  158.  
  159.         int Number = 0;
  160.         string Destination = "";
  161.         string AircraftType = "";
  162.  
  163.         cout << "Flight list:\n\n";
  164.  
  165.         // форматированный вывод на экран иформации о рейсе
  166.         for (int i = 0; i < size; ++i) {
  167.            
  168.             input >> Number >> Destination >> AircraftType;
  169.  
  170.             cout << setw(4) << Number << " " << setw(14) << Destination << " " << setw(14) << AircraftType << endl;
  171.         }
  172.  
  173.         return;
  174.     }
  175.  
  176.     // Оператор [] для удобства обращения за записью к аэропорту. По сути является оберткой
  177.     Flight operator[](int number) {
  178.         return GetFlightFromBinFile(number);
  179.     }
  180.     // Объявляем перегрузку оператора >> для ввода данных из текстового файла в аэропорт
  181.     // friend-ом. Необходимо для обращения к хэш-таблице
  182.     friend ifstream& operator>>(ifstream& stream, Airport& airport);
  183.  
  184. private:
  185.     // Хэш-таблица. Первый параметр - тип ключа (Key)
  186.     // Второй параметр - данные, хранящиеся в хэш-таблице (Value)
  187.     // HashTable - класс, реализующий хэш-функцию
  188.     unordered_map<int, int, HashFunction> HashTable;
  189.     string FlightsInfo;     // Строка, содержит название бинарного файла, в котором хранится информация о рейсах
  190. };
  191.  
  192. // Перегрузка оператора >> для ввода данных из текстового файла в аэропорт
  193. ifstream& operator>>(ifstream& stream, Airport& airport)
  194. {
  195.     // Вектор (массив) рейсов
  196.     vector<Flight> flights;
  197.  
  198.     // Инициализация переменных для чтения данных рейсов
  199.     int number = 0;
  200.     string destination = "";
  201.     string aircraftType = "";
  202.     // Чтение данных о рейсах из файлового потока
  203.     while (stream >> number
  204.         >> destination
  205.         >> aircraftType)
  206.     {
  207.         // Запись рейса в массив
  208.         flights.push_back(Flight(number, destination, aircraftType));
  209.     }
  210.  
  211.     // Для каждого рейса из массива
  212.     for (int i = 0; i < flights.size(); ++i) {
  213.         // Создание соответствующей записи в хэш-таблице
  214.         airport.HashTable[flights[i].Number] = i;
  215.         // Запись рейса в бинарный файл
  216.         airport.PrintFlightToBinFile(flights[i]);
  217.     }
  218.  
  219.     // Очистка массива с рейсами
  220.     flights.clear();
  221.  
  222.     return stream;
  223. }
  224.  
  225.  
  226. // Точка входа в программу
  227. int main()
  228. {
  229.     // Файл с рейсами
  230.     ifstream input;
  231.     input.open("input.txt");
  232.  
  233.     // Удаление бинарного файла
  234.     remove("myAirport.bin");
  235.  
  236.     // Создание аэропорта с указанием имени бинарного файла для хранения данных
  237.     Airport myAirport("myAirport.bin");
  238.  
  239.     // Записываем данные о рейсах в аэропорт
  240.     input >> myAirport;
  241.  
  242.     // вывод на экран информации о всех рейсах
  243.     myAirport.PrintAllFlights();
  244.  
  245.     int number; // номер рейса для запроса
  246.    
  247.     cout << "\nEnter the number of flight: ";
  248.     cin >> number;
  249.    
  250.     // Пример получения записи
  251.     Flight myFlight = myAirport[number];//or Flight myFlight = myAirport.GetFlightFromBinFile(...);
  252.  
  253.     // Вывод записи в консоль
  254.     cout << myFlight.Number << " ------ "
  255.         << myFlight.Destination << " ------ "
  256.         << myFlight.AircraftType << "\n\n";
  257.  
  258.     system("pause");
  259.     return 0;
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement