Advertisement
NickAndNick

Каталог журналов

Mar 7th, 2022
874
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <fstream>
  5. #include <string>
  6. #include <unordered_map>
  7.  
  8. using namespace std;
  9.  
  10. template<typename T>
  11. T integer(const char* msg = ">>> ") {
  12.     cout << msg;
  13.     unsigned value;
  14.     cin >> value;
  15.     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  16.     return static_cast<T>(value);
  17. }
  18.  
  19. class Cataloge {
  20. public:
  21.     explicit Cataloge(const string& path) : path(path) {
  22.         load();
  23.     }
  24.     ~Cataloge() {
  25.         save();
  26.     }
  27.     void load() {
  28.         ifstream inp{ path };
  29.         if (inp.is_open()) {
  30.             string key;
  31.             short value;
  32.             while (inp >> key >> value) {
  33.                 replace(key.begin(), key.end(), '_', ' ');
  34.                 box.insert({ key, value });
  35.             }
  36.             inp.close();
  37.             if (box.empty()) {
  38.                 puts("Каталог найден, но не содержит записей!");
  39.             }
  40.         } else {
  41.             puts("Путь к файлу каталога не найден!\nПрограмма создала пустой каталог.");
  42.         }
  43.     }
  44.     void save() {
  45.         ofstream out{ path };
  46.         if (out.is_open()) {
  47.             for (auto& [key, value] : box) {
  48.                 auto tmp = key;
  49.                 replace(tmp.begin(), tmp.end(), ' ', '_');
  50.                 out << tmp << ' ' << value << '\n';
  51.             }
  52.             out.close();
  53.         } else {
  54.             puts("Программе не удалось сохранить данные!");
  55.         }
  56.     }
  57.     void show()const {
  58.         auto lambda = [](const pair<string, short>& a, const pair<string, short>& b) {
  59.             return a.first.length() < b.first.length();
  60.         };
  61.         auto width = max_element(box.begin(), box.end(), lambda)->first.length() + 1U;
  62.         for (const auto& [key, value] : box) {
  63.             cout << left << setw(width) << key << ' ' << value << '\n';
  64.         }
  65.     }
  66.     void oldest() {
  67.         auto lambda = [](const pair<string, short>& a, const pair<string, short>& b) {
  68.             return a.second < b.second;
  69.         };
  70.         auto old = min_element(box.begin(), box.end(), lambda);
  71.         cout << old->first << ' ' << old->second << '\n';
  72.     }
  73.     void add_record(pair<string, short>&& rec) {
  74.         box.insert(box.end(), rec);
  75.     }
  76.     void erase_record(size_t&& pos) {
  77.         auto n = 0U;
  78.         for (auto it = box.begin(); it != box.end(); ++it) {
  79.             if (++n == pos) {
  80.                 box.erase(it);
  81.                 break;
  82.             }
  83.         }
  84.     }
  85. private:
  86.     string path;
  87.     unordered_multimap<string, short> box;
  88. };
  89.  
  90. class UI {
  91. public:
  92.     int run(Cataloge& cat) {
  93.         auto repeat = true;
  94.         do {
  95.             puts("\tВыбор действия:");
  96.             for (const auto& msg : messages) cout << msg << '\n';
  97.             switch (integer<Menu>()) {
  98.                 case Menu::Load: cat.load(); break;
  99.                 case Menu::Show: cat.show(); break;
  100.                 case Menu::Oldest: cat.oldest(); break;
  101.                 case Menu::Add: cat.add_record(record()); break;
  102.                 case Menu::Erase: cat.erase_record(position()); break;
  103.                 case Menu::Save: cat.save(); break;
  104.                 case Menu::Exit: repeat = false; break;
  105.                 default: puts("Неверный выбор!");
  106.             }
  107.             puts("");
  108.         } while (repeat);
  109.         return 0;
  110.     }
  111. private:
  112.     enum class Menu {
  113.         Load = 1, Show, Oldest, Add, Erase, Save, Exit
  114.     };
  115.     inline static const char* messages[]{
  116.         "1. Загрузка данных из файла",
  117.         "2. Вывод данных в виде таблицы",
  118.         "3. Вывод самого первого журнала по дате",
  119.         "4. Добавить запись",
  120.         "5. Удаление записи по её номеру",
  121.         "6. Сохранение данных в файл",
  122.         "7. Выход из программы",
  123.     };
  124.     pair<string, short> record() {
  125.         pair<string, short> rec;
  126.         cout << "Введите название журнала: ";
  127.         getline(cin, rec.first);
  128.         rec.second = integer<short>("Введите год издания: ");
  129.         return rec;
  130.     }
  131.     size_t position() {
  132.         return integer<size_t>("Введите номер удаляемой записи: ");
  133.     }
  134. };
  135.  
  136. int main() {
  137.     system("chcp 1251 > nul");
  138.     string path{ "D:\\magazine.txt" };
  139.     Cataloge cat{ path };
  140.     UI ui;
  141.     return ui.run(cat);
  142. }
Advertisement
RAW Paste Data Copied
Advertisement