triangles.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include <iostream> // подключение библиотеки ввода-вывода
  2. #include <cmath> // подключение библиотеки для проведения математических операций
  3. using namespace std; // подключение стандартного пространства имён
  4. class Triangle{ // класс Треугольник
  5. float length[3]; // массив, хранящий стороны треугольника
  6. static int total_quantity; // статическая переменная, хранящая общее возможное количество объектов класса
  7. public:
  8. static int get_total_quantity(){ return total_quantity; } // возвращение значения статической переменной (статического поля) - геттер
  9. static void set_total_quantity(int _new_total_quantity){ total_quantity = _new_total_quantity; } // изменение значения статической переменной - сеттер
  10. Triangle(){ // конструктор без параметров
  11. cout << "\n\t\t\t\t\t\t\t\tConstructor " << this << " initialized.\n"; // вывод информации о инициализации конструктора
  12. }
  13. Triangle(float _first_length, float _second_length, float _third_length){ // конструктор с параметрами
  14. cout << "\n\t\t\t\t\t\t\t\tConstructor " << this << " initialized.\n"; // вывод информации о инициализации конструктора
  15. // присваивание сторонам треугольника значений, введённых пользователем
  16. this->length[0] = _first_length; this->length[1] = _second_length; this->length[2] = _third_length;
  17. }
  18. /*
  19. Triangle(float _first_length = 1, float _second_length = 1, float _third_length = 1){ // конструктор с параметрами по умолчанию
  20. cout << "\n\t\t\t\t\t\t\t\tConstructor " << this << " initialized.\n"; // вывод информации о инициализации конструктора
  21. // присваивание сторонам треугольника значений, введённых пользователем
  22. this->length[0] = _first_length; this->length[1] = _second_length; this->length[2] = _third_length;
  23. }
  24. */
  25. ~Triangle(){ // деструктор
  26. cout << "\n\t\t\t\t\t\t\t\tDestructor " << this << " initialized.\n"; // вывод информации о инициализации деструктора
  27. }
  28. void set_triangle_lengths(float _first_length, float _second_length, float _third_length){
  29. // присваивание сторонам треугольника значений, введённых пользователем
  30. this->length[0] = _first_length; this->length[1] = _second_length; this->length[2] = _third_length;
  31. }
  32. bool is_equilteral(){ // проверка на равносторонность
  33. return (this->length[0] == this->length[1] && this->length[1] == this->length[2] && this->length[0] == this->length[2]);
  34. }
  35. float get_square(){ // вычисление и возвращение площади равностороннего треугольника по формуле (sqrt(3)/4 * lenght^2)
  36. return ((sqrt(3)/4) * pow(this->length[0], 2));
  37. }
  38. bool operator == (Triangle& triangle){ // проверка на равносторонность через перегрузку оператора сравнения
  39. return triangle.is_equilteral();
  40. }
  41. };
  42. ostream& operator<< (ostream& out, Triangle& triangle){ //перегрузка оператора вывода
  43. return out << "Square: " << triangle.get_square(); // вывод значения площади треугольника
  44. }
  45. void check_equilteral(Triangle *triangles[], int triangles_count){ // функция проверки треугольников на равносторонность
  46. for (int i = 0; i < triangles_count; i++){ // цикл на прохождение треугольников
  47. // проверка осуществляется через перегрузку оператора сравнения, в который передаётся объект класса треугольник
  48. // и в переданном объекте вызывается функция проверки на равносторонность
  49. // соответственно, если объект равен сам себе, то треугольник равносторонний
  50. if ((*triangles[i]) == (*triangles[i])){ // если треугольник равносторонний
  51. cout << i+1 << " triangle is equilteral. " << (*triangles[i]); // вывод номера и площади текущего треугольника через перегрузку оператора вывода
  52. }
  53. }
  54. }
  55. enum UserChoice { // список возможных выборов пользователя
  56. DEFAULT = 1, // конструктор по умолчанию (без параметров)
  57. WITH_PARAMETERS = 2, // конструктор с параметрами
  58. STATIC_EXAMPLE = 3 // использование статического метода и конструктор без параметров
  59. };
  60. int Triangle::total_quantity = 5; // присваивание значения статической переменной класса
  61. int main(){
  62. char change_static_value; // изменение значения статической переменной класса
  63. int choice; // выбор типа конструктора (без параметров, с параметрами, использование статической переменной)
  64. int triangles_count; // переменная, хранящая количество треугольников
  65. // ввод количества треугольников
  66. cout << "Input triangles count: "; cin >> triangles_count;
  67. // если количество < 1, то просиходит завершение программу
  68. if (triangles_count < 1){
  69. cout << "Triangles count can't be less than 1.\n";
  70. return 0;
  71. }
  72. // вывод возможных вариантов для инициализации объектов
  73. cout << "\nPlease, choose constructor's type:" << "\n";
  74. cout << "1. Default constructor (without parameters)." << "\n";
  75. cout << "2. Constructor with parameters." << "\n";
  76. cout << "3. Example static point." << "\n";
  77. // ввод пользователя
  78. cin >> choice;
  79. switch (choice)
  80. {
  81. case UserChoice::DEFAULT:{ // конструктор без параметров
  82. Triangle* triangles[triangles_count]; // указатель на массив с объектами класса Triangle
  83. for (int i = 0; i < triangles_count; i++){ // цикл на ввод треугольников
  84. float length[3]; // стороны треугольника
  85. cout << "\tInput " << i+1 << " triangle\n";
  86. for (int j = 0; j < 3; j++){ // цикл на ввод сторон текущего треугольника
  87. cout << "\t\t" << j+1 << " side: "; cin >> length[j];
  88. }
  89. triangles[i] = new Triangle(); // создание нового объекта класса Triangle через динамическое выделение памяти
  90. (*triangles[i]).set_triangle_lengths(length[0], length[1], length[2]); // передача введённых сторон в текущий треугольник
  91. }
  92. check_equilteral(triangles, triangles_count); // проверка треугольников на равносторонность
  93. for (int i = 0; i < triangles_count; i++) delete triangles[i]; // очистка памяти от динамического массива объектов класса Triangle
  94. break;
  95. }
  96. case UserChoice::WITH_PARAMETERS:{ // конструктор с параметрами
  97. Triangle* triangles[triangles_count]; // указатель на массив с объектами класса Triangle
  98. for (int i = 0; i < triangles_count; i++){ // цикл на ввод треугольников
  99. float length[3]; // стороны треугольника
  100. cout << "\tInput " << i+1 << " triangle\n";
  101. for (int j = 0; j < 3; j++){ // цикл на ввод сторон текущего треугольника
  102. cout << "\t\t" << j+1 << " side: "; cin >> length[j];
  103. }
  104. // создание нового объекта класса Triangle через динамическое выделение памяти и передача введённых сторон в текущий треугольник
  105. triangles[i] = new Triangle(length[0], length[1], length[2]);
  106. }
  107. check_equilteral(triangles, triangles_count); // проверка треугольников на равносторонность
  108. for (int i = 0; i < triangles_count; i++) delete triangles[i]; // очистка памяти от динамического массива объектов класса Triangle
  109. break;
  110. }
  111. case UserChoice::STATIC_EXAMPLE:{ // использование статической переменной и конструктора с параметрами
  112. cout << "Total possible quantity of triangles: " << Triangle::get_total_quantity() << endl; // вывод макисмально возможного количества треугольников
  113. cout << "Do you want to change this value? y/n "; cin >> change_static_value; // изменение значения статической переменной
  114. if (change_static_value == 'y') { // если пользователь хочет изменить значение
  115. int new_total_quantity; // объявление новой переменной
  116. cout << "Input new total possible quantity of triangles: "; cin >> new_total_quantity; // ввод значения
  117. Triangle::set_total_quantity(new_total_quantity); // передача значения в функцию изменения значения статической переменной (сеттер)
  118. }
  119. Triangle* triangles[triangles_count]; // указатель на массив с объектами класса Triangle
  120. for (int i = 0; i < triangles_count; i++){ // цикл на ввод треугольников
  121. if (i >= (*triangles[i]).get_total_quantity()) break;
  122. float length[3]; // стороны треугольника
  123. cout << "\tInput " << i+1 << " triangle\n";
  124. for (int j = 0; j < 3; j++){ // цикл на ввод сторон текущего треугольника
  125. cout << "\t\t" << j+1 << " side: "; cin >> length[j];
  126. }
  127. // создание нового объекта класса Triangle через динамическое выделение памяти и передача введённых сторон в текущий треугольник
  128. triangles[i] = new Triangle(length[0], length[1], length[2]);
  129. }
  130. check_equilteral(triangles, (*triangles[0]).get_total_quantity()); // проверка треугольников на равносторонность
  131. for (int i = 0; i < (*triangles[0]).get_total_quantity(); i++) delete triangles[i]; // очистка памяти от динамического массива объектов класса Triangle
  132. break;
  133. }
  134. default: // если ничего не выбрано
  135. cout << "\n" << "Incorrect input." << "\n\n"; // вывод о некорректном вводе
  136. return 0; // завершение программы
  137. }
  138. return 0; // завершение
  139. }