wiki:k2013/demot/demo6
Last modified 5 years ago Last modified on 2013-05-28 15:22:07

Demot » Demo 6, 18.2.2013 - Kesällä to 20.6.2013

Palautus NETTIDEMOWWW-ohjelmalla. Tähdellä (*) merkitty ne tehtävät, jotka ehdottomasti kannattaa tehdä.

Testaaminen

Kaikki "Järkevästi" testattavissa olevat ohjelmat testattava automaattitestillä (!JUnit tai ComTest). Jos testaa GUI-ohjelmia esim Lift-kirjastolla saa merkitä yhden lisäbonuspisteen. NettiDemoWWW:hen tämä "tilitetään" palauttamalla tiedosto guitest.txt johon kirjoitetaan mitkä tehtävä on testattu ja vähän mielipiteitä testaamisesta.

Java tehtävistä 1,2, 3, 5, 6 ja B1-2, G1-2 saa merkitä täysille pisteille vain, mikäli ne tai suurin osa metodeista on automaattisesti testattu.

Ville V1

Tee JAVA Villestä tehtävät 7. Aliohjelmat 2: Funktiot.
1.4 Ville-tehtävien palautus NettiDemoWWW:llä.

Katso seuraavissa (tehtävät 1-3) Demo 5:n vastauksia tehtävään (Pvm.java).

Tehtävä 1. Pvm

Korjaa Pvm -luokan alusta -metodi niin, että siinä tehdään tarvittavat oikeellisuustarkistukset. Jos jokin attribuutti olisi saamassa väärän arvon, mitään ei muuteta (paitsi jos kutsussa on 0 vastaavssa kohdassa, jolloin jätetään ko. attribuutille alkuperäinen arvo) . Katso ideaa LisaaPvm.java esimerkistä.

Tehtävä 2. Pvm vertailu funktiolla

Kirjoita tavallinen funktio (siis staattinen metodi) compareTo(pv1,pv2), joka palauttaa -1, mikäli päivämäärä pv1 on ennen päivämäärää pv2, 0 jos päivämäärät ovat samoja ja 1 muuten (pv1 ja pv2 ovat tyyppiä Pvm, tarvitseeko luokka Pvm muutoksia jos staatti­nen metodi compareTo siirrettäisiin toisessa tiedostossa olevaan luokkaan?). Luonnollisesti TDD testi ensin.

Tehtävä 3*. Pvm vertailu metodilla

Tee edellistä funktiota vastaava metodi, eli lisää Pvm -luokkaan metodi compareTo(pv2), joka palauttaa kuten edellä (-1,0 tai 1), kun verrataan oliota itseään ja päivämäärää pv2. Lisää nyt vielä equals -metodi . ( Huom! jos et osannut 1&2. tehtä­vää, voi tämän tehdä silti). Tässäkin TDD-testi ensin.

// Käyttöesimerkki 2&3:een kun compareTo-metodit ovat Pvm-luokassa
Pvm pv1 = new Pvm(1,2),pv2 = new Pvm(3,3);
if ( compareTo(pv1,pv2) < 0 ) System.out.println(pv1 + " < " + pv2);
if ( pv1.compareTo(pv2) != 0 ) System.out.println(pv1 + " != " + pv2);

Tehtävä 4. Elain rajapinnalla

Lue monisteesta rajapinnoista. Ota ensin luentojen elukat/Elain.java, elukat/Kissa.java ja elukat/Koira.java. Ensin muuta Koira-luokan pääohjelma muotoon:

    public static void main(String[] args) {
        Elain elukat[] = {
                new Koira("Musti", 18005),
                new Kissa("Mirri", 18000),
                new Koira("Pluto", 1930),
                new Kissa("Miuku", 980),
           //     new Kotka("Kalle", 2400)
        };

        for (int i = 0; i < elukat.length; i++) {
            elukat[i].aantele();
            System.out.println(elukat[i]);
        }
    }

Kokeile että toimii ja tulostelee eri eläimiä. Sitten kopioi kaikki toiseen pakettiin. Lisää ElainRajapinta -"luokka" jossa luetellaan kaikki ne metodit, mitkä kaikki eläimet osaavat. Poista Elain-luokka ja sitten muuta Kissa ja Koira toteuttamaan perinnän sijasta ElainRajapinnan. Muuta em. pääohjelmaa siten että, taulukossa alkioiden tyypiksi tulee ElainRajapinta. Mitä voittaa? Mitä häviää? Li­sää kummassakin "kirjoittamistavassa" vielä Kotka-luokka. Palauta luokkatiedostot ElainRajapinta, Kissa, Koira, 2 kpl Kotka ja mielipiteet rajapinnan ja perimisen eroista tekstitiedostossa erot.txt siten että vastausten yhteispistemääräksi tulee 1.

Tehtävä 5*. Kulkuneuvo

Kirjoita luokka Kulkuneuvo, jossa on ainakin nopeus ja matkustajien lukumäärä. Peri tästä luokat Laiva ja Lentokone joissa kummassakin on jokin oma erikoisominaisuus yleiseen kulkuneuvoon verrattuna. Kirjoita myös pieni testipääohjelma.

Tehtävä 6*. Taulukot

Seuraavia asioita ei ole vielä käsitelty luennolla, mutta ne on käsitelty Ohjelmointi 1-kurssilla ja myös monisteen luvussa 12. Tee aliohjelma pienimmanPaikka, joka palauttaa kokonaislukutaulukon pienimmän al­kion paikan (indeksin). Esim. taulukosta:

                     /*ta,he,ma,hu,to,ke,he,el,sy,lo,ma,jo*/
    int kPituudet[] = {31,28,31,30,31,30,31,31,30,31,30,31};

    i = pienimmanPaikka(kPituudet); /* => i=1 */

Tee edellistä aliohjelmaa käyttäen aliohjelma pienin, joka palauttaa kokonaislukutaulu­kon pienimmän alkion arvon

n = pienin(kPituudet);         // => n = 28 

Tehtävä 7*. Levyt ja kappaleet

Piirrä kuva tietorakenteesta (katso monisteen luku 10 ja 11, katso, katso myös: oikea ja virhellinen kuva), jossa olisi levyjä ja kullakin levyllä voisi olla useita kappaleita. Jos omassa harjoitustyössäsi on vastaava tietorakenne, niin tämä käy myös. Jos teet kuvan harjoitustyöstäsi, niin esitä myös CRC-kortit, koska ne on joka tapauksessa kohta tehtävä.

Tehtävä 8. Säännöllinen monikulmio

Ota Graphics.jar itsellesi. Katso mallia Circle.java -luokasta ja kirjoita luokka SaannollinenMonikulmio, jota voidaan käyttää seuraavasti (ks. kuva):

    public static void main(String[] args) {
        EasyWindow window = new EasyWindow();
        window.add(new SaannollinenMonikulmio( 50, 50,30,3));
        window.add(new SaannollinenMonikulmio(150, 50,30,4));
        window.add(new SaannollinenMonikulmio( 50,150,30,5));
        window.add(new SaannollinenMonikulmio(150,150,30,6));
        window.showWindow();
    }

Tehtävä B1-2. AstiaPeli olioksi

Muuta AstiaPeli.java olio-ohjelmaksi, joka toimisi suurin piirtein seuraavasti:

...
public static void main(String args[]) {
  AstiaPeli peli = new AstiaPeli();
  peli.lisaa_astia("8",8);
  peli.lisaa_astia("5",5);
  peli.tulosta_ohje();
  peli.pelaa();
}

Astia -luokkaan ei tarvitse tehdä mitään muutosta ja voit käyttää sitä sellaisenaan. Vanhasta AstiaPeli-luokasta kopioi osa (tai kaikki) staattisista metodeista ta­vallisiksi metodeiksi uuteen AstiaPeli -luokkaan). Yritä saada niin, että sen sijaat että viittaisit suoraan attribuuttiin (taulukko) astiat[i], käyttäisit metodia anna(i). Pelin "graafinen versio" löytyy osoitteesta: https://svn.cc.jyu.fi/srv/svn/ohj2/esimerkit/k2013/demot/tehtavat/GraafinenAstiaPeli.jar

Tehtävä G1-2. AstiaPeli ja ratkaistut tilavuudet

Lisää astiapeliin seuraavanlainen tulostus ennen kuin käyttäjä valitsee astiat:

Olet ratkaissut tilavuudet: 3 5 8. 
Ratkaisematta on 1 2 4 6 7 9 10 11 12 13.

Ja peliin automaattinen lopetus kun kaikki tilavuudet on ratkaistu.

Tehtävä G3-4. Mock-luokat

Hahmottele Mock-luokkiin perustuva idea 8-tehtävän kaltaisten luokkien testaamiseksi. Ei tarvita kuin ideat, ei toteutusta.