Задание. Площадь региона
Вычислить площадь региона, заданного непересекающимися геометрическими фигурами. Необходимо реализовать типы различных фигур в виде пользовательских типов данных (классов).
Задача
Дан список геометрических фигур (исходные данные). Эти фигуры не пересекают друг друга. Требуется ответить на два вопроса:
- Какова суммарная площадь этих фигур?
- Какие пять фигур имеют наибольшую площадь?
Фигуры, которые нужно реализовать:
- Круг (класс
Circle
). Параметр круга — одно число (радиус). - Прямоугольник (класс
Rect
). Параметры прямоугольника — два числа (ширина и высота). - Треугольник (класс
Triangle
). Параметры треугольника — три числа (длины трёх его сторон).
Пожелания по решению
Удобно будет реализовать классы геометрических фигур, реализующие протокол вычисления площади.
Пусть класс, реализующий протокл вычисления площади, содержит следующие методы:
area()
— возвращает вещественное число (float), равное площади фигуры.
Кроме того, все нужные параметры фигура должна получать при создании, как параметры конструктора класса.
Так же необходимо реализовать метод __str__()
, чтобы фигуру можно было вывести на экран при помощи функции print()
.
Для удобства я рекомендую создание фигуры вынести в функцию (например, create_figure
). Пусть эта функция принимает в качестве аргументов название типа фигуры и список её параметров (вся эта информация — из исходного файла), а возвращает вновь созданную фигуру. Такая функция будет называться фабричный метод (или factory method). Фабричный метод входит в классический список па́ттернов проектирования. Подробнее об этом паттерне можно прочесть тут. Так же на этом сайте можно почитать и про другие паттерны.
Исходные данные
Список фигур, из которых состоит регион, скрипт должен прочитать из текстового файла figures.txt
. Скачайте его по ссылке: https://anhel.in/files/figures.txt.
Каждая строка файла описывает одну фигуру и имеет следующий формат:
название-класса-фигуры,параметр1,параметр2
Элементы строки разделены запятыми. Количество параметров в строке зависит от типа фигуры (у круга один, у прямоугольника два, у треугольника три).
Название класса фигуры может быть:
Circle
— кругRect
— прямоугольникTriangle
— треугольник
Результат выводится на экран.
Пример класса Circle
import math
class Circle:
def __init__(self, params):
if len(params) != 1:
raise ValueError("Circle needs only one parameter")
self.r = params[0]
def area(self):
return math.pi * (self.r ** 2)
def __str__(self):
return "Circle(r={})".format(self.r)
Остальные классы фигур реализуйте аналогично.
Замечания по реализации
- Формулы вычисления площади соответствующих фигур посмотрите в интернете.
- Площадь треугольника по трём известным сторонам можно вычислить по формуле Герона
- Квадратный корень из числа считает функция
math.sqrt(x)
(нужно импортировать модуль math). - «Вывести фигуру» значит вывести с помощью
print
её строковое представление. Для этого у каждой фигуры должна быть адекватная реализация метода__str__(self)
. - Чтобы вывести пять фигур с наибольшей площадью, проще всего отсортировать список фигур по площади и сделать срез первых пяти элементов этого списка.