Ohjelmointitekniikka (Java) - projektit

Muutettu viimeksi 11.2.2008.

Ohjelmointiharjoittelu muodostuu kolmen aihealueeen harjoittelusta: kokoelmaluokat, säikeet, graafinen käyttöliittymä. Projektityöt toimimitetaan harjoitusten ohjaajalle tarkastettaviksi viimeistään maanantaina 25.2. kello 23:59. Kurssin pisteistä 15/60 on saatavissa projekteista. Kukin osatehtävä arvostellaan pistein 0-5. Myöhästyminen johtaa nopeaan maksimipistemäärän vähenemiseen.

Projektityöt saavat olla myös ryhmätyön tuloksia, kunhan kaikki tekijöiksi nimetyt todella ovat kunnolla osallistuneet työhön. Täysi vastuu tästä on opiskelijoilla itsellään.

Ohjelmia ei tarvitse erikseen dokumentoida, mutta täysien pisteiden saamisen välttämätön edellytys on, että että ohjelmat on kommentoitu hyödyllisesti ja huolellisesti. Harjoitusten ohjaaja antoi vielä yhden tärkeän lisäyksen ohjeisiin: "Töissä oletetaan käsiteltävän virheitä ja poikkeuksia niin kuin kurssilla on opittu. Tuskin joka metodin tarvitsee invarianttia tarkistaa, mutta esiehtoja olisi kiva nähdä, ja siepattujen poikkeusten käsittelemättä jättämistä ei olisi kiva nähdä."

Täsmennetyt palautusohjeet (Blom):

Tehtävät:

  1. Osa 1, kokoelmaluokat:

    Tee kaikki seuraavat (a, b ja c) tehtävät:

    1. Toteuta geneeriset joukko-operaatiot yhdiste, leikkaus ja erotus.

    2. Suunnittele ja toteuta uusi proxy-näkymä Javan kokoelmille. Proxyn kautta käytettynä kokoelmasta näkyvät kaikki jonkin ehdon toteuttavat elementit. Näkymää käytetään seuraavaan tapaan:
        Collection <E> c = ..;
        Property <E> prop = new Property <E> () {
            public bool cond (E e) { return . . ; }};
        SubCollection <E> s = new SubCollection <E> (c, prop);
        for (E e : s)
          System.out.println (e); 
      

    3. Tee ohjelma, joka laskee tekstitiedoston sisältämien eri sanojen lukumäärät. Ohjelma tulostaa eri sanat lukumäärineen aakkosjärjestyksessä. "Sana" saa olla välilyöntien ja rivinvaihtojen muista "sanoista" erottama merkkien jono. Voit toki halutessassi karsia myös välimerkit pois "sanoista". "Aakkosjärjestyksenä" saat käyttää String-luokan compareTo-vertailun antamaa järjestystä. Toki voit tätä järjestystä halutessasi parantaakin.

  2. Osa 2, säikeet

    Tee ainakin yksi seuraavista tehtävistä (a, b tai c):

    1. Säikeiden kokeilua:

      1. Ohjelmoi seuraava luokka: Ilmentymällä on hallussaan yksi kokonaislukuarvo, johon luokan ainoa metodi osaa lisätä annetun luvun. Metodi aina myös tulostaa muuttuneen arvon. Laadi myös ohjelma, joka luo yhden ilmentymän mainitusta oliosta sekä joukon säikeitä, jotka kilvan päivittelevät kyseistä oliota. Olion luokka on ohjelmoitava siten, ettei yksikään lisätty arvo jää tulostumatta.
      2. Toteuta luentokalvojen tuottaja-kuluttaja-esimerkki. Laajenna esimerkkiä siten, että tuottajia ja kuluttajia voi olla useampia. Suunnittele ja toteuta myös ohjelman toiminnan seuraamisen mahdollistavat tiulostukset. Kokeile järjestelmää erilaisilla tuottajien ja kuluttajien määrillä.

    2. Toteuta seuraava graafisen käyttöliittymän ja säikeiden kokeiluohjelma: Työsäie (worker thread) laskee rajattomasti sekunnin kymmenyksiä - int-muuttuja saa pyöriä kuin matkamittari, ei siis huolta ylivuodosta. Toinen säie tarkkailee työsäiettä ja kerran sekunnissa tulostaa nykyisen laskurin arvon. "Start/Stop"-nappulan painaminen luo ja käynnistää uuden työsäikeen ja sen tarkkailijasäikeen. Nappulan painaminen uudelleen ilmoittaa tarkkailijalle, että on syytä lopettaa sekä oma, että työsäikeen toiminta.

    3. Ohjelmoi rekursiivinen pikajärjestäminen (quicksort) monisäikeisenä: jokainen rekursiotaso suoritetaan omassa säikeessään, joka järjestää saamansa palasen taulukosta. Tarvitaanko synkronointia? Tutki ja mittaa yksisäikeisen ja monisäiseisen pikajärjestämisen nopeutta.

  3. Osa 3, graafinen käyttöliittymä

    Tee ainakin yksi seuraavista tehtävistä (a, b, c tai d):

    1. Ohjelmoi seuraavat graafiset sovellukset.

      1. Tee ohjelma, joka näyttää JFrame-elementin, jolla on näppäintapahtumankuuntelija (key listener) ja kolmenlaisten hiiritapahtumien kuuntelijat. Tulosta tieto kaikista tapahtumista niiden tapahtuessa ja ohjelman ohjelman lopussa tulosta vielä eriteltyinä kaikkien tapahtumien lukumäärät.

      2. Kirjoita ohjelma, joka näyttää ainakin kolme erilaista kuvaa JLabel-kentässä. Kun ohjelma käynnistetään, ensimmäinen kuva näytetään. Sovelmassa on myös nappula, jota painaen näytetään aina seuraava kuva. Viimeisen kuvan jälkeen näytetään taas ensimmäinen, jne.

    2. Suunnittele ja ohjelmoi jokin yksinkertainen kahden pelaajan lautapeli graafisena sovelluksena tai sovelmana. Esimerkiksi klassinen tic-tac-toe kelpaa, mutta toki saat toteuttaa vaikka shakin tai go-pelin, jos oikein hurjaksi heittäydyt.

      Pelipöytä piirretään näkyviin ja siirrot näytetään. Pelin päättyessä ohjelma ilmoittaa voittajan tai mahdollisen tasapelin.

    3. Toteuta graafinen "taskulaskin". Laskimessa on syytä olla ainakin normaalin nelilaskimen operaatiot, mutta toki muistipaikan voi ottaa mukaan, samoin erilaisia funktioita, ja jos intoa riittää, saat toki tehdä vaikka funktioiden kuvaajia piirtelevän ohjelmoitavan "tieteellisen" laskimen...

    4. Suunnittele ja ohjelmoi graafisena sovelluksena tai sovelmana kahden pelaajan klassinen "tietokonepöytätennis", Ping Pong. Näkymän vasemmassa ja oikeassa reunassa näkyviä mailoja liikutellaan alas ja ylös esimerkiksi näppäinpareilla z-a ja m-k. Pallon pomppimisen geometrian ohjelmointiin auttaa varmaan luentomateriaalin pallon pompotteluesimerkki.