ITI0011RUS:task 08

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti

Срок сдачи упражнения 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>