Давайте перейдём к более сложным геометрическим фигурам.
Разработайте класс Rectangle
.
При инициализации класс принимает два кортежа рациональных координат противоположных углов прямоугольника (со сторонами параллельными осям координат).
Класс должен реализовывать методы:
perimeter
— возвращает периметр прямоугольника;area
— возвращает площадь прямоугольника.
Все результаты вычислений нужно округлить до сотых.
Примечание
Ваше решение должно содержать только классы и функции.
В решении не должно быть вызовов инициализации требуемых классов.
Пример
Ввод
rect = Rectangle((3.2, -4.3), (7.52, 3.14))
print(rect.perimeter())
Вывод
23.52
Ввод
rect = Rectangle((7.52, -4.3), (3.2, 3.14))
print(rect.area())
Вывод
32.14
Решение
На примере этой серии задач моно научиться видоизменять видоизменять класс под все более точную постановку задачи – по мере появления новой информации нам придется модифицировать наш класс. Это довольно частая ситуация в реальном программировании, потому что задача редко бывает сформулирована достаточно детально.
Нам дается две координаты противоположных углов. Мы моем работать с ними как есть, используя функцию abs() для вычисления длин сторон нашего прямоугольника, а можем упорядочить наши координаты таким образом, чтобы использовать например левый нижний и правый верхний углы. В этой парадигме немного проще мыслить чем в истории с абсолютной разницей между координатами.
Если немного подумать, то можно увидеть, что нам нет необходимости держать в памяти какие-либо координаты, достаточно вычислить высоту и ширину прямоугольника. будем считать это решение решением задачи Классный прямоугольник 1.5, потому что эта идея нам пригодится в решении следующей задачи.
Посмотреть код
Решение
class Rectangle:
def __init__(self, corner1, corner2) -> None:
self.left_down = min(corner1[0], corner2[0]), min(corner1[1], corner2[1])
self.up_right = max(corner1[0], corner2[0]), max(corner1[1], corner2[1])
def perimeter(self):
return round((self.up_right[0] - self.left_down[0]) * 2 +
(self.up_right[1] - self.left_down[1]) * 2, 2)
def area(self):
return round((self.up_right[0] - self.left_down[0]) *
(self.up_right[1] - self.left_down[1]), 2)
Решение
class Rectangle:
def __init__(self, *coords):
self.coords = coords
self.width = abs(self.coords[0][0] - self.coords[1][0])
self.height = abs(self.coords[0][1] - self.coords[1][1])
def perimeter(self):
return round(2 * (self.width + self.height), 2)
def area(self):
return round(self.width * self.height, 2)