wiki:k2015/demot/demo5
Last modified 3 years ago Last modified on 2015-02-04 20:37:29

Demot » Demo 5, 16.2.2015

English version

Palauttaminen 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 tehtäväksi U1. Tiedostoon kirjoitetaan mitkä tehtävä on testattu ja vähän mielipiteitä testaamisesta.

Vinkki: Jos JOptionPane-dialogiin laittaa rivinvaihtoja, niin sisältö kannattaa ottaa:

String s = (String)(g.getComponent(JOptionPane.class).getMessage());  

koska label ei jostakin syystä tuossa tapauksessa anna kuin 1. rivin.

Jos halutaan että regular expressionissa .* voi vastata myös rivinvaihtoja, pitää se testi tehdä optiolla ?s regexpin alussa:

s =R= "(?s).*Poika: 2.*"; 

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

Tauno T1 (0.5p)

Tee Demo 1:n Tauno-tehtävät suoraan silmukalla ko. demossa annettuun pohjaan ja lisää testejä eri kokoisille taulukoille. Silmukkaa suunnitellessa katso Taunolla tehtyjä vastauksia.

Ville V1 (0.5p)

Tee JAVA Villestä tehtävät 6. Aliohjelmat 1: Proseduurit.
1.4 Ville-tehtävien palautus NettiDemoWWW:llä.

Tehtävä 1*. Henkilön toString ja parse

Muuta edellisen demon tehtävän 7-8 vastausta (Henkilo.java) seuraavasti:

  1. Lisää luokkaan parametriton muodostaja.
  2. Lisää metodi parse, joka selvittää henkilön tiedot tolppa-erotetusta merkkijonosta.
  3. Kirjoita vielä muodostaja jolla on yksi merkkijonoparametri ja muodostaja kutsuu parse-metodia.
  4. Lisää luokkaan vielä (valmis) metodi:
    public void tulosta(OutputStream os) {
        PrintStream out = new PrintStream(os);
        out.println(etunimi + " " + sukunimi + " " + syntymavuosi);
    }
    

Lisäysten jälkeen seuraavan pääohjelman:

public static void main(String[] args) {
    Henkilo hlo = new Henkilo();
    Henkilo aku = new Henkilo("Aku", "Ankka", 1934);
    System.out.println(hlo);
    hlo.parse("Sepe|Susi|1933");
    hlo.tulosta(System.out);
    aku.tulosta(System.out);
    Henkilo mikki = new Henkilo("Mikki|Hiiri");
    System.out.println(mikki);
}

pitäisi tulostaa

||0
Sepe Susi 1933
Aku Ankka 1934
Mikki|Hiiri|0

Tehtävä 2*. Päivämäärä-luokka

Kirjoita luokkaan Pvm.java saantimetodit päivälle, kuukausille ja vuosille. Ei tarvitse tehdä tiedostossa olevia TODO: -juttuja (vielä :-). Voisi käyttää esimerkiksi:

Pvm pvm = new Pvm();
pvm.parse("3.4.2011");
System.out.println(pvm.getPv()); // tulostaa 3

Huom! Tarvittava mjonot on Ali.jar paketissa.

Tehtävä 3-4. Äänestys: tyttö, poika, nainen, mies

Tee luennolla tehdyn irrallisilla RadioButtoneilla tai GUI-kirjastolla tehdyn SwingAanestys.java:n tehtävät. Katso kuva millainen ohjelmasta pitäisi tulla.

Rivin saa vaihtumaan JOptionDialogissa laittamalla tekstiin "\n", esim: "Eka\ntoka";

Tehtävä 5*. Linja-auto

Toteuta luokka LinjaAuto, jossa on ominaisuudet paikkojen lukumäärä ja vapaiden paikkojen lukumäärä. Tee metodit tulosta (vrt. Henkilo-tehtävä) sekä lisaa ja vahenna muuttamaan matkustajien lukumäärää. Kirjoita testipääohjelma.

Tehtävä 6*. Linja-auto

Modifioi edellistä ratkaisua siten, että luokaa LinjaAuto voi käyttää seuraavassa testiohjelmassa (tulostukset voivat olla kauniimpia, esimerkit lyhyyden vuoksi):

public static void main(String[] args) {
    LinjaAuto pikkubussi = new LinjaAuto(10);
    LinjaAuto isobussi = new LinjaAuto(45);
    pikkubussi.lisaa(4);    pikkubussi.tulosta(System.out); // 10,4,6
    isobussi.lisaa(30);     isobussi.tulosta(System.out);   // 45,30,15
    int yli = pikkubussi.lisaa(15);
    isobussi.lisaa(yli);    
    pikkubussi.tulosta(System.out);                         // 10,10,0
    isobussi.tulosta(System.out);                           // 45,39,6
    if ( pikkubussi.getTilaa() > 0 )
        System.out.println("Pieneen bussiin mahtuu!");   // ei tulosta
    if ( isobussi.tilaa() )
        System.out.println("Isoon bussiin mahtuu!");     // tulostaa
    int vajaa = pikkubussi.vahenna(12);                  // vajaa = -2
    if ( vajaa < 0 )                                      
        System.out.println("Pikkubussissa ei edes ole näin montaa!");
    pikkubussi.tulosta(System.out);                         // 10,0,10
}

Tehtävä 7. Tietokone

Kirjoita yksinkertainen luokka Tietokone, jossa on tietokoneelle tarpeellisia attribuutteja (muistin määrä, kovalevyn koko jne..) sekä tarvittavat muodostajat sekä sopivat metodit. Kirjoita myös testipääohjelma.

Tehtävä 8. Javan bittioperaatiot

Etsi sopivista lähteistä (esim. luentomoniste) tietoa Javan bittioperaatioista ja selvitä mitä tapahtuu seuraavassa ohjelmanpätkässä (tutki pöytätestillä):

    /* 01 */  int a=23,b=13,c=17;         
    /* 02 */  char m = 'b';
    /* 03 */  if ( ( a = b ) != 0 ) c+=0x0f;
    /* 04 */  if ( ( a & ~b ) != 0 ) c--;
    /* 05 */  m ^= 1 << 5;
    /* 06 */  if ( m == 'B' ) b &= c;
    /* 07 */  System.out.print(
                "a=" + a + " b=" + b + " c=" + c + " m=" +m );

Tehtävä B1-2. User-luokka

Muuta Demo 3:n LueUsers.java guru-tehtävän vastaus sellaiseksi, että siinä on luokka User ja attribuutteina luokassa on aliohjelman kasitteRivi tarvittavat lokaalit muuttujat. Varsinaisen muunnostyön hoitaa metodi setAsHTMLString ja tulos saadaan metodilla getAsListString. Muut metodit ja konstruktorit yms. saat määritellä itse.

Tehtävä B3. Astia-peli

Täydennä luennolla annettu astia/Astia.java niin että se toimii alkukommenteissa olevien määritysten mukaan. Kokeile ajettavaa Java-ohjelmaa: GraafinenAstiaPeli.jar ja Windows-ohjelmaa: n:\kurssit\winohj\moniste\tentit\v00\Ampari.exe. Pääohjelma malliksi

public static void main(String[] args) {
    Astia astiat[] = { new Astia("ä", 100), 
                       new Astia("5", 5), new Astia("8", 8) };
    Astia ampari = astiat[0];
    ampari.tayta();

    tulostaOhje(astiat);

    while ( true ) {
        for (int i = 1; i < astiat.length; i++)
            System.out.println(astiat[i].getTilavuus()+" litran astiassa on "+
                               astiat[i].getMaara() + " litraa nestettä");
        String rivi = Syotto.kysy("Mistä kaadetaan ja mihin");
        if ( rivi.length() == 0 ) break;
            
        StringBuilder sb = new StringBuilder(rivi); 
        String mista = Mjonot.erota(sb);
        String mihin = Mjonot.erota(sb);
        int imista = etsi(astiat, mista);
        int imihin = etsi(astiat, mihin);

        if ( (imista < 0) || (imihin < 0) )
            nimiOhje(astiat, mista, mihin);
        else astiat[imista].kaada(astiat[imihin]);
    }
}

Huomautus: Tämä tehtävä tulee jatkumaan useammassa demossa!

Tehtävä B4-5. Väli-luokka

Toteuta Vali -luokka, joka tallettaa suljetun reaalilukuvälin (päätepisteet ei-negatiivisia reaalilukuja). Kirjoita metodit parse ja compareTo(vali). parse kelpuuttaa seuraavat muodot (oletetaan että väli on alustettu ennen jokaista esimerkkiä väliksi [0,5]):

vali.parse("")       => 0-5
vali.parse("3")      => 3-3
vali.parse("3-")     => 3-5
vali.parse("-3")     => 0-3
vali.parse("1-3")    => 1-3

compareTo palauttaa tiedon siitä osuuko toinen väli itse olioon. Testiohjelmassa on tehty kaksi väliä, sitten otettu niihin tiedot merkkijonosta ja sitten verrattu osuvatko välit toisiinsa. (Testi)pääohjelma voisi olla esimerkiksi:

public static void main(String[] args) {
    Vali v1 = new Vali(1, 3), v2 = new Vali(2, 4);
    System.out.println(v1); // tulostaa (1.0-3.0)
    System.out.println(v2); // tulostaa (2.0-4.0)
    v1.parse("2-");    // loppupiste puuttuu, käytetään valin olemassa olevaa
    v2.parse("2.5-7");
    System.out.println(v1); // tulostaa (2.0-3.0)
    System.out.println(v2); // tulostaa (2.5-7.0)
    int osuman_laatu = v1.compareTo(v2); // vastaa "vähennyslaskua" 
                                         // ol = v1 - v2;
    if ( osuman_laatu == 0 ) // esimerkin välit osuvat
        System.out.println("Välit osuvat toisiinsa");
    else if ( osuman_laatu == 1 )
        System.out.println("v1 kokonaan v2:n oikealla puolella");
    else if ( osuman_laatu == -1 )
        System.out.println("v1 kokonaan v2:n vasemmalla puolella");
}

Pohdi onko mielekästä, että compareTo palauttaa 0 jos välit osuvat toisiinsa. Vihje : Piirrä kuva, miten kaksi väliä käyttäytyy toisiinsa nähden.

Tehtävä G1. Väli-luokka ja leikkaus

Lisää tehtävään B4-5 vielä tarvittavat metodit ja määrittele tyhjä väli, jotta seuraavat kutsut toimivat:

Vali v3 = v1.leikkaus(v2);
System.out.println(v3);
if ( v1.leikkaus(v2) == tyhja ) 
  System.out.println("Välit eivät osu");

Voitaisiinko tehdä välien yhdiste ja mitä ongelmia siitä seuraisi?

Tehtävä K1. getParameter paremmin

Miten seuraava pitäisi kirjoittaa jotta koodirivejä tulisi oleellisesti puolet vähemmän (kun parametrinhakurivejä tulee oikeasti kymmeniä):

  String beginHour = request.getParameter("beginHour");
  String endHour = request.getParameter("endHour");
  if (beginHour == null) beginHour="";
  if (endHour == null) endHour="";

K-alkuiset tehtävät ovat (vanhasta) Korpista otettuja koodinpätkiä, joissa olisi pitänyt osata alunperinkin tehdä paremmin.