-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdz3_sam.py
127 lines (117 loc) · 7.65 KB
/
dz3_sam.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# Класс Rectangle - работа с прямоугольниками
#
# Инструкция по использованию платформы
#
#
#
# Разработайте программу для работы с прямоугольниками. Необходимо создать класс Rectangle, который будет представлять прямоугольник с заданными шириной и высотой.
#
# Атрибуты класса:
#
# width (int): Ширина прямоугольника. height (int): Высота прямоугольника.
#
# Методы класса:
#
# __init__(self, width, height=None): Конструктор класса. Принимает ширину и высоту прямоугольника. Если высота не указана (по умолчанию None), то считается, что прямоугольник является квадратом, и высота устанавливается равной ширине.
#
# perimeter(self): Метод для вычисления периметра прямоугольника. Возвращает целое число - значение периметра.
#
# area(self): Метод для вычисления площади прямоугольника. Возвращает целое число - значение площади.
#
# __add__(self, other): Магический метод, который определяет операцию сложения (+) для двух прямоугольников. Принимает другой прямоугольник other. Создает новый прямоугольник, который представляет собой объединение исходных прямоугольников по периметру. Новая ширина и высота вычисляются также на основе объединения. Возвращает новый прямоугольник.
#
# __sub__(self, other): Магический метод, который определяет операцию вычитания (-) одного прямоугольника из другого. Принимает вычитаемый прямоугольник other. Создает новый прямоугольник, представляющий разницу периметров исходных прямоугольников, и вычисляет высоту на основе этой разницы. Новая ширина вычисляется также на основе разницы. Возвращает новый прямоугольник.
#
# __lt__(self, other): Магический метод, который определяет операцию "меньше" (<) для двух прямоугольников. Принимает другой прямоугольник other. Возвращает True, если площадь первого прямоугольника меньше площади второго, иначе False.
#
# __eq__(self, other): Магический метод, который определяет операцию "равно" (==) для двух прямоугольников. Принимает другой прямоугольник other. Возвращает True, если площади равны, иначе False.
#
# __le__(self, other): Магический метод, который определяет операцию "меньше или равно" (<=) для двух прямоугольников. Принимает другой прямоугольник other. Возвращает True, если площадь первого прямоугольника меньше или равна площади второго, иначе False.
#
# __str__(self): Магический метод, возвращающий строковое представление прямоугольника. Возвращает строку, описывающую ширину и высоту прямоугольника в виде:
# Прямоугольник со сторонами 2 и 3,
# где первое число - это ширина, а второе - высота.
#
# __repr__(self): Магический метод, возвращающий строковое представление прямоугольника, которое может быть использовано для создания нового объекта такого же класса с теми же атрибутами.
#
# Пояснение:
#
# Метод __add__ объединяет два прямоугольника по периметру и создает новый прямоугольник.
# Метод __sub__ вычитает один прямоугольник из другого, представляя разницу периметров исходных прямоугольников, и создает новый прямоугольник.
# Методы сравнения __lt__, __eq__ и __le__ сравнивают прямоугольники по их площади.
# Методы __str__ и __repr__ предоставляют строковое представление объекта класса Rectangle.
#
# Пример использования:
# На входе:
#
#
# rect1 = Rectangle(5, 10)
# rect2 = Rectangle(3, 7)
#
# print(f"Периметр rect1: {rect1.perimeter()}")
# print(f"Площадь rect2: {rect2.area()}")
# print(f"rect1 < rect2: {rect1 < rect2}")
# print(f"rect1 == rect2: {rect1 == rect2}")
# print(f"rect1 <= rect2: {rect1 <= rect2}")
#
# rect3 = rect1 + rect2
# print(f"Периметр rect3: {rect3.perimeter()}")
# rect4 = rect1 - rect2
# print(f"Ширина rect4: {rect4.width}")
# На выходе:
#
#
# Периметр rect1: 30
# Площадь rect2: 21
# rect1 < rect2: False
# rect1 == rect2: False
# rect1 <= rect2: False
# Периметр rect3: 50
# Ширина rect4: 2
class Rectangle:
def __init__(self, width, height=None):
self.width = width
if height:
self.height = height
else:
self.height = width
def perimeter(self):
return self.width * 2 + self.height * 2
def area(self):
return self.width * self.height
def __add__(self, other):
width = self.width + other.width
height = self.height + other.height
return Rectangle(width,height)
def __sub__(self, other):
perimeter_diff = abs(self.perimeter() - other.perimeter())
new_height = int((perimeter_diff / 4) // 1) +1
new_width = new_height - 1
return Rectangle(new_width, new_height)
def __eq__(self,other):
return self.area() == other.area()
def __ne__(self,other):
return self.area() != other.area()
def __gt__(self,other):
return self.area() > other.area()
def __ge__(self,other):
return self.area() >= other.area()
def __lt__(self,other):
return self.area() < other.area()
def __le__(self,other):
return self.area() <= other.area()
def __str__(self):
return f"Прямоугольник со сторонами {self.width} и {self.height}"
def __repr__(self):
return f"Rectangle({self.width}, {self.height})"
rect1 = Rectangle(5, 10)
rect2 = Rectangle(3, 7)
print(f"Периметр rect1: {rect1.perimeter()}")
print(f"Площадь rect2: {rect2.area()}")
print(f"rect1 < rect2: {rect1 < rect2}")
print(f"rect1 == rect2: {rect1 == rect2}")
print(f"rect1 <= rect2: {rect1 <= rect2}")
rect3 = rect1 + rect2
print(f"Периметр rect3: {rect3.perimeter()}")
rect4 = rect1 - rect2
print(f"Ширина rect4: {rect4.width}")