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)