Ohjelmistojen mallintaminen, syksy 2010, laskuharjoitus 5

Samankaltaiset tiedostot
Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

Rajapinta (interface)

Java kahdessa tunnissa. Jyry Suvilehto

Mikä yhteyssuhde on?

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Kertaus: yleistys-erikoistus ja perintä

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Ohjelmointi 2 / 2010 Välikoe / 26.3

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Javan perusteita. Janne Käki

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Ohjelmoinnin perusteet, kurssikoe

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Metodien tekeminen Javalla

Olio-ohjelmointi Javalla

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Hakemistojen sisällöt säilötään linkitetyille listalle.

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

16. Javan omat luokat 16.1

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Tietorakenteet, laskuharjoitus 7,

YHTEYSSUHDE (assosiation)

9. Periytyminen Javassa 9.1

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

9. Periytyminen Javassa 9.1

Ohjelmistojen mallintaminen. Luento 7,

Ohjelmistojen mallintaminen, syksy 2011, laskuharjoitus 2

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Luokkamalli LUOKKAKAAVIO. Tämän osan sisältö. Luokkamalli. Luokka ja olio. Luokkakaavio (class diagram)

Luokat ja oliot. Ville Sundberg

Sisältö. 22. Taulukot. Yleistä. Yleistä

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1

Java-API, rajapinnat, poikkeukset, UML,...

2. Olio-ohjelmoinista lyhyesti 2.1

Periytyminen (inheritance)

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

4. Olio-ohjelmoinista lyhyesti 4.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Lista luokan sisällä

UML ja luokkien väliset suhteet

7/20: Paketti kasassa ensimmäistä kertaa

Listarakenne (ArrayList-luokka)

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Javan GUI Scratchaajalle

1 Tehtävän kuvaus ja analysointi

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

17. Javan omat luokat 17.1

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Sisältö. 2. Taulukot. Yleistä. Yleistä

Ohjelmistotekniikan menetelmät, koe

8. Näppäimistöltä lukeminen 8.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

14. Poikkeukset 14.1

Taulukot. Jukka Harju, Jukka Juslin

Interaktiivinen tarinankerronta

12. Näppäimistöltä lukeminen 12.1

Ohjelmistojen mallintaminen. Luento 11, 7.12.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Ohjelmistojen mallintaminen. Luento 4,

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Luokan sisällä on lista

TIETORAKENTEET JA ALGORITMIT

Pakkauksen kokoaminen

Ohjelmointi 2, välikoe

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

8. Näppäimistöltä lukeminen 8.1

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

1. Omat operaatiot 1.1

7. Näytölle tulostaminen 7.1

812336A C++ -kielen perusteet,

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

4. Luokan testaus ja käyttö olion kautta 4.1

14. Poikkeukset 14.1

ITKP102 Ohjelmointi 1 (6 op)

Transkriptio:

Ohjelmistojen mallintaminen, syksy 2010, laskuharjoitus 5 1. Seuraavassa on lueteltu käsitteitä, jotka ovat jossain suhteessa keskenään. Mitä suhdetyyppiä (normaali yhteys, kompositio, perintä, riippuvuus,...) kussakin tapauksessa kannattaa käyttää (siis jokaiseen palloon oma suhde). Piirrä esim. pieni luokkakaavio jokaisesta tilanteesta. Ruokaileva filosofi käyttää haarukkaa Unixissa tiedosto on joko tavallinen tiedosto tai hakemisto Tiedosto muodostuu tavuista Monikulmion kulmat ovat järjestetty jono pisteitä Opiskelija hallitsee Java-kielen Ihmisellä on syntymävuosi Hiiri, näppäimistö ja Näyttö ovat I/O-laitteita (eli tietokoneen syötelaite) Polku yhdistää kaksi kylää Monopolissa on 2-8 Pelaajaa. Pelaaja voi olla yksittäinen henkilö tai joukkue. Joukkue koostuu yksittäisistä henkilöistö Kaikki tiet vievät roomaan (Vihavaisen laatima tehtävä) 2. Tee luokkakaavio ohjelmoinnin jatkokurssin viikon ylimääräisestä tehtävästä "Maidon elämä". Metodien nimien merkitseminen ei ole oleellista. Tehtävämäärittely löytyy osoitteesta: http://www.cs.helsinki.fi/u/avihavai/ekstraa.html Pystyt tekemään luokkakaavion tehtäväkuvauksen perusteella vaikka et olisikaan ohjelmoinut Maidon elämää. Maidon elämän Java-koodi tulee viimeistään pe 26.11. osoitteeseen http://wiki.helsinki.fi/pages/viewpage.action?pageid=63743590 3. Kuvaa sekvenssikaaviona mitä Maidon elämässä tapahtuu kun seuraava koodi suoritetaan: Maatila maatila = new Maatila("Esko", new Navetta(new Maitosailio())); // voit ajatella edellisen sekvenssikaaviossa seuraavanlaiseksi: // Maitosailio maitosailio = new Maitosailio(); // Navetta navetta = new Navetta(maitosailio); // Maatila maatila = new Maatila( navetta ); Lypsyrobotti robo = new Lypsyrobotti(); maatila.asennanavettaanlypsyrobootti(robo); Lehma lehma1 = new Lehma(); Lehma lehma2 = new Lehma(); Lehma lehma3 = new Lehma(); maatila.lisaalehma(lehma1); maatila.lisaalehma(lehma2); maatila.eleletunti(); maatila.hoidalehmat(); System.out.println(maatila); 1

4. Laajennetaan edellisellä viikolla aloitettua monopolin luokkamallia. Ota pohjaksi viime viikon ratkaisusi tai esimerkkivastaus. Voit olettaa, että kyseessä on tietokonepelinä toteutettava monopoli. Seuraavassa asioita, jotka pitäisi tulla mallissa esille. Ruutuja on useampaa eri tyyppiä: aloitusruutu vankila sattuma ja yhteismaa asemat ja laitokset normaalit kadut (joihin liittyy nimi) Monopolipelin täytyy tuntea sekä aloitusruudun että vankilan sijainti. Jokaiseen ruutuun liittyy jokin toiminto. Sattuma- ja yhteismaaruutuihin liittyy kortteja, joihin kuhunkin liittyy joku toiminto. Toimintoja on useanlaisia. Ei ole vielä tarvetta tarkentaa toiminnon laatua. Normaaleille kaduille voi rakentaa korkeintaan 4 taloa tai yhden hotellin. Kadun voi omistaa joku pelaajista. Pelaajilla on rahaa. Tässä vaiheessa ei vielä liitetä peliin metodeja. Niiden aika tulee seuraavalla viikolla. 5. Ohjelmoinnin jatkokurssilla on tutustuttu sangen hyödylliseen luokkaan ArrayList. ArrayListluokan olioden voi ajatella olevan automaattisesti itseään kasvattavia vaihtelevanmittaisia taulukoita, joihin voidaan säilöä muita olioita. Lyhyesti ilmaistuna ArrayList-oliot ovat "oliosäiliöitä". Etsi Java-API:sta (http://download.oracle.com/javase/6/docs/api/), ArrayList-luokka. Tutkitaan ArrayListin ominaisuuksia. Tällä kertaa ei kiinnitetä huomiota ArrayListin metodeihin vaan sen sijaintiin Java-API:n luokkahierarkiassa. Eli mikä on ArrayList:in yläluokka, mitä sisarluokkia (eli yliluokan muita aliluokkia) sillä on, mikä on ArrayListin yliluokan yliluokka, mitä serkkuluokkia ArrayListilla on, jne... Erityisesti on syytä selvittää mitä "sopimuksia" eli rajapintoja ArrayList mainitsee toteuttavansa? Mitä noissa rajapinnoissa luvataan? Piirrä tilanteesta luokkakaavio. Jos kaavio kasvaa liian isoksi, älä tunge kaikkea kuvaan. Metodinimiä ei kannattane luokkakaavioon ainakaan montaa merkitä. ArrayList ja muut oliosäiliöt liittyvät läheisesti kurssin Tietorakenteet aihepiiriin. Ammattimaisessa Java-ohjelmoinnissa tämä erilaisten "oliosäiliöiden" luokkaperhe on erittäin hyödyllinen. Kuten huomataan, on erilaisia säiliöluokkia todella suuri määrä. Joskus onkin haastavaa löytää parhaiten omiin tarpeisiin soveltuva luokka. Ohjelmoinnin jatkokurssin viikon 2 tehtävässä 4.2 tutstuttiin hieman ArrayListin tapaan toimivaan HashSet-luokkaan. Miten HashSet-mukaan sijoittuu Javan luokkahierarkiaan ArrayList:in suhteen? Mikä selittää sen, että HashSet:iä ja ArrayList:iä voi käyttää monin paikoin toistensa tilalla? Mitä eroavaisuuksia löytyy? 6. Luennoilla ja kalvoissa on mainittu 3 oliosuunnittelun periaatetta: Single responsibility principle Luokilla tulisi olla vain yksi selkeä vastuu. Vastuulla oikeastaan tarkoitetaan potentiaalista syytä muutokselle. Ei ole esimerkiksi viisasta laittaa käyttäjän syötteen lukemista minkään sovellusolion tehtäväksi. Syötteen lukeminen on oma selkeä vastuunsa ja sitä varten tulisi olla oma luokka. Sovellusoliot sitten tarpeen vaatiessa kutsuvat syötteenlukijaolioita. 2

Program to interfaces, not to concrete implementations Älä ohjelmoi siten, että olet riippuvainen konkreettisista luokista, on järkevämpi olla riippuvainen ainoastaan rajapinnasta. Esim. lypsyrobootista (ks. tehtävä 2) tulee monikäyttöisempi kun se määrittelee lypsettävän olevan joku rajapinnan Lypsava toteuttava olio: public void lypsa(lypsava lypsettava) { //... double maitoa = lypsettava.lypsa(); sailio.lisaasailioon(maitoa); Tämä periaate kannattaa myös pitää mielessä kun käyttää edellisestä tehtävästä tuttuja säiliöluokkia. Itseasiassa tärkeää säiliöluokkien suhteen ovat juuri niiden toteuttamat rajapinnat, käyttäjän kannalta säiliöluokan sijainnilla perintähierarkiassa ei ole mitään merkitystä Favor composition over inheritance Rakenna toiminnallisuutta monimutkaisen perintähierarkian sijaan liittämällä yhteen joukko selkeän vastuun omaavia "pieniä" olioita. Hyvänä esimerkkinä tästä ohjelmoinnin jatkokurssin viikon 3 MuistavaTuotevarasto jota käsiteltiin luennolla Tämän periaatteen soveltaminen on siis yksi keino, jonka avulla saadaan oliot noudattamaan single responsibility -periaatetta. Muitakin periaatteita on olemassa, joihinkin niistä palataan kurssin aikana Tehtävät: (a) Toteuttaako Maidon elämä kaikkia em. periaatteita? Jos ei niin mikä rikkoutuu? (b) Etsi ohjelmoinnin perusteiden ja jatkokurssin sekä tämän kurssin materiaaleista (luentomateriaalista ja laskareista) esimerkkejä (ainakin 3 esimerkkiä) jotka rikkovat jonkun ym. periaatteista. Näytä miten korjaisit tilanteen. (c) Minkä takia em. periaatteet ovat tärkeitä? Saako niitä rikkoa? Missä tilanteissa? 3

Lisäharjoituksia 4. viikolle http://www.cs.helsinki.fi/u/avihavai/ekstraa.html 1 / 4 28.11.2010 23:44 Copyright Arto Vihavainen. Materiaalia saa vapaasti käyttää itseopiskeluun. Muu käyttö vaatii luvan. Lisäharjoituksia 4. viikolle (Muutettu viimeksi 22.11.2010, sivu perustettu 22.11.2010.) 1 Maidon elämää, vaihe 1 Tämän tehtäväsarjan laatija on Arto Vihavainen ( ). Suurkiitokset kaimalle! Ja vastuu kaimalle..., niin ohjelmista kuin oikeinkirjoituksesta... ;-) [editointi AW] Maatiloilla on lypsäviä eläimiä, jotka tuottavat maitoa. Maatilat eivät itse käsittele maitoa, vaan se kuljetetaan Maitoautoilla meijereille. Meijerit ovat yleisiä maitotuotteita tuottavia rakennuksia. Jokainen meijeri erikoistuu yhteen tuotetyyppiin, esimerkiksi Juustomeijeri tuottaa Juustoa, Voimeijeri tuottaa voita ja Maitomeijeri tuottaa maitoa. Rakennetaan maidon elämää kuvaava simulaattori. 1.1 Maitosäiliö Jotta maito pysyisi tuoreena, täytyy se säilöä sille tarkoitettuun säiliöön. Säiliöitä valmistetaan sekä oletustilavuudella 2000 litraa, että asiakkaalle räätälöidyllä tilavuudella. Toteuta luokka Maitosailio jolla on seuraavat konstruktorit ja aksessorit. public Maitosailio() public Maitosailio(double tilavuus) public double gettilavuus() public double getsaldo() public double paljonkotilaajaljella() public void lisaasailioon(double maara) lisää säiliöön vain niin paljon maitoa kuin sinne mahtuu, ylimääräiset jäävät lisäämättä -- maitosäiliön ei siis tarvitse huolehtia tilanteesta jossa maitoa valuu yli public double otasailiosta(double maara) ottaa säiliöstä pyydetyn määrän, tai niin paljon kuin siellä on jäljellä Toteuta Maitosailio-luokalle myös tostring()-metodi, jolla kuvaat sen tilaa. Ilmaistessasi säiliön tilaa tostring()-metodissa, pyöristä litramäärät ylöspäin käyttäen Math-luokan tarjoamaa ceil()-metodia. Testaa maitosailiötä seuraavalla ohjelmapätkällä Maitosailio sailio = new Maitosailio(); sailio.otasailiosta(100); sailio.lisaasailioon(25); sailio.otasailiosta(5); System.out.println(sailio); sailio = new Maitosailio(50); sailio.lisaasailioon(100); System.out.println(sailio); Ohjelman tulostuksen tulee olla seuraavankaltainen 20.0/2000.0 50.0/50.0 Huomaa että kutsuttaessa System-luokan out-olioon liittyvää println()-metodia, joka saa parametrikseen Object-tyyppisen muuttujan, tulostus käyttää Maitosailioluokassa korvattua tostring()-metodia! Tässä on kyse polymorfismista, eli ajonaikaisesta käytettävien metodien päättelystä. 1.2 Lehmä Saadaksemme maitoa tarvitsemme myös lehmiä. Lehmällä on nimi ja utareet, eli se kapseloi maitosäiliön. Lehman utareiden tilavuus on satunnainen luku väliltä 15 ja 40 -- luokkaa Random voi käyttäää satunnaislukujen arpomiseen, esimerkiksi int luku = 15 + new Random().nextInt(26);. Lehma toteuttaa myös seuraavat rajapinnat Lypsava, joka kuvaa lypsämiskäyttäytymistä, ja Eleleva, joka kuvaa elelemiskäyttäytymistä. public interface Lypsava { public double lypsa(); public interface Eleleva { public void eleletunti(); Lehmää lypsettäessä sen koko maitovarasto tyhjennetään jatkokäsittelyä varten. Lehmän elellessä sen maitovarasto täyttyy hiljalleen. Suomessa maidontuotannossa käytetyt lehmät tuottavat keskimäärin noin 25-30 litraa maitoa päivässä. Simuloidaan tätä tuotantoa tuottamalla noin 0.7-2 litraa tunnissa. Jos lehmälle ei anneta nimeä, valitse sille nimi satunnaisesti seuraavasta listasta. private static String[] NIMIA = new String[]{ "Anu", "Arpa", "Essi", "Heluna", "Hely", "Hento", "Hilke", "Hilsu", "Hymy", "Ilme", "Ilo", "Jaana", "Jami", "Jatta", "Laku", "Liekki", "Mainikki", "Matti", "Mella", "Mimmi", "Naatti", "Nina", "Nyytti", "Papu", "Pullukka", "Pulu", "Rima", "Soma", "Sylkki", "Valpu", "Virpi"; Toteuta luokka Lehma ja testaa sen toimintaa seuraavan ohjelmapätkän avulla. Toteuta luokalle myos metodi tostring(), joka palauttaa sitä kuvaavan merkkijonon. Lehma lehma = new Lehma(); Eleleva elelevalehma = lehma; elelevalehma.eleletunti(); elelevalehma.eleletunti();

Lisäharjoituksia 4. viikolle http://www.cs.helsinki.fi/u/avihavai/ekstraa.html 2 / 4 28.11.2010 23:44 elelevalehma.eleletunti(); elelevalehma.eleletunti(); Lypsava lypsavalehma = lehma; lypsavalehma.lypsa(); System.out.println(""); lehma = new Lehma("Ammu"); lehma.lypsa(); Ohjelman tulostus on erimerkiksi seuraavanlainen. Liekki 0.0/23.0 Liekki 16.0/23.0 Liekki 0.0/23.0 Ammu 0.0/53.0 Ammu 9.0/53.0 Ammu 0.0/53.0 1.3 Lypsyrobotti Nykyaikaisilla maatiloilla lypsyrobotit hoitavat lypsämisen. Jotta lypsyrobotti voi lypsää lypsävää otusta, tulee lypsyrobotin olla kiinnitetty maitosäiliöön. Toteuta luokka Lypsyrobotti ja testaa sitä seuraavan ohjelmapätkän avulla. Varmista että lypsyrobotti voi lypsää kaikkia Lypsava-rajapinnan toteuttavia olioita! Lypsyrobotti lypsyrobotti = new Lypsyrobotti(); Lehma lehma = new Lehma(); lypsyrobotti.lypsa(lehma); System.out.println(""); Maitosailio sailio = new Maitosailio(); lypsyrobotti.setmaitosailio(sailio); System.out.println("Säiliö: " + sailio); for(int i = 0; i < 2; i++) { System.out.println("Elellään.."); for(int j = 0; j < 5; j++) { System.out.println("Lypsetään..."); lypsyrobotti.lypsa(lehma); System.out.println("Säiliö: " + sailio); System.out.println(""); Ohjelman tulostus on esimerkiksi seuraavanlainen. Ei kiinnitetty maitosäiliöön, ei voida lypsää. Säiliö: 0.0/2000.0 Mella 0.0/23.0 Elellään.. Mella 17.0/23.0 Lypsetään... Säiliö: 17.0/2000.0 Mella 0.0/23.0 Elellään.. Mella 13.0/23.0 Lypsetään... Säiliö: 29.0/2000.0 1.4 Navetta Lehmät hoidetaan (eli tässä tapauksessa lypsetään) navetassa. Alkukantaisissa navetoissa on maitosäiliö ja tilaa yhdelle lypsyrobotille. Huomaa että lypsyrobottia asennettaessa se kytketään juuri kyseisen navetan maitosäiliöön. Jos navetassa ei ole lypsyrobottia, ei siellä voida myöskään hoitaa lehmiä. Toteuta luokka Navetta jolla on seuraavat konstruktorit ja aksessorit. public Navetta(Maitosailio maitosailio) public void asennalypsyrobotti(lypsyrobotti lypsyrobotti) public void hoida(lehma lehma) hoida(collection<lehma> lehmat) Lisää navettaan myös aksessori maitosailiölle. Metodi hoida lypsää parametrina annetun lehmän tai lehmäkokoelman Lypsyrobotin avulla. Toteuta navetalle myös tostring()-metodi, joka palautaa sen sisältämän maitosäiliön tilan. Collection on Javan oma rajapinta joka kuvaa kokoelmien käyttäytymistä. Esimerkiksi luokat ArrayList ja LinkedList toteuttavat rajapinnan Collection. Jokaista Collection-rajapinnan toteuttavaa ilmentymää voi myös iteroida for-each-tyyppisesti. Testaa luokkaa Navetta seuraavan ohjelmapätkän avulla. Älä hermoile luokasta LinkedList, se toimii ulkoapäin katsottuna kuin ArrayList, mutta sen kapseloima toteutus on hieman erilainen. Tästä lisää tietorakenteet kurssilla! Navetta navetta = new Navetta(new Maitosailio()); System.out.println("Navetta: " + navetta);

Lisäharjoituksia 4. viikolle http://www.cs.helsinki.fi/u/avihavai/ekstraa.html 3 / 4 28.11.2010 23:44 Lypsyrobotti robo = new Lypsyrobotti(); navetta.asennalypsyrobotti(robo); Lehma ammu = new Lehma(); ammu.eleletunti(); ammu.eleletunti(); navetta.hoida(ammu); System.out.println("Navetta: " + navetta); LinkedList<Lehma> lehmalista = new LinkedList(); lehmalista.add(ammu); lehmalista.add(new Lehma()); for(lehma lehma: lehmalista) { navetta.hoida(lehmalista); System.out.println("Navetta: " + navetta); Tulostuksen tulee olla esimerkiksi seuraavanlainen: Navetta: 0.0/2000.0 Navetta: 5.0/2000.0 Navetta: 17.0/2000.0 1.5 Maatila Maatilalla on omistaja ja siihen kuuluu navetta sekä joukko lehmiä. Maatila toteuttaa myös aiemmin nähdyn rajapinnan Eleleva, jonka metodia eleletunti()-kutsumalla kaikki maatilaan liittyvät lehmät elelevät tunnin. Toteuta luokka maatila siten, että se toimii seuraavien esimerkkiohjelmien mukaisesti. Odotettu tulostus: Maatila maatila = new Maatila("Esko", new Navetta(new Maitosailio())); System.out.println(maatila); Ei lehmiä. Odotettu tulostus: Maatila maatila = new Maatila("Esko", new Navetta(new Maitosailio())); System.out.println(maatila); Naatti 0.0/19.0 Hilke 0.0/30.0 Sylkki 0.0/29.0 Odotettu tulostus: Maatila maatila = new Maatila("Esko", new Navetta(new Maitosailio())); maatila.eleletunti(); maatila.eleletunti(); Heluna 6.0/17.0 Rima 8.0/42.0 Ilo 8.0/25.0 Odotettu tulostus: Maatila maatila = new Maatila("Esko", new Navetta(new Maitosailio())); Lypsyrobotti robo = new Lypsyrobotti(); maatila.asennanavettaanlypsyrobotti(robo); maatila.eleletunti(); maatila.eleletunti(); maatila.hoidalehmat(); System.out.println(maatila); Navetan maitosäiliö: 18.0/2000.0 *** *** ***

Lisäharjoituksia 4. viikolle http://www.cs.helsinki.fi/u/avihavai/ekstraa.html 4 / 4 28.11.2010 23:44 Hilke 0.0/30.0 Sylkki 0.0/45.0 Hento 0.0/54.0 1.6 Maatilasimulaattori Luodaan ohjelma jolla voidaan simuloida maatilan toimintaa. Simulaattori kysyy ensiksi maatilan omistajan nimeä, jonka jälkeen kysytään maatilalla olevien nautojen määrä. Kun nämä ovat tiedossa luodaan maatila ja siihen liittyvät lehmät (muista asettaa maatilalle myös navetta, ja navetalle lypsyrobotti!). Kun maatila on luotu, käyttäjälle annetaan 3 vaihtoehtoa: "Elele tunti", "Hoida lehmät" ja "Lopeta" -- jokainen toiminto laukaistaan numerolla. Pyydetty numero kannattaa lukea Scannerin ja Integer-luokan yhteistyöllä seuraavasti: int luku = Integer.parseInt(scanner.nextLine()); Toteuta maatilasimulaattori, seuraavassa esimerkkitulostus: Anna maatilan omistajan nimi: Esko Montako nautaa? 2 Mella 0.0/54.0 Nina 0.0/21.0 Komennot: 1 - Elele tunti 2 - Hoida lehmat muut - Lopeta? 1 Mella 4.0/54.0 Nina 5.0/21.0 Komennot: 1 - Elele tunti 2 - Hoida lehmat muut - Lopeta? 1 Mella 7.0/54.0 Nina 8.0/21.0 Komennot: 1 - Elele tunti 2 - Hoida lehmat muut - Lopeta? 2 Navetan maitosäiliö: 15.0/2000.0 Mella 0.0/54.0 Nina 0.0/21.0 Komennot: 1 - Elele tunti 2 - Hoida lehmat muut - Lopeta? x Kiitos!... jatkoa mahdollisesti seuraa...

Maidon elämä - ohpejaohja2010 (Created by mluukkai@helsinki.fi 28... http://wiki.helsinki.fi/pages/viewpage.action?pageid=63743590 1 / 3 28.11.2010 23:43 Maidon elämä Added by Matti Luukkainen, last edited by Matti Luukkainen on 2010-11-24 Esimerkkivastaus viikon 4 ylimääräiseen tehtävään maidon elämä Rajapinnat: public interface Eleleva { public void eleletunti(); public interface Lypsava { public double lypsa(); public class Maitosailio { private double tilavuus; private double saldo; public Maitosailio() { this(2000); public Maitosailio(double tilavuus) { this.tilavuus = tilavuus; public double gettilavuus() { return tilavuus; public double getsaldo() { return saldo; public double paljonkotilaajaljella() { return tilavuus-saldo; public double otasailiosta(double maara) { if ( maara>getsaldo() ) maara = getsaldo(); saldo -= maara; return maara; public void lisaasailioon(double maara) { if ( maara > paljonkotilaajaljella() ) maara = paljonkotilaajaljella(); saldo += maara; @Override public String tostring() { return Math.ceil( getsaldo() )+"/"+ Math.ceil( gettilavuus() );

Maidon elämä - ohpejaohja2010 (Created by mluukkai@helsinki.fi 28... http://wiki.helsinki.fi/pages/viewpage.action?pageid=63743590 2 / 3 28.11.2010 23:43 class Lehma implements Lypsava, Eleleva { private static String[] NIMIA = new String[]{ "Anu", "Arpa", "Essi", "Heluna", "Hely", "Hento", "Hilke", "Hilsu", "Hymy", "Ilme", "Ilo", "Jaana", "Jami", "Jatta", "Laku", "Liekki", "Mainikki", "Matti", "Mella", "Mimmi", "Naatti", "Nina", "Nyytti", "Papu", "Pullukka", "Pulu", "Rima", "Soma", "Sylkki", "Valpu", "Virpi"; private String nimi; private double utareidentilavuus; private double maitoavalmiina; public Lehma(String nimi) { this.nimi = nimi; utareidentilavuus = 15+(int)(Math.random()*25); maitoavalmiina = 0; public Lehma() { this( NIMIA[ (int)(math.random()*nimia.length)] ); public double lypsa() { return maitoavalmiina; public void eleletunti() { double lisamaito = 0.7+Math.random()*1.3; maitoavalmiina += lisamaito; if ( maitoavalmiina>utareidentilavuus ) maitoavalmiina = utareidentilavuus; @Override public String tostring() { return nimitasattuna() + pyorista(maitoavalmiina)+"/"+pyorista(utareidentilavuus); private String pyorista(double luku) { return String.format("%.1f", luku); private String nimitasattuna() { return String.format("%-10s",nimi); public class Lypsyrobotti { private Maitosailio sailio; public void lypsa(lypsava lypsettava) { if ( sailio==null ) { System.out.println("Ei kiinnitetty maitosäiliöön, ei voida lypsää."); return; double maitoa = lypsettava.lypsa(); sailio.lisaasailioon(maitoa); public void setmaitosailio(maitosailio sailio) { this.sailio = sailio;

Maidon elämä - ohpejaohja2010 (Created by mluukkai@helsinki.fi 28... http://wiki.helsinki.fi/pages/viewpage.action?pageid=63743590 3 / 3 28.11.2010 23:43 public class Navetta { private Maitosailio sailio; private Lypsyrobotti robootti; public Navetta(Maitosailio maitosailio) { sailio = maitosailio; public void hoida(lehma ammu) { robootti.lypsa(ammu); public void asennalypsyrobotti(lypsyrobotti robo) { this.robootti = robo;; robootti.setmaitosailio(sailio); public void hoida(list<lehma> lehmalista) { for ( Lehma lehma : lehmalista ) hoida(lehma); @Override public String tostring() { return sailio.tostring(); class Maatila implements Eleleva { private String omistaja; private Navetta navetta; private List<Lehma> lehmat; public Maatila(String omistaja, Navetta navetta) { this.omistaja = omistaja; this.navetta = navetta; this.lehmat = new ArrayList<Lehma>(); @Override public String tostring() { String tulostus = "Maatilan omistaja: "+omistaja + "\n" + "Navetan maitosäiliö "+navetta.tostring() +"\n"; if ( lehmat.isempty() ) tulostus += "Ei lehmiä."; else { String lehmajono = ""; for ( Lehma lehma :lehmat ) lehmajono += " "+lehma + "\n"; lehmajono.substring(0, lehmajono.length()-1); tulostus += "\n"+lehmajono; return tulostus; public void lisaalehma(lehma lehma) { lehmat.add(lehma); public void eleletunti() { for ( Lehma lehma : lehmat ) public void hoidalehmat() { navetta.hoida(lehmat); public void asennanavettaanlypsyrobootti(lypsyrobotti robo) { navetta.asennalypsyrobotti(robo); Printed by Atlassian Confluence 3.3.1, the Enterprise Wiki.