ITI0011RUS:task 08
Срок сдачи упражнения 14-е занятие (25 марта).
Общая информация об упражнениях: ITI0011RUS_Practice.
Обратно на страницу предмета.
Описание
Создать классы для описания объектов различной формы. Все классы должны либо напрямую, либо через какой-либо другой промежуточный класс, наследовать класс Shape
(см. шаблон). Классы, которые следует описать:
- Triangle. Конструктор треугольников должен принимать три параметра типа целых чисел, соответсвующие длинам ребер треугольника.
- Ellipse. Конструктор эллипсов должен принимать два целых числа в качестве параметров: ближайшее и наибольее расстояния от центральной точки до линии эллипса.
- Rectangle. Конструктор прямоугольников также принимает два значение в качестве аргументов: значения ширины и высоты прямоугольника.
- Circle. Должен наследовать класс Ellipse. Конструктор окружностей должен принимать один параметр - радиус (расстояние от центра до окружности).
- Square. Должен наследовать класс Rectangle. Конструктор принимает один параметр - длину стороны квадрата.
Поскольку в классе Shape
описаны два абстрактных метода, все классы, которые наследуют класс Shape
, должны задать реализацию этих методов. Классы Circle
и Square
должны использовать функционал непосредственного базового класса. В этих классах следует создать свои конструкторы, поскольку они отличаются от конструктора базового класса. Эти конструкторы должны вызывать конструктор базового класса. В классы Circle
и Square
больше никакого функционала реализовывать не нужно. Например, при создании прямоугольника, требуется задать два значения, a и b. Для создания квадрата достаточно одного значения а. Таким образом, в конструкторе квадрата следует вызвать конструктор прямоугольника, в который следует передать значение а дважды (поскольку ширина квадрата равна его высоте).
У всех фигур следует проверять, чтобы параметры были в допустимых пределах - тоесть чтобы фигуру можно было бы создать. Например, отрицательное значение ширины или высоты у фигуры невозможно. В случае неподходящих параметров методы getArea()
и getPerimeter()
должны возвращать значение Double.Nan
. Было бы более корректно, если конструктор выкидывал бы исключение при попытке передать в него неподходящие параметры, например, IllegalArgumentException
. Если вам такое решение кажется более верным, то скрипт автоматического тестирования считает корректными оба варианта решения - тот, при котором конструктор выкидывает исключение в случае попытки передачи конструктору некорректных данных, либо методы getArea()
и getPerimeter()
, возвращающие значение Double.Nan
, если значения полей классов выходят за допустимые пределы.
Ниже вы найдете шаблон, который следует использовать для решения этого упражнения.
Методы
Помимо самих классов, следует создать 4 метода:
public static double getCircularShapesTotalArea(List<Shape> shapes)
. Функция принимает список фигур в качестве параметра. Площади всех округлых фигур следует сложить и вернуть сумму их площадей.public static double getNonCircularShapesTotalPerimeter(List<Shape> shapes)
.
Периметры всех не-округлых фигур следует сложить и вернуть их сумму.
public static int countUniqueEllipses(List<Shape> shapes)
. Функция подсчитывает все уникальные эллипсоидные объекты. Эллипсы можно определить конструкциейx instanceof Ellipse
. Уникальными являются объекты, которые не являются одним и тем же объектом - тоесть располагаются по разным адресам в памяти.public static int countDifferentRectangles(List<Shape> shapes)
. Функция подсчитывает количество различных прямоугольников. Прямоугольники можно определить конструкциейx instanceof Rectangle
. Прямоугольники считаются различными, если у них хотя бы одно поле отличается. Причем объектыRectangle(10, 20)
иRectangle(20, 10)
являются одинаковыми в рамках данного задания.
Шаблон
Shape.java <source lang="java">
/**
* General abstract class Shape. All the different * shapes in this exercise have to extend it directly * or through another class.
*
* All the abstract methods have to implemented by the class * which extends this class (and is not abstract itself). */ public abstract class Shape { /** * Calculates the total area for the shape. * As it is an abstract method, every class * which extends Shape has to implement this method, * e.g. override this method and write the body * which actually does the calculations. *
* Note that abstract method definition doesn't * have body (no {} part). * @return Area of the shape */ public abstract double getArea(); /** * Calculates the perimeter of the shape. * For circular shapes, perimeter is also called * circumference. * @return Perimeter of the shape */ public abstract double getPerimeter(); } </source> EX08.java: <source lang="java"> import java.util.ArrayList; import java.util.HashSet; import java.util.List; /** * The main class where some static methods * which operate on shapes list are declared. */ public class EX08 { public static void main(String[] args) { // Shape s = new Shape(); // should not be allowed Circle c = new Circle(10); Ellipse e = new Ellipse(10, 5); Rectangle r = new Rectangle(10, 12); Rectangle r2 = new Rectangle(10, 12); Square s = new Square(5); Triangle t = new Triangle(3, 4, 5); List<Shape> shapes = new ArrayList<Shape>(); //shapes.add(c); shapes.add(e); shapes.add(r); shapes.add(r); shapes.add(r2); shapes.add(s); shapes.add(t); System.out.println(getCircularShapesTotalArea(shapes)); System.out.println(getNonCircularShapesTotalPerimeter(shapes)); System.out.println(countUniqueEllipses(shapes)); System.out.println(countDifferentRectangles(shapes)); } /** * Given a list of shapes, sum up the area for all the circular shapes. * @param shapes A list of shapes. * @return Total area of circular shapes */ public static double getCircularShapesTotalArea(List<Shape> shapes) { // TODO: implement return Double.NaN; } /** * Given a list of shapes, sum up the perimeter for all the * non-circular shapes. * @param shapes A list of shapes. * @return Total perimeter of non-circular shapes. */ public static double getNonCircularShapesTotalPerimeter(List<Shape> shapes) { // TODO: implement return Double.NaN; } /** * Count unique ellipses in the given list of shapes. * Every different instance of Ellipse is a unique ellipse. * The same object instance in the list is considered as a duplicate. * @param shapes A list of shapes * @return Count of unique ellipses (hoe many ellipses are in the memory). */ public static int countUniqueEllipses(List<Shape> shapes) { // TODO: implement return -1; } /** * Count different rectangles in the given list of shapes. * Two rectangles are different if at least one of the sides * (a or b) is not equal for both rectangles. * @param shapes A list of shapes. * @return Count of different rectangless. */ public static int countDifferentRectangles(List<Shape> shapes) { // TODO: implement return -1; } } </source>