Ohjelmointi 2 -- kesä 2006 -- Demo 8/11

Demonumero:8/11
Palautus:tiistaina 27.6.2006 klo 18 mennessä.
Laskennallinen tehtävämäärä:
 9 kpl.
Pisteitä saa korkeintaan:
 11 kpl.

(esim. 12 tehtyä kohtaa -> 11 pistettä Korppiin)

Jos vastaukseen liittyy ohjelmointia, palauta täydellinen Java-luokka tarvittavine metodeineen -- älä pelkkää pätkää tekstitiedostossa!

Nyt on noita luennolla lupaamiani tehtäviä, joissa pääsee tutustumaan Javan kirjastoihin... manuaalit kauniiseen käteen ja sieltä sitten etsimään.

1-4:

(Kertausta, "pistokoe")

Tämä on tärkeä tehtävä, johon sopivalla tavalla vastaamalla saattaa pystyä vaikuttamaan siihen, kuinka tarkasti katson läpi aiemmat demovastaukset siinä "105 prosentin mielessä" ja ehkä myös arvosanamielessä...

(Jos asiat eivät vielä ole selviä, niin ei muuta kuin lukemaan luentomonistetta ja kirjallisuutta, keskustelemaan muiden kanssa sähköpostilistalla, ja tarvittaessa etsiskelemään ymmärrystä netistä tai muualta.)

Olio-ohjelmoinnin periaatteet:

  1. Mitä eri syitä voi olla luokan perimiselle jostakin toisesta?
  2. Mitä vaihtoehtoja olio-ohjelmoinnissa on perimiselle?
  3. Mikä on "rajapinta" yleisesti ottaen olio-ohjelmoinnissa ja mitä hyötyä sellaisesta on ohjelmien tekemisessä?
  4. Verrattuna edelliseen: mikä on Javan interface-systeemi?
  5. Selitä suojaustasojen merkitys yleisesti ottaen sekä se, miten ne Javassa ilmenevät.

Java-kieli ja -toimintaympäristö:

  1. Kirjoita esimerkin vuoksi rivi, jolla Javassa aloittaisit määrityksen luokalle, joka on peritty toisesta ja toteuttaa kolme eri interface-rajapintaa.
  2. Mistä luokasta kaikki luokat Javassa tulevat väistämättä perityksi? Selitä suomen kielellä kyseisen luokan rajapinta.
  3. Selitä suomen kielellä rajapinnan java.lang.Comparable toiminta ja merkitys.
  4. Mitä merkitsee Javan avainsana static? Mihin sen voi laittaa ja millaiseen tarkoitukseen käyttäisit sitä?

Yksityiskohtia ja yleistystä:

  1. Selitä, mitä tiedät Javan tyyppijärjestelmästä ja parametrinvälitysmekanismista: Kerro primitiivityypeistä, luokista ja olioista sekä siitä, miten tieto näistä kulkee metodien käyttöön. Millä eri tavoilla metodi voi "jättää jälkensä" muiden ohjelman osien toimintaan vielä suorituksensa jälkeenkin?
  2. Mitä tarkoittaa "dynaaminen tietorakenne" ja mitä sellaisella saavutetaan?
  3. Unohda Java hetkeksi. Mitä yleisesti ottaen vähintään tarvitset, että voit toteuttaa jonkin tietokoneohjelman?
  4. Mitä vähintään täytyy tapahtua sen jälkeen, kun olet kirjoittanut Java-ohjelman, ennen sitä kun se on ajettu ja olet nähnyt miten se toimii? Mitä toimijoita prosessiin liittyy ja mitä kukin niistä tekee?
  5. Millainen käsityksesi mukaan on hyvä ohjelma? Sanaluettelo ei riitä -- perustele miksi kukin ominaisuus kuuluu hyvään ohjelmaan ja miten se on mahdollista toteuttaa!
5:

(Dynaaminen tietorakenne)

Muuta aiemman demon vastaukseen sisältynyt FaniKatsomo sellaiseksi, että katsomon ollessa täynnä ei heitetäkään poikkeusta, vaan luodaan uusi isompi katsomo, johon aiemmat Fanit sekä uusi tulokas siirretään.

Aiempi katsomo löytyy tuolta: http://www.cc.jyu.fi/~nieminen/oh2/demot/demo6/malli/FaniTestiLyhyt2.java

ja olennainen osuus tästä:

class FaniKatsomo {
    private static final int maxLkm = 10;
    private int lkm = 0;
    private Fani[] katsojat = new Fani[maxLkm];
    public void lisaa(Fani f) throws KatsomoTaynnaException {
        if (lkm >= maxLkm) throw new KatsomoTaynnaException();
        katsojat[lkm++] = f;
    }
    public void meteli(){
        for (int i = 0; i<lkm; i++){
            katsojat[i].kannata(System.out);      // Tietovirta parametrina
        }
    }
}
6:

(valmiit tietorakenteet)

Toteuta FaniKatsomoCol, joka on kuten FaniKatsomo, mutta fanit sijoitetaan sisäisessä toteutuksessa java.util.ArrayList -luokan instanssiin. Saa toteuttaa joko käyttäen geneerisyyttä tai sitten ilman.

7:

(Map, geneerisyys)

Käytä tässä tehtävässä nimenomaan Java 5.0:n geneerisyyttä. Toteuta puhelinluettelo käyttäen jotakin konkreettista luokkaa, joka toteuttaa java.util.Map-rajapinnan. Tee testiohjelma, jossa Map-metodeilla ensin lisäät ja sitten haet puhelinnumerot Sepe Sudelle, Lukas Podolskille ja Mr. Lordille.

Mihin ongelmaan luultavasti törmää, jos toteuttaa puhelinluettelon Mapillä? Miten ongelma korjautuisi?

8:

(Java-rajapinnat, lajittelu valmiilla algoritmilla)

(Tämän voi toteuttaa joko tehtävän 6 vastauksen pohjalta tai erillisessä pääohjelmassa.)

Sijoita erinimisiä ja -maalaisia Fani-olioita suuri joukko johonkin Javan valmiiseen tietorakenteeseen ja järjestä se sitten aakkosjärjestykseen käyttäen java.util.Collections -luokan tarjoamia palveluita.

Tee tarvittaessa muutoksia Fani-luokkaan.

9:

(Regular expressions)

Opettele käyttämään "säännöllisiä kielioppeja" eli "regular expressioneja" eli "RegExpejä" (paketti java.util.regex). Niitä käyttäen...

  1. tee ohjelma, joka lukee tekstitiedoston rivi kerrallaan, ja tulostaa rivin, mikäli rivillä näyttää olevan suomalaisittainen päivämäärä, eli esimerkiksi 1.11.2005 tai 20.5.2006 tai 12.8.1323. Yritä vähentää harhaosumia esimerkiksi IP-osoitteiden ja muiden numero/piste-hässäköiden suhteen. (kokonaan ei oikein voi välttyä käyttämällä pelkästään regexiä...)
  2. tee versio, joka tulostaa vain rivit, joilla näyttää olevan kesäkuun päivämäärä. Siis 1.4.2005 ei riitä rivin tulostamiseen, mutta 30.6.2006 riittää.

Bonus-osio

B1:

(Ohjelman ajonaikainen ympäristö, yhteys käyttöjärjestelmään)

Huom: "Not 100% Java..." kaikkea sitä oppii... silti Windows- ja Linux-ympäristössä voitaisiin haluta tehdä tällaista:

Käyttäen edellisen demon palindromitarkistusta, toteuta ohjelma, jolle voi käynnistettäessä viedä argumenttina (=komentoriviparametrina) sanan, jonka palindromisuuden ohjelma tarkistaa. Vastaus tulostetaan standardiulostulovirtaan. Jos parametria ei ole annettu, tai on annettu useita parametreja, tulostetaan standardivirhevirtaan virheilmoitus. Jos parametri on -? tai --help, tulostetaan käyttöohje standardiulostulovirtaan.

Kokeile ajaa komentoriviltä tai opettele tapa, jolla käyttämässäsi IDEssä voi antaa komentoriviparametrit (JBuilderissa näyttäisi olevan valikon "Run->Configurations" kautta mahdollista tehdä uusi ajoympäristö, jossa voi laittaa komentoriviparametrit kohtaan "Application parameters"... Eclipsessä on varmasti jotain vastaavaa.)

B2:

(Ohjelman ajonaikainen ympäristö, yhteys käyttöjärjestelmään)

Tee ohjelma, joka tulostaa ympäristömuuttujien nimet ja arvot. System luokkaa lienee hyvä paikka aloittaa etsiminen.

B3:

("Ylläpitoa" eli aiemman ohjelman tutkimista ja muokkaamista)

Täydennä Astia.java vastaamaan alussa olevaa kommenttia.