libre.cpp 8.9 KB

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