АВТ
Язык:

Дистанционный практикум по программированию

Задачи Online статус Соревнования
Новости Справка СДО
 
Здравствуйте, Гость! Войдите с паролем или зарегистрируйтесь.

1648. Фигуры

Ограничение времени: 1 сек.
Ограничение памяти:262144 КБайт
Баллы:100
Статистика Послать на проверку Задачу добавил debug

Дана следующая иерархия классов геометрических фигур:
  • Абстрактный базовый класс Shape (фигура). Содержит поле color(цвет) и абстрактный метод area (площадь). Также имеет абстрактный метод draw, полученный от интерфейса Drawable.
  • Интерфейс Drawable (способность быть нарисованным). Имеет один метод draw (нарисовать себя).
  • Класс Point (точка) - точка на плоскости с целочисленными координатами.
  • Класс Circle (окружность) - наследник от класса Shape. Содержит поля радиус и центр окружности, конструктор, свои реализации виртуальных методов area и draw.
  • Класс Triangle (треугольник) - также наследник от класса Shape. Содержит три поля - вершины треугольника, конструктор, свои реализации виртуальных методов area и draw.
Все данные классы располагаются в пакете ru.edu.vstu.avt.shapes.

Для решения задачи скачайте архив shapes.tar (с форматом tar умеют работать, например, 7z и Far), выполните приведённые ниже задания, результат запакуйте в tar-архив (с точно такой же структурой папок внутри) и отошлите его на проверку. При отправке решения используйте кнопку выбора файла.

Задания

  1. Добавьте в класс Shape абстрактную функцию вычисления периметра с именем perimeter и переопределите её в классах-потомках.
  2. Добавьте ещё один public класс Polygon - произвольный многоугольник. Его единственный конструктор должен принимать переменное число аргументов, где первый аргумент - это цвет (тип int), а все следующие аргументы - это точки (тип Point) в порядке обхода. В случае, если количество точек меньше трех, конструктор должен выбрасывать исключение типа IllegalArgumentException.
  3. Реализуйте для класса Polygon методы вычисления площади и периметра. Подсказка: площадь многоугольника может быть вычислена как сумма площадей трапеций со знаком.
  4. Создайте public интерфейс Moveable с одним методом void moveBy(int dx, int dy), который перемещает фигуру на вектор (dx, dy). Реализуйте его в классе Shape и переопределите метод moveBy во всех классах-наследниках.
  5. Сделайте так, чтобы по точкам - вершинам полигона можно было проходить циклом for с двоеточием. Подсказка: необходимо реализовать интерфейс Iterable.
Ограничения: аргументы конструкторов всех классов могут принимать любые значения из диапазона типа int. При этом гарантируется, что при вызове метода moveBy координаты не выйдут за пределы типа int. Абсолютная или относительная погрешность результата функций area и perimeter не должна превосходить 10-6.

Исходные данные


Пример действий, которые будут производиться с вашим классом при проверке:

        Point p[] = {new Point(0, 0), new Point(10, 0), new Point(10, 10), new Point(0, 10)};
        Shape s = new Polygon(1, p);
        out.printf("Area = %.3f%n", s.area());
        out.printf("Perimeter = %.3f%n", s.perimeter());
        s.moveBy(7, 8);
        for (Point pt : (Polygon)s) {
          out.println("Point: " + pt.x + " " + pt.y);
        }
        Polygon pol = new Polygon(1, new Point(5, 0), new Point(0, 10), new Point(0, 0));
        out.printf("Area = %.3f%n", pol.area());
        out.printf("Perimeter = %.3f%n", pol.perimeter());
        Triangle t = new Triangle(1, new Point(5, 0), new Point(0, 10), new Point(0, 0));
        out.printf("Area = %.3f%n", t.area());
        out.printf("Perimeter = %.3f%n", t.perimeter());
 

Результат

Area = 100.000
Perimeter = 40.000
Point: 7 8
Point: 17 8
Point: 17 18
Point: 7 18
Area = 25.000
Perimeter = 26.180
Area = 25.000
Perimeter = 26.180

Статистика Послать на проверку Обсуждение задачи Автор/источник:
Учебные курсы / Программирование на языке высокого уровня / Продолжение следует /
97. Прогрессия 1648.
 
время генерации 0.078 сек.
© Copyright ВоГУ, АВТ, Носов Д.А., Андрианов И.А.