book_text.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include <iostream> // подключение библиотеки ввода-вывода
  2. using namespace std; // подключение стандартного пространства имён
  3. class Page { // класс Страница
  4. string title; // заголовок страницы
  5. string text; // текст страницы
  6. int index; // номер страницы
  7. static string main_title; // статический заголовок, на который заменяется заголовок найденной страницы
  8. static int main_index; // статический номер, на который заменяется номер найденной страницы
  9. public:
  10. // установка статических значений
  11. static void set_main_fields(string _main_title, int _main_index) { main_title = _main_title; main_index = _main_index; }
  12. // получение статических значений
  13. static string get_main_title() { return main_title; }
  14. static int get_main_index() { return main_index; }
  15. Page(){ // конструктор без параметров
  16. cout << "\n\t\t\t\t\t\t\t\t\t\t\tConstructor " << this << " initialized.\n"; // вывод информации о инициализации конструктора
  17. }
  18. Page(string _title, string _text, int _index){ // конструктор с параметрами
  19. cout << "\n\t\t\t\t\t\t\t\t\t\t\tConstructor " << this << " initialized.\n"; // вывод информации о инициализации конструктора
  20. this->title = _title; this->text = _text; this->index = _index;
  21. }
  22. /*
  23. Page(string _title = "default", string _text = "default", int _index = 1){ // конструктор с параметрами по умолчанию
  24. cout << "\n\t\t\t\t\t\t\t\t\t\t\tConstructor " << this << " initialized.\n"; // вывод информации о инициализации конструктора
  25. this->title = _title; this->text = _text; this->index = _index;
  26. }
  27. */
  28. ~Page(){ // деструктор
  29. cout << "\n\t\t\t\t\t\t\t\t\t\t\tDestructor " << this << " initialized.\n"; // вывод информации о инициализации деструктора
  30. }
  31. // установка значений страницы (заголовка, текста и номера)
  32. void set_page(string _title, string _text, int _index){ this->title = _title; this->text = _text; this->index = _index; }
  33. // получение размера заголовка страницы
  34. int get_title_size() { return this->title.size(); }
  35. // замена заголовка и индекса страницы на введённые пользователем
  36. void replace_title_and_index(){ this->title = main_title; this->index = main_index; }
  37. // перегрузка оператора сравнения > (больше)
  38. bool operator > (int _title_size){ return (title.size() > _title_size); }
  39. // объявление перегруженных операторов ввода-вывода дружественными для доступа приватным полям класса
  40. friend istream& operator>> (istream &in, Page& page);
  41. friend ostream& operator<< (ostream& out, Page& page);
  42. };
  43. istream& operator>> (istream &in, Page& page){ // перегрузка оператора ввода для прямого ввода значений страницы
  44. cout << "\n\tInput title: "; in >> page.title; // ввод заголовка
  45. cout << "\tInput text: "; in >> page.text; // ввод текста
  46. cout << "\tInput index: "; in >> page.index; // ввод номера страницы
  47. return in;
  48. }
  49. ostream& operator<< (ostream& out, Page& page){ // перегрузка оператора вывода для вывода значений страницы
  50. return out <<
  51. "\n\tTitle: " << page.title << // вывод заголовка
  52. "\n\tText: " << page.text << // вывод текста
  53. "\n\tIndex: " << page.index << "\n"; // вывод номера
  54. }
  55. int get_max_title_size(Page* pages[], int pages_count){ // функция получения индкса страницы в массиве с самым длинным заголовком
  56. int max_title_size = (*pages[0]).get_title_size(); // максимальный размер заголовка
  57. int finded_page = 0; // найденный индекс страницы в массиве
  58. for (int i = 0; i < pages_count; i++){ // цикл на массив объектов
  59. if ((*pages[i]) > max_title_size){ // сравнение длинны заголовка через перегрузку оператора сравнения
  60. max_title_size = (*pages[i]).get_title_size(); // присваивание максимальному размеру заголовка значение размера заголовка текущей страницы
  61. finded_page = i; // присваивание найденному индексу страницы значения текущего индекса элемента в массиве
  62. }
  63. }
  64. return finded_page; // возвращение найденного индекса страницы в массиве
  65. }
  66. void set_main_fields(){ // функция ввода значений статических полей класса
  67. string title; // новый заголовок
  68. int index; // новый индекс
  69. cout << "\tInput new title: "; cin >> title; // ввод заголовка
  70. cout << "\tInput new index: "; cin >> index; // ввод индекса
  71. Page::set_main_fields(title, index); // установка статических значений согласно введённым переменным
  72. }
  73. // установка значений статических полей по умолчанию во избежания ошибки "неопределённая ссылка"
  74. string Page::main_title = ""; // пустой заголовок по умолчанию
  75. int Page::main_index = 1; // 1 страница по умолчанию
  76. enum UserChoice { // список возможных выборов пользователя
  77. DEFAULT = 1, // конструктор по умолчанию (без параметров)
  78. WITH_PARAMETERS = 2, // конструктор с параметрами
  79. };
  80. int main(){
  81. int choice; // выбор типа конструктора (без параметров, с параметрами)
  82. int finded_page; // найденный индекс страницы в массиве
  83. int pages_count; // количество страниц
  84. cout << "Input pages count: "; cin >> pages_count; // ввод количества страниц
  85. if (pages_count < 1){ // если количество страниц меньше 1
  86. cout << "Page count can't be less than 1.\n"; // вывод о некорректном вводе значения
  87. return 0; // завершение программы
  88. }
  89. // вывод возможных вариантов для инициализации объектов
  90. cout << "\nPlease, choose constructor's type:" << "\n";
  91. cout << "1. Default constructor (without parameters)." << "\n";
  92. cout << "2. Constructor with parameters." << "\n";
  93. // ввод пользователя
  94. cin >> choice;
  95. switch (choice)
  96. {
  97. case UserChoice::DEFAULT:{
  98. Page* pages[pages_count]; // создание динамического массива объектов
  99. // цикл на массив, создание экземпляра класса через конструктор бех параметров и последующий ввод значений текущего экземпляра через перегрузку оператора ввода
  100. for (int i = 0; i < pages_count; i++){ pages[i] = new Page(); cout << "Input " << i+1 << " page"; cin >> (*pages[i]); }
  101. cout << "\n"; // перенос строки
  102. // получение индекса страницы в массиве с наибольшей длинной заголовка
  103. finded_page = get_max_title_size(pages, pages_count);
  104. cout << "Page with max title length:" << (*pages[finded_page]); // вывод найденной страницы
  105. // ввод новых значений заголовка и индекс для найденной страницы
  106. cout << "\n\n\nInput new values of title and index for this page\n";
  107. set_main_fields();
  108. // замена заголовка и индекса найденной страницы на введённые пользователем
  109. (*pages[finded_page]).replace_title_and_index();
  110. cout << "\n\n\nOutput after replace\n\n"; // перенос строки
  111. // цикл на массив, вывод значений текущего экземпляра через перегрузку оператора вывода
  112. for (int i = 0; i < pages_count; i++){ cout << i+1 << " page"; cout << (*pages[i]); }
  113. // удаление динамических объектов
  114. for (int i = 0; i < pages_count; i++) delete pages[i];
  115. break;
  116. }
  117. case UserChoice::WITH_PARAMETERS:{
  118. Page* pages[pages_count]; // создание динамического массива объектов
  119. // цикл на массив, создание экземпляра класса через конструктор с параметрами
  120. for (int i = 0; i < pages_count; i++){
  121. string title, text; int index; // объявление переменных
  122. cout << "Input " << i+1 << " page";
  123. cout << "\n\tInput title: "; cin >> title; // ввод заголовка
  124. cout << "\tInput text: "; cin >> text; // ввод текста
  125. cout << "\tInput index: "; cin >> index; // ввод номера страницы
  126. pages[i] = new Page(title, text, index); // создание экземпляра класса через конструктор с параметрами
  127. }
  128. cout << "\n"; // перенос строки
  129. // получение индекса страницы в массиве с наибольшей длинной заголовка
  130. finded_page = get_max_title_size(pages, pages_count);
  131. cout << "Page with max title length:" << (*pages[finded_page]); // вывод найденной страницы
  132. // ввод новых значений заголовка и индекс для найденной страницы
  133. cout << "\n\n\nInput new values of title and index for this page\n";
  134. set_main_fields();
  135. // замена заголовка и индекса найденной страницы на введённые пользователем
  136. (*pages[finded_page]).replace_title_and_index();
  137. cout << "\n\n\nOutput after replace\n\n"; // перенос строки
  138. // цикл на массив, вывод значений текущего экземпляра через перегрузку оператора вывода
  139. for (int i = 0; i < pages_count; i++){ cout << i+1 << " page"; cout << (*pages[i]); }
  140. // удаление динамических объектов
  141. for (int i = 0; i < pages_count; i++) delete pages[i];
  142. break;
  143. }
  144. default: // если ничего не выбрано
  145. cout << "\n" << "Incorrect input." << "\n\n"; // вывод о некорректном вводе
  146. return 0; // завершение программы
  147. }
  148. return 0; // завершение программы
  149. }