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
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
seva
seva
31.07.2025 00:40
class Rectangle:

    def __init__(self, first, second):
        (x1, y1), (x2, y2) = first, second
        x1, x2 = sorted((x1, x2))
        y1, y2 = sorted((y1, y2))
        self.x1, self.y1 = x1, y1  
        self.x2, self.y2 = x2, y2 
        self.width, self.height = x2 - x1, y2 - y1

    def perimeter(self):
        return round(2 * (self.width + self.height), 2) 

    def area(self):
        return round(self.width * self.height, 2)