Ohjelmointi 2 2005/ 22.3

1. välikoe


Jokainen tehtävä omalle konseptille. Yhdeltä konseptilta arvostellaan vain YKSI tehtävä. Pöytätestille on oma lomake. Tarvittaessa liitä pöytätestiinkin mukaan konsepti. Muista laittaa nimi jokaiseen tehtäväpaperiin. Laita myös nimi lunttilappuun ja palauta lunttilappukin. Koeaikaa 4 tuntia!

Vastaa 4 tehtävään (yht. max 24 pistettä) ja halutessasi niiden mahdollisiin Bonus-kohtiin (merkitty *). Jos vastaat useampaan tehtävään, arvostellaan 4 huonointa. Jos ohjelmatehtävissä käytät standardifunktioita tai metodeja, muttet muista tarkkaan funktion tai metodin nimeä, kirjoita "kuvittelemasi" esittely funktiolle tai metodille. Saat käyttää myös luennoilla käytettyjä Ali-paketin aliohjelmia samoilla ehdoilla.

Muista vastata jokaisen alakohdan jokaiseen kysymykseen niissä tehtävissä, joihin päätät vastata. Joissakin tehtävissä on pohdintaosuus (merkitty *), jonka ansiosta tehtävän summa voi ylitää 6 pistettä.

1. Pöytätesti

Tutki ohjelman toimintaa pöytätestillä käyttäen ohessa olevaa pöytätestilomaketta.
-
Merkitse harmaaksi ne alueet, jolloin muuttujaa ei ole olemassa.
-
Ruutuun merkintä vain jos muuttujan arvo muuttuu tai olio muuttuu roskaksi.
-
Merkitse iso R-kirjain kun olio muuttuu roskaksi.
-
Merkitse rivillä "* = viite" * jokaisen muuttujan päälle joka on viitemuuttuja.
-
N1 tarkoittaa ensimmäisenä new:llä kekoon luotua oliota. N2 toista jne.
-
Käytä &-merkkiä olioviitteisiin. (esim. &N3 viittaa N3:een)

(6p)
/*01*/ public class LintuLenssu {
/*02*/    private static int voittoja;
/*03*/    public static String virus = "H5N1";
/*04*/
/*05*/    public static class Lintu {
/*06*/        private boolean myrkytetty = false;
/*07*/        public static boolean sairas;
/*08*/
/*09*/        public Lintu(boolean tosi) {
/*10*/            if (!tosi) {
/*11*/                StringBuffer sb = new StringBuffer("Virus tulee Suomeen!");
/*12*/                myrkytetty = !myrkytetty;
/*13*/                if (sb.length() > virus.length()) sb.append(" Syökää kanaa!");
/*14*/                media(sb.toString());
/*15*/            }
/*16*/            if (tosi) sairastu(true);
/*17*/            myrkytetty = !tosi;
/*18*/        }
/*19*/
/*20*/        public void aantele() {
/*21*/            if (myrkytetty) System.out.println("R.I.P.");
/*22*/            if (!this.sairas && !myrkytetty) 
                    System.out.println("Olen terve. KVAAAK!");
/*23*/            if (!!sairas) System.out.println("niisk!");
/*24*/        }
/*25*/
/*26*/        public void sairastu(boolean kipia) {
/*27*/            this.sairas = true;
/*28*/            voittoja += 1;
/*29*/        }
/*30*/    }
/*31*/
/*32*/    public static void media(String propaganda) {
/*33*/        if (propaganda.length() > virus.length())
/*34*/            System.out.println(propaganda);
/*35*/    }
/*36*/
/*37*/    public static void media() {
/*38*/        System.out.println("Paniikki! " + virus + " on voittanut " 
                                 + voittoja + " kertaa!");
/*39*/    }
/*40*/
/*41*/    public static void main(String[] args) {
/*42*/        Lintu tirppa = new Lintu(false);
/*43*/        Lintu kotkansorsa = tirppa;
/*44*/        kotkansorsa.aantele();
/*45*/        media();
/*46*/        tirppa = new Lintu(true);
/*47*/        tirppa.aantele();
/*48*/        media();
/*49*/    }
/*50*/ }


2. Algoritmit ja merkkijonot

a)
Kirjoita algoritmi, joka tutkii merkkijonoa ja poistaa siitä kaikki merkkien kahdentumat, eli jos jokin merkki esiintyy merkkijonossa peräkkäin useammin kuin kerran, sen monikerrat poistetaan. (2 p.)
b)
a-kohdan algoritmin toteutus Java-metodina. (4 p.)

Esimerkkejä metodin toiminnasta:

poista_kahdentumat("kissa") palauttaa "kisa"
poista_kahdentumat("kkkkkiiiiiissssssssssssssaaaaaaaaaa")
palauttaa "kisa"
poista_kahdentumat("anneli jäätteenmäki") palauttaa "aneli
jätenmäki"


3. Tiedostot

Tee ohjelma, joka lukee tekstitiedoston ja tulostaa sen jälkeen kuinka monta merkkiä, sanaa ja riviä tiedostossa oli.(6p)

Tiedostoa luetaan riveittäin ja jokainen rivi lisää merkkimäärää yhdellä. Tämä siksi että tiedoston todellinen koko tavuina vaihtelee käyttöjärjestelmän mukaan (Windows 2 merkkiä, Mac ja Linux 1 merkkiä/rivinvaihto).

Sanaerottimien "joukko" tulee olla helposti muutettavissa.

4. Taulukot ja dynaamisuus

Liittenä on luokat Luokat Autokauppa.java Autotehdas.java Auto.java Moottori.java
a)
Piirrä kuva tietorakenteesta Autokauppa-luokan main-metodin rivin seitsemän jälkeen. (/*7*/ jouppi.hanki(ladatehdas, "tonnisata", 2;) (1p)
b)
Kirjoita Autokauppa-luokkaan etsi-metodi metodin kommenttien mukaiseksi. (1p)
c)
Kirjoita Autokauppa-luokan annaAuto-metodi metodin kommenttien mukaiseksi. (1p)
d)
Kirjoita Autokauppa-luokkaan myy-metodi metodin kommenttien mukaiseksi. (3p)


5. Luokat ja yhteistyö

a)
Tee luokka Yhtio, jolla on ainakin nimi, sekä viite yhteen sisaryhtiöön ja emoyhtiöön. Jos yhtiöllä ei ole sisar- tai emoyhtiötä, on vastaava viite tällöin null. Tee tarvittavat metodit, joilla b-kohdassa esitetyn kuvan mukainen rakenne voidaan muodostaa. (3p)
b)
Tee pääohjelma, jossa syntyy alla olevan kuvan mukainen rakenne: (2p)

             +---------------+
             |               |
+-------+    |   +-------+   |  +-------+
|"A Oy" |<---+   |"B Oy" |   |  |"C Oy" |
| null  |<-------+---o   |   +--+---o   |
| null  |<--+    |   o---+----->|   o---+---+
+-------+   |    +-------+      +-------+   |
            |        ^                      |
            |        |                      |
            |        +----------------------+
            |
            |     +-------+
            |     |"D Oy" |
            +-----+---o   |
                  | null  |
                  +-------+



c)
Miten voisi toteuttaa sen, että yhtiöllä olisi useampi kuin yksi sisaryhtiö? Tähän liittyen, miten emoyhtiö voisi tietää tytäryhtiöistään? (1p)