Harjoitustyö ei ole työnäyte!
Harjoitustyö on oppimistilaisuus, jossa opiskelija yrittää omaamansa tiedon pohjalta tehdä jotakin. Tätä yritystä näytetään työn ohjaajalle, joka sitten tutkii mikä työssä on oikein ja mikä väärin, huonosti tai kömpelösti toteutettu. Näin jo opiskelun alkuvaiheessa päästään korjaamaan vääriä tottumuksia, joita jälkeenpäin piintyneinä tapoina voi olla mahdoton muuttaa.
Tämän takia harjoitustyötä pitää käydä esittämässä ohjaajille riittävän usein. Punakynämerkintä ei ole häpeä, vaan osoitus siitä, mitä pitäisi pohtia uudelleen (ja osoitus siitä, että ohjaaja on kiinnostunut opiskelijan työstä!).
Kirjoita heti oikealla tyylillä! Kun kirjoitat harjoitustyötä, käytä heti oikeaoppista sisennystä, muuttujien nimien valintaa yms. On liian aikaa vievää ensin kirjoittaa jonkinlainen sotku ja työn loppuvaiheessa käyttää 10 tuntia tyylin muuttamiseen. Kun oikean tyylin oppii, on sillä aivan yhtä nopea kirjoittaa kuin suttutyylilläkin.
Harjoitustyö on hyvä tehdä ryhmätyönä. Ryhmäläisillä voi olla kaikilla joko sama aihe jota he tekevät yhdessä tai sitten kullakin oma aihe, jota yhdessä voidaan työstää. Esimerkiksi yhden tekemät aliohjelmat kelpaavat muillekin, yksi ymmärtää ja selostaa muille. Kaikki voivat testata toistensa suunnitelmia ristiin.
Erillisissä töissä on se etu, että jonkin ryhmäläisen lopettaessa voidaan työ saattaa yksin loppuun.
Opiskelijan kannalta on tietysti motivoivampaa valita itse aiheensa, josta haluaa tehdä ohjelman. Aihe voi olla esimerkiksi opettajilla jokin opetusohjelma, urheilijoilla jokin pistelasku tai päiväkirja, koti-isillä reseptivarasto jne.
Ehdotettua aihetta voidaan sitten ohjaajien kanssa muokata vastaamaan tasoltaan kurssin vaatimuksia.
Tavoitteena on ensin saada itseä miellyttävä aihe, jonka käyttötarpeen, toiminnan ja hyödyllisyyden ymmärtää. Tämän jälkeen aihe kiinnitetään ja ruvetaan harjoittelemaan ohjelman suunnittelua ja ohjelmointia tähän aiheeseen.
Harjoitustyössä pitäisi saada harjoiteltua seuraavat asiat:
Siis aihe tulisi valita siten, että siinä käsiteltävä aineisto pitäisi ohjelman käyttökertojen välillä tallettaa tiedostoon. Aineiston tarpeen pitäisi olla niin suuri, ettei sille välttämättä osata sanoa ennakolta tarkkaa ylärajaa. Tyypillisiä tällaisia ohjelmia ovat erilaiset rekisteriohjelmat, esim. mallina oleva kerhon jäsenrekisteri.
Ohjelman tulisi olla sellainen, että sitä osaa käyttää kuka tahansa. Ammattimaisempaan käyttöön tehty ohjelma voi sisältää vähemmän ohjeita kuin yleiseen käyttöön tehty ohjelma.
Harjoitustyön tehtävän määritys on varsin epämääräinen. Jotta aiheesta saa järkevän, kannattaa ennen muuta jäsentämistä pohtia sitä, missä vastaavalla ohjelmalla olisi käyttöä.
Esimerkiksi olkoon tehtävänä tehdä ohjelma, jolla voidaan tutkia elokuvateatterin kävijöiden ikä ja sukupuolijakaumaa.
Missä tällaisella ohjelmalla olisi käyttöä? Tietysti elokuvateatterin johto voisi tämän perusteella valita mitä teatterissa kannattaa esittää ja milloin näytöksiä pidetään.
Mistä tiedot saadaan? Tiedot voitaisiin saada suoraan ovelta kävijöiden mennessä teatteriin. Mikro olisi ovella ja jokainen kävijä näppäilisi kysytyt tiedot koneeseen. Tällöin tämän osan ohjelmasta tulisi olla todella idioottivarman. Kun kaikki ovat menneet sisälle, kävisi teatterin johto jollakin salasanalla lopettamassa syötön ja ottaisi tarvitsemansa analyysin sekä tallettaisi tulokset tiedostoon myöhempää käyttöä varten! Tulevaisuudessa käyttäjän näppäily voitaisiin korvata vaikka siten, että ohjelma hakee ohimenevän henkilön kännykästä Bluetooth-yhteydellä tarvittavat tiedot.
Esimerkiksi tehtävänä naisten telinevoimistelun pistelasku. Telineet, niiden nimet ja niiden määrä täytyy olla jälkeenpäin helposti muutettavissa, koska tuskinpa muuten ohjelmassa on isoa ero siinä lasketaanko miesten vai naisten kilpailua.
Harjoitustyön ohjausta annetaan mielihyvin kaikille niille, jotka tulevat apua ja/tai ohjausta pyytämään.
Ohjaukseen tulee varata aika Kuukkelin (http://www.mit.jyu.fi/kuukkeli/) avulla vähintään päivää ennen ohjausaikaa. Jos et pääse paikalle varaamanasi ohjausaikana, peru se (jos Kuukkeli ei anna perua aikaa, peru aika lähettämällä ohjaajalle sähköpostia). Vapaina aikoina saa toki käydä katsomassa, josko ohjaukseen pääsisi.
Ohjaukseen tultaessa pitää olla varustautunut seuraavasti:
Kaikki edellämainittu kaivetaan esiin jo ennen ohjaajan huoneeseen astumista; ei ole ystävällistä kaivaa kassiaan 5 minuuttia ohjausajasta ja näin viedä muiden ohjattavien aikaa
Ohjauksessa:
Harjoitustyö kirjoitetaan ja kommentoidaan samaan tyyliin kuin monisteen loppuosassa esitetyt esimerkkiohjelmat. Myös muut selkeät ja perustellut tyylit käyvät. Erityisesti harjoitustyöstä tarkastetaan
#include "a:oma.h"vaan
#include "oma.h"
Harjoitustyö tehdään aikataulun (http://www.mit.jyu.fi/~vesal/kurssit/ohjelmointi2002/htohje.html) mukaan.
Ohjelman koodin kehityksen vaiheet näet n:\kurssit\cpp\kerho
Katso luentomonisteen luku 2 ja luku 3.
Harjoitustyön 1. vaihe on esisuunnitelma. Tässä vaiheessa on tarkoitus tutkia tehtävän määritys tarkemmin ja yrittää määritellä siitä minkälainen ohjelman tulisi olla. Tässä tehdään monisteen Kerho-ohjelman mallin mukainen (tai parempi) suunnitelma siitä mitä ohjelma tekee.
Erityisesti kirjoitetaan kaikki ne kohdat, joita näyttöön tulostuu, mitä käyttäjä vastaa ja miten ohjelman tulisi eri vastauksiin reagoida! Siis
Anna hetu >111375-111A[RET] Henkilötunnuksessa päivämäärä väärin! Anna hetu >
ei missään tapauksessa pelkkiä koneen tekemisiä:
Anna hetu > VÄÄRIN TEHTY! Henkilötunnuksessa päivämäärä väärin! Anna hetu >
Jo tämä vaihe kannattaa kirjoittaa tekstieditorilla (esimerkiksi Builderilla), jolloin sitä on helppo korjailla ohjaajien toivomusten mukaisesti. Myös se mitä tiedostoon talletetaan ja minkä näköisenä, tulisi esittää (tässä voi auttaa ER-kaavion tekeminen, jos sen on esimerkiksi jollakin toisella kurssilla oppinut)!
Koska Kerho-ohjelma jaetaan kurssilla mallina, saattaa ohjaaja tehdä suunnitelmaan muutoksia tai lisäyksiä, jottei työ synny pelkästään vaihtamalla malliohjelmassa sanoja Kerho sanoiksi Kauppa ja sanoja Jäsen sanoiksi Tuote.
Vaikka hieno näytönkäsittely yms. kuuluvatkin oikeaan ohjelmaan, kannattaa työmäärän vähentämiseksi (ja ohjelman pitämiseksi standardi ISO C++:n mukaisena) tyytyä Kerho-ohjelman tyyliseen keskustelevaan kyselyyn. Kuitenkin aina kun mahdollista, kannattaa käyttäjälle ehdottaa jotakin oletusvastausta, jonka hän voi hyväksyä pelkällä RET-näppäimen painamisella.
Jos joku haluaa oikeata näytön käsittelyä, on kurssin aliohjelmakirjastossa pieni apukirjasto console.c ja console.h , jota saa käyttää (koska se voidaan kääntää useimmille laiteympäristöille). Tämän kirjaston avulla voidaan kirjoittaa yksi-ikkunaisia sovelluksia. Joka tapauksessa käyttöliittymä kannattaa ohjelmointivaiheessa eristää muusta koodista, jotta käyttöliittymän vaihtaminen olisi helpompaa (vrt. kerho -malliohjelmat).
Katso myös http://www.it.jyu.fi/users/vesal/ohj/
Katso luentomonisteen luku 2 ja luku 3.
Ohjaajan ehdottamat muutokset on tehty suunnitelmaan ja suunnitelma on puhtaaksikirjoitettu. Jatkossa ohjelmaa kehitetään tämän suunnitelman pohjalta.
Tietysti mikäli myöhemmin keksii selviä parannuksia, niin näitä voidaan suunnitelmaan tehdä. Parannukset on kuitenkin hyväksytettävä ohjaajalla.
Katso luentomonisteen luku 2 ja luku 3.
Tässä vaiheessa toteutetaan ohjelman käyttöliittymä. Esimerkiksi jos ohjelma on menupohjainen, toteutetaan päämenu ja kaikki alimenut. Mitään varsinaista toiminnallisuutta ei tarvitse olla.
Huomattakoon, että ohjelma pitää olla aina kommentoitu. Erityisesti kukin tarvittava .cpp ja .h tiedosto pitää varustaa tekijöiden nimillä ja teko- sekä muutospäivämäärillä!
Vaihetta vastaa esimerkkiohjelman hakemisto n:\kurssit\cpp\kerho\menut.05.
Katso luentomonisteen luku 11 ja luku 12.
Ohjelman jatkokehittelyn kannalta on välttämätöntä kiinnittää ainakin jonkinlainen osa ohjelman tarvitsemista tietorakenteista. Tietorakenteista piirretään aluksi kuvat ja ne hyväksytetään ohjaajalla.
Tietorakenteiden ei välttämättä tarvitse olla samanlaiset kuin Kerho-ohjelmassa, mutta useisiin harjoitustöihin tämä rakenne käy lähes sellaisenaan tai pienin muutoksin.
Samalla suunnitellaan ohjelman luokkajako. Luokkajako kirjoitetaan CRC-korteille tai piirretään UML-luokkakaavioksi, jotka näytetään ohjaajalle.
Katso myös http://www.it.jyu.fi/users/vesal/ohj/
Tämä vaihe kannattaa tehdä kunnolla ja ajatuksella! Aiemmilla kursseilla on havaittu, että jos tämän vaiheen tekee huolimattomasti, seuraava vaihe on yleensä yhtä vaikeuksien kanssa painimista.
Katso luentomonisteen luku 15 ja luku 16.
Seuraavaksi toteutetaan vaiheessa 4 suunnitellut tietorakenteet ja luokat. Vaiheessa 3 toteutettu käyttöliittymä muutetaan ensin olio-ohjelmaksi ja tulos testataan. Sitten toteutetaan yksittäisiä tiedonpaloja hallinnoivat luokat (vrt. Kerho-ohjelman cJasen) ja testataan ne.
Tässä vaiheessa tulee jokainen luokka olla omassa .h&.cpp-tiedostoparissaan. Ohjelman täytyy olla hyvin kommentoitu: jokaisen luokan ja metodin tarkoitus ja käyttö tulee olla hyvin dokumentoitu kommenteissa.
Viimeistään tässä vaiheessa (ja myöhemmissäkin) ohjaajat tenttaavat suullisesti tekijän ymmärtävän jokaisen ohjelmaansa kirjoittaman lauseen merkityksen (oma listaus saa olla mukana ja siinähän täytyy olla kommentteja).
Esimerkiksi cJasen-luokan määrittely kirjoitetaan jasen.h-tiedostoon ja luokan toteutus jasen.cpp-tiedostoon. Toteutustiedostoon tehdään pieni ehdollisesti kääntyvä testiohjelma, jolla luokan toimivuus voidaan testata. seuraavaksi toteutetaan säiliöluokat (vrt. Kerho-ohjelman cJasenet) ja testataan ne. Esimerkissä jasenet.h ja jasenet.cpp. Tietysti esimerkissä myös vastaavat harrastuksiin liittyvät luokat. Lopuksi vielä luokkien yhteistyötä hoitava kerho.h ja kerho.cpp.
Vaihetta vastaa esimerkkiohjelman hakemisto n:\kurssit\cpp\kerho\raken.09.
Katso luentomonisteen luku 17 ja luku 19.
Seuraavaksi toteutetaan tiedostonkäsittely. Ohjelma on paras rakentaa niin, että ohjelman käynnistyessä luetaan mahdollisesti olemassaolevasta tiedostosta tiedot ja sammutettaessa ne tallennetaan. Lienee helpointa toteuttaa ensin tiedostosta lukeminen ja testata se, ja sitten vasta tiedostoon tallentaminen ja testata se (tai päinvastoin).
Tässä vaiheessa kootaan lisäksi käyttöliittymä ja erilliset tietorakenteet toimivaksi, yhtenäiseksi ohjelmaksi.
Vaihetta vastaa esimerkkiohjelman hakemistot n:\kurssit\cpp\kerho\jako.15 ja n:\kurssit\cpp\kerho\talletus.2.
Katso luentomonisteen luku 20, luku 21 ja luku 22.
Nyt ohjelmaan täydennetään alkuperäisen suunnitelman mukaisia toimintoja pala kerrallaan koko ajan testaten. Näin saadaan lopuksi aikaan valmis ja toimiva ohjelma.
Harjoitustyössä ei välttämättä kaikkien alavalintojen tarvitse toimia, kunhan opiskelija on käynyt kaikki oleelliset ohjelmointiin ja käytettyyn kieleen liittyvät asiat läpi. Ohjaajan kanssa sovitaan mitkä kohdat ohjelmasta voidaan jättää toteuttamatta.
Toivottavaa olisi, että vähintään jokin yksinkertainen etsiminen (haku) toimisi. Samoin lajittelu esimerkiksi STL:n algoritmeja käyttäen.
Pääosin harjoitustyön tulee tasoltaan vastata luentomonisteen malliohjelmana olevaa kerhon jäsenrekisteriä ja sen tulee toimia alkuperäisen suunnitelman mukaisesti!
Tässäkään vaiheessa tuskin kannattaa matkia sokeasti kurssin malliohjelman toteutuksia, koska jokainen ohjelmassa oleva rivi pitää pystyä perustelemaan ohjaajalle
Vaihetta vastaa esimerkkiohjelman hakemistot n:\kurssit\cpp\kerho\lukemine.3, n:\kurssit\cpp\kerho\tarkistu.4 ja n:\kurssit\cpp\kerho\etsilaj.5.