Ohjelmointi 2 / 2009

Välikoe / 27.3

Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään liittyvää tehtävää. Aikaa 4 tuntia. Jokainen vastaus omalle paperilleen, bonustehtävät voi kirjoittaa samalle. Tehtävistä 1-6 SAA vastata vain 4:ään. Jos vastaa useampaan 4 huonointa arvostellaan.
1.
Tutki ohjelman toimintaa pöytätestillä käyttäen ohessa olevaa pöytätestilomaketta. (6p)
- 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 * jokaisen muuttujan päälle joka on viitemuuttuja.
- N1 tarkoittaa ensimmäistä kekoon luotua oliota. N2 toista jne.
- Käytä &-merkkiä olioviitteisiin. (esim. &N1 viittaa N1:een)

/*01*/public class Lama {
/*02*/    private static int arvio = -15;
/*03*/    private static String tila = "TAANTUMA";
/*04*/
/*05*/    public static class Politiikka{
/*06*/        private boolean valtiollaRooli;
/*07*/
/*08*/        public Politiikka(boolean valtiollaRooli){
/*09*/            this.valtiollaRooli = valtiollaRooli;
/*10*/            if (!!!valtiollaRooli)
/*11*/                arvio = 2 * --arvio;
/*12*/            valtiollaRooli = !valtiollaRooli;
/*13*/        }
/*14*/
/*15*/        public void elvyta(int paketti){
/*16*/            if (valtiollaRooli)
/*17*/                arvio += --paketti;
/*18*/        }
/*19*/
/*20*/        public static void spekuloi(){
/*21*/          System.out.println(tila.toLowerCase() + ++arvio + "!");
/*22*/        }
/*23*/    }
/*24*/
/*25*/    public static void arvioi(){
/*26*/        if (arvio < 0)
/*27*/            tila = "LAMA";
/*28*/        else
/*29*/            tila = "HYVÄ";
/*30*/    }
/*31*/
/*32*/    public static void main(String[] args){
/*33*/        Politiikka keynes = new Politiikka(true);
/*34*/        Politiikka yltioKapitalismi = new Politiikka(false);
/*35*/        yltioKapitalismi.elvyta(20);
/*36*/        arvioi();
/*37*/        Politiikka.spekuloi();
/*38*/        keynes.elvyta(52);
/*39*/        arvioi();
/*40*/        Politiikka.spekuloi();
/*41*/    }
/*42*/}
2.
a) Taulukkoon on talletettu n kappaletta kokonaislukuja väliltä 0-n. Kirjoita lineaarisessa ajassa ( O(n) eli suorituksen kesto on suoraan verrannollinen taulukon kokoon) toimiva algoritmi, joka järjestää taulukon alkiot suuruusjärjestykseen pienimmästä suurimpaan. (Vinkki: Käytä apuna taulukkoa, johon lasketaan kunkin luvun esiintymien lukumäärä) (2p)
b) Toteuta algoritmi Javalla. (4p)
3.
a) Muodosta Firma -luokka siten, että alla oleva ohjelma toimii oikein. (4p)
b) Piirrä kuva tietorakenteesta määrätyissä kohdissa. (2p)
Firma taito = new Firma("Taito");
Firma tunarix = new Firma("TunariX");
Firma solero = new Firma("Solero");
Firma mokia = new Firma("Mokia");

solero.tulosta();
tunarix.tulosta();
taito.tulosta();
mokia.tulosta();
// Piirrä rakenne tässä vaiheessa
tunarix.valtaa(solero);
tunarix.valtaa(mokia);
solero.tulosta();
tunarix.tulosta();
taito.valtaa(solero);
solero.tulosta();
tunarix.valtaa(taito);
// Piirrä rakenne tässä vaiheessa
tunarix.tulosta();
taito.tulosta();
Esimerkkitulostus (oikeasti jokainen Hei -alkava rivi samalle riville):
Hei, olen Solero. Minulla ei ole omistajaa.
Hei, olen TunariX. Minulla ei ole omistajaa.
Hei, olen Taito. Minulla ei ole omistajaa.
Hei, olen Mokia. Minulla ei ole omistajaa.
Hei, olen Solero. Minut omistaa TunariX.
Hei, olen TunariX. Minulla ei ole omistajaa. Omistan seuraavat yritykset: Solero, Mokia
Hei, olen Solero. Minut omistaa Taito.
Hei, olen TunariX. Minulla ei ole omistajaa. Omistan seuraavat yritykset: Mokia, Taito
Hei, olen Taito. Minut omistaa TunariX. Omistan seuraavat yritykset: Solero

4.
a)
/*1*/ private final Collection<Jasen> alkiot = new ArrayList<Jasen>();
/*2*/ private final ArrayList<Jasen> alkiot = new ArrayList<Jasen>();
/*3*/ private final Collection<Jasen> alkiot = new Collection<Jasen>();

Mitkä näistä kolmesta rivistä ovat sallittuja Javan peruskirjaston mukaan? Kerro lyhyesti virheellisten rivien osalta, että miksi kyseinen lause ei ole sallittu sekä sallittujen rivien osalta, että mitä rivillä tarkoitetaan. (2p)
b) Jos esitellään
private final ArrayList<Integer> alkiot = new ArrayList<Integer>();

ja lisätään:

alkiot.add(345);

ja luetaan

int luku = alkiot.get(0);  
niin mitä tapahtuu ja miksi? (2p)
c)
if ( Tiedosto.lueTiedosto("koe.txt").length() != 0 ) {
    String [] rivit = Tiedosto.lueTiedosto("koe.txt");
    ...
}

Tiedosto.lueTiedosto(nimi) lukee parametrina annetun tiedostonnimen 'nimi' sisällön ja palauttaa sen merkkijonolistana, jossa jokainen tiedoston rivi on omalla rivillään.
Tutki yllä olevaa koodiesimerkkiä. Pohdi toteutuksen mielekkyyttä ja esittele siihen mahdollisesti liittyviä ongelmia.
Huom: Tehtävässä ei tarvitse pohtia lueTiedosto -aliohjelman sisäistä toteutusta. Voit olettaa sen toimivan yllä olevan kuvauksen mukaisesti. (2p)
5.
Liitteenä luennolla tehty TaulukkoGen.java . Toisena liitteenä Javan Collection -luokan rajapinnan dokumentaatio. Toteuta toimiviksi puuttuvat rajapinnan vaatimat metodit (myös optionaaliset) (ei seuraavia: equals, remove, removeAll, retainAll, HashCode :n toteutus saa olla mitä tahansa). Miten luokka TaulukkoGen esitellään nyt, niin että se toteuttaa Collection rajapinnan. (6p)
6.
Toteuta toimiviksi edellisen tehtävän tekemättä jääneet metodit: equals, remove, removeAll, retainAll. (6p)
B1.
Bonus: toteuta 2. tehtävän Java-ohjelmaan testit (JUnit tai ComTest). (1p)
B2.
Kirjoita testit 6. tehtävän metodeille. (1p)