NickAndNick

База данных книги (простая)

Sep 17th, 2020
1,122
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <regex>
  5. #include <algorithm>
  6. #include <map>
  7. using namespace std;
  8. struct Book {
  9.     string name;
  10.     string genre;
  11.     unsigned rating;
  12.     string tostr(const string& delim = " "s) {
  13.         return name + delim + genre + delim + to_string(rating);
  14.     }
  15. };
  16. class Books {
  17. public:
  18.     Books(const Books&) = delete;
  19.     Books(Books&&) = delete;
  20.     Books& operator=(const Books&) = delete;
  21.     Books& operator=(Books&&) = delete;
  22.     Books() : buffer_(16U), count_(0U), books_(new Book[buffer_]) {}
  23.     ~Books() {
  24.         read_db_.is_open() ? read_db_.close() : void();
  25.         this->save(db_path_);
  26.         if (books_ != nullptr) {
  27.             delete[] books_;
  28.             books_ = nullptr;
  29.         }
  30.     }
  31.     Book operator[](int index)const { return books_[index]; }
  32.     void add(const Book& book) {
  33.         if (count_ == buffer_) {
  34.             auto books = new Book[buffer_ << 1U];
  35.             for (auto i = 0U; i < count_; ++i) books[i] = books_[i];
  36.             delete[] books_;
  37.             books_ = books;
  38.         }
  39.         books_[count_] = book;
  40.         ++count_;
  41.     }
  42.     bool load(const string& db_path) {
  43.         read_db_.open(db_path);
  44.         const regex re{ "#" };
  45.         string recording;
  46.         tuple<string, string, int> tmp;
  47.         Book book;
  48.         if (read_db_.is_open()) {
  49.             this->clear_();
  50.             while (getline(read_db_, recording)) {
  51.                 regex_token_iterator iter{ recording.begin(), recording.end(), re, -1 };
  52.                 book.name = iter->str();
  53.                 book.genre = (++iter)->str();
  54.                 book.rating = stoul((++iter)->str());
  55.                 this->add(book);
  56.             }
  57.             read_db_.close();
  58.             db_path_ = db_path;
  59.             return true;
  60.         }
  61.         return false;
  62.     }
  63.     void save(const string& db_path = ""s) {
  64.         db_path_ = db_path.empty() ? db_path_ : db_path;
  65.         write_db_.open(db_path_);
  66.         if (write_db_.is_open()) {
  67.             for (auto i = 0U; i < count_; ++i) write_db_ << books_[i].tostr("#"s) << '\n';
  68.             write_db_.close();
  69.             puts("Данные успешно сохранены!");
  70.         } else {
  71.             puts("Программе не удалось сохранить данные!");
  72.         }
  73.     }
  74.     void show() {
  75.         auto id = 0U;
  76.         for (auto i = 0U; i < count_; ++i) cout << ++id << ". " << books_[i].tostr("; "s) << '\n';
  77.     }
  78.     map<unsigned, string, greater<>> interest() {
  79.         map<string, unsigned> box;
  80.         for (auto i = 0U; i < count_; ++i) {
  81.             auto [genre, rating] = make_pair(books_[i].genre, books_[i].rating);
  82.             box[genre] += rating;
  83.         }
  84.         map<unsigned, string, greater<>> reverse;
  85.         for (const auto& [key, value] : box) reverse[value] = key;
  86.         return reverse;
  87.     }
  88. private:
  89.     size_t buffer_;
  90.     size_t count_;
  91.     Book* books_;
  92.     string db_path_;
  93.     ifstream read_db_;
  94.     ofstream write_db_;
  95.     void clear_() {
  96.         count_ = 0;
  97.     }
  98. };
  99. int main() {
  100.     system("chcp 1251 > nul");
  101.     Books books;
  102.     books.add({ "«Гроза», А. Н. Островского", "трагедия", 25 });
  103.     books.add({ "«Идеалы» Ф фон Шиллер", "элегия", 11 });
  104.     books.add({ "«Король забавляется», В. М. Гюго", "драма", 42 });
  105.     books.add({ "«Понедельник начинается в субботу», А. и Б. Стругацкие", "комедия", 49 });
  106.     books.add({ "«Василий Тёркин», А. Твардовский", "поэма", 65 });
  107.     books.add({ "«Преступление и наказание», Ф. М. Достоевский", "роман", 51 });
  108.     books.add({ "«Как важно быть серьезным», О. Уальд", "комедия", 58 });
  109.     books.add({ "«Божественная комедия», А. Данте", "поэма", 27 });
  110.     books.add({ "«Гамлет», У. Шекспир", "трагедия", 56 });
  111.     books.add({ "«Юлия, или Новая Элоиза», Ж.-Ж. Руссо", "роман", 17 });
  112.     const auto db_path = "books_db.txt"s;
  113.     books.save(db_path);
  114.     books.load(db_path);
  115.     puts("\n\tБаза данных КНИГИ\n");
  116.     books.show();
  117.     puts("\n\tЖанровый рейтинг\n");
  118.     auto interest = books.interest();
  119.     for (const auto& [rating, genre] : interest) cout << genre << " = " << rating << '\n';
  120.     system("pause > nul");
  121. }
RAW Paste Data