E. Классный прямоугольник

Давайте перейдём к более сложным геометрическим фигурам.

Разработайте класс 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, потому что эта идея нам пригодится в решении следующей задачи.

Посмотреть код

Решение

Python
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)

Решение

Python
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)
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии