A feladat egy olyan alkalmazás készítése, amellyel szimulálni tudjuk termékek elszállítását gyárakból. A gyárakban a téglatest alakú dobozokba csomagolt termékek egyetlen futószalagra kerülnek, ahonnan a szállítók fuvarozzák el őket. A gyártás során a legyártott dobozok a futószalag végére kerülnek, a szállítók pedig a futószalag elejétől pakolnak. Minden doboznak egyforma a magassága (ennek nem lesz jelentősége a feladatban) és a szélessége; valamint a legtöbb doboz kocka alakú, azaz a mélysége is megegyezik az előző két mérettel. Van azonban pár különleges termék, ami a szabványostól különböző csomagolást igényel, így a dobozok 3. mérete (a mélység) ezeknél a speciális dobozoknál eltérhet. A szállítók kamionjai változó hosszúságúak lehetnek, abban viszont megegyeznek, hogy a rakodótér szélessége megegyezik egy doboz szélességével, így egyetlen sor dobozt tudunk bepakolni egy kamionba. Dobozok egymás tetejére nem kerülhetnek. A dobozok elszállításának pontos módjáról majd az adott feladatnál lesz részletesebb tájékoztatás.
Az osztályok kerüljenek egy szallitas
nevű csomagba.
Gyar
osztályDoboz
típusú) dobozokat egy listában tároljuk, egy gyár létrejöttekor a futószalagja üres (hosszát pedig végtelennek képzelhetjük).legyart
: olyan void
visszatérési értékű
metódus, amelynek egyetlen paramétere egy újonnan legyártott doboz, amit
a futószalagra az utoljára legyártott doboz után teszünk.dobozokSzama
: paraméter nélküli, int
visszatérési értékű függvény, amely megadja, hogy hány doboz van a futószalagon.Doboz
osztályszelesseg
: osztályszintű int
típusú adattag, amely meghatározza a dobozok cm-ben mért élhosszát. Kezdőértéke legyen 50
. A változó értékét ne lehessen megváltoztatni, viszont kívülről szabadon lekérdezhető legyen.getMelyseg
: példányszintű, paraméter nélküli metódus, amely int
típusú visszatérési értékében visszaadja egy doboz mélységét, ami ebben az esetben megegyezik a szélességgel.termekAzonosito
: példányszintű, byte
típusú adattag, amely a dobozba csomagolt termék azonosítóját tárolja. A
változót ne lehessen kívülről elérni, viszont legyen hozzá publikus
lekérdező (getTermekAzonosito
) és beállító (setTermekAzonosito
) metódus.toString
paraméter nélküli, String
visszatérési értékű függvény. Egy doboz String reprezentációjában
szögletes zárójelek között szerepeljen a dobozba csomagolt termék
azonosítója és a doboz mélysége (amit a getMelyseg
metódus ad vissza) kettősponttal elválasztva. A mélység után szerepeljen a "cm" is. Szóközök, újsor, stb. le negyen benne! Pl. "[1:50cm]"
SpecialisDoboz
osztály – a Doboz
osztályból származikszorzo
egy új példányszintű, float
típusú
adattag, amely azt adja meg, hogy a speciális csomagolást igénylő termék
dobozának a mélysége hányszorosa a szabványos dobozénak.getMelyseg
: definiáld felül a szülőosztályban található metódust úgy, hogy a Doboz
osztály szelesseg
változójában tárolt értékét szorozd meg az aktuális dobozhoz tartozó szorzóval. Mivel itt int
típusú értéket kell visszaadni, a kapott eredményt kerekítsd egészre (Tipp: java.lang.Math
osztály).Megjegyzés: innentől kezdve a doboz mérete alatt mindig azt az értéket értjük, amelyet a getMelyseg
metódus ad vissza, hiszen ez az egyetlen méret, ami különbözhet a dobozok esetében.
Gyar
osztálygetMeretAlattiDoboz
: példányszintű, Doboz
visszatérési értékű metódus, amelynek egyetlen int
típusú paramétere azt határozza meg, hogy milyen méret alatti dobozt
keresünk a futószalagon. A lista elejétől kezdve keressük meg az első
dobozt, amelynek mélysége ezen a méreten belül van. Amennyiben nincs
ilyen doboz a futószalagon (vagy egyáltalán nincs rajta doboz), null
-t adjunk vissza. A dobozt nem kell "levenni" a futószalagról.toString
: a futószalagon lévő dobozok String reprezentációját adja vissza, ahol a dobozok aláhúzás jellel (_
) legyenek elválasztva. Az utolsó után ne szerepeljen ilyen jel. Pl. "[1:50cm]_[2:150cm]_[5:60cm]"SpecialisDoboz
osztálySzallito
osztálygetDobozok
: példányszintű, paraméter nélküli metódus, amely visszaadja a szállítón lévő dobozok listáját (lehet List
típusú, vagy annak leszármazottja)felrak
: példányszintű, boolean
visszatérési értékű metódus. Egy Doboz
típusú paramétere van. A paraméterben megadott dobozt akkor tesszük fel
az autóra, ha az még ráfér (azaz a felpakolt dobozok összmélysége + a
paraméterként kapott doboz mélysége nem haladja meg a rakodótér
hosszát). Ekkor true
értékkel térünk vissza, és felvesszük a dobozt a szállító listájára, egyébként pedig false
értéket adunk vissza. Gyar
osztályelszallit
: példányszintű, int
visszatérési
értékű, egyparaméteres metódus. Paramétere egy szállító. A futószalag
elejéről kezdve pakoljuk fel a szállítóra addig a dobozokat, amíg egy
olyan dobozhoz érünk el, ami nem fér fel a kamionra. Ekkor ezt a dobozt
átugorhatjuk, és megkereshetjük a szalagon azt az első dobozt, ami még
felférhet. Ha még mindig maradt hely, megint megpróbálunk egy ilyet
keresni, stb. Két esetben kell megállni a pakolással: ha a futószalagon
lévő összes dobozt felpakoltuk, vagy ha már nincs olyan doboz, ami
felférne a kamionra. A visszatérési értékben megadjuk, hogy hány dobozt
pakoltunk fel. Szallito
osztálylepakol
: példányszintű, int
visszatérési értékű függvény. Egy byte
típusú paramétert vár, amely azt adja meg, hogy milyen
termékazonosítójú dobozokat szeretnénk lepakolni. A feladat kikeresni az
összes dobozt, amin ez a termékazonosító szerepel, és lepakolni, azaz
eltávolítani a szállító listájáról ezeket a dobozokat. Szeretnénk
segíteni kiszámítani, hogy mennyi hely fog kelleni a tároláshoz, így
meghatározzuk a lepakolt dobozok összalapterületét (cm^2-ben): a dobozok
összmélységét meg kell szorozni az állandó szélességgel.A for-each ciklussal történő listabejárás során a listát nem lehet változtatni, ezért a fenti feladat megoldásánál célszerű lehet az eltávolítandó elemeket egy külön ideiglenes listába kigyűjteni, majd ezt a listát bejárni, és a kívánt elemeket eltávolítani az eredeti listából.