Ohjelmointi 2 2005/ 21.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. Aikaa 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)

Merkitse vastauslomakkeen kääntöpuolelle mitä ohjelma tulostaa. (6p)
/* 01 */ public class VkSeko05 {
/* 02 */
/* 03 */   public static String OHI = new String("Ohi");
/* 04 */
/* 05 */   public static class Valtio {
/* 06 */     private int ohjuksia;
/* 07 */     private static boolean pommita;
/* 08 */
/* 09 */     public Valtio(int pommeja)
/* 10 */     {
/* 11 */       ohjuksia = ++pommeja;
/* 12 */       pommita = !pommita;
/* 13 */     }
/* 14 */
/* 15 */     public void tiedota() {
/* 16 */       StringBuffer apu = new StringBuffer("Ohjuksia");
/* 17 */       apu.append(": ");
/* 18 */       System.out.println(apu.toString() + ohjuksia--);
/* 19 */     }
/* 20 */
/* 21 */     public void demokratisoi(Valtio vihollinen, int pelkokerroin)
/* 22 */     {
/* 23 */       if(!!!pommita) ohjuksia -= pelkokerroin*2;
/* 24 */       vihollinen.pommita = false;
/* 25 */       vihollinen.tiedota();
/* 26 */       String ohiOn = new String(OHI + " on");
/* 27 */       System.out.println(ohiOn + ".");
/* 28 */     }
/* 29 */   }
/* 30 */
/* 31 */   public static void main(String[] args) {
/* 32 */     Valtio eka = new Valtio(1024);
/* 33 */     Valtio toka = eka;
/* 34 */     toka.tiedota();
/* 35 */     eka = new Valtio(3);
/* 36 */     toka.demokratisoi(eka, 10);
/* 37 */     eka = null;
/* 38 */     toka.tiedota();
/* 39 */   }
/* 40 */ }


2. Algoritmit ja merkkijonot

a)
Kirjoita algoritmi metodista, jolle annetaan parametrinä merkkijonossa sanoja. Metodi palauttaa merkkijonossa kaikki ne kirjaimet, jotka esiintyvät jokaisessa sanassa. Palautettujen kirjainten järjestyksellä ei ole väliä. Samaa kirjainta ei palauteta kuin kerran. Voidaan olettaa, että sanoissa käytetään vain pieniä kirjaimia.(2p)
b)
Toteuta a)-kohdan algoritmi Javalla. Toteutus joko staattisena metodina tai luokkana. (4p)

Esimerkki:
    yhteiset("kissa kassa kaappi piiska") palauttaa "ka"
    yhteiset("tosi isot sotii") palauttaa "tosi"
    yhteiset("java tentti tosi vaikea") palauttaa ""


3. Tiedostot

Tee metodi, joka lukee tiedoston rivi kerrallaan, laskien samalla riveillä esiintyvien lukujen summan. Lukujen, jotka liitetään lopulliseen summaan tulee olla väliltä alaraja<=x<=ylaraja. Metodin esittelyn tulisi olla
public int laskeSumma(String tiedostonimi,int alaraja, int ylaraja) 

Esimerkki:
kissa 5 koira 7
koirakoirakoira 2 kissakissakissa346 8
Esimerkin tiedoston summa on 20 (5+7+8), jos käyteään arvoja alaraja=5 ja yläraja=10. (6p)

4. Taulukot ja dynaamisuus

Liitteenä on luokat tiedosto/Sanat.java ja tiedosto/Sana.java.
a)
Piirrä kuva tietorakenteesta ennen Sanat-luokan main-metodin viimeisen tulosta-metodin kutsua. (1p)
b)
Kirjoita Sanat-luokkaan metodi poista(String sana), joka vähentää parametrinä tuodun sanan lukumäärää ja mikäli lukumäärä tulee 0:ksi poistaa koko sanan tietorakenteesta. Tarvittaessa saat tehdä pieniä muutoksia luokkaan Sana.(5p)


5. Luokat ja yhteistyö

a)
Lisää seuraavaan Henkilo-luokkaan metodit teeLapsi, meneNaimisiin ja tulosta, siten että seuraava ohjelma toimii oikein ja tulostaa alla olevat tulostukset. Tarvittaessa voit lisätä muitakin metodeja. Huomaa tulostuksesta miten sukunimi välittyy lapsille. (5p)
b)
Jos sama henkilö menee uudelleen naimisiin, niin hänen oletetaan eroavan entisestä puolisostaan.(1p)
c*)
Piirrä kuva tietorakenteesta pääohjelma loppuessa.(1p)

Huomaa että vanhempien ei tarvitse tietää lapsistaan syntymän jälkeen (tässä tehtävässä :-).
public class Henkilo {
  private String etunimi;
  private String sukunimi;

  private Henkilo vanhempi1=null;
  private Henkilo vanhempi2=null;
  private Henkilo puoliso=null;

  public Henkilo(String etunimi, String sukunimi) {
    this.etunimi = etunimi;
    this.sukunimi = sukunimi;
  }

  private void setVanhempi1(Henkilo h) {
    this.vanhempi1 = h;
  }

  private void setVanhempi2(Henkilo h) {
    this.vanhempi2 = h;
  }

  private void setPuoliso(Henkilo h) {
    this.puoliso = h;
  }

  public Henkilo getPuoliso() {
    return puoliso;
  }

  public String getEtunimi() {
    return etunimi;
  }

  public String getSukunimi() {
    return sukunimi;
  }

  public static void main(String[] args) {
    Henkilo matti = new Henkilo("Matti","Virtanen");
    Henkilo liisa = new Henkilo("Liisa","Mäkinen");
    Henkilo aki = new Henkilo("Aki","Saari");

    matti.meneNaimisiin(liisa);
    matti.tulosta();
    liisa.tulosta();
    Henkilo heli = matti.teeLapsi("Heli");
    heli.tulosta();
    Henkilo mikko = heli.teeLapsi("Mikko");
    // b)-kohdan toiminnot alkavat
    liisa.meneNaimisiin(aki);
    matti.tulosta();
    liisa.tulosta();
  }
}

Esimerkkitulostus:
Olen Matti Virtanen ja puolisoni on Liisa Mäkinen
Olen Liisa Mäkinen ja puolisoni on Matti Virtanen
Olen Heli Virtanen 
  ja ensimmäinen vanhempani on Matti Virtanen 
  ja toinen vanhempani on Liisa Mäkinen
Olen Riitta Mäkinen 
  ja ensimmäinen vanhempani on Liisa Mäkinen 
  ja toinen vanhempani on Matti Virtanen
Olen Heli Virtanen ja puolisoni on Riitta Mäkinen 
  ja ensimmäinen vanhempani on Matti Virtanen 
  ja toinen vanhempani on Liisa Mäkinen
Olen Matti Virtanen
Olen Liisa Mäkinen ja puolisoni on Aki Saari