Класс прямоугольников и его методы

Прохожу все тесты, указанные в примерах. Но последний тест, который не указан - выдаёт ошибку.

Разработайте класс Rectangle.

При инициализации класс принимает два кортежа рациональных координат противоположных углов прямоугольника (со сторонами параллельными осям координат).

get_pos() — возвращает координаты верхнего левого угла в виде кортежа;

get_size() — возвращает размеры в виде кортежа;

move(dx, dy) — изменяет положение на заданные значения;

resize(width, height) — изменяет размер (положение верхнего левого угла остаётся неизменным)

Примечание Ваше решение должно содержать только классы и функции. В решении не должно быть вызовов инициализации требуемых классов. Все результаты вычислений нужно округлить до сотых.

Пример 1

Ввод rect = Rectangle((3.2, -4.3), (7.52, 3.14))

print(rect.get_pos(), rect.get_size())

rect.move(1.32, -5)

print(rect.get_pos(), rect.get_size())

Вывод

(3.2, 3.14) (4.32, 7.44)

(4.52, -1.86) (4.32, 7.44)

Пример 2

Ввод

rect = Rectangle((7.52, -4.3), (3.2, 3.14))

print(rect.get_pos(), rect.get_size())

rect.resize(23.5, 11.3)

print(rect.get_pos(), rect.get_size())

Вывод

(3.2, 3.14) (4.32, 7.44)

(3.2, 3.14) (23.5, 11.3)

Мой код, ООП только начинаю проходить, самостоятельно. Примеры здесь внесла для проверки. В тестирующую систему отправляю без них.

class Rectangle:
    def __init__(self, coord_1=(0., 0.), coord_2=(0., 0.)):
        self.coord_1 = coord_1
        self.coord_2 = coord_2
        if self.coord_2[0] > self.coord_1[0]:
            self.top_left = self.coord_1[0], self.coord_2[1]
            self.btm_rigth = self.coord_2[0], self.coord_1[1]
        elif self.coord_2[1] > self.coord_1[1]:
            self.top_left = self.coord_2
            self.btm_rigth = self.coord_1
        else:
            self.top_left = self.coord_1
            self.btm_rigth = self.coord_2
        self.width = abs(self.btm_rigth[0] - self.top_left[0])
        self.height = abs(self.btm_rigth[1]) + abs(self.top_left[1])

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

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

    def get_pos(self):
        return self.top_left

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

    def move(self, dx, dy):
        self.top_left = list(self.top_left)
        self.btm_rigth = list(self.btm_rigth)
        self.top_left = (round((self.top_left[0] + dx), 2),
                         round((self.top_left[1] + dy), 2))
        self.btm_rigth = (round((self.btm_rigth[0] + dx), 2),
                          round((self.btm_rigth[1] + dy), 2))

    def resize(self, width, height):
        self.btm_rigth = list(self.btm_rigth)
        self.btm_rigth = (self.btm_rigth[0] + self.width - width,
                          self.btm_rigth[1] + self.height - height)
        self.width = width
        self.height = height


rect = Rectangle((3.2, -4.3), (7.52, 3.14))
print(rect.get_pos(), rect.get_size())
rect.move(1.32, -5)
print(rect.get_pos(), rect.get_size())

rect = Rectangle((7.52, -4.3), (3.2, 3.14))
print(rect.get_pos(), rect.get_size())
rect.resize(23.5, 11.3)
print(rect.get_pos(), rect.get_size())

Тест 3. Ответ неверный. Ошибка в программе или неверный алгоритм.


Ответы (2 шт):

Автор решения: YaAlex

Ваш класс Rectangle имеет правильную структуру и методы, но есть небольшая ошибка в методе move, и вам нужно изменить метод resize:

  1. Метод move должен изменять положение верхнего левого угла, но вы изменяете и верхний левый угол и правый нижний угол. Вам нужно только изменить верхний левый угол.

  2. Метод resize должен изменить размер, но не должен изменять положение верхнего левого угла. Вам нужно только изменить ширину и высоту.

Вот исправленный код:

class Rectangle:
    def __init__(self, coord_1=(0., 0.), coord_2=(0., 0.)):
        self.coord_1 = coord_1
        self.coord_2 = coord_2
        if self.coord_2[0] > self.coord_1[0]:
            self.top_left = self.coord_1
            self.btm_rigth = self.coord_2
        else:
            self.top_left = self.coord_2
            self.btm_rigth = self.coord_1
        self.width = abs(self.btm_rigth[0] - self.top_left[0])
        self.height = abs(self.btm_rigth[1] - self.top_left[1])

    def get_pos(self):
        return self.top_left

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

    def move(self, dx, dy):
        self.top_left = (round(self.top_left[0] + dx, 2), round(self.top_left[1] + dy, 2))
        self.btm_rigth = (round(self.btm_rigth[0] + dx, 2), round(self.btm_rigth[1] + dy, 2))

    def resize(self, width, height):
        self.width = width
        self.height = height

rect = Rectangle((3.2, -4.3), (7.52, 3.14))
print(rect.get_pos(), rect.get_size())
rect.move(1.32, -5)
print(rect.get_pos(), rect.get_size())

rect = Rectangle((7.52, -4.3), (3.2, 3.14))
print(rect.get_pos(), rect.get_size())
rect.resize(23.5, 11.3)
print(rect.get_pos(), rect.get_size())

Теперь класс Rectangle должен работать правильно, и тесты должны проходить без ошибок.

→ Ссылка
Автор решения: Pozitiffa

Вот код, который прошел все тесты

class Rectangle:
    def __init__(self, coord_1, coord_2):
        self.coord_1 = coord_1
        self.coord_2 = coord_2
        self.top_left = (min(self.coord_1[0], self.coord_2[0]),
                         max(self.coord_1[1], self.coord_2[1]))
        self.btm_rigth = (max(self.coord_1[0], self.coord_2[0]),
                          min(self.coord_1[1], self.coord_2[1]))
        self.width = abs(self.btm_rigth[0] - self.top_left[0])
        self.height = abs(self.btm_rigth[1] - self.top_left[1])

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

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

    def get_pos(self):
        return self.top_left

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

    def move(self, dx, dy):
        self.top_left = (round(self.top_left[0] + dx, 2),
                         round(self.top_left[1] + dy, 2))
        self.btm_rigth = (round(self.btm_rigth[0] + dx, 2),
                          round(self.btm_rigth[1] + dy, 2))

    def resize(self, width, height):
        self.btm_rigth = (round(self.top_left[0] + width, 2),
                          round(self.top_left[1] - height, 2))
        self.width = round(width, 2)
        self.height = round(height, 2)

изменила поле верхнего левого угла и нижнего правого, поле высоты; метод resize, во всех вычислениях добавила округление

→ Ссылка