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