wiki:k2015/demot/demo8
Last modified 2 years ago Last modified on 2016-01-19 10:03:58

Demot » Demo 8, 9.3.2015

English version

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

Pisteet 2x

Tästä alkaa uusi demojakso ja nyt laskennallinen maksimi joka kerta on 8 tehtävää. Enää ei siis ole mahdollista kerätä yli 100% (eikä tarvitse :-). Muista että demo 8-12 pisteet lasketaan tuplana kaavassa

3/5*vk + dp1 + 2*dp2

Itsearvio A1 (0p mutta pakollinen)

Jollet tehnyt jo maanantain demopalautuksessa, niin täytä edellisen (esim. demo1:n arvion demo 2 kerralla) kerran itsearviolomake: arvio.txt (lataa ja muokkaa) ja palauta NettiDemoWWW:hen nimellä A1 tiedosto arvio.txt tai jos täytät käsin paperille demon aikana etkä jaksa kirjoittaa koneelle, niin ota kuva tai skannus paperista ja paluta arvio.X (missä X on joku seuraavista: pdf, jpg, png).

Testaaminen

ComTest tai JUnit testit on tehtävä joka tehtävään, joihin se on mielekkäästi mahdollista (merkitty (T)). Muuten ei saa merkitä tehtävästä kuin 0.5 p. 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.

Tauno T1 (0.5 p)

Tee Demo 4:n Tauno-tehtävät suoraan silmukalla ko. demossa annettuun pohjaan ja lisää testejä eri kokoisille taulukoille. Silmukkaa suunnitellessa katso Taunolla tehtyjä vastauksia. Lisää testejä muillekin taulukon koolle kuin 6.

Ville V1 (0.5 p)

Tee JAVA Villestä tehtävät 10. Järjestysalgoritmit.
1.4 Ville-tehtävien palautus NettiDemoWWW:llä.

Vinkkejä

Tarvittaessa katso k2015/demo/vinkkeja8

Tehtävä 1-2*. Mäkihyppy

Täydennä edellisen demon tehtävän 7.7-8 vastaus MakiHyppy.java kunnon olio-ohjelmaksi niin, että seuraava testiohjelma toimii (huom! kaikkien "ominaisuuksien" ei tarvitse olla attribuutteina) (ks. Java-kuva)

  public void kisa() { 
    Kilpailija toni = new Kilpailija("Toni",3); 
    Kilpailija matti = new Kilpailija("Matti",7); 
    toni.tulosta(); 
    matti.tulosta(); 

    toni.setPituus(1,107);       // 1. kierros, 107 m
    toni.setPituus(2,100);       // 2. kierros, 100 m
    toni.setTuomari(2,1,19.0);   // 2. kierros, 1. tuomari, 19 p 
    toni.setTuomari(2,2,18.0);   // 2. kierros, 2. tuomari, 18 p
    toni.setTuomari(2,3,19.5); 
    toni.setTuomari(2,4,18.0); 
    toni.setTuomari(2,5,20.0); 

    matti.setPituus(1,125); 
    matti.setTuomari(1,1,20.0); 
    matti.setTuomari(1,2,20.0); 
    matti.setTuomari(1,3,20.0); 
    matti.setTuomari(1,4,20.0); 
    matti.setPituus(2,109); 
    matti.setTuomari(2,1,20.0); 
    matti.setTuomari(2,2,20.0); 
    matti.setTuomari(2,3,20.0); 
    matti.setTuomari(2,4,20.0); 

    toni.tulosta(); 
    matti.tulosta(); 

  } 

  public static void main(String[] args)  { 
    Makihyppy kisa = new Makihyppy(); 
    kisa.kisa(); 
  } 

Älä käytä kilpailijassa tyyliin

  tulos.kierros[k].pituus = p;

koska oikeasti kukin luokka olisi omassa tiedostossaan ja tällöin noin ei voisi kirjoittaa koska Kilpailija ei näe tuloksen private attribuutteja silloin. Nyt valitettavasti private attribuutteihin pääsee käsiksi vieraastakin luokasta koska nuo ovat saman tiedoston sisällä (???).

Tehtävä 3*. Postimaksu oliotaulukolla

Muuta demotehtävän 7.4 vastaus Kirje.java sellaiseksi, että kahden taulukon sijasta onkin vain yksi taulukko, jonka alkioina on Hinta -luokka (ominaisuudet hinta ja paino). Kirjoita myös lisäksi funktio double postimaksu(int paino) . (T)

Toteuta vielä uusi ratkaisu siten, että on yksi 2-ulotteinen taulukko (n x 2), jonka 1. sarakkeessa (sarake 0) on paino reaalilukuna ja toisessa sarakkeessa (sarake 1) hinta reaalilukuna. (T)

Tehtävä 4*5. Liittymän erottaminen

Katso esimerkkiä Vaihtoehdot2.java, Valinta.Java ja AanestysLiittyma.java. Noissa on toisessa tiedostossa kaikki ”logiikka” (eli tietorakenteen käsittely) ja toisessa kaikki komentorivikäyttöliittymään kuuluva asia.

Demo 7 mallivastauksessa AstiaPeli.java on kuitenkin sekä käyttöliittymää, että logiikkaa samassa tiedostossa. Ota myös Astia.java Esiintymat.java Kombinaatiot.java jotta voit kääntää ja ajaa ohjelman.

Erota tästä vastaavalla tavalla itse AstiaPeli (jätä tänne kaikki metodit, jotka eivät tulosta) ja KomentoriviAstiaPeli (tänne kaikki metodit jotka tulostavat tai kutsuvat metodeja jotka tulostavat). Koita saada niin, että pääohjelma (siirretään luokkaan KomentoriviAstiaPeli) on täsmälleen samanlainen kuin GraafinenAstiaPeli-luokassa. Tarvittaessa kirjoita muutama pieni metodi lisää luokkaan AstiaPeli. Testit Bonus-tehtävänä.

Tehtävä 6*. Matriisin suurin

Kirjoita aliohjelma matriisinSuurin, joka palauttaa 2-ulotteisen matriisin suurimman alkion arvon. (T)

Tehtävä 7. Matriisin summa taulukon summan avulla

Edellisen kerran tehtävän 7.8 vastauksen Rajat.java funktiota summa käyttäen kirjoita uusi funktio summa, joka laskee 2-ulotteisen reaalilukumatriisin summan (älä kopioi, vaan kutsu funktiota, muista että matriisi on taulukko riveistä!). (T)

Tehtävä 8. Päivämäärä

Ota selvää miten päivämäärä saadaan selville Javan kirjastokutsuilla. Kirjoita metodi paivays, jolla saadaan nykyinen päiväys selville Demo 6:n Pvm.java:n Pvm tyyppiseen olioon. Muuta tarvittaessa myös luokan muodostaja ja alusta -metodi sellaiseksi, että jos alustuksessa ei anneta kaikkia arvoja, arvona käytetään nykypäiväystä puuttuville arvoille (pois saa jättää oikealta): (T) Esimerkiksi:

  Pvm tammi2005 = new Pvm(1,1,2005)=>  1.1.2005 
  Pvm tammi2014 = new Pvm(1,1); // =>  1.1.2014
  Pvm maalis2014 = new Pvm(1);  // =>  1.3.2014 
  Pvm tanaan = new Pvm();       // =>  5.3.2014
                                  // (testattu 5.3.2014) 

Tehtävä B1. Pylväs

Malliksi toisenlainen GraafinenAstia. Huonoa tuossa on vielä montakin asiaa. Yksi on kuitenkin se, että astian koodiin on sotkettu paljon grafiikkaa, jolla voisi olla muutakin käyttöä. Ota grafiikkaan liittyvä koodi ja tee siitä Pylvas -luokka, joka voidaan testata seuraavalla pääohjelmalla:

public static void main(String[] args) {
    Pylvas p5 = new Pylvas(1,5,0); 
    Pylvas p8 = new Pylvas(1,8,2);
// muodostajalle pylvään leveys, korkeus ja väritetyn osan määrä
// väritetyn osan korkeudesta käytetään nimeä väli

    Window window = new Window();
    window.scale(0,0,5,8);
    p8.move(2,0,0);
    p8.setValiColor(Color.RED);

    window.add(p8);
    window.add(p5);
    window.showWindow();

    Syotto.kysy("Lisää 5 pylvään väliä");         p5.setVali(4);
    Syotto.kysy("Pienennä 8 pylvään korkeutta");  p8.setKorkeus(6);
}

Tehtävä B2. Testit AstiaPeliin

Muuta KomentoriviAstiaPeli-luokan testit taas toimiviksi.

Tehtävä G1-4. Jäsenen suojaaminen

Malliohjelman vaiheen 5 luokassa Jasenet (Jasenet.java) on metodi anna joka palauttaa Jasen-luokan viitteen (Jasen.java). Tässä on se vika, että luokassa KerhoSwing (KerhoSwing.java) olevassa metodissa tulostaValitut voitaisiin muuttaa Jasen-luokan olion arvoa (ks. myös Kerho.java):

401     public void tulostaValitut(JTextArea text) {
402         PrintStream os = TextAreaOutputStream.getTextPrintStream(text);
403         os.println("Tulostetaan kaikki jäsenet");
404         for (int i = 0; i < kerho.getJasenia(); i++) {
405             Jasen jasen = kerho.annaJasen(i);
                jasen.vastaa_aku_ankka();  // esim. näin muutettaisiin
406             tulosta(os, jasen);
407             os.println("\n\n");
408         }    
409     }

Mieti ja toteuta millainen pitäisi olla metodin anna paluuarvo, jotta metodia käyttävät eivät voisi mitenkään "pilata" palautetun jäsenen arvoa. Vinkki: muista rajapinnat.