ITI0011-2015:harjutus 08

Allikas: Kursused
Redaktsioon seisuga 16. märts 2015, kell 01:16 kasutajalt Ago (arutelu | kaastöö) (→‎Loodavad funktsioonid)
Mine navigeerimisribale Mine otsikasti

Kirjeldus

Luua klassid, millega saab defineerida erinevaid kujundi-objekte. Kõik nimetatud klassid peavad kas otse või läbi mõne teise klassi pärinema Shape klassist (vt allpool malli). Klassid, mis tuleks kirjeldada:

  • Triangle (kolmnurk). Kolmnurga objektil on konstruktor, kuhu saab ette anda kolm täisarvu: kolme külje pikkused.
  • Ellipse (ellips). Ellipsil objektil on konstruktor, kuhu saab ette anda kaks täisarvu: lühim kaugus keskpunktist jooneni ja pikim kaugus keskpunktist jooneni.
  • Rectangle (ristkülik). Ristkülikul on konstruktor, kuhu saab ette anda kahe kõrvuti oleva külje pikkused (a ja b).
  • Circle (ring). See pärineb Ellipse klassist. Kirjeldab ära konstruktori, mis võtab vastu ühe täisarvu - raadiuse (kaugus keskpunktist jooneni).
  • Square (ruut). Pärineb Rectangle klassist. Kirjeldab ära konstruktori, mis võtab vastu ühe täisarvu - ruutu külje pikkuse.

Kuna Shape klassis on kirjeldatud ära kaks abstraktset meetodit, peavad kõik Shape klassi laiendavad klassid ära kirjeldama nende meetodite sisu. Circle ja Square peavad ära kasutama oma vahetu ülemklassi funktsionaalsust. Nendes klassides tuleb eraldi konstruktor luua, kuna see on erinev ülemklassi omast. Loodud konstruktor peaks välja kutsuma superklassi konstruktori. Muid funktsioone pole nendesse klassidesse (Circle, Square) vaja. Näiteks, ristküliku defineerimisel antaks ette kaks väärtust: a ja b. Ruudu loomisel piisab ühest väärtusest: a. Seega, ruudu loomisel (konstruktoris) peab ära kasutama ristküliku konstruktori, kuhu antakse ette kahe külje suurused (ruudu puhul on need mõlemad samad, ehk kaasa läheb a ja a).

Kõikide kujundite puhul tuleb kontrollida ka seda, kas antud parameetrid on võimalikud (ehk siis kas kujund saab tekkida). Näiteks negatiivne küljepikkus ei ole sobiv. Ebasobivate parameetrite puhul peab nii getArea() kui ka getPerimeter() tagastama Double.Nan. Valikuline: tegelikult ilusam lahendus on see, kui konstruktor annab ebasobivate parameetrite puhul IllegalArgumentException. Seega, kui teile tundub selline lahendus parem, siis testskript arvestab mõlemad õigeks (nii selle, kui ebasobivate argumentidega kujund luuakse, kui ka selle, kui see kujund annab Double.NaN tulemuseks getArea() ja getPerimeter() väljakutsete peale).

Allpool on toodud mall, mida peaks kasutama ülesande teksti juurde.

Loodavad funktsioonid

Lisaks andmeklassidele tuleb luua 4 funktsiooni:

  • public static double getCircularShapesTotalArea(List<Shape> shapes). Funktsioonile antakse ette nimekiri kujunditest. Kõikide ümarate kujundite pindalad tuleb kokku liita ja tagastada saadud pindalade summa
  • public static double getNonCircularShapesTotalPerimeter(List<Shape> shapes). Kõikide mitte-ümarate kujundite ümbermõõdud tuleb kokku liita ja saadud summa tagastada.
  • public static int countUniqueEllipses(List<Shape> shapes). Loendab kokku kõik unikaalsed ellips-tüüpi objektid. Ellips-tüüpi objekte saab tuvastada x instanceof Ellipse konstruktsiooniga. Unikaalsed on need objektid, mis ei ole samad isendid. Ehk siis asuvad mälus erinevates paikades, isegi juhul, kui objekti muutujad on täpselt samad.
  • public static int countDifferentRectangles(List<Shape> shapes). Loendab kokku erinevad ristkülik-tüüpi objektid. Ristkülik-tüüpi objekte saab tuvastada x instanceof Rectangle konstruktsiooniga. Erinevad ristkülikud on need, millel on vähemalt üks erinev omadus (muutuja). Ehk siis kui nimekirjas on kaks ristkülikut, mille külgede numbrid on 10 ja 20, siis need ei ole erinevad ristkülikud. Kusjuures antud ülesande puhul külgede järjekord pole oluline. Ehk siis ristkülikud Rectangle(10, 20) ja Rectangle(20, 10) ei ole erinevad (antud funktsiooni mõttes loetakse need üheks).

Mall

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>