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):
- Palautukset osoitteeseen tuomas.blom ättä helsinki.fi
- Ratkaisut tulee palauttaa yhdessä zip-paketissa (tar/tgz käy myös),
jonka tiedostonimi alkaa tekijän käyttäjätunnuksella (ryhmässä yhden
tunnus riittää).
- Paketin sisällön tulee olla jaettuna hakemistoihin siten, että
kunkin osion ratkaisut ovat omassa alihakemistossaan, ja ne taas yhdessä
päähakemistossa, jonka nimenä on tekijän käyttäjätunnus (ryhmässä yhden
tunnus riittää).
- Jos ratkaisut ovat ryhmätyön tuotosta, kaikkien ryhmäläisten nimet
ja käyttäjätunnukset tulee löytyä joko selkeästi jokaisen tehtävän
kommenteista tai paketin päähakemiston alta README-tiedostosta.
- Pakettia palauttaessa kannattaa kirjoittaa muutama sana myös
sähköpostin viestiosaan - muuten palautus saattaa päätyä suoraan
roskapostikansioon! Yritän toki pitää roskakansiota silmällä deadlinen
lähettyvillä, mutta en voi taata löytäväni sieltä mitään.
Tehtävät:
- Osa 1, kokoelmaluokat:
Tee kaikki seuraavat (a, b ja c) tehtävät:
-
Toteuta geneeriset joukko-operaatiot yhdiste, leikkaus ja erotus.
-
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);
-
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.
- Osa 2, säikeet
Tee ainakin yksi seuraavista tehtävistä (a, b tai c):
- Säikeiden kokeilua:
-
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.
-
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ä.
-
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.
-
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.
- Osa 3, graafinen käyttöliittymä
Tee ainakin yksi seuraavista tehtävistä (a, b, c tai d):
- Ohjelmoi seuraavat graafiset sovellukset.
-
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.
-
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.
- 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.
- 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...
-
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.