Hei, olet erehtynyt sivustolle, jossa käsitellään keväällä 2008 toteutuvan ATK3-kurssin harjoitustöitä. Vaikka et kurssille osallistuisikaan, sivustolta löytyy kuitenkin erilaista ohjelmointiin liittyvää materiaalia. Suurin osa sivuston materiaalista keskittyy C++-kielen ympärille, mutta sivustolta löytyy myös yleisjorinaa, jossa käsitellään ohjelmointia yleisellä, maailmaa syleilevällä tasolla.
Kevään 2008 Harjoitustyöt

Kevään ensimmäisessä harjoitustyössä opiskelijoiden tehtävänä on rakentaa konsolissa toimiva ristinolla-peli.
Kevään toisessa harjoitustyössä opiskelijoiden tehtävänä on rakentaa konsolissa toimiva roskapostinsuodatin .
Huom! Tämän harjoitustyön palautuspäivä on muuttunut . Kevään kolmas harjoitustyö on tänä vuonna vapaavalintainen työ. Tarkemman vaatimukset löytyvät
täältä . HUOM! Jos teet tämän työn niin se arvostellaan ja tällöin voit suorittaa kurssin minitentillä
ja kurssin arvosanasta 2/3 tulee tämän työn perusteella. Kevään neljännessä harjoitustyössä on tarkoituksena perehtyä
geneeriseen ohjelmointiin sekä tutustua yksikkötestaukseen. HUOM! Tämän harjoitustyön lähdekoodipohja on muuttunut koodissa olleen bugin vuoksi (29.4.2008)!
Ristinolla
Tehtävänäsi on rakentaa ristinolla-peli, jossa ihmispelaaja voi ottaa tiukkoja mittelöitä nerokasta keinoälyä vastaan. Ohjelman tarkemmat vaatimukset löytyvät alta.
- Pelissä on oltava vähintään tekstipohjainen käyttöliittymä.
- Pelissä on oltava kaksi pelaajaa. Toisen pelaajista on oltava ihminen, jonka "liikkeet" luetaan näppäimistön ulostulosta. Toinen pelaaja on tekoäly, jonka tulee pystyä määrittämään jollain tavalla omat liikkeensä (perustuen pelilaudan tilanteeseen) tarjoten näin näennäisen vastuksen ihmispelaajalle.
- Peliä on pelattava laudalla, jonka koko on vähintään 10x10 ruutua. Pelin tulee päättyä, kun jompikumpi pelaajista saa joko vaakasuoraan, pystysuoraan tai viistoon viisi rastia tai nollaa peräkkäin.
Toiminnalliset vaatimukset
- Ohjelmisto ei saa missään tapauksessa "vuotaa" muistia.
- Ohjelman tulee pystyä käsittelemään tilanteet, jossa pelaaja (ihminen tai AI) syöttää järjestelmälle merkkejä tai arvoja, jotka eivät ole siihen pelitilanteeseen tai yleensä toiminnallisesti merkitseviä.
- Ohjelmassa tulee käyttää hyväksi perintää.
- Ohjelmassa tulee käyttää hyväksi luokkamalleja tai mallifunktioita (templates).
- Ohjelmassa tulee olla dynaamista muistinvarausta (jossain muodossa).
- Ohjelman tulee noudattaa olio-ohjelmoinnin perusperiaatteita, eli kapselointia sekä koodin uudelleen käytettävyyttä.
- Ohjelman lähdekoodin tulee olla dokumentoituna käyttäen automaattista doxygen-dokumentaattoria.
- Lähdekoodissa tulee noudattaa hyvää yhdenmukaista nimeämiskäytäntöä. Esimerkkeinä olemassa olevista käytännöistä löytyy tästä sekä tästä. HUOM! Tarjoamani lähdekoodipohja ei noudata "kunnolla" kumpaakaan käytäntöä.
Toteutukselliset vaatimukset
- Toimiva ohjelma tulee palauttaa minulle sähköpostitse 28.3.2008 mennessä käyttäen turvattomien tiedostojen välittämiseen tarkoitettua palvelua . Palautuksen tulee sisältää ohjelman lähdekoodi, lähdekoodin perusteella automaattisesti generoitu html-dokumentaatio sekä valmiiksi käännetty binääri (joko windows tai linux). Kaikki tiedostot tulee olla pakattuna muodossa zip/rar/tar.gz yhteen tiedostoon. Palautettavasta kansiosta tulee löytyä myös README-tiedosto, joka sisältää tekijän nimen, koulutusohjelman, aloitusvuoden sekä sähköpostiosoitteen. READM E-tiedostossa tulee myös määrittää ohjelman tekemiseen käytetyt työkalut (ohjelmointiympäristöt, kääntäjät) sekä käännösympäristö (windows/linux)
- HUOM! Edellä esitetty palautuspäivämäärä on ehdoton,
julkaisen tämän päivän jälkeen ohjelman lähdekoodin näillä sivuilla.
Aikataululliset vaatimukset
Olen tehnyt ohjelmaa varten lähdekoodipohjan, jonka päälle ohjelmaa voi ruveta toteuttamaan. Samaisesta lähdekoodipohjasta löytyy myös automaattisesti generoitu
html-dokumentaatio sekä yksinkertaistettu luokkakaavio. Tutkimalla tarkkaan edellä esitettyä dokumentaatiota sekä tarjoamiani lähdekoodeja ohjelma pit
äisi olla toteutettavissa.
HUOM! Voit testata tekemääni ristinolla-ohjelmaa (jonka lähdekoodista edellä esitetty dokumentaatio on tehty) lataamalla
ohjelman binäärin tästä. Edellä esitetystä linkistä löytyy sekä linuxissa toimiva binääri että windows-ympäristössä toimiva .exe-tiedosto.
HUOM! Voit suunnitella/toteuttaa ohjelman myös täysin ilman antamaani pohjakoodia/suunnitelmaa, kunhan valmis ohjelma vastaa edellä esitettyjä vaatimuksia.
Roskapostisuodatin
Tehtävänäsi on rakentaa roskapostisuodatin, joka pystyy luokittelemaan annettujen opetusnäytteiden perusteella roskapostin oikeasta sähköpostista. Tarkoitus on, että opetuksen jälkeen järjestelmän tulisi pystyä luokittelemaan annetut sähköpostit (ennen näkemättömät näytteet) roskapostiksi (SPAM) tai oikeaksi sähköpostiksi (HAM). Ohjelman tarkemmat vaatimukset löytyvät alta.
- Ohjelmassa on oltava vähintään tekstipohjainen käyttöliittymä.
- Ohjelman on pystyttävä jollain tarkkuudella luokittelemaan annetut näytteet kahteen luokkaan SPAM/HAM.
Toiminnalliset vaatimukset
- Ohjelmisto ei saa missään tapauksessa "vuotaa" muistia.
- Käyttöliittymää käyttäen on oltava mahdollista valita, haluaako opettaa järjestelmää opetusnäytteillä, vai haluaako luokitella uuden tuntemattoman näytteen (sähköpostin).
- Käyttöliittymässä on oltava mahdollista (jotain valintaa käyttäen) myös lopettaa ohjelman suoritus. Tässä esimerkki käyttöliittymästä.
- Järjestelmän tarvitsemat opetettavat näytteet on oltava tekstitiedostossa/tiedostoissa, joissa näytteet on luokiteltu valmiiksi. Tutustu seuraavaan esimerkkiin.
- Opetettavat näytteet, kuten myös uusi tuntematon näyte (sähköposti), luetaan aina suoraan tiedostosta järjestelmään.
- Järjestelmän ei tarvitse osata luokitella sellaisia näytteitä, jotka sisältävät erikoismerkkejä. Esimerkki näytteestä, jonka järjestelmän tulisi pystyä luokittelemaan. Tässä toinen.
- Ohjelmassa tulee käyttää hyväksi luokkia ja olioita.
- Ohjelman tulee noudattaa olio-ohjelmoinnin perusperiaatteita, eli kapselointia sekä koodin uudelleen käytettävyyttä.
- Ohjelmassa tulee olla dynaamista muistinvarausta (jossain muodossa).
- Ohjelman lähdekoodin tulee olla dokumentoituna käyttäen automaattista doxygen-dokumentaattoria.
- Lähdekoodissa tulee noudattaa hyvää yhdenmukaista nimeämiskäytäntöä. Esimerkkejä olemassa olevista käytännöistä löytyy tästä sekä tästä.
Toteutukselliset vaatimukset
- Toimiva ohjelma tulee palauttaa minulle sähköpostitse 21.4.2008 mennessä käyttäen turvattomien tiedostojen välittämiseen tarkoitettua palvelua. Palautuksen tulee sisältää ohjelman lähdekoodi, lähdekoodin perusteella automaattisesti generoitu html-dokumentaatio sekä valmiiksi käännetty binääri (joko windows tai linux). Kaikki tiedostot tulee olla pakattuna muodossa zip/rar/tar.gz yhteen tiedostoon. Palautettavasta kansiosta tulee löytyä myös README-tiedosto, joka sisältää tekijän nimen, koulutusohjelman, aloitusvuoden sekä sähköpostiosoitteen. README-tiedostossa tulee myös määrittää ohjelman tekemiseen käytetyt työkalut (ohjelmointiympäristöt, kääntäjät) sekä käännösympäristö (windows/linux)
- HUOM! Edellä esitetty palautuspäivämäärä on ehdoton,
julkaisen tämän päivän jälkeen ohjelman lähdekoodin näillä sivuilla.
Aikataululliset vaatimukset
- Kuinka tiedostosta luetaan näytteitä sekä kuinka niistä kerätään tunnistusta varten tarvittavat tiedot.
- Minkälaiseen tietorakenteeseen tieto tallennetaan ja kuinka sitä käsitellään? Vinkkinä tutustu harjoitukseen, jossa laskettiin sanojen frekvenssejä
- Kuinka luokitellaan tieto (SPAM/HAM)? Luokitteluun kannattaa käyttää Naiivia Bayestunnistinta (luokitinta). Olen koonnut tietoa siitä minkälainen tuollainen luokitin on ja kuinka sellaista käytetään tänne.
Toteutuksesta
Ohjelman toteutuksessa on kolme avainkohtaa:HUOM! Voit määrittää itse "sopivat" opetusnäytteet ja "sopivat" tuntemattomat näytteet! Tässä työssä on tärkeintä oppia ohjelmoimaan ja toiseksi tutustua teköälyn mielenkiintoiseen maailmaan.
Kolmas harjoitustyö
Tämä harjoitustyö on vapaavalintainen. Voit tehdä työn, joko yksin tai parin kanssa.
- Ilmoita minulle työsi aihe sähköpostitse 5.5 mennessä.
Yleiset vaatimukset
- Harjoitustyö arvostellaan asteikolla 1-5
-
Julkaisen tällä sivulla arvostelumatriisin, josta näkyy tarkemmat tiedot mitä asioita työstä arvostellaan. - Jos annat minulle oikeuden julkaista harjoityösi lähdekoodin sekä kuvauksen sen toiminnasta tällä nettisivulla tulevia sukupolvia varten niin ansaitset automaagisesti bonus-pisteitä arvosteluun (tarkennan myöhemmin paljonko).
Arvostelu
- Toteutus ei saa missään tapauksessa "vuotaa" muistia.
- Toteutuksessa tulee noudattaa hyviä ohjelmointiperiaatteita
- Toteutuksen tulee noudattaa olio-ohjelmoinnin perusperiaatteita, mm. kapselointia sekä koodin uudelleen käytettävyyttä.
- Toteutuksen lähdekoodin tulee olla dokumentoituna käyttäen automaattista doxygen-dokumentaattoria.
- Lähdekoodissa tulee noudattaa hyvää yhdenmukaista nimeämiskäytäntöä. Esimerkkeinä olemassa olevista käytännöistä löytyy tästä sekä tästä.
Toteutukselliset vaatimukset
- Toimiva ohjelma tulee palauttaa minulle sähköpostitse 28.5.2008 mennessä käyttäen turvattomien tiedostojen välittämiseen tarkoitettua palvelua. Palautuksen tulee sisältää ohjelman lähdekoodi, lähdekoodin perusteella automaattisesti generoitu html-dokumentaatio sekä valmiiksi käännetty binääri (joko windows tai linux). Kaikki tiedostot tulee olla pakattuna muodossa zip/rar/tar.gz yhteen tiedostoon. Palautettavasta kansiosta tulee löytyä myös README-tiedosto, joka sisältää tekijän nimen, koulutusohjelman, aloitusvuoden sekä sähköpostiosoitteen. README-tiedostossa tulee myös määrittää ohjelman tekemiseen käytetyt työkalut (ohjelmointiympäristöt, kääntäjät) sekä käännösympäristö (windows/linux). README-tiedostossa tulee olla myös ohjeet koodin kääntämiseen sekä ohjelman käyttämiseen. Jos käytät työssäsi ulkopuolisia kirjastoja niin sinun tulee palauttaa myös nekin! (Poikkeus: Qt4-kirjastoja ei tarvitse palauttaa)
- HUOM! Edellä esitetty palautuspäivämäärä on ehdoton
Aikataululliset vaatimukset
Ohjelman suunnittelua tehdessäsi sinulle saattaa olla hyötyä tekemästäni lyhyestä esitelmästä ohjelmistonsuunnittelusta.
Geneerinen ohjelmointi
Tehtävänäsi on saattaa annettu geneerisen matriisi-luokan koodi toimivaksi. Koodin toimivuus testataan käyttämällä tekemääni TinyUnit++ -yksikkötestaus kirjastoa.
- Toteuta Matrix-templates.h tiedostoon Matrix.h-tiedostossa määritetty rajapinta.
- Toteutuksen pitää pystyä suoriutumaan annetuista yksikkötesteistä.
- Toteutus ei saa missään tapauksessa "vuotaa" muistia.
- Toteutuksen tulee noudattaa olio-ohjelmoinnin perusperiaatteita, eli kapselointia sekä koodin uudelleen käytettävyyttä.
- Toteutuksen lähdekoodin tulee olla dokumentoituna käyttäen automaattista doxygen-dokumentaattoria.
- Lähdekoodissa tulee noudattaa hyvää yhdenmukaista nimeämiskäytäntöä. Esimerkkeinä olemassa olevista käytännöistä löytyy tästä sekä tästä. HUOM! Tarjoamani lähdekoodipohja ei noudata "kunnolla" kumpaakaan käytäntöä.
Yleiset vaatimukset
- Toimiva ohjelma tulee palauttaa minulle sähköpostitse 7.5.2008 mennessä käyttäen turvattomien tiedostojen välittämiseen tarkoitettua palvelua. Palautuksen tulee sisältää ohjelman lähdekoodi, lähdekoodin perusteella automaattisesti generoitu html-dokumentaatio sekä valmiiksi käännetty binääri (joko windows tai linux). Kaikki tiedostot tulee olla pakattuna muodossa zip/rar/tar.gz yhteen tiedostoon. Palautettavasta kansiosta tulee löytyä myös README-tiedosto, joka sisältää tekijän nimen, koulutusohjelman, aloitusvuoden sekä sähköpostiosoitteen. README-tiedostossa tulee myös määrittää ohjelman tekemiseen käytetyt työkalut (ohjelmointiympäristöt, kääntäjät) sekä käännösympäristö (windows/linux)
- HUOM! Edellä esitetty palautuspäivämäärä on ehdoton
Aikataululliset vaatimukset
Olen tehnyt matriisi-luokasta lähdekoodipohjan, jonka päälle koodia voi ruveta rakentamaan. Huomaa! Tässä työssä sinun tarvitsee tehdä muutoksia pelkästään core/Matrix.h, core/Matrix-templates.h, tests/TestMatrix.h, tests/TestMatrix.cpp -tiedostoihin!. Testaa koodiesi toimivuus kääntämällä koodisi yliopiston tuomi-koneella (käyttämällä annettua tests/Makefile:ä) tekemällä sen säästät minulta paljon työtä. Tässä työssä saa käyttää myös maalaisjärkeä nimittäin voi olla, että antamassani lähdekoodipohjassa on bugeja joten kannattaa sen suhteen olla kriittinen.
Muuta kurssiin liittyvää
Uusi c++-kielen standarti julkaistaan piakkoin. Tässä hieman taustatietoa siitä. Suunniteltaessa, että mikä tietorakenne on paras mahdollinen käsillä olevaan ongelmaan. Voi tästä kuvasta olla hyötyä.
Yhteydenotot
Heikki Laitala
Sähköposti : etunimi.sukunimi[AT]oulu.fi tai helaital[ET]p.o.f.
Parhaiten minut saa kiinni ircistä (IRCNET), lymyilen tunnuksen TuOki^ -takana.