3 option.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include <iostream> // подключение библиотеки ввода-вывода
  2. #include <cmath> // подключение библиотеки для работы с математическими функциями
  3. using namespace std; // подключение стандартного пространства имён
  4. class Point {
  5. int x, y; // переменные x y, представляющие собой координаты точки
  6. public:
  7. Point() { // конструктор без параметров
  8. cout << "\nConstructor " << this << " initialized.\n"; // сообщение об инициализации конструктора
  9. }
  10. Point(int _x, int _y) { // конструктор с параметрами
  11. cout << "\nConstructor " << this << " initialized.\n";
  12. this->x = _x; this->y = _y; // передача аргументов функции в качестве значений переменных класса
  13. }
  14. /*
  15. // конструктор с параметрами по умолчанию
  16. Point(int _x = 0, int _y = 0){
  17. cout << "Constructor " << this << " initialized.\n"; // сообщение об инициализации конструктора
  18. this->x = _x; this->y = _y; // передача аргументов функции в качестве значений переменных класса
  19. }
  20. */
  21. void set_coordinates() { // сеттер (установка значений переменных класса)
  22. cout << " input x y coordinates with space: "; cin >> this->x >> this->y; // ввод значений переменных класса
  23. }
  24. void set_coordinates(int _x, int _y) { // дополнительный сеттер (с передачей значений через аргумент функции)
  25. this->x = _x; this->y = _y; // передача аргументов функции в качестве значений переменных класса
  26. }
  27. // геттеры
  28. int get_x() { return this->x; } // получение значения переменной x
  29. int get_y() { return this->y; } // получение значения переменной y
  30. int operator-(Point& b) { // перегрузка оператора вычитания
  31. // возвращает значение длины вектора по соответствующей формуле
  32. // отнимаем от значений основного объекта значения объекта, переданного в качестве аргумента
  33. return abs(sqrt((this->x - b.x) * (this->x - b.x) + (this->y - b.y) * (this->y - b.y)));
  34. }
  35. ~Point() { // деструктор
  36. cout << "Destructor " << this << " initialized.\n"; // сообщение об инициализации деструктора
  37. }
  38. };
  39. ostream& operator<< (ostream& out, Point& point) //перегрузка оператора вывода
  40. {
  41. return out << point.get_x() << " " << point.get_y(); // вывод значений x и y у объекта
  42. }
  43. enum class e_types { // список возможных фигур
  44. rect, // прямоугольник
  45. square, // квадрат
  46. rhombus, // ромб
  47. trapezoid, // трапеция
  48. same_shape, // произвольный многоугольник
  49. parallelogram // параллелограмм
  50. };
  51. e_types get_typeof_shape(Point& a, Point& b, Point& c, Point& d) { // функция определения фигуры по введённым точкам
  52. // подсчёт сторон фигуры
  53. int AB = a - b;
  54. int BC = b - c;
  55. int CD = c - d;
  56. int DA = d - a;
  57. // подсчёт диагоналей между противоположными углами
  58. int AC = a - c;
  59. int BD = b - d;
  60. // сравнение сторон. В зависимости от их соотношения делается определение фигуры
  61. if (AB == CD && BC == DA)
  62. {
  63. if (AB == BC && AC == BD) return e_types::square;
  64. else if (AB == BC && AC != BD) return e_types::rhombus;
  65. else if (AB != CD && AC == BD) return e_types::rect;
  66. else if (AB != CD && AC != BD) return e_types::parallelogram;
  67. else return e_types::same_shape;
  68. }
  69. else {
  70. if (((a.get_x() - b.get_x()) * (c.get_y() - d.get_y()) == (a.get_y() - b.get_y()) * (c.get_x() - d.get_x())) ||
  71. ((a.get_x() - d.get_x()) * (b.get_y() - c.get_y()) == (a.get_y() - d.get_y()) * (b.get_x() - c.get_x()))){
  72. return e_types::trapezoid;
  73. }
  74. else {
  75. return e_types::same_shape;
  76. }
  77. }
  78. }
  79. static void correct_and_print(Point& point) { // статическая функция для переопределения значения статической переменной
  80. int x, y;
  81. cout << "Enter new points: "; cin >> x >> y;
  82. point.set_coordinates(x, y);
  83. }
  84. int get_square(Point& a, Point& b){ // функция получения площади квадрата
  85. return ((a - b) * (a - b)); // вычисление значения площади
  86. }
  87. void delete_points(Point *points[4]){ // функция удаления точек
  88. cout << "\n";
  89. for (int i = 0; i < 4; i++){ // цикл от 0 до 4
  90. delete points[i]; // удаление точки
  91. }
  92. }
  93. enum UserChoice { // список возможных выборов пользователя
  94. DEFAULT, // конструктор по умолчанию (без параметров)
  95. WITH_PARAMETERS, // конструктор с параметрами
  96. STATIC_EXAMPLE // использование статического метода и конструктор без параметров
  97. };
  98. int main() {
  99. // Важный момент - точки строятся друг за другом, то есть программа
  100. // производит расчёт исходя из порядка ввода точек.
  101. // То бишь, на одни и те же координаты, введённые в разном порядке программа выдаст 2 разных результата
  102. int choice; // выбор типа конструктора
  103. Point *points[4]; // массив указателей с классом Point
  104. // переменная типа e_types для определения результата
  105. e_types* result;
  106. result = new e_types;
  107. // вывод меню выбора
  108. cout << "Please, choose constructor's type:" << "\n";
  109. cout << "1. Default constructor (without parameters)." << "\n";
  110. cout << "2. Constructor with parameters." << "\n";
  111. cout << "3. Example static point." << "\n\n";
  112. // ввод пользователя
  113. cin >> choice;
  114. // выбор дальнейших действий в зависимости от ввода пользователя
  115. switch (choice - 1) // отнимаем 1, так как отсчёт идёт с нуля
  116. {
  117. case UserChoice::DEFAULT: // конструктор без параметров
  118. {
  119. cout << "\n" << "Default constructor." << "\n\n"; // вывод типа конструктора
  120. for (int i = 0; i < 4; i++){ // цикл от 0 до 4
  121. points[i] = new Point(); // явная инициализация объекта
  122. cout << i+1 << " point -";
  123. (*points[i]).set_coordinates(); // ввод значений
  124. }
  125. cout << "\n\n";
  126. // вывод координат точек через перегрузку оператора вывода
  127. for (int i = 0; i < 4; i++){
  128. cout << i+1 << " point coordinates: " << (*points[i]) << endl;
  129. }
  130. cout << "\n";
  131. *result = get_typeof_shape(*points[0], *points[1], *points[2], *points[3]); // определение фигуры по введённым точкам
  132. break;
  133. }
  134. case UserChoice::WITH_PARAMETERS: // конструктор с параметрами
  135. {
  136. cout << "\n" << "Constructor with parameters." << "\n\n"; // вывод типа конструктора
  137. for (int i = 0; i < 4; i++){
  138. int x, y; // инициализация переменных
  139. cout << i+1 << " point -" << " input x y coordinates with space: "; cin >> x >> y; // ввод переменных
  140. points[i] = new Point(x, y); // явная инициализация через конструктор с параметрами
  141. }
  142. cout << "\n\n";
  143. // вывод координат точек через перегрузку оператора вывода
  144. for (int i = 0; i < 4; i++){
  145. cout << i+1 << " point coordinates: " << (*points[i]) << endl;
  146. }
  147. cout << "\n";
  148. *result = get_typeof_shape(*points[0], *points[1], *points[2], *points[3]); // определение фигуры по введённым точкам
  149. break;
  150. }
  151. case UserChoice::STATIC_EXAMPLE: // конструктор без параметров и использование статической переменной
  152. {
  153. cout << "\n" << "Default constructor." << "\n\n";
  154. string change_static_value; // выбор изменения статической переменной
  155. static Point* example = new Point(0, -3); // создание статической переменной, задающей координаты точки
  156. cout << "\nStatic point's coordinates: " << (*example) << "\n"; // вывод значений статической переменной через перегрузку оператора вывода
  157. for (int i = 0; i < 4; i++){ // цикл от 0 до 4
  158. points[i] = new Point(); // явная инициализация объекта
  159. cout << i+1 << " point -";
  160. (*points[i]).set_coordinates(); // ввод значений
  161. }
  162. cout << "\n\n";
  163. cout << "Do you want correct static point? y/n: "; cin >> change_static_value;
  164. // если пользователь хочет изменить значение статической переменной
  165. if (change_static_value == "y") correct_and_print(*example); // вызыв статической функции для переопределения точки
  166. points[0] = new Point((*example).get_x(), (*example).get_y()); // присваивание значения статической переменной в качестве 1 элемента массива с остальными точками
  167. cout << "\n\n";
  168. // вывод координат точек через перегрузку оператора вывода
  169. for (int i = 0; i < 4; i++){
  170. cout << i+1 << " point coordinates: " << (*points[i]) << endl;
  171. }
  172. cout << "\n";
  173. delete example; // удаление статической переменной за ненадобностью
  174. *result = get_typeof_shape(*points[0], *points[1], *points[2], *points[3]); // определение фигуры
  175. break;
  176. }
  177. default: // если ничего не совпало
  178. cout << "\n" << "Incorrect input." << "\n\n"; // вывод о некорректном вводе
  179. delete result; // удаление result, так как переменная является динамической
  180. return 0; // завершение программы
  181. break;
  182. }
  183. cout << "\nDefined type of shape: ";
  184. switch (*result)// проверка результата определения фигуры
  185. {
  186. case e_types::same_shape:
  187. cout << "arbitrary quadrangle" << endl; // произвольный четырёхугольник
  188. break;
  189. case e_types::rect:
  190. cout << "rect" << endl; // прямоугольник
  191. break;
  192. case e_types::rhombus:
  193. cout << "rhombus" << endl;// ромб
  194. break;
  195. case e_types::square:
  196. cout << "square" << endl; // квадрат
  197. cout << "square area: " << get_square(*points[0], *points[1]) << "\n"; // определение площади квадрата
  198. break;
  199. case e_types::trapezoid:
  200. cout << "trapezoid" << endl; //трапеция
  201. break;
  202. case e_types::parallelogram:
  203. cout << "parallelogram" << endl; // параллелограмм
  204. break;
  205. }
  206. delete result; // удаление result, так как переменная является динамической
  207. delete_points(points); // удаление динамического массива с объектами класса Point
  208. return 0; // конец программы
  209. }