ITI0011:harjutus 09

Allikas: Kursused
Redaktsioon seisuga 11. märts 2016, kell 05:35 kasutajalt Ago (arutelu | kaastöö)
Mine navigeerimisribale Mine otsikasti

Ü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:

  • 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.

Order: 2
Client: Mati
Address: Tallinn
Roses: 2
Tulips: 1
12.00€

Lisaosa

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 (getPrice() ei võta sisse ühtegi muutujat).

Madis soovib veel ka kõige rohkem õiglase kaubanuduse 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. 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