Erinevus lehekülje "ITI0011:harjutus 09" redaktsioonide vahel
136. rida: | 136. rida: | ||
1.00€ | 1.00€ | ||
</pre> | </pre> | ||
+ | |||
+ | ==== Tellimusenumbri näide ==== | ||
+ | <source lang="java"> | ||
+ | int onr = Order.getNextOrderNumber(); | ||
+ | System.out.println(onr); | ||
+ | Order o = new Order("a", "b"); | ||
+ | o.pay(); | ||
+ | System.out.println(o.getOrderNumber()); | ||
+ | System.out.println(o.getNextOrderNumber()); | ||
+ | </source> | ||
+ | |||
+ | Väljund: | ||
+ | <pre> | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | </pre> | ||
+ | |||
+ | Siin peab jälgima järgmisi asju: | ||
+ | * ükskõik, mis numbriga antud näide hakkab, kaks järgmist numbrit peavad olema järjestikused numbrid (testimise mõttes oleks korrektne ka 4 5 6) | ||
+ | * <code>Order.getNextOrderNumber()</code> peab numbreid tagastama järjest (1, 2, 3 jne) | ||
+ | * <code>pay</code> meetod peab kasutama <code>Order.getNextOrderNumber()</code> meetodit ning kasutama seda numbrit, mida viimane meetod tagastab. | ||
== Lisaosa 1 (0.5p) == | == Lisaosa 1 (0.5p) == |
Redaktsioon: 14. märts 2016, kell 06:24
Üldine
Tähtaeg: 14. - 15. märts
Kaust gitis: EX09
Ülesanne
Madisel on näpud põhjas ning naistepäeva eel tuli tal geniaalne idee raha teenimiseks lilli müüma hakata. Roosid ja tulbid on Madis juba hankinud.
Kuna lilli ja kliente on palju, palub Madis teil luua kahe ilusa lille eest lihtne arvete väljastamise süsteem.
Kõigepealt looge klass Flower
. Sellel klassil on olemas ka konstruktor, mis saab ette hinna double
kujul. Kui lill on loodud, siis hinda enam muuta ei saa, kuid peaks olema meetod getPrice()
, mis tagastab lille hinna.
Seejärel looge klassid Rose
ja Tulip
. Need peaks olema klassi Flower
alamklassid.
Kuna Madisel on okastega ja okasteta roose, on Rose
klassil meetod hasThorns()
, mis tagastab tõeväärtuse, kas roosil on või pole okkaid.
Veel on madisel erinevat värvi tulpe, tulbi klassil on vastavalt meetod getColour()
, mis tagastab tulbi värvi sõnena.
Igal alamklassil on oma getPrice
meetod, mis saab ette lillede arvu (int
) ja tagastab ühe lille hinna vastavalt konkreetse lille reeglitele (double
).
Reeglid on järgmised:
Rose
- kui lilli on rohkem kui 3 (3 kaasa arvatud), siis on allahindlus 5%.Tulip
- kui lilli on rohkem kui 5 (5 kaasa arvatud), siis on allahindlus 10%.
Lisaks tuleb teil luua klass Order
, mille konstruktor saab ette sõne kujul kaks argumenti: kliendi nimi ja asukoht, kuhu tellimus saadetakse.
Order klassil on olemas ka:
- Meetodid
getClient()
,getAddress()
- tagastavad vastavalt konstruktoris määratud kliendi ja aadressi. - Väli
orderNumber
, mis on tellimuse number. Esimesel tellimusel 1, järgmisel 2 jne. Tellimuse number määratakse alles peale pay() meetodi väljakutsumist. Tellimuse loomisel on tellimuse number 0. Peale pay() meetodi väljakutsumist antakse tellimusele järgmine vaba number (esimene tellimuse saab numbri 1, teine tellimus 2 jne). - Meetod
boolean add(Flower flower)
, mis lisab etteantud lille lillede listi ja tagastab vastavalt booleani. - Meetod
double getTotalPrice()
, mis tagastab kogu tellimuse maksumuse kahe komakoha täpsusega. - Meetod
int getOrderNumber()
, mis tagastab tellimuse numbri. - Staatiline meetod
int getNextOrderNumber()
, mis tagastab järgmise tellimuse numbri. Siin on mõistlik kasutada staatilist muutujat, kus on kirjas järgmise tellimuse number. Iga kord, kui küsitakse järgmist numbrit, peaks vastavat muutujat ka suurendama. Tegemist on staatilise muutujaga, kuna see on kõikide tellimuste peale ühine (ei ole seotud konkreetse tellimusega). - Meetod
String pay()
, mis tagastab tellimuse tšeki. Tšekil on kuvatud tellimuse number, kliendi nimi, aadress, lillede kogus ja kogusumma.
Tšeki näited:
Tellitud on vaid roose. Lõpus reavahetust pole:
Order: 2 Client: Kati Address: Tallinn Roses: 2 11.55€
Tellitud on 2 roosi ja 1 tulp. Rooside kogus peaks alati eespool olema kui tulpide kogus.
Order: 2 Client: Mati Address: Tallinn Roses: 2 Tulips: 1 12.00€
Koodinäited
<source lang="java"> Rose rose = new Rose(-10, true); Rose rose2 = new Rose(10, true); System.out.println(rose.getPrice(1)); System.out.println(rose.getPrice(0)); System.out.println(rose.getPrice(-1)); System.out.println(rose2.getPrice(3)); System.out.println(rose2.getPrice(1)); System.out.println(rose2.getPrice(0)); System.out.println(rose2.getPrice(-1)); </source>
Väljund:
0.0 0.0 0.0 9.5 10.0 0.0 0.0
<source lang="java"> Rose r1 = new Rose(10, true); Rose r2 = new Rose(5, false);
Tulip t1 = new Tulip(10, "Red"); Tulip t2 = new Tulip(10, "Blue"); Tulip t3 = new Tulip(10, null);
Order o1 = new Order("Mati", "Maalt"); o1.add(r1); o1.add(r2); o1.add(t1); o1.add(t2); o1.add(t3); o1.add(r1); System.out.println(o1.pay()); </source> peaks andma tulemuseks (kuna roose on kokku 3, kehtib neile kõikidele allahindlus):
Order: 1 Client: Mati Address: Maalt Roses: 3 Tulips: 3 53.75€
<source lang="java"> Order o2 = new Order("Jüri", "Jürist"); System.out.println(o2.pay()); </source>
Väljund:
Order: 2 Client: Jüri Address: Jürist 0.00€
<source lang="java"> Order o3 = new Order("Manni", "Maan Tee 12"); o3.add(new Rose(-4, true)); o3.add(new Rose(0, true)); o3.add(new Rose(1, true)); System.out.println(o3.pay()); </source>
Väljund (negatiivse hinnaga lilli ei loeta):
Order: 3 Client: Manni Address: Maan Tee 12 Roses: 2 1.00€
Tellimusenumbri näide
<source lang="java"> int onr = Order.getNextOrderNumber(); System.out.println(onr); Order o = new Order("a", "b"); o.pay(); System.out.println(o.getOrderNumber()); System.out.println(o.getNextOrderNumber()); </source>
Väljund:
1 2 3
Siin peab jälgima järgmisi asju:
- ükskõik, mis numbriga antud näide hakkab, kaks järgmist numbrit peavad olema järjestikused numbrid (testimise mõttes oleks korrektne ka 4 5 6)
Order.getNextOrderNumber()
peab numbreid tagastama järjest (1, 2, 3 jne)pay
meetod peab kasutamaOrder.getNextOrderNumber()
meetodit ning kasutama seda numbrit, mida viimane meetod tagastab.
Lisaosa 1 (0.5p)
Madis soovitas teil, juhul kui aega liiga palju on, luua õiglase kaubanduse sertifikaadiga rooside jaoks eraldi klass (FairTradeRose
, mis on klassi Rose
alamklass), mille hinna arvutamisel ei arvestata rooside kogust, ning mille hind on kahekordne süsteemis hoitavast hinnast (lisage double getPrice()
, mis ei võta sisse ühtegi muutujat).
Madis soovib veel ka kõige rohkem õiglase kaubanduse teel saadud roose ostnud kliendile šokolaadi kinkida, kuid manuaalselt kõiki tšekke üle vaadates ei jõuaks Madis vampiiripäevikute uusi osi ära vaadata.
Selle kliendi leidmiseks looge Order
klassi uus staatiline meetod findTheMostCaringCustomer()
, mis võtab sisendiks tellimuste listi (List<Order>
) ning tagastab kliendi nime (String
). Juhul kui mitu klienti on õiglase kaubanduse sertifikaadiga roose sama palju ostnud, tagastage kõikide klientide nimed sõnena üksteise all sellises järjekorras, nagu nad listis on. Kui keegi neid ostnud pole, tagastage tühi sõne.
Näiteks kui need kolm meest on tellinud kõik 6 õiglase kaubanduse sertifikaadiga roosi, on meetodi findTheMostCaringCustomer
väljund selline:
Ramsay Bolton Theon Greyjoy Joffrey Baratheon
Kuna Madis tahab tšekkidel näha eraldi õiglase kaubanduse teel saadud rooside kogust, peate täiendama pay
meetodit. FairTradeRose
objektide kogus oleks kõige esimesena välja toodud:
Order: 69 Client: Mati Address: Tallinn Fair-trade roses: 2 Roses: 1 Tulips: 1 12.00€
Koodinäited
<source lang="java"> Order o4 = new Order("Gandalf", "Tallinn"); o4.add(new Rose(10, true)); o4.add(new FairTradeRose(8, false)); o4.add(new FairTradeRose(12, false)); System.out.println(o4.pay());
Order o5 = new Order("Guido", "Mõigu"); o5.add(new Tulip(10, "Red")); o5.add(new Tulip(10, null)); o5.add(new FairTradeRose(4, false)); o5.add(new FairTradeRose(1, false)); o5.add(new FairTradeRose(-1, false)); System.out.println(o5.pay());
Order o6 = new Order("Mõtus", "Mändra"); o6.add(new Rose(11, true));
Order o7 = new Order("Kaunis", "Kungla"); System.out.println("--"); System.out.println(Order.findTheMostCaringCustomer(Arrays.asList(o4, o5))); System.out.println("--"); System.out.println(Order.findTheMostCaringCustomer(Arrays.asList(o6, o7)));
</source>
Order: 4 Client: Gandalf Address: Tallinn Fair-trade roses: 2 Roses: 1 50.00€ Order: 5 Client: Guido Address: Mõigu Fair-trade roses: 2 Tulips: 2 30.00€ -- Gandalf Guido --
Lisaosa 2 (0.5p)
Madisel on vaja natuke täpsemat arvepidamist. Seetõttu peaksid realiseerima järgnevad meetodid Order
klassis:
add(Flower flower, int count)
lisab etteantud lille tellimusse etteantud kogusega.payItems()
mis sarnaseltpay
meetodile tagastab tellimuse info sõnena, aga kirjutab välja, milliseid lilli millises koguses ja millise hinnaga telliti. Reeglid:- samat tüüpi lilled samade parameetritega (hind, okkad/värv) pannakse kokku.
- read väljastatakse selles järjekorras, kuidas need lisati
add
meetodiga. - allahinnatud lille puhul (kui kogus on piisavalt suur) tuleb välja näidata allahinnatud hind.
- Madis ei taha 0.00€ hinnaga lilli tulemusel näha.
- kui kogus on 0, siis vastavat rida ei näidata.
getTotalPriceItems()
tagastab tellimuse kogusumma võttes arvesse lisatud lilli kogusega. Märkus,getTotalPrice
meetod tagastab teise tulemuse, kuna see arvestab lilli ilma koguseta.
Koodinäited
<source lang="java"> Order orderItems = new Order("Kauna", "Kaunas"); orderItems.add(new Rose(10, true), 2); orderItems.add(new Rose(10, true), 1); orderItems.add(new Rose(9.50, true), 1); orderItems.add(new Rose(10, false), 1); Tulip t = new Tulip(10, "Red"); orderItems.add(t, 1); orderItems.add(t, 2); orderItems.add(t, 3); orderItems.add(new Tulip(10, "Blue"), 1); orderItems.add(new Tulip(10, "Blue"), 1); orderItems.add(new Tulip(10, null), 1); System.out.println(orderItems.payItems()); </source>
väljund:
Order: 6 Client: Kauna Address: Kaunas Item 1: Rose with thorns 3 x 9.50€ Item 2: Rose with thorns 1 x 9.50€ Item 3: Rose without thorns 1 x 10.00€ Item 4: Red tulip 6 x 9.00€ Item 5: Blue tulip 2 x 10.00€ Item 6: Tulip 1 x 10.00€ Total: 132.00€
Märkused:
- esimesed kaks roosi, mis koodis on lisatud, on sisuliselt samad roosid ja seetõttu pannakse tellimusel kokku. Sama käib tulbi
t
kohta (mida lisatakse 3 korda). - Item 1 ja 2 on näiliselt samad, aga neid ei saa kokku panna. Esimene rida tuleb sellest, et roosi hind on 10 eurot, aga kuna kogus on 3, siis allahinnatult on hind 9.50. Item 2 ongi originaalse hinnaga 9.50€.
- kui tulbil värvi pole, tuleb see osa nimest ära jätta. Värviga tulbi korral on "tulip" väikese algustähega, värvita tulbi korral suurega "Tulip".
Soovituslik oleks kasutada mõnda Map
i realisatsiooni (näiteks HashMap
või LinkedHashMap
), et erinevat tüüpi lilled kokku grupeerida. Tõenäoliselt tuleb realiseerida lille klassis equals
ja hashCode
meetodid, et Map
õigesti töötaks.