Advertisement
xxeell

map_II

Jun 29th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 19.14 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. #include<string>
  4. #include<map>
  5. #include<utility>
  6. #include<vector>
  7. #include<algorithm>
  8. #include<stdlib.h>
  9.  
  10. using namespace std;
  11.  
  12. void clear_screen() { system("CLS"); }
  13. void pause(istream& in)
  14. {
  15.     if(in == cin) system("pause");
  16. }
  17.  
  18. class Exception
  19. {
  20. private:
  21.     string content;
  22. public:
  23.     Exception(string message) : content(message) {}
  24.  
  25.     string Message()
  26.     {
  27.         return content;
  28.     }
  29. };
  30.  
  31. class Book
  32. {
  33. private:
  34.     string name;
  35.     string content;
  36. public:
  37.     Book(string name, string content) : name(name), content(content) {}
  38.  
  39.     string Name()
  40.     {
  41.         return name;
  42.     }
  43.  
  44.     string Text()
  45.     {
  46.         return content;
  47.     }
  48.  
  49.     bool operator== (const Book &b) const
  50.     {
  51.         return content == b.content;
  52.     }
  53.  
  54.     bool operator< (const Book &b) const
  55.     {
  56.         return content < b.content;
  57.     }
  58. };
  59.  
  60. class AuthorBooks
  61. {
  62. private:
  63.     string author;
  64.     map<string, Book> content;
  65. public:
  66.     AuthorBooks(string author) : author(author), content() {}
  67.  
  68.     inline bool HaveBook(string book_name)
  69.     {
  70.         return content.find(book_name) != content.end();
  71.     }
  72.  
  73.     Book GetBook(string book_name)
  74.     {
  75.         map<string, Book>::iterator res = content.find(book_name);
  76.         if(res == content.end()) throw Exception("Have not \"" + book_name + "\" book.");
  77.         return (*res).second;
  78.     }
  79.  
  80.     bool AddBook(string book_name, string book)
  81.     {
  82.         if(HaveBook(book_name)) return false;
  83.         content.insert(pair<string, Book>(book_name, Book(book_name, book)));
  84.         return true;
  85.     }
  86.  
  87.     bool AddBook(Book book)
  88.     {
  89.         if(HaveBook(book.Name())) return false;
  90.         content.insert(pair<string, Book>(book.Name(), book));
  91.         return true;
  92.     }
  93.  
  94.     bool RemoveBook(string book_name)
  95.     {
  96.         map<string, Book>::iterator i = content.find(book_name);
  97.         if(i == content.end()) return false;
  98.         content.erase(i);
  99.         return true;
  100.     }
  101.  
  102.     bool ChangeBook(string book_name, string book)
  103.     {
  104.         if(!RemoveBook(book_name)) return false;
  105.         content.insert(pair<string, Book>(book_name, Book(book_name, book)));
  106.         return true;
  107.     }
  108.  
  109.     bool ChangeBook(string book_name, Book book)
  110.     {
  111.         if(!RemoveBook(book_name)) return false;
  112.         content.insert(pair<string, Book>(book_name, book));
  113.         return true;
  114.     }
  115.  
  116.     vector<string> BooksNames()
  117.     {
  118.         vector<string> res;
  119.  
  120.         for(map<string, Book>::iterator i = content.begin(); i != content.end(); i++)
  121.         {
  122.             res.push_back((*i).first);
  123.         }
  124.  
  125.         return res;
  126.     }
  127.  
  128.     vector<string> FindInName(string word)
  129.     {
  130.         vector<string> res;
  131.  
  132.         for(map<string, Book>::iterator i = content.begin(); i != content.end(); i++)
  133.         {
  134.             if((*i).first.find(" " + word) != (*i).first.npos)
  135.             {
  136.                 res.push_back((*i).first);
  137.                 continue;
  138.             }
  139.  
  140.             if((*i).first.find(word + " ") != (*i).first.npos)
  141.             {
  142.                 res.push_back((*i).first);
  143.                 continue;
  144.             }
  145.  
  146.             if((*i).first == word)
  147.             {
  148.                 res.push_back((*i).first);
  149.                 continue;
  150.             }
  151.         }
  152.  
  153.         return res;
  154.     }
  155.  
  156.     bool operator== (const AuthorBooks &b) const
  157.     {
  158.         return content == b.content;
  159.     }
  160.  
  161.     bool operator< (const AuthorBooks &b) const
  162.     {
  163.         return content < b.content;
  164.     }
  165. };
  166.  
  167. class Author
  168. {
  169. private:
  170.     string name;
  171.     int death_year;
  172. public:
  173.     Author(string name) : name(name), death_year(-1) {}
  174.  
  175.     Author(string name, int year) : name(name), death_year(year) {}
  176.  
  177.     string Name()
  178.     {
  179.         return name;
  180.     }
  181.  
  182.     int Year()
  183.     {
  184.         return death_year;
  185.     }
  186.  
  187.     bool operator== (const Author &b) const
  188.     {
  189.         return name == b.name && death_year == b.death_year;
  190.     }
  191.  
  192.     bool operator< (const Author &b) const
  193.     {
  194.         return (name < b.name) || ((name == b.name) && death_year < b.death_year);
  195.     }
  196.  
  197. };
  198.  
  199. class Library
  200. {
  201. private:
  202.     map<Author, AuthorBooks*> content;
  203.  
  204.     struct check_author
  205.     {
  206.     private:
  207.         string t;
  208.     public:
  209.         check_author(string check_name)
  210.         {
  211.             t = check_name;
  212.         }
  213.  
  214.         bool operator()(pair<Author, AuthorBooks*> a) const
  215.         {
  216.             return a.first.Name() == t;
  217.         }
  218.     };
  219.  
  220. public:
  221.     Library() : content() {}
  222.  
  223.     inline bool HaveAuthor(string author_name)
  224.     {
  225.         return find_if(content.begin(), content.end(), check_author(author_name)) != content.end();
  226.     }
  227.  
  228.     AuthorBooks* GetBooks(string author_name)
  229.     {
  230.         map<Author, AuthorBooks*>::iterator res = find_if(content.begin(), content.end(), check_author(author_name));
  231.         if(res == content.end()) throw Exception("Have not author " + author_name + ".");
  232.         return res->second;
  233.     }
  234.  
  235.     bool AddAuthor(string author_name)
  236.     {
  237.         if(HaveAuthor(author_name)) return false;
  238.         content.insert(pair<Author, AuthorBooks*>(Author(author_name), new AuthorBooks(author_name)));
  239.         return true;
  240.     }
  241.  
  242.     bool UpdateAuthor(string author_name, int year)
  243.     {
  244.         map<Author, AuthorBooks*>::iterator i = find_if(content.begin(), content.end(), check_author(author_name));
  245.         if(i == content.end()) return false;
  246.         AuthorBooks* t = (*i).second;
  247.         content.erase(i);
  248.         content.insert(pair<Author, AuthorBooks*>(Author(author_name, year), t));
  249.         return true;
  250.     }
  251.  
  252.     bool RemoveAuthor(string author_name)
  253.     {
  254.         map<Author, AuthorBooks*>::iterator i = find_if(content.begin(), content.end(), check_author(author_name));
  255.         if(i == content.end()) return false;
  256.         content.erase(i);
  257.         return true;
  258.     }
  259.  
  260.     vector<string> AuthorsNames()
  261.     {
  262.         vector<string> res;
  263.  
  264.         for(map<Author, AuthorBooks*>::iterator i = content.begin(); i != content.end(); i++)
  265.         {
  266.             pair<Author, AuthorBooks*> p = *i;
  267.             res.push_back(p.first.Name());
  268.         }
  269.  
  270.         return res;
  271.     }
  272.  
  273.     map<string, vector<string> > FindAllBooksContain(string word)
  274.     {
  275.         map<string, vector<string> > res;
  276.  
  277.         for(map<Author, AuthorBooks*>::iterator i = content.begin(); i != content.end(); i++)
  278.         {
  279.             pair<Author, AuthorBooks*> p = *i;
  280.             vector<string> author_res = p.second->FindInName(word);
  281.  
  282.             if(author_res.size()) res.insert(pair<string, vector<string> >(p.first.Name(), author_res));
  283.         }
  284.  
  285.         return res;
  286.     }
  287. };
  288.  
  289. class LibUI
  290. {
  291. private:
  292.     Library lib;
  293.  
  294.     vector<string> print_author_list()
  295.     {
  296.         vector<string> res = lib.AuthorsNames();
  297.  
  298.         for(int i = 0; i < res.size(); i++)
  299.         {
  300.             cout << " " << i + 1 << ") " << res[i] << "\n";
  301.         }
  302.  
  303.         return res;
  304.     }
  305.  
  306.     void lib_start_page(istream& in)
  307.     {
  308.         while(true)
  309.         {
  310.             cout << " In our Archives presents the work of various authors.\n";
  311.             cout << " What do you want? \n";
  312.             cout << " 1) See the list of authors \n";
  313.             cout << " 2) Add new author \n";
  314.             cout << " 3) Read the author\'s books \n";
  315.             cout << " 4) Update author \n";
  316.             cout << " 5) Remove author \n";
  317.             cout << " 6) Find books containing the word \n";
  318.             cout << " 7) Return \n";
  319.             cout << "> ";
  320.  
  321.             int input;
  322.             in >> input;
  323.  
  324.             while(input < 1 || input > 7)
  325.             {
  326.                 cout << " We have not this variant.\n";
  327.                 cout << " Please, select something from the above list.\n";
  328.                 cout << "> ";
  329.                 in >> input;
  330.             }
  331.  
  332.             clear_screen();
  333.  
  334.             if(input == 1)
  335.             {
  336.                 cout << " Archives contain the following authors: \n";
  337.  
  338.                 vector<string> v = lib.AuthorsNames();
  339.  
  340.                 if(v.size() == 0)
  341.                 {
  342.                     cout << " No authors. \n";
  343.                 }
  344.  
  345.                 for(int i = 0; i < v.size(); i++)
  346.                 {
  347.                     cout << " - " << v[i] << "\n";
  348.                 }
  349.  
  350.                 pause(in);
  351.                 clear_screen();
  352.                 continue;
  353.             }
  354.  
  355.             if(input == 2)
  356.             {
  357.                 cout << " Enter author name:\n";
  358.                 cout << "> ";
  359.                 string s, ts;
  360.                 in >> s;
  361.                 getline(in, ts);
  362.                 s = s + " " + ts;
  363.  
  364.                 add_new_author(in, s);
  365.                 continue;
  366.             }
  367.  
  368.             if(input == 6)
  369.             {
  370.                 cout << " Enter word:\n";
  371.                 cout << "> ";
  372.                 string s, ts;
  373.                 in >> s;
  374.                 getline(in, ts);
  375.                 s = s + " " + ts;
  376.  
  377.                 map<string, vector<string> > res = lib.FindAllBooksContain("of");
  378.  
  379.                 for(map<string, vector<string> >::iterator i = res.begin(); i != res.end(); i++)
  380.                 {
  381.                     vector<string> ts = i->second;
  382.  
  383.                     for(int ti = 0; ti < ts.size(); ti++)
  384.                     {
  385.                         cout << " - " << i->first << ", " << ts[ti] << "\n";
  386.                     }
  387.                 }
  388.  
  389.                 pause(in);
  390.                 clear_screen();
  391.                 continue;
  392.             }
  393.  
  394.             if(input == 7)
  395.             {
  396.                 clear_screen();
  397.                 break;
  398.             }
  399.  
  400.             cout << " Choose the author you are interested in:\n";
  401.             vector<string> authors = print_author_list();
  402.  
  403.             cout << " " << authors.size() + 1 << ") Return\n";
  404.             cout << "> ";
  405.  
  406.             int input_2;
  407.             in >> input_2;
  408.  
  409.             while(input_2 < 1 || input_2 > authors.size() + 1)
  410.             {
  411.                 cout << " We have not this variant.\n";
  412.                 cout << " Please, select something from the above list.\n";
  413.                 cout << "> ";
  414.                 in >> input_2;
  415.             }
  416.  
  417.             if(input_2 == authors.size() + 1)
  418.             {
  419.                 clear_screen();
  420.                 continue;
  421.             }
  422.  
  423.             switch(input)
  424.             {
  425.             case 3:
  426.                 clear_screen();
  427.                 use_author_books(in, authors[input_2 - 1]);
  428.                 break;
  429.             case 4:
  430.                 update_author(in, authors[input_2 - 1]);
  431.                 break;
  432.             case 5:
  433.                 remove_author(in, authors[input_2 - 1]);
  434.                 break;
  435.             }
  436.         }
  437.     }
  438.  
  439.     void add_new_author(istream& in, string author_name)
  440.     {
  441.         if(lib.AddAuthor(author_name))
  442.         {
  443.             cout << " " << author_name << " added!\n";
  444.         }
  445.         else
  446.         {
  447.             cout << " Don't added.\n";
  448.         }
  449.  
  450.         pause(in);
  451.         clear_screen();
  452.     }
  453.  
  454.     void update_author(istream& in, string author_name)
  455.     {
  456.         cout << " Enter the year of death:\n";
  457.         cout << "> ";
  458.         int year;
  459.         in >> year;
  460.         if(lib.UpdateAuthor(author_name, year))
  461.         {
  462.             cout << " " << author_name << " updated!\n";
  463.         }
  464.         else
  465.         {
  466.             cout << " Don't updated.\n";
  467.         }
  468.  
  469.         pause(in);
  470.         clear_screen();
  471.     }
  472.  
  473.     void remove_author(istream& in, string author_name)
  474.     {
  475.         if(lib.RemoveAuthor(author_name))
  476.         {
  477.             cout << " " << author_name << " removed!\n";
  478.         }
  479.         else
  480.         {
  481.             cout << " Don't removed.\n";
  482.         }
  483.  
  484.         pause(in);
  485.         clear_screen();
  486.     }
  487.  
  488.     vector<string> print_books(AuthorBooks* books)
  489.     {
  490.         vector<string> res = books->BooksNames();
  491.  
  492.         for(int i = 0; i < res.size(); i++)
  493.         {
  494.             cout << " " << i + 1 << ") " << res[i] << "\n";
  495.         }
  496.  
  497.         return res;
  498.     }
  499.  
  500.     void use_author_books(istream& in, string author_name)
  501.     {
  502.         AuthorBooks* books = lib.GetBooks(author_name);
  503.  
  504.         while(true)
  505.         {
  506.             cout << " You are in room of "  << author_name << " \n";
  507.             cout << " What do you want? \n";
  508.             cout << " 1) View books \n";
  509.             cout << " 2) Add book \n";
  510.             cout << " 3) Read book \n";
  511.             cout << " 4) Update book \n";
  512.             cout << " 5) Remove book \n";
  513.             cout << " 6) Return \n";
  514.             cout << "> ";
  515.  
  516.             int input;
  517.             in >> input;
  518.  
  519.             while(input < 1 || input > 6)
  520.             {
  521.                 cout << " We have not this variant.\n";
  522.                 cout << " Please, select something from the above list.\n";
  523.                 cout << "> ";
  524.                 in >> input;
  525.             }
  526.  
  527.             clear_screen();
  528.  
  529.             if(input == 1)
  530.             {
  531.                 cout << " Room contain the following books: \n";
  532.  
  533.                 vector<string> v = books->BooksNames();
  534.  
  535.                 if(v.size() == 0)
  536.                 {
  537.                     cout << " No books. \n";
  538.                 }
  539.  
  540.                 for(int i = 0; i < v.size(); i++)
  541.                 {
  542.                     cout << " - " << v[i] << "\n";
  543.                 }
  544.  
  545.                 pause(in);
  546.                 clear_screen();
  547.                 continue;
  548.             }
  549.  
  550.             if(input == 2)
  551.             {
  552.                 add_book(in, books);
  553.                 pause(in);
  554.                 clear_screen();
  555.                 continue;
  556.             }
  557.  
  558.             if(input == 6)
  559.             {
  560.                 clear_screen();
  561.                 break;
  562.             }
  563.  
  564.             cout << " Choose the book you are interested in:\n";
  565.             vector<string> books_names = print_books(books);
  566.  
  567.             cout << " " << books_names.size() + 1 << ") Return\n";
  568.             cout << "> ";
  569.  
  570.             int input_2;
  571.             in >> input_2;
  572.  
  573.             while(input_2 < 1 || input_2 > books_names.size() + 1)
  574.             {
  575.                 cout << " We have not this variant.\n";
  576.                 cout << " Please, select something from the above list.\n";
  577.                 cout << "> ";
  578.                 in >> input_2;
  579.             }
  580.  
  581.             if(input_2 == books_names.size() + 1)
  582.             {
  583.                 clear_screen();
  584.                 continue;
  585.             }
  586.  
  587.             switch(input)
  588.             {
  589.             case 3:
  590.                 clear_screen();
  591.                 read_book(in, books, books_names[input_2 - 1]);
  592.                 break;
  593.             case 4:
  594.                 update_book(in, books, books_names[input_2 - 1]);
  595.                 break;
  596.             case 5:
  597.                 remove_book(in, books, books_names[input_2 - 1]);
  598.                 break;
  599.             }
  600.  
  601.         }
  602.         clear_screen();
  603.     }
  604.  
  605.     void add_book(istream& in, AuthorBooks* books)
  606.     {
  607.         cout << " Enter book name: \n";
  608.         cout << "> ";
  609.         string s, ts;
  610.         in >> s;
  611.         getline(in, ts);
  612.         string name = s + " " + ts;
  613.  
  614.         cout << " Enter book:\n";
  615.         cout << "> ";
  616.         in >> s;
  617.         getline(in, ts);
  618.         string book = s + " " + ts;
  619.  
  620.         if(books->AddBook(name, book))
  621.         {
  622.             cout << " " << name << " added! \n";
  623.         }
  624.         else
  625.         {
  626.             cout << " " << name << " not added. \n";
  627.         }
  628.  
  629.         pause(in);
  630.         clear_screen();
  631.     }
  632.  
  633.     void read_book(istream& in, AuthorBooks* books, string name)
  634.     {
  635.         cout << books->GetBook(name).Text() << "\n";
  636.  
  637.         pause(in);
  638.         clear_screen();
  639.     }
  640.  
  641.     void update_book(istream& in, AuthorBooks* books, string name)
  642.     {
  643.         cout << " Enter new text for " << name << ":\n";
  644.         cout << "> ";
  645.         string s, ts;
  646.         in >> s;
  647.         getline(in, ts);
  648.         string text = s + " " + ts;
  649.  
  650.         if(books->ChangeBook(name, text))
  651.         {
  652.             cout << " " << name << " updated! \n";
  653.         }
  654.         else
  655.         {
  656.             cout << " " << name << " not updated! \n";
  657.         }
  658.  
  659.         pause(in);
  660.         clear_screen();
  661.     }
  662.  
  663.     void remove_book(istream& in, AuthorBooks* books, string name)
  664.     {
  665.          if(books->RemoveBook(name))
  666.         {
  667.             cout << " " << name << " removed! \n";
  668.         }
  669.         else
  670.         {
  671.             cout << " " << name << " not removed! \n";
  672.         }
  673.  
  674.         pause(in);
  675.         clear_screen();
  676.     }
  677. public:
  678.     LibUI() : lib() {}
  679.  
  680.     void Run(istream& in)
  681.     {
  682.         cout << " Greetings traveler. You are in the Eternal Archives, \n";
  683.         cout << " the repository of the wisdom of many generations.\n";
  684.  
  685.         while(true)
  686.         {
  687.             cout << " Before you the door of the Archive. \n";
  688.             cout << " What do you want? \n";
  689.             cout << " 1) Go in Archive \n";
  690.             cout << " 2) Exit \n";
  691.             cout << "> ";
  692.  
  693.             int input;
  694.             in >> input;
  695.  
  696.             while(input < 1 || input > 2)
  697.             {
  698.                 cout << " We have not this variant.\n";
  699.                 cout << " Please, select something from the above list.\n";
  700.                 cout << "> ";
  701.                 in >> input;
  702.             }
  703.  
  704.             clear_screen();
  705.  
  706.             if(input == 1)
  707.             {
  708.                 lib_start_page(in);
  709.                 continue;
  710.             }
  711.             break; // if(input == 2)
  712.         }
  713.  
  714.         cout << " Be careful traveler.\n";
  715.     }
  716. };
  717.  
  718. int main()
  719. {
  720.     ifstream in("input.txt");
  721. /*
  722.     Library lib;
  723.  
  724.     lib.AddAuthor("J.R.R.Tolkien");
  725.     lib.GetBooks("J.R.R.Tolkien")->AddBook("Lord of the Rings I", "LOTR 1");
  726.     lib.GetBooks("J.R.R.Tolkien")->AddBook("Lord of the Rings II", "LOTR 2");
  727.     lib.GetBooks("J.R.R.Tolkien")->AddBook("Lord of the Rings III", "LOTR 3");
  728.  
  729.     lib.AddAuthor("L.N.Tolstoy");
  730.     lib.GetBooks("L.N.Tolstoy")->AddBook("War and World", "WaW");
  731.     lib.GetBooks("L.N.Tolstoy")->AddBook("Anna Karenina", "AK");
  732.     lib.GetBooks("L.N.Tolstoy")->AddBook("Book of Letters", "BoL");
  733.  
  734.     lib.AddAuthor("A.P.4ehov");
  735.     lib.GetBooks("A.P.4ehov")->AddBook("Garden of Cherry", "GoC");
  736.     lib.GetBooks("A.P.4ehov")->AddBook("Men", "M");
  737.     lib.GetBooks("A.P.4ehov")->AddBook("OliGofren", "OG");
  738.  
  739.     map<string, vector<string> > res = lib.FindAllBooksContain("of");
  740.  
  741.     for(map<string, vector<string> >::iterator i = res.begin(); i != res.end(); i++)
  742.     {
  743.         vector<string> ts = i->second;
  744.  
  745.         for(int ti = 0; ti < ts.size(); ti++)
  746.         {
  747.             cout << i->first << ", " << ts[ti] << "\n";
  748.         }
  749.     }
  750. */
  751. /*
  752. Input:
  753. 1
  754.  
  755. 2
  756. J.R.R.Tolkien
  757. 3
  758. 1
  759. 2
  760. Lord of the Rings I
  761. LOTR 1
  762. 2
  763. Lord of the Rings II
  764. LOTR 2
  765. 2
  766. Lord of the Rings III
  767. LOTR 3
  768. 6
  769.  
  770. 2
  771. L.N.Tolstoy
  772. 3
  773. 2
  774. 2
  775. War and World
  776. WaW
  777. 2
  778. Anna Karenina
  779. AK
  780. 2
  781. Book of Letters
  782. BoL
  783. 6
  784.  
  785. 2
  786. A.P.4ehov
  787. 3
  788. 1
  789. 2
  790. Garden of Cherry
  791. GoC
  792. 2
  793. Men
  794. M
  795. 2
  796. OliGofren
  797. OG
  798. 6
  799.  
  800. 7
  801. 2
  802. */
  803.  
  804.     LibUI lib;
  805.     lib.Run(in);
  806.     clear_screen();
  807.     lib.Run(cin);
  808.  
  809.     //getc(stdin);
  810.     return 0;
  811. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement