Ohjelmoinnin peruskurssi Y2, kurssimateriaali

Rästitehtävä 3: Tekstin tavutus

Etusivulle

Rästitehtävä 3: Tekstin tavutus

Tehtävä on luvun 3.4 tehtävä "Tekstin tavutus". Tehtävä on saatava kokonaan oikein ja hyväksytystä tehtävästä saa 150 pistettä.

Intro

Tehtävässä kirjoitetaan ohjelma, joka tavuttaa suomenkielistä tekstiä käyttäen perintää. Huomaa kuinka helppo koodiin olisi lisätä uusia tavutussääntöjä.

Toteutusohjeet

Suomen kielen tavutus on enimmiltään suhteellisen yksinkertaista. Pääosa sanoista voidaan tavuttaa käyttäen vain kolmea perussääntöä.

Tässä tehtävässä kehitämme lisää toiminnallisuutta luokalle RuleBasedHyphenator, joka tavuttaa annettua tekstiä kulloisenkin säännöstön perusteella. Säännöstöön on mahdollista vaikuttaa kirjoittamalla uusia tavutussääntöluokkia jotka täyttävät rajapinnan HyphenationRule. Näitä yksinkertaisia luokkia toteutetaan 3 kpl.

HyphenationRule

HyphenationRule on yliluokka jonka toteutuksesta puuttuu vain yksi metodi next_hyphen(word, previous_hyphen_at).

Tämä metodi palauttaa annetulle sanalle word seuraavan tavutuskohdan lähtien liikkeelle paikasta previous_hyphen_at, joka on tyypillisesti edellinen löydetty tavutuskohta. Jos sääntöä ei voida soveltaa tästä kohdasta lähtien, metodi ilmaisee tämän palauttamalla virhekoodin HyphenationRule.NOT_APPLICABLE. Esim sanassa "kiusaus" konsonanttisääntöä ei voida soveltaa indeksistä 3 lähtien sillä seuraavan vokaalin "a" jälkeen tulevia konsonantteja ei enää seuraa yksikään vokaali. Palautettu tavutuskohta on tavuviivaa seuraavan merkin indeksi. Esim sanassa "kissa" katkaisukohdat ovat paikoissa 0, 3 ja 5.

FinnishHyphenationRule

FinnishHyphenationRule on abstrakti luokka joka jättää HyphenationRule-yliluokasta täyttämättä vaaditun metodin next_hyphen, mutta lisää aliluokilleen joukon käteviä apumetodeja.

ConsonantRule, VowelRule ja DiphthongRule (Palautetaan)

Näissä luokissa toteutetaan FinnishHyphenationRulesta puuttuva metodi sännöstä riippuen eri tavoin. Käytä toteuttaessa mahdollisuuksien mukaan yliluokan apumetodeja.

RuleBasedHyphenator

RuleBasedHyphenator yrittää soveltaa tavutussääntöjä tietyssä prioriteettijärjestyksessä, kunnes se löytää säännön jota voidaan soveltaa. Jokainen säännön löytämä tavutuskohta lisätään metodin palauttamaan listaolioon kokonaislukuna.

Tavutussääntöluokkiesi metodi next_hyphen saa tehtävän testeissä aina yksittäisen SUURILLA KIRJAIMILLA kirjoitetun sanan tarkistettavaksi, joten välilyönneistä ei tarvitse välittää.

Jos haluat jatkokehittää luokkaa vaikka projektiisi, niin lisää välilyöntien, välimerkkien ja väliviivojen käsittelylle omia sääntöjä, niin voit tavuttaa ohjelmasi tulostaman tekstin sopivaksi vaihtelevan kokoisille ikkunoille.

Tavutussäännöt

Suomen kielen tavuttaminen seuraa melko suoraviivaisesti seuraavia sääntöjä:

Konsonanttisääntö

Jos tavuun kuuluvia vokaaleja seuraa yksi tai useampia konsonantteja, joita vielä seuraa vokaali, tavuraja sijoittuu välittömästi ennen viimeistä konsonanttia.

Esimerkkejä

lef-fas-sa ki-vaa kah-del-le:

tra-giik-kaa se-kä hork-ka-ti-lo-ja

greip-pi

on

Tämä toteutetaan luokkaan ConsonantRule.

Kaikki ylläolevan esimerkin tavuviivat tulivat konsonanttisäännöltä kun sääntöä sovellettiin sanan alkuun tai jonkin tavuviivan jälkeiseen paikkaan. Esim. sanan "on" tapauksessa kohdasta 0 löytyy tavuun kuuluvia vokaaleja (o) ja näitä seuraava konsonantti (n), mutta koska näitä seuraavia vokaaleja ei enää löydy, on tulos HyphenationRule.NOT_APPLICABLE.

Vokaalisääntö

Jos tavun ensimmäistä vokaalia (* seuraa toinen vokaali, niiden väliin tulee tavuraja, ellei

  1. edellinen vokaali ole sama kuin jälkimmäinen (pitkä vokaali).
  2. jälkimmäinen vokaali ole i (i:hin loppuva diftongi).
  3. kysymyksessä ole jokin vokaalipareista au, eu, ey, ie, iu, ou, uo, yö, äy tai öy (muu diftongi).

Esimerkkejä:

"-" vokaalisäännön tulee laittaa tämä tavuviiva,

"+" vokaalisäännön tulisi palauttaa "+"-merkkiä edeltävän tavuun sovellettuna NOT_APPLICABLE

lu-en+to Aa+si -an kää+pi-ö+puo+lu-eis+ta

Esimerkin sana Aasian demonstroi kuinka vokaalisääntö ei laita tavuviivaa paikasta 0 (kirjain A) lähdettäessä ensimmäisen vokaalin ja sitä seuraavan vokaalin väliin → NOT_APPLICABLE.

Kohdasta 2 (kirjain s) lähdettäessä löydetyt vokaalit i, a taas eivät ole samoja, eivät muodosta diftongia ja niistä jälkimmäinen ei ole i, joten palautetaan tavutuskohta, 4.

Toteutetaan luokkaan VowelRule

*) HUOM! Älä etsi seuraavaa vokaalia johon sääntöä soveltaa jos sääntöä ei voi soveltaa tavun ensimmäiseen vokaaliin. Kaikkia tehtävässä listattuja sääntöjä tulee soveltaa kulloinkin käsiteltävään tavuun.

Diftongisääntö

Jos tavun ensimmäisen vokaalin aloittamaa diftongia tai pitkää vokaalia seuraa vokaali, tähän väliin tulee aina tavuraja.

Esimerkkejä:

"-" diftongisäännön tulee laittaa tämä tavuviiva,

"+" diftongisäännön tulisi palauttaa "+"-merkkiä edeltävän tavuun sovellettuna NOT_APPLICABLE

raa-is+tu+nut maa-il+ma, liu-ot+ti+met lau-an+tai+na tau-ot+ta leu-an al+la

Tämä toteutetaan luokkaan DiphthongRule.

Poikkeussääntö

Poikkeussanojen oikea tavutus on joko tiedettävä tai arvattava (tätä ei toteuteta tässä tehtävässä).

Poikkeukset liittyvät yleensä lainasanoihin ja yhdyssanoihin. Esimerkiksi sanaan demokratia tulisi konsonanttisäännön perusteella tavuviiva väärään kohtaan, k:n ja r:n väliin (demok - ratia). Samalla säännöllä sanaan kaivosaukko tulisi o:n ja s:n väliin tavuviiva (kaivo - saukko), mikä tuskin oli tarkoitus.

Vinkkejä

  • Luokassa FinnishHyphenationRule on joukko apumetodeja joita kannattanee käyttää.
  • Huomaa että kaikki säännöt alkoivat ilmaisulla "tavun ensimmäistä vokaalia" tai "tavun vokaaleja". Lienee hyvä aluksi etsiä ensimmäinen vokaali.
  • Onko vaikea keksiä hyviä testisanoja? Testisanojen ei tarvitse olla suomea, jotta niillä voi testata. esim: "zxzxeuook" tai "eäio".

Tehtävänanto

Lue molemmat PyUnit-ohjeet, mikäli et vielä ole lukenut niitä. Halutessasi tee Eclipseen projekti jossa PyUnit:ia on helppo suorittaa.

Tehtävänanto löytyy A+:sta.

Etusivulle