wiki:k2015/demot/demo7
Last modified 2 years ago Last modified on 2016-01-19 10:01:16

Demot » Demo 7, 2.3.2015

English version

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

Muista, ettei tehtäviä lasketa kuin max. 10 kerrallaan, joten jos teet bonus-/gurutehtäviä, niin voit säästää aikaasi jättämällä muutaman "tavallisen" tekemättä. Bonustehtävät on täysin mahdollista tehdä kurssin tiedoilla. Tämän kerran Guru-tehtäväkin on mahdollista tehdä; se vaatii vain hieman miettimistä.

Tämä on laskennallisesti viimeinen demokerta demojaksoon 1. Demojaksoon 2 tulevat demot 8,9,10,11,12. Demojaksossa 2 jokaisen kerran maksimipistemäärä on 8 tehtävää (jaksossa 1 se oli 10). Pistelaskennassa prosentteihin ei pyöristellä, vaan KATKAISTAAN. Eli 104.95% => 104% < 105%.

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ät on testattu ja vähän mielipiteitä testaamisesta.

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 C1 (1 p), pakollinen

Testaa demo 6:n Pvm-luokkasi seuraavilla testeillä:

     * @example
     * <pre name="test">
     * #CLASSIMPORT
     *   Pvm pvm = new Pvm(20,2,2012);
     *   pvm.alusta(1,3,0);     pvm.toString() === "1.3.2012";
     *   pvm.alusta(2,13,2012); pvm.toString() === "1.3.2012";
     *   pvm.alusta(28,2,2012); pvm.toString() === "28.2.2012";
     *   pvm.alusta(29,2,2011); pvm.toString() === "28.2.2012";
     *   pvm.alusta(29,2,2012); pvm.toString() === "29.2.2012";
     *   pvm.alusta(31,3,2012); pvm.toString() === "31.3.2012";
     *   pvm.alusta(31,4,2012); pvm.toString() === "31.3.2012";
     *   pvm.alusta( 0,2,2012); pvm.toString() === "31.3.2012";
     * </pre>

     * @example
     * <pre name="test">
     * #STATICIMPORT
     *  Pvm pv1 = new Pvm(15,6,2013);
     *  Pvm pv2 = new Pvm(14,5,2014);
     *  Pvm pv3 = new Pvm(15,7,2014);
     *  Pvm pv4 = new Pvm(16,7,2014);
     *  Pvm pv5 = new Pvm(16,7,2014);
     *  Pvm pv6 = new Pvm(16,7,2012);
     *  compareTo(pv1,pv2) === -1;  // ero vuodessa
     *  compareTo(pv2,pv1) ===  1;
     *  compareTo(pv2,pv3) === -1;  // ero kuukaudessa
     *  compareTo(pv3,pv2) ===  1;
     *  compareTo(pv3,pv4) === -1;  // ero päivässä
     *  compareTo(pv4,pv3) ===  1;
     *  compareTo(pv4,pv5) ===  0;  // kaikki samoja
     *  compareTo(pv6,pv2) === -1;  // ero kuukaudessa, mutta vuodessa toisinpäin
     *  compareTo(pv2,pv6) ===  1;
     * </pre>

Vastauksena palauta tiedosto testaaminen.txt, jossa kerrot, miten testeissä kävi ja miksi. Kerro samalla, mitä pitää korjata, jotta testit menevät läpi.

Tauno T1 (0.5 p)

Tee Demo 3: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 9. Taulukot.
1.4 Ville-tehtävien palautus NettiDemoWWW:llä.

Tehtävä 1. Java ja String-luokka

Mikä (tai yhdistelemällä mitkä, ks. sähköposti) Java:n String -luokan metodi sopisi seuraavan ongelman ratkaisemiseen ja miten (kirjoita malli kutsusta):

  1. Onko merkkijonossa jono muita kirjaimia kuin joukon k kirjaimet
    jono="kissa" k="aik" -> on, k="aiks" -> ei ole
    
  2. Missä on jonon viimeinen '\'.
    "C:\mytemp\ohj2\vesal\Koe.java"  -> 
    indeksi "osoittamaan" viimeiseen '\'-merkkiin, 
    eli jonon \Koe.java:n alkuun.
    
  3. Onko jonossa jokin kirjain joukosta k
    jono="kissa" k="ibm" -> on , k="pc"  -> ei ole
    

Mikäli et keksi suoraa tapaa tehdä kyseinen asia Java:n String-luokan metodilla, voit toteuttaa tehtävän tekemällä itse vastaavan toiminnallisuuden esimerkiksi silmukkaa apuna käyttäen.

Jos haluat "urheilla", niin yhden rivin vastauksen saat esim. säännöllisillä lausekkeilla (ks myös esim: regex-coach)

Tehtävä 2. String-luokka lisää

Edelleen katso String -luokasta kuinka saataisiin vastaus kysymyksiin (kirjoita esimerkki­koodit, nyt voi olla ettei yksi rivi enää riitä):

  1. onko " matti* " sama kuin "Matti Nykänen"?
    (vastaus: on.  Huomaa jokerimerkki, välilyönnit, sekä
    isot ja pienet kirjaimet)
    
  2. Paljonko jonossa "Kissa istuu puussa" on yhteensä
    merkkejä "a-j" tai "r-w"  ("a-j" == "abcdefghij")
    (vastaus: 2*a + 2*i +5*s + 1*t + 4*u = 14)
    

Tehtävä 3. Postimaksu

Monisteen luvussa 9.5.2 on esimerkki funktiosta postimaksu. Tee tätä matkien funktio suurinKirjeenPaino, joka palauttaa suuriman kirjeen painon, jonka voi lähettää tie­tyllä rahasummalla, if -toteutus. TIM

Tehtävä 4*. Kirjeen paino taulukolla

suurinKirjeenPaino, taulukkoon pohjautuva toteutus. Koeta saada hintojen muut­taminen mahdollisimman helpoksi. TIM

Tehtävä 5. Palindromi

Kirjoita funktio palindromi, joka palauttaa tiedon siitä (true=kyllä, false=ei) onko parametrina välitetty SANA palindromi vai ei (esim abba on palindromi, apua ei ole, sanassa ei ole välilyöntejä tai muita erikoismerkkejä). TIM

Tehtävä 6. Tuhoa lopusta

Kirjoita kaksi eri tuhoaLopusta aliohjelmaa (toinen String-jonoille ja toinen StringBuilder (tai StringBuffer) -jonoille), jotka loogisessa mielessä "poistavat" merkkijonon n viimeistä merkkiä (muista virhetilanteet!):

String s="Kissa istuu";
s = tuhoaLopusta(s,3);           // => s = "Kissa is" 
StringBuilder sb = new StringBuilder("Kissa istuu");
tuhoaLopusta(sb,3);              // => sb= "Kissa is" 

TIM

Tehtävä 7*. Tietueet

Seuraavassa C-ohjelman määritykset mäkihyppykilpailua varten. Piirrä aluksi kuva kummas­takin tietueesta (toni ja matti) "sijoituksen" jälkeen. Huomaa että C:ssä asiat ovat sisäkkäisiä. Tämän jälkeen esittele vastaavat luokat Java-kielellä. Eli tällä demokerralla tarvitaan vain luokkien nimet ja attribuuttien esittelyt. Jos esimerkki ei riitä C:n tietueista, niin lisää voit katsoa esim:Ohjelmointi ++, 9.2 Tietueet, välivaihe kohti olioita ja 13.7 Tietueet, union ja enum.

/* tonitiet.c */
/* Malli tietueesta tietueessa
#include <stdio.h>

typedef struct {
  double pituus;      /* hyppyjen pituudet metreinä */
  double tuomarit[5]; /* tuomaripisteet             */
  double pisteet;     /* Yhteistulos                */
} Kierros_tyyppi;

typedef struct {
  Kierros_tyyppi kierros[2];
  double lopputulos;
} Tulos_tyyppi;

typedef struct {
  char nimi[8];
  int  nro;
  Tulos_tyyppi tulos;
} Kilpailija_tyyppi;


int main(void)
{
  Kilpailija_tyyppi toni,matti;
/* Halutaan tehdä sijoitukset:

     toni:  nimi <- "Toni N"
            nro  <- 3
            1. kierroksen pituus <- 107
            2. kierroksen tuomareiden pisteet <-
                19,18,19.5,18,20
     matti: nimi <- "Matti H"
            nro  <- 7
            2. kierroksen pituus  <- 109
            1. kierroksen pisteet <- 125
            Lopputulos            <- 251

Esimerkki:
  toni.tulos.kierros[0].pituus = 107;
*/
  ...
  return 0;
}

Tehtävä 8*. Taulukon raja-arvot

Kirjoita aliohjelmat paras (palauttaa reaalilukutaulukon suurimman luvun), huonoin (palauttaa reaalilukutaulukon pienimmän luvun) ja summa (palauttaa reaalilukutaulukon summan). Näitä käyttäen kirjoita aliohjelma summaHuonoinJaParasPois, joka pa­lauttaa reaalilukutaulukon summan kun siitä otetaan huonoin ja paras tulos pois (sopii esim. mäkikisan arvosteluun). TIM

Tehtävä B1-4. GraafinenAstiaPeli

Seuraavissa Bonus- ja Guru-tehtävissä on tarkoitus tehdä mallin: GraafinenAstiaPeli.jar mukainen GraafinenAstiaPeli.

"Pelissä" klikataan ensin sitä astiaa (tolppaa), mistä kaadetaan ja sitten sitä astiaa, johon kaadetaan. Alarivin numeroista merkitään keltaisella niitä tilavuuksia, joita saadaan käyttämällä 8 ja 5 litran astioissa olevaa nestemäärää. Koeta saada kaikki numerot keltaiseksi "kaatelemalla" eri tavoin astiasta toiseen.

Ota aluksi pohjaksi uudet: Astia.java ja GraafinenAstia.java sekä demo 6:n mallivastauksen AstiaPeli-luokka.

Etenemisjärjestys:
  0. Luokkiin Astia, GraafinenAstia ei tarvitse tehdä muutoksia.
  1. Vaihda AstiaPelin sisäisen astiat[] -taulukon tilalle
     ArrayList<Astia> astiat;
  2. Kokeile ja aja ilman muita muutoksia.
  3. Luo uusi Swing Frame nimelle GraafinenAstiaPeli
  4. Yritä tehdä käyttöliittymästä mallin kaltainen, ilman astioita.
  5. Lisää yksi paneli nimelle panelAstiat ja laita siihen
     vaakasuuntainen BoxLayout
  6. Laita GraafinenAstiaPeli-luokan main-metodiin 
        frame.setVisible(true);
     edelle koodi:
        AstiaPeli peli = new AstiaPeli();
        peli.lisaaAstia("8", 8);
        peli.lisaaAstia("5", 5);
        frame.alustaAstiat(peli);
  7. Lisää vielä alla olevat metodit luokkaan.
      private void alustaAstiat(AstiaPeli peli) {        
        this.peli = peli;
        maxSize = peli.astioidenSumma();
        for (int i = 0; i < peli.getLkm(); i++) {
            Astia astia = peli.anna(i);
            lisaaAstia(astia);
        }
      }
  // alustavasti:
      private void lisaaAstia(Astia astia) {
        GraafinenAstia gastia = new GraafinenAstia();
        gastia.setMaxSize(maxSize);
        gastia.setAstia(astia);
        panelAstiat.add(gastia);
        gastia.addAstiaClickedListener(new AstiaClickedListener() {
            @Override
            public void clicked(GraafinenAstia klikattuAstia) {
                astiaKlikattu(klikattuAstia);
            }
        });
      }
  8. Itsellesi tehtäväksi jää siis oikeastaan vain metodi
     astiaKlikattu ja lisätä astioidenSumma() AstiaPeli-luokkaan.
     Tämä laskee kaikkien muiden astioiden yhteiskoon paitsi ämpärin.
     Tämän tiedon perusteella osataan astiat piirtää suhteessa oikean
     kokoisiksi. Malliesimerkissä summa on siis 13.

Uuden Astia-luokan ero vanhaan Astia-luokkaan on siinä, että siihen on lisätty

addMaaraMuuttuuListener

jonka ansiosta voidaan "kuunnella" määrän muuttumista ja näin graafisessa versiossa reagoida siihen. GraafinenAstia on vain "näytin", johon voidaan liittää Astia} ja kun Astia muuttuu, niin GraafinenAstia huomaa tämän ja muuttaa siksi "nesteen pintaa". Toteuta mallin mukaisesti toimiva GraafinenAstiaPeli niin, että siinä ei vielä tarvitse toimia löydettyjen määrien näyttäminen. Kokeile toimiiko ilman muita muutoksia 3:lla lisätyllä astialla.

Tehtävä B5-6. Esiintymat

Astiapelissä (AstiaPeli.java) voitaisiin tehdä lopun automaattista tarkistusta auttamaan luokka, jota voitaisiin käyttää seuraavasti (sovitaan että astioiden tilavuudet voivat olla vain ko­konaislukuja):

public static void main(String[] args)  {
    Esiintymat esiintymat = new Esiintymat(1,13);  
                          // laskee lukujen 1-13 esiintymiä
    esiintymat.lisaa(0);  // ei vaikuta, koska 0 ei ole välillä [1,13]
    esiintymat.lisaa(1);  //
    esiintymat.lisaa(8);  // lisää yhden esiintymän luvun 8 kohdalle.
    esiintymat.lisaa(5);  // lisää yhden esiintymän luvun 5 kohdalle.
    esiintymat.lisaa(13); //
    System.out.println(esiintymat.loydetyt());   // 1 5 8 13
    System.out.println(esiintymat.ei_loydetyt());// 2 3 4 6 7 9 10 11 12
    int loydettyja = esiintymat.getLoydettyja();
    System.out.println("Loydettyja on " + loydettyja);// Löydettyjä on 4
}

Toteuta (tietysti myös testit) luokka Esiintymat ja testaa sitä mm. em. kutsuilla.

Tehtävä G1-2. Kombinaatiot

Edelleen astiapeliin. Löydetyt esiintymät on "helppo" tarkistaa jos tiedetään että käyttöastioita on 2 kappaletta. Mutta jos astioita on lkm -kappaletta, niin testaaminen meneekin vaikeammaksi. Toteuta apuluokka, jota voitaisiin käyttää edellisen tehtävän Esiintymat -luokan kanssa apuna käymään läpi kaikki summakombinaatiot, joita astioista voisi muodostaa. Eli jos meillä olisi vaikkapa astioita 3 kappaletta ja niissä olisi nestettä 3, 5 ja 9 litraa, niin saisimme niillä aikaiseksi summakombinaatiot (järjestys ei ole oleellinen):

3       (0+0+3)
5       (0+5+0)
8       (0+5+3)
9       (9+0+0)
12      (9+0+3)
14      (9+5+0)
17      (9+5+3)

Aloita hahmottelu miettimällä kuinka voisit alustaa luokan, mitä metodeja tarvittaisiin ja miten kutsuisit metodeja (vrt. edellinen tehtävä, olkoon luokan nimi vaikkapa Kombinaatiot).

Tehtävä G3-4. Liittäminen astia-peliin

Lisää Esiintymat ja Kombinaatiot -luokan käyttö sekä komentorivipohjaiseen AstiaPeliin että Graafiseen astiapeliin niin, että käyttäjä aina tietää mitkä nestemäärät hän on onnistunut ratkaisemaan ja mitkä ovat vielä ratkaisematta. Kun kaikki on löydetty, peli huomauttaa tästä.