5.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #include <iostream> // библиотке ввода-вывода
  2. #include <string> // библиотека строк
  3. #include <vector> // библиотека векторов (динамических массивов без ограничений памяти)
  4. using namespace std;
  5. class Library {
  6. vector <vector <string>> books;
  7. public:
  8. Library(int quantity){
  9. books.resize(quantity);
  10. input_books();
  11. }
  12. void input_books(){
  13. int pages;
  14. for (int i = 0; i < books.size(); i++){
  15. cout << "Input count " << i+1 << " book's pages: ";
  16. cin >> pages;
  17. cin.get();
  18. cout << endl;
  19. if (pages < 1){
  20. cout << "\nPage's size can't be less than 1\n";
  21. exit(0);
  22. }
  23. books[i].resize(pages);
  24. input_pages(i);
  25. cout << endl;
  26. }
  27. }
  28. void input_pages(int index){
  29. for (int i = 0; i < books[index].size(); i++){
  30. cout << "\tInput " << i+1 << " page's text\n\t\t";
  31. getline(cin, books[index][i]);
  32. cout << endl;
  33. }
  34. }
  35. void output_books(){
  36. for (int i = 0; i < books.size(); i++){
  37. cout << i+1 << " book:\n";
  38. for (int j = 0; j < books[i].size(); j++){
  39. cout << "\t" << j+1 << " page\n\n";
  40. cout << "\t\t" << books[i][j];
  41. cout << "\n\n";
  42. }
  43. cout << "\n\n\n";
  44. }
  45. }
  46. int get_book_number(string target_word){
  47. int target_book;
  48. int index = -1;
  49. vector <string> page_words;
  50. int sum[books.size()];
  51. for (int i = 0; i < books.size(); i++){
  52. sum[i] = 0;
  53. }
  54. int **count_target_words = new int *[books.size()];
  55. for (int i = 0; i < books.size(); i++){
  56. count_target_words[i] = new int [books[i].size()];
  57. }
  58. for (int i = 0; i < books.size(); i++){
  59. for (int j = 0; j < books[i].size(); j++){
  60. page_words = get_words(books[i][j]);
  61. count_target_words[i][j] = get_count_target_word(page_words, target_word);
  62. }
  63. }
  64. for (int i = 0; i < books.size(); i++){
  65. for (int j = 0; j < books[i].size(); j++){
  66. sum[i] += count_target_words[i][j];
  67. }
  68. }
  69. index = sum[0];
  70. for (int i = 0; i < books.size(); i++){
  71. if (index <= sum[i]){
  72. index = sum[i];
  73. target_book = i;
  74. }
  75. }
  76. delete_matrix(count_target_words, books.size());
  77. return target_book;
  78. }
  79. void delete_matrix(int **matrix, int iterations){ // удаление матрицы
  80. for (int i = 0; i < iterations; i++){ // цикл от 0 до iterations
  81. delete[] matrix[i]; // удаление текущего элемента матрицы
  82. }
  83. delete[] matrix; // удаление матрицы
  84. }
  85. int get_count_target_word(vector <string> page_words, string target_word){
  86. int count = 0;
  87. for (int i = 0; i < page_words.size(); i++){
  88. if (target_word == page_words[i]){
  89. count++;
  90. }
  91. }
  92. return count;
  93. }
  94. vector <string> get_words(string file_text){
  95. vector <string> words; // массив для хранения слов строки (используется вектор для устранения ограничения на размер памяти)
  96. int start = 0; // счётчик начала слова
  97. int end = 0; // // счётчик конца слова
  98. int skip_count = 0; // счётчик пропусков
  99. for (int i = 0; i <= file_text.size(); i++) { // цикл на прохождение строки
  100. if (skip_count > 0){ // если есть ряд символов без букв
  101. skip_count--; // уменьшаем счётчик пропусков
  102. continue; // переходим на следующую итерацию до следующей буквы в строке
  103. }
  104. if (ispunct(file_text[i]) || isspace(file_text[i]) || file_text[i] == '\0'){ // если текущий символ строки не является буквой, то
  105. skip_count = 0; // обнуляем счётчик от нового слова
  106. end = i; // счётчик окончания равен текущему значению i
  107. words.push_back(file_text.substr(start, (end-start))); // добавляем в массив слов часть строки от значения счётчика start.
  108. // (end - start) нужен для вычисления количества символов
  109. while (ispunct(file_text[end]) || isspace(file_text[end])){ // пока текущий символ не является буквой,
  110. end++; // увеличиваем переменную end
  111. skip_count++; // увеличиваем количество пропусков в цикле по количеству итераций end
  112. } // цикл необходим для перехода к следующему слову, так как в задании не указан разделитель слов.
  113. start = end; // присваиваем счётчику start значение от end для пропуска не буквенных символов и продолжения работы.
  114. }
  115. }
  116. return words; // возвращаем отсортированный массив
  117. }
  118. void delete_words_in_page(int book_index, int page_index, string target_word){
  119. string new_page_text = "";
  120. vector <string> page_words = get_words(books[book_index][page_index]);
  121. for (int i = 0; i < page_words.size(); i++){
  122. if (page_words[i] == target_word){
  123. continue;
  124. }
  125. new_page_text.append(page_words[i]);
  126. new_page_text.append(" ");
  127. }
  128. books[book_index][page_index] = new_page_text;
  129. }
  130. bool check_page_index(int book_index, int page_index){
  131. return !(page_index < 0 || page_index > books[book_index].size() - 1);
  132. }
  133. };
  134. int main(){
  135. string target_word;
  136. int quantity;
  137. int book_index;
  138. int page_index;
  139. cout << "Input book's quantity: ";
  140. cin >> quantity;
  141. cin.get();
  142. cout << endl;
  143. if (quantity < 1){
  144. cout << "\nLibrary's size can't be less than 1.\n";
  145. return 0;
  146. }
  147. Library libre(quantity);
  148. cout << "Input target word: ";
  149. cin >> target_word;
  150. book_index = libre.get_book_number(target_word);
  151. if (book_index == -1){
  152. cout << "\nInputed word doesn't find.\n";
  153. return 0;
  154. }
  155. cout << "\nIndex of found book: " << book_index + 1 << endl;
  156. cout << "\n\nInput book's page: ";
  157. cin >> page_index;
  158. cin.get();
  159. cout << endl << endl;
  160. if (!libre.check_page_index(book_index, page_index - 1)){
  161. cout << "Inputed index page doesn't exist.\n";
  162. return 0;
  163. }
  164. libre.delete_words_in_page(book_index, page_index - 1, target_word);
  165. libre.output_books();
  166. return 0;
  167. }