Ohjelmointi 1, syksy 2007 -- Demo 10

Tehtävät julkaistaan:
 Tiistaina 13.11.2007
Palautus viimeistään:
 20.11.2007 klo 18
100% tehtävistä tarkoittaa:
 6 kpl tehty

Tämä on nyt sitten viimeinen demo. Kerrataan jälleen vanhaa, ja ihan vähän ennakoidaan tulevia haasteita kuten omien olioluokkien tekemistä ja "edistyneempiä koodauskäytänteitä" eli sitten kun osaa tehdä koodin jollain tavoin, ja tietää että se toimii, niin siitä voi tehdä muutamalla peruskikalla lyhyempää ja selkeämpää.

Paperikopioita on saatavilla perinteisestä paikasta.

Contents

Kertausta

Tehtävä 1:

"Capstone" -tehtävä, eli kokonaisen ohjelman tekeminen. Kahden tehtävän laajuinen. Jos omassa harkassa on kovasti tekemistä, tee mieluummin sitä ja lyhytjänteisempiä tehtäviä. Tehdään palautus kahden tasoisena:

Level 1: Palauta pelkästään tehtävä 1: Riittää että ohjelma toimii kovakoodatulla sanakirjalla. Tässäkin joutuu kivasti miettimään, mutta pärjää alkeellisemmilla tietorakenteilla ym.

Level 2: Palauta sama(t) tiedosto(t) tehtävään 1 ja myös 2: Täytyy toimia tiedostosta ladatulla sanakirjalla. Tässä ei paljon toiminnallista eroa ykköseen: pitää jälleen katsoa jostakin mallia tiedoston lataamiseen, ja joutuu käyttämään esim. ArrayListiä tai muuta Javan valmista tietorakenneluokkaa.

Harjoitustyö on se, jossa hiotaan kaikki seikat kuntoon. Demossa sallitaan pieniä oikomisia esim. kommentoinnin ja syötteiden käsittelyn suhteen. Tärkeää on jotakuinkin toimivan tuotoksen tekeminen käytettävissä olevassa ajassa.

Tehtäväkuvaus: Halutaan tulkkiohjelma, joka lukee sanakirjan seuraavanlaisesta tiedostosta (ekalla rivillä kielten nimet, sitten sanastoa miten tahansa paljon):

suomi | englanti
aikavyöhyke | time zone
apina | monkey
haarukka | fork
käytettävyystutkimus  | usability research
käyttöjärjestelmä | operating system
ohjelmointi | programming
operaatiotutkimus | operations research

Sanaston pituus tiedostossa voi olla mikä tahansa, joten tietorakenteeksi kannattanee valita joku Javan valmis dynaaminen kokoelmaluokka. Tässä joudut jo todella suunnittelemaan tarvittavia tietorakenteita ja aliohjelmia. Jotenkin on hallittava sanojen yksi-yhteen vastaavuus kummasta tahansa kielestä toiseen.

Paljon tarvittavia osia voi olla valmiina Javassa, jos osaa etsiä esim. Internetistä vinkkejä, mutta jos ei löydy, niin periaatteessa näkisin, että itsekin voi tehdä sen mikä puuttuu. Pitää vaan miettiä, mitä tarvitaan, ja toteuttaa.

Käyttöliittymä olisi seuraavanlainen:

Kielenkäännöstranslaattori
--------------------------
Mikä sanakirjatiedosto ladataan> suomienglanti.txt
Sanakirja ladattu OK.
Kummasta kielestä käännetään (suomi/englanti)>suomi
-- Tyhjä rivi lopettaa ohjelman --
Anna sana kielellä "suomi">haarukka
Sana "haarukka" on käännettynä: fork

-- Tyhjä rivi lopettaa ohjelman --
Anna sana kielellä "suomi">nieminen
Sanalle "nieminen" ei löydy käännöstä!

-- Tyhjä rivi lopettaa ohjelman --
Anna sana kielellä "suomi">

jne

Ohjelma ei ole valmis ennen kuin se toimii siten kuin sen pitää (ks. suoritusesim. edellä ja määritelmät Level 1 ja level 2 -tasoisille toteutuksille).

Tehtävä 2: (sama kuin ykköstehtävä)

Jos saat tehtyä level 2:n, palauta tähän sama(t) tiedosto(t) kuin ykköseen, niin automaatti osaa laskea kaksi demopistettä!

Tehtävä 3: Matriiseja vielä

Kertaillaan vähän matriisin sielunelämää. Aiemmin on tehty satunnaisen liukulukumatriisin (2-ulotteinen taulukko) generointi. Tee ja testaile aliohjelmat, joilla voi laskea minkä tahansa kokoiselle matriisille:

  • kaikkien alkioiden keskiarvon.
  • kunkin rivin alkioiden keskiarvot (paluuarvona uusi 1-ulotteinen taulukko)

Tehtävä 4: Koodauskäytänteet loppuun asti

Korjaa seuraavat koodit Java Code Conventions -lehdykän luvun "10.5 Miscellaneous Practices" mukaisiksi:

public static boolean onAamupaiva(int kloTunnit){
    if (kloTunnit < 12){
        return true;
    } else {
        return false;
    }
}

public static double minimiKahdestaLuvusta(double a, double b){
    if (a<b) {
        return a;
    }
    return b;
}

// Seuraavaa ei ole code conventions -lehdykässä, mutta korjaa silti.
// Idea on sama, ja ns. hyvässä koodissa vain yksi aliohjelmarivi!
// Vaikeasti luettava ja pitkä toteutus on siis ongelma:

public static boolean onVirastoaika(int kloTunnit){
    boolean tulos = false;
    if (kloTunnit >= 8){
        if (kloTunnit <= 16){
            tulos = true;
        }
    }
    return tulos;
}

// Vielä yksi helppo tapaus:

public static double summa(double a, double b, double c){
    double summa = 0;
    summa += a;
    summa += b;
    summa += c;
    return summa;
}

Oman luokan määrittely

Tehtävä 5:

Ennakoidaan tulevaa. Vasta ohjelmointi kakkosella vapaudutaan mallintamaan maailmaa kunnolla olioluokkien hierarkiana. Nyt voi jo kokeilla yksittäisen luokan tekemistä. Oppikirjan luku 5 kertoo tästä ja antaa esimerkkejä.

Määrittele, toteuta ja dokumentoi javadocilla "perinteinen ensimmäinen olio": Elukka eli eräänlaisen elävän olennon tietokonemalli. Elukan ominaisuudet eli attribuutit ovat:

  • kesäkarvan väri (merkkijono)
  • tieto siitä, onko tällä hetkellä talviturkki (talviturkki on aina valkoinen, mutta palaa taas keväällä elukan syntymäkarvan väriseksi).

Attribuutit oltava privaatteja ja niihin pääsee käsiksi vain olion rajapinnan eli julkisten metodien kautta!

Elukalle pitää olla vähintään kaksi konstruktoria: Parametriton konstruktori luo mustakarvaisen elukan. Merkkijonolla parametroidulla konstruktorilla voi luoda minkä tahansa värisen elukan. Käytä elukkaa eri käännösyksiköstä, esim. ElukkaTestisovellus.java. Käyttö pitää onnistua seuraavasti:

public class ElukkaTestisovellus{
  public static void main(String[] args){
    Elukka ellu = new Elukka();
    Elukka nellu = new Elukka("täplikäs seepranvihreä");

    // Pitäisi tulostua "musta" ja "täplikäs seepranvihreä":
    System.out.println("Ellun karva on " + ellu.getKarvanVari());
    System.out.println("Nellun karva on " + nellu.getKarvanVari());

    ellu.talviturkki();  // Olion sisäinen tila muuttuu!
    nellu.talviturkki();  // Olion sisäinen tila muuttuu!

    // Pitäisi tulostua "valkoinen" ja "valkoinen":
    System.out.println("Ellun karva on " + ellu.getKarvanVari());
    System.out.println("Nellun karva on " + nellu.getKarvanVari());

    ellu.kesaturkki();  // Olion sisäinen tila muuttuu taas!
    nellu.kesaturkki();  // Olion sisäinen tila muuttuu taas!

    // Pitäisi tulostua jälleen "musta" ja "täplikäs seepranvihreä":
    System.out.println("Ellun karva on " + ellu.getKarvanVari());
    System.out.println("Nellun karva on " + nellu.getKarvanVari());
  }
}

Harjoitustyö

Tehtävä 6: Oma harjoitustyö loppuun tai "loppuun"

Palauta omasta harjoitustyöstä versio, joka on mielestäsi valmis ja vaatimusten mukainen. Tämä on triviaalia niille, jotka ovat jo saaneet hyväksymismerkinnän; palauta demossa sama harkkatiedosto. Muille laitetaan tässä vähän pientä painetta pönttöön: Nyt voi kuitata demopisteen tekemällä harkkaa kunnon askeleen eteenpäin! Varsinainen hyväksyntä kuitenkin henkilökohtaisella palautuksella (varaa aika Korpista normaalisti). Apuja saa tukiopetussessioissa sekä varattavissa ohjauksissa.

Tätä ei käsitellä demotilaisuudessa.

Bonussektori

Tehtävä 7: Vapaamuotoinen kurssipalaute

Kirjoita tekstitiedosto, jossa kerrot kurssista kokemuksiasi ja parannusehdotuksia. Myöhemmin tulee virallinen anonyymi kurssikysely, mutta siihen ei pysty kovin monisanaisesti kuvailemaan asioita.

Tätä ei käsitellä demotilaisuudessa.