Язык программирования Python

Курс IT-Академии Сухорукова

Январь-март 2019

Следующее занятие

19 февраля в 19:00 NOVT

Задание. Площадь региона

Вычислить площадь региона, заданного непересекающимися геометрическими фигурами. Необходимо реализовать типы различных фигур в виде пользовательских типов данных (классов).

Задача

Дан список геометрических фигур (исходные данные). Эти фигуры не пересекают друг друга. Требуется ответить на два вопроса:

  1. Какова суммарная площадь этих фигур?
  2. Какие пять фигур имеют наибольшую площадь?

Фигуры, которые нужно реализовать:

  • Круг (класс 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).
  • Чтобы вывести пять фигур с наибольшей площадью, проще всего отсортировать список фигур по площади и сделать срез первых пяти элементов этого списка.