Library-2-2-2.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. #include <iostream> // библиотке ввода-вывода
  2. #include <string> // библиотека строк
  3. #include <vector> // библиотека векторов (динамических массивов без ограничений памяти)
  4. using namespace std;
  5. class Page {
  6. string page_title;
  7. string page_text;
  8. vector <string> page_words;
  9. public:
  10. vector <string> transform_text_to_words(string file_text){
  11. vector <string> words; // массив для хранения слов строки (используется вектор для устранения ограничения на размер памяти)
  12. string word = "";
  13. for (int i = 0; i <= file_text.size(); i++) { // цикл на прохождение строки
  14. if (!(isspace(file_text[i]) || ispunct(file_text[i]) || file_text[i] == '\0')){
  15. word.push_back(file_text[i]);
  16. continue;
  17. }
  18. if (word.empty())
  19. continue;
  20. words.push_back(word);
  21. word.clear();
  22. }
  23. return words; // возвращаем отсортированный массив
  24. }
  25. void input_title(string title){
  26. page_title = title;
  27. }
  28. void input_text(string text){
  29. page_text = text;
  30. page_words = transform_text_to_words(page_text);
  31. }
  32. void delete_target_word(string target_word){
  33. string new_text = "";
  34. for (int i = 0; i < page_words.size(); i++){
  35. if (target_word == page_words[i])
  36. continue;
  37. new_text.append(page_words[i]);
  38. new_text.append(" ");
  39. }
  40. page_text = new_text;
  41. }
  42. string get_text(){
  43. return page_text;
  44. }
  45. string get_title(){
  46. return page_title;
  47. }
  48. int get_count_target_word(string target_word){
  49. int count = 0;
  50. for (int i = 0; i < page_words.size(); i++){
  51. if (page_words[i] == target_word){
  52. count++;
  53. }
  54. }
  55. return count;
  56. }
  57. };
  58. class Book {
  59. vector <Page> pages;
  60. vector <int> count_target_word_in_pages;
  61. public:
  62. void input_pages_size(int size){
  63. pages.resize(size);
  64. count_target_word_in_pages.resize(size);
  65. }
  66. void input_pages(){
  67. string title = "";
  68. string text = "";
  69. for (int i = 0; i < pages.size(); i++){
  70. cout << "\n\n\t\tInput " << i+1 << " page's title: ";
  71. getline(cin, title);
  72. pages[i].input_title(title);
  73. cout << "\n\t\tInput " << i+1 << " page's text:\n\n\t\t\t";
  74. getline(cin, text);
  75. pages[i].input_text(text);
  76. }
  77. }
  78. void output_pages(){
  79. for (int i = 0; i < pages.size(); i++){
  80. cout << "\n\n\t\t" << i+1 << " page's title: " << pages[i].get_title();
  81. cout << "\n\t\t" << i+1 << " page's text:\n\n\t\t\t" << pages[i].get_text();
  82. }
  83. }
  84. void delete_target_word(string target_word, int page_index){
  85. pages[page_index].delete_target_word(target_word);
  86. }
  87. int get_count_target_word(string target_word){
  88. int count = 0;
  89. for (int i = 0; i < pages.size(); i++){
  90. count_target_word_in_pages[i] = pages[i].get_count_target_word(target_word);
  91. }
  92. for (int i = 0; i < count_target_word_in_pages.size(); i++){
  93. count += count_target_word_in_pages[i];
  94. }
  95. return count;
  96. }
  97. int get_book_size(){
  98. return pages.size();
  99. }
  100. };
  101. class Library {
  102. int pages_size;
  103. int book_index = -1;
  104. int book_max;
  105. vector <Book> libre;
  106. vector <int> count_target_word_in_library;
  107. public:
  108. Library(int size = 1){
  109. libre.resize(size);
  110. count_target_word_in_library.resize(size);
  111. cout << "Constructor " << this << " initialized\n";
  112. }
  113. void input_library(){
  114. for (int i = 0; i < libre.size(); i++){
  115. cout << "\n\tInput " << i+1 << " book page's quantity: ";
  116. cin >> pages_size;
  117. cin.get();
  118. cout << endl;
  119. libre[i].input_pages_size(pages_size);
  120. libre[i].input_pages();
  121. }
  122. }
  123. void output_library(){
  124. cout << "\n\nOutput lybrary";
  125. for (int i = 0; i < libre.size(); i++){
  126. cout << "\n\n\t" << i+1 << " book:";
  127. libre[i].output_pages();
  128. }
  129. cout << "\n\n";
  130. }
  131. int get_book_index(string target_word){
  132. for (int i = 0; i < libre.size(); i++){
  133. count_target_word_in_library[i] = libre[i].get_count_target_word(target_word);
  134. }
  135. book_max = count_target_word_in_library[0];
  136. for (int i = 0; i < libre.size(); i++){
  137. if (book_max <= count_target_word_in_library[i]){
  138. book_max = count_target_word_in_library[i];
  139. book_index = i;
  140. }
  141. }
  142. if (book_max == 0)
  143. book_index = -1;
  144. return book_index;
  145. }
  146. bool check_page_exist(int page_index){
  147. return (page_index >= 0 && page_index < libre[book_index].get_book_size());
  148. }
  149. void delete_target_word(string target_word, int page_index){
  150. libre[book_index].delete_target_word(target_word, page_index);
  151. }
  152. ~Library(){
  153. cout << "Destructor " << this << " initialized\n";
  154. }
  155. };
  156. int main(){
  157. int books_size;
  158. int book_index;
  159. int page_index;
  160. string target_word;
  161. Library *lib;
  162. system("clear");
  163. // system("cowsay -t \"Привет, это программа для задания 2.1. Пожайлуста не ломайте её лишний раз, я итак уже вскрылся, пока её писал.\"");
  164. // system("sleep 10 && clear");
  165. // system("jp2a Armstrong-profile.jpg --colors&& echo \"\nNanomachines, son!\n© Senator Armstrong\"");
  166. // system("sleep 6 && clear");
  167. // system("jp2a ukr-bomb.jpg --colors && echo \"\nУкрасинька бимба.\n© Хохланд\"");
  168. // system("sleep 4 && clear");
  169. // system("jp2a glasses.jpg --colors && echo \"\nКазах без понтов - беспонтовый казах.\n© Неизвестный\"");
  170. // system("sleep 4 && clear");
  171. cout << "Input library size: ";
  172. cin >> books_size;
  173. cin.get();
  174. cout << endl;
  175. if (books_size > 0){ // проблема с областью видимости в if. Уточнить у преподавателя.
  176. lib = new Library(books_size);
  177. }
  178. else {
  179. cout << "\nLibrary's size can't be less than 1, so it's sets to 1.\n";
  180. lib = new Library();
  181. }
  182. (*lib).input_library();
  183. cout << "\n\nInput target word: ";
  184. cin >> target_word;
  185. cin.get();
  186. cout << endl;
  187. book_index = (*lib).get_book_index(target_word);
  188. if (book_index == -1){
  189. cout << "\nInputed word doesn't find.\n";
  190. return 0;
  191. }
  192. cout << "\nIndex of found book: " << book_index + 1 << endl;
  193. cout << "\n\nInput book's page: ";
  194. cin >> page_index;
  195. cin.get();
  196. cout << endl << endl;
  197. if (!((*lib).check_page_exist(page_index - 1))){
  198. cout << "Inputed index page doesn't exist.\n";
  199. return 0;
  200. }
  201. (*lib).delete_target_word(target_word, page_index - 1);
  202. (*lib).output_library();
  203. delete lib;
  204. return 0;
  205. }