Luku 3.4: Tehtävä: Tekstin tavutus (150p)
Tästä sivusta:
Mitä käsitellään? Merkkijonoja, perintää.
Mitä tehdään? Kirjoitetaan koodia joka hyödyntää perintää.
Suuntaa antava vaativuusarvio: Keskivaikea lähinnä uusien asioiden vuoksi. Itse tehtävä ei lopulta ole kovin haastava.
Suuntaa antava työläysarvio: 1-2 tuntia
Pistearvo: 150
Bonus: +5 % omista pisteistä aikaisesta palautuksesta.
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
- edellinen vokaali ole sama kuin jälkimmäinen (pitkä vokaali).
- jälkimmäinen vokaali ole i (i:hin loppuva diftongi).
- 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.
Huom!
Muutoksia voi vielä tulla.