Library-3.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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()) continue;
  19. words.push_back(word);
  20. word.clear();
  21. }
  22. return words; // возвращаем отсортированный массив
  23. }
  24. void input_title(string title){ page_title = title; }
  25. void input_text(string text){ page_text = text; page_words = transform_text_to_words(page_text); }
  26. // удаление искомого слова на странице
  27. void delete_target_word(string target_word){
  28. string new_text = "";
  29. for (int i = 0; i < page_words.size(); i++){ // цикл на массив слов, содержащихся в тексте
  30. if (target_word == page_words[i]) continue; // если искомое слово совпадает с текущим - пропускаем итерацию
  31. new_text.append(page_words[i]);
  32. new_text.append(" ");
  33. }
  34. this->page_text = new_text; // заменяем текст страницы на новый
  35. }
  36. string get_text(){ return page_text; }
  37. string get_title(){ return page_title; }
  38. // подсчёт вхождений искомого слова
  39. int get_count_target_word(string target_word){
  40. int count = 0;
  41. for (int i = 0; i < page_words.size(); i++){
  42. if (page_words[i] == target_word){
  43. count++;
  44. }
  45. }
  46. return count;
  47. }
  48. };
  49. class Book {
  50. vector <Page> pages; // количество страниц
  51. vector <int> count_target_word_in_pages; // количество найденного искомого слова на странице
  52. public:
  53. void input_pages_size(int size){ // ввод количества страниц
  54. pages.resize(size);
  55. count_target_word_in_pages.resize(size);
  56. }
  57. void input_pages(){ // ввод значений страниц
  58. string title = ""; // заголовок
  59. string text = ""; // текст
  60. // последовательный ввод
  61. for (int i = 0; i < pages.size(); i++){
  62. cout << "\n\n\t\tInput " << i+1 << " page's title: ";
  63. getline(cin, title);
  64. pages[i].input_title(title);
  65. cout << "\n\t\tInput " << i+1 << " page's text:\n\n\t\t\t";
  66. getline(cin, text);
  67. pages[i].input_text(text);
  68. }
  69. }
  70. // вывод страниц
  71. void output_pages(){
  72. for (int i = 0; i < pages.size(); i++)
  73. cout << "\n\n\t\t" << i+1 << " page's title: " << pages[i].get_title() << "\n\t\t" << i+1 << " page's text:\n\n\t\t\t" << pages[i].get_text();
  74. }
  75. // удаление искомого слова на заданной странице
  76. void delete_target_word(string target_word, int page_index){ pages[page_index].delete_target_word(target_word); }
  77. // подсчёт вхождений искомого слова на всех страницах
  78. int get_count_target_word(string target_word){
  79. int count = 0;
  80. for (int i = 0; i < pages.size(); i++){
  81. count_target_word_in_pages[i] = pages[i].get_count_target_word(target_word);
  82. }
  83. for (int i = 0; i < count_target_word_in_pages.size(); i++){
  84. count += count_target_word_in_pages[i];
  85. }
  86. return count;
  87. }
  88. // получение количества страниц
  89. int get_book_size(){ return pages.size(); }
  90. };
  91. class Library {
  92. float postfix_increment_overload; // переменная для перегрузки опреатора постфиксинкремента
  93. int pages_size; // количество страниц
  94. int book_index = -1; // индекс книги
  95. int book_max; // количество встречаемового слова в книге
  96. static int count_book_for_search; // количество книг для поиска слова
  97. static vector <int> numbers_book_for_search; // номера книг для поиска
  98. vector <Book> libre; // массив объектов класса "Book"
  99. vector <int> count_target_word_in_library; // массив для подсчёта количества найденных вхождений введённого слова
  100. public: // публичные функции
  101. // получение количества страниц
  102. int get_pages_size(){ return this->pages_size; }
  103. // получение индекса книги, в которой наибольшее число раз встречается введённое слово
  104. int get_book_index(){ return this->book_index; }
  105. // статическая функция для вывода статических полей (getter, если угодно)
  106. static void get_static_fields(){
  107. cout << "\nBooks count for searching target word: ";
  108. cout << count_book_for_search;
  109. cout << "\nBooks indexs for searching target word: ";
  110. numbers_book_for_search.resize(count_book_for_search);
  111. for (int i = 0; i < count_book_for_search; i++){
  112. cout << numbers_book_for_search[i] << ", ";
  113. }
  114. cout << "\n";
  115. }
  116. // статическая функция переопределения статических полей класса (setter)
  117. static void set_static_fields(){
  118. int num;
  119. cout << "\nEnter books count for searching target word: ";
  120. cin >> count_book_for_search;
  121. if (count_book_for_search < 1){
  122. cout << "Count can't be less than 1.\n";
  123. exit(0);
  124. }
  125. cout << "\nInput books indexs for searching target word\n";
  126. numbers_book_for_search.resize(count_book_for_search);
  127. for (int i = 0; i < count_book_for_search; i++){
  128. cin >> num;
  129. numbers_book_for_search[i] = num-1;
  130. }
  131. }
  132. /* конструктор с параметром по умолчанию
  133. Library(int size){
  134. libre.resize(size);
  135. count_target_word_in_library.resize(size);
  136. cout << "Constructor " << this << " initialized\n";
  137. }
  138. */
  139. // конструктор с параметром по умолчанию
  140. Library(int size = 1){
  141. libre.resize(size);
  142. count_target_word_in_library.resize(size);
  143. cout << "Constructor " << this << " initialized\n";
  144. }
  145. // ввод библиотеки
  146. void input_library(){
  147. for (int i = 0; i < libre.size(); i++){
  148. cout << "\n\tInput " << i+1 << " book page's quantity: ";
  149. cin >> pages_size;
  150. cin.get();
  151. cout << endl;
  152. libre[i].input_pages_size(pages_size);
  153. libre[i].input_pages();
  154. }
  155. }
  156. // вывод библиотеки
  157. void output_library(){
  158. cout << "\n\nOutput lybrary";
  159. for (int i = 0; i < libre.size(); i++){
  160. cout << "\n\n\t" << i+1 << " book:";
  161. libre[i].output_pages();
  162. }
  163. cout << "\n\n";
  164. }
  165. // поиск книги, в которой введённое слово встречается наибольшее число раз
  166. int get_book_index(string target_word){
  167. for (int i = 0; i < numbers_book_for_search.size(); i++){
  168. count_target_word_in_library[i] = libre[numbers_book_for_search[i]].get_count_target_word(target_word);
  169. }
  170. book_max = count_target_word_in_library[0];
  171. for (int i = 0; i < count_target_word_in_library.size(); i++){
  172. if (book_max <= count_target_word_in_library[i]){
  173. book_max = count_target_word_in_library[i];
  174. book_index = i;
  175. }
  176. }
  177. if (book_max == 0) book_index = -1; // если слово нигде не найдено, то устанвливаем индекс на -1
  178. return book_index;
  179. }
  180. // проверка на наличие страницы в книге
  181. bool check_page_exist(int page_index){ return (page_index >= 0 && page_index < libre[book_index].get_book_size()); }
  182. void delete_target_word(string target_word, int page_index){ libre[book_index].delete_target_word(target_word, page_index); }
  183. void operator++(int _num){ // перегрузка оператора постинкремента
  184. this->postfix_increment_overload = 0;
  185. this->postfix_increment_overload = _num + 30;
  186. }
  187. float get_postfix_increment_overload() { return this->postfix_increment_overload; } // возвращение переменной, задействованной в перегрузке унарного оператора
  188. ~Library(){ // деструктор
  189. cout << "Destructor " << this << " initialized\n";
  190. }
  191. };
  192. ostream& operator<< (ostream& out, Library& _lib) //перегрузка оператора вывода
  193. {
  194. return out << "Book index: " << _lib.get_book_index() << " | Pages: " << _lib.get_pages_size() << "\n\n";
  195. }
  196. // статитические поля и функции здесь отвечают за количество книг,а также за номера страниц,
  197. // в которых будет осуществлятляться поиск слова, введённого пользователем
  198. int Library::count_book_for_search = 1; // определение по умолчанию
  199. vector <int> Library::numbers_book_for_search = {0};
  200. int main(){
  201. char static_choise; // изменение значений статических переменных
  202. int books_size; // количество книг
  203. int book_index; // индекс найденной книги
  204. int page_index; // индекс выбранной страницы
  205. string target_word; // искомое слово
  206. Library *lib; // указатель для последующей инициализации объекта (АКА динамика для 4 (8) задания)
  207. system("clear"); // очистка экрана
  208. // ввод количества книг в библиотеке
  209. cout << "Input library size: ";
  210. cin >> books_size;
  211. cin.get();
  212. cout << endl;
  213. if (books_size > 0){ // проблема с областью видимости в if. Уточнить у преподавателя.
  214. lib = new Library(books_size); // явная инициализация объекта с передачей параметра
  215. }
  216. else { // явная инициализация объекта без передачи параметра
  217. cout << "\nLibrary's size can't be less than 1, so it's sets to 1.\n";
  218. lib = new Library();
  219. }
  220. // ввод библиотеки
  221. (*lib).input_library();
  222. // изменение статических полей по желанию
  223. Library::get_static_fields();
  224. cout << "\nDo you want to set static fields after input? (y/n): "; cin >> static_choise;
  225. if (static_choise == 'y') Library::set_static_fields();
  226. // ввод искомого слова
  227. cout << "\n\nInput target word: ";
  228. cin >> target_word;
  229. cin.get();
  230. cout << endl;
  231. // получение индекс книги, в которой искомое слово встречается наибольшее число раз
  232. book_index = (*lib).get_book_index(target_word);
  233. if (book_index == -1){ // если индекс -1, то искомое слово нигде не найдено, соответственно - завершаем программу
  234. cout << "\nInputed word doesn't find.\n";
  235. return 0;
  236. }
  237. // вывод найденной книги
  238. cout << "\nIndex of found book: " << book_index + 1 << endl;
  239. // ввод номера страницы, на которой надо удалить слово
  240. cout << "\n\nInput book's page: ";
  241. cin >> page_index;
  242. cin.get();
  243. cout << endl << endl;
  244. // проверка на наличие данной страницы
  245. if (!((*lib).check_page_exist(page_index - 1))){ // если страницы не существует, то завершаем программу
  246. cout << "Inputed index page doesn't exist.\n";
  247. delete lib; // удаление динамического объекта для чистки ОЗУ
  248. return 0;
  249. }
  250. (*lib).delete_target_word(target_word, page_index - 1); // удаление искомого слова на данной странице
  251. (*lib).output_library(); // вывод библиотеки
  252. (*lib).operator++(book_index + 1); // вывод перегруженного оператора постинкремента
  253. cout << (*lib); // вывод значений через перегрузку оператора вывода
  254. delete lib; // удаление динамического объекта для чистки ОЗУ
  255. return 0;
  256. }