Класс прямоугольников и его методы
Прохожу все тесты, указанные в примерах. Но последний тест, который не указан - выдаёт ошибку.
Разработайте класс 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 шт):
Ваш класс Rectangle имеет правильную структуру и методы, но есть небольшая ошибка в методе move, и вам нужно изменить метод resize:
Метод
moveдолжен изменять положение верхнего левого угла, но вы изменяете и верхний левый угол и правый нижний угол. Вам нужно только изменить верхний левый угол.Метод
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 должен работать правильно, и тесты должны проходить без ошибок.
Вот код, который прошел все тесты
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, во всех вычислениях добавила округление