Anna aihe aivan toinen
jos siitäkin koodin voinen?
Olkoon ukko ulkomailla
sanoja sen taarviis saada.
Mielipä sen jo tekevi
apetta ajattelevi.
Polo kuinka tuon sanoisi
Sanakirjan saa avuksi
.
Olkoon meillä tehtävänä tehdä satunnaisen matkaajan käyttöön soveltuva tulkkiohjelma, joka kääntää sana kerrallaan. Mitään valmiita lauseita ja taivutusmuotoja hallitsevaa ohjelmaa emme edes yritä tehdä. Tavoitteena on siis sanakirjan yksinkertaistettu elektroninen versio.
Ohjelman yksi tavoite täytyisi olla sanaston helppo täydentäminen. Sanasto on jälleen luonnollisinta säilyttää tiedostossa. Mikäli sanasto on normaali tekstitiedosto, on sen täydentäminen tekstinkäsittelyohjelmalla helppoa. Nykyisin JOKAISEN on osattava käyttää jotakin tekstinkäsittelyohjelmaa!
Tehtäväksemme jää siis sanastotiedoston muodon suunnittelu sekä itse ohjelman toimintojen suunnittelu.
Sanasto voisi näyttää vaikkapa seuraavalta:
Suomi Ruotsi Englanti
;––––––––––––––––––––––––––––––––––––––––––
minä jag i
sinä du you
hän han he
Tässä tuleekin nyt ongelmia. Tarvitaan synonyymejä. Esimerkiksi "hän" täytyisi voida sanoa "he" tai "she" suvun mukaan. Miten esittäisimme synonyymit? Tarvitaan ehkä myös kommentteja! Ratkaisu voisi olla seuraava:
Suomi | Ruotsi | Englanti
;––––––––––––––––––––––––––––––––––––––––––
minä | jag | i
sinä | du | you (yks.)
hän | han (mask.) | he (mask.)
hän | hon (fem.) | she (fem.)
me | vi | we
te | ni | you (mon.)
he | dom | they
hernekeitto | ärtsoppa | pea soup
sukellusvene | ubåt | submarine
suklaa | chokolade | chocolate
sukka | socka (lyhyt) | sock (lyhyt)
sukka | strumpa (pitkä)| stocking (pitkä)
Itse ohjelman on sitten huolehdittava siitä, että synonyymien tapauksessa myös synonyymit tulostetaan.
Ohjelma lukee käynnistyessään koko tiedoston. Tiedoston 1. riviltä selviävät käytettyjen kielten nimet. Nimessä iso kirjain tarkoittaa kirjainta, jolla kielen nimi voidaan lyhentää.
Tehtävä 3.1 Kielen lisääminen
Lisää sanastoon Savon kieli!
Ohjelman suunnittelu on tässäkin tapauksessa parasta tehdä käyttöohjeen avulla. Suunnittelemme aluksi kuitenkin ohjelmalta halutut toiminnot.
Satunnaisen matkaajan tarpeet ovat varmaankin seuraavat:
· Hän istuu ruokapöydässä Ruotsissa ja lukee menua. Pitäisi saada selville mitä "ärtsoppa" tarkoittaa.
· Hän haluaa "hernekeittoa". Mitä se on ruotsiksi?
· Hän näkee sukellusveneen Tukholman rannikolla ja haluaa kertoa tästä vieressään seisovalle merisotilaalle.
· Ruotsalainen merisotilas ei hetkauta korvaansa "UBÅT–UBÅT" –huudoille. Takana seisoo englantilainen kenraali ja satunnainen matkaaja haluaisi tiedottaa näkemästään myös hänelle.
Suomalaisen ollessa Ruotsissa tarvitaan käännöksiä ruotsi–suomi ja suomi–ruotsi. Siis molemmat kielet tulee voida valita.
Hätätilassa pitää suhteellisen helposti päästä käsiksi myös muunkielisiin sanoihin.
Periaatteessa, mikäli kielet on jo valittu, riittäisi käyttö tyyliin
Sana >ärtsoppa[RET]
ruotsi: ärtsoppa = suomi: hernekeitto
Entäpä mikäli kielinä olisi suomi ja englanti:
Sana >he[RET]
suomi : he = englanti: they
englanti: he (mask.) = suomi : hän
Tämä voisi olla aivan hyvä ratkaisu. Miten kielen vaihto kävisi kätevästi (nopeasti)?
Sana >sukellusvene/s–e[RET]
suomi: sukellusvene = englanti: submarine
Voisi olla tarpeen myös saada käännös samanaikaisesti usealla eri kielellä:
Sana >sukellusvene/s–re[RET]
suomi: sukellusvene = ruotsi : ubåt
= englanti: submarine
Sovimme siis, että sanan perään kirjoitetaan kauttaviivan jälkeen mistä kielestä käännetään ja mihin. Mikäli kumpiakin kieliä on vain yksi, käännös voi olla kumpaankin suuntaan. Mikäli toista kieltä on useita kappaleita, tehdään käännös vain kuten on pyydetty. Mikäli toista kieltä ei anneta lainkaan, tarkoitetaan kaikkia mahdollisia kieliä.
Kerran annetut käännöskielet säilyvät, kunnes käännöskielet annetaan uudelleen.
Siis ohjelman toiminta voisi olla vaikkapa seuraavanlainen:
Terve! Olen Satunnaiselle matkaajalle suunniteltu Tulkki!
Sanastoni on tiedostossa SANASTO.DAT. Mikäli haluat lisätä
sanastoa, käytä tekstinkäsittelyohjelmaa sanaston
päivittämiseksi.
Avustusta saat vastaamalla ? kun sinulta kysytään sanaa.
Tulkattavina kielinä on nyt suomi–ruotsi.
Sana>?[RET]
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Avustus:
Kirjoita sanakysymyksen perään sana jonka haluat kääntää.
Mikäli painat pelkän [RET], ohjelman toiminta loppuu.
Mikäli haluat vaihtaa kieliä, kirjoita sanan perään
kauttaviiva ja kielten nimien lyhennekirjaimet, joita
haluat kääntää. Mikäli haluat käännöksen samalla
usealle eri kielelle/kieleltä, kirjoita kaikki haluamasi
kielet. Mikäli haluat käännöksen kaikille mahdollisille
kielille, kirjoita vain lähtökieli.
Tunnen kielet Suomi Ruotsi Englanti.
Esimerkki:
Sana>kissa/s–e
suomi: kissa = englanti: cat
Sana>car
englanti: car = suomi: auto
Sanassa voi käyttää myös jokerimerkkejä * ja ?
Esimerkki:
Sana>suk*
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Sana>hän/s–e[RET]
suomi: hän = englanti: he (mask.)
= englanti: she (fem.)
Sana>he[RET]
suomi : he = englanti: they
englanti: he (mask.) = suomi : hän
Sana>hän/s–[RET]
suomi: hän = englanti: he (mask.)
= ruotsi : han (mask.)
= englanti: she (fem.)
= ruotsi : hon (fem.)
Sana>suk*/s–r[RET]
suomi: sukellusvene = ruotsi : ubåt
sukka = ruotsi : strumpa (pitkä)
sukka = ruotsi : socka (lyhyt)
suklaa = ruotsi : chokolade
Sana>käyrätorviorkesteri[RET]
Ei löydy sanastosta!
Sana>[RET]
Kiitos käytöstä!
Satunnainen matkaaja voi olla huono/hidas konekirjoittaja. Siksi valitsimme hänelle lisäksi mahdollisuuden antaa sanoja jokerimerkkien avulla. Näin hänen ei välttämättä tarvitse osata kirjoittaa koko sanaa vaan hän voi lyhentää sen haluamastaan kohdasta. Tätä sanotaan käyttäjäystävällisyydeksi.
Mikäli kieliä ei anneta lainkaan, sanaa etsittäisiin kaikista mahdollisista kielistä. Tällaisen option tarve olisi silloin, kun ei ole harmaintakaan aavistusta siitä, millä kielellä sana on kirjoitettu.
Sana >h*/–[RET]
suomi : hän = ruotsi : han (mask.)
= englanti: he (mask.)
ruotsi : han (mask.) = suomi : hän
= englanti: he (mask.)
englanti: he (mask.) = suomi : hän
= ruotsi : han (mask.)
suomi : hän = ruotsi : hon (fem.)
= englanti: she (fem.)
ruotsi : hon (fem.) = suomi : hän
= englanti: she (fem.)
suomi : he = ruotsi : dom
= englanti: they
suomi : hernekeitto = ruotsi : ärtsoppa
= englanti: pea soup
Sana >h*/–s[RET]
ruotsi : han (mask.) = suomi : hän
englanti: he (mask.) = suomi : hän
ruotsi : hon (fem.) = suomi : hän
Voimme jälleen havaita seuraavat suuremmat ohjelman kokonaisuudet:
1. tiedoston lukeminen
2. sanan lukeminen ja kielten erottaminen
3. sanan etsiminen sanastosta sekä synonyymien tarkistus
Miten sanaa etsitään sanastosta? Mikäli sanasto ei ole järjestetty (voidaan myöhemmin järjestää mikäli sanasto kasvaa) riittää varmaankin raaka peräkkäishaku.
Miten löydetään sanaa vastaavat muunkieliset tulkinnat? Ne ovat löytyneen sanan kanssa samalla rivillä.
Käännöksenä on esim. "s–e" (suomi–englanti) ja annetaan sana he. Mitä tehdään? Etsitään suomi –sarakkeesta sanan "he" –rivi ja tulostetaan rivin englanti –sarakkeessa oleva sana. Etsitään englanti –sarakkeesta "he" –rivi ja tulostetaan rivin suomi –sarakkeessa oleva sana.
Yllättäen alemman tason aliohjelmissa tarvitaan samoja ominaisuuksia kuin jäsenrekisteriäkin tehtäessä:
1. merkkijonon lukeminen päätteeltä siten, että sille voidaan jättää oletusarvo (laitetaan oletusarvoksi tyhjä)
2. pitkän merkkijonon pilkkominen osamerkkijonoihin annetun merkin kohdalta
3. loppuvälilyöntien poistaminen merkkijonosta
4. isojen ja pienien kirjainten muuttaminen merkkijonossa. Esimerkiksi:
AKU ANKKA –> Aku Ankka
aku ankka –> Aku Ankka
aKU ANkKa –> AKU ANKKA
5. ovatko merkkijonot "*aku*" ja "AKU ANKKA" samoja?
Tehtävä 3.2 Aliohjelmien käyttö
1. Mikä edellisistä sopii sanan perässä olevan kommentin poistoon (suluissa oleva sana)?
2. Voidaanko jotain edellistä soveltaa sanan ja kielten erottamiseen?
3. Entä kun käännös (esim. s–e) on löytynyt, niin voidaanko jotain edellä olevista soveltaa mistä– ja mihin– kielten erottamiseen?
Mikäli käännösetsiminen osataan tehdä esim. s–sarakkeesta ja tulos ottaa e–sarakkeesta ohjeella "s–e", niin miten sama saataisiin tehtyä päinvastoin? Ohjeella "e–s"?. Siis mikäli käännösohjeeksi valittaisiin "s–e", niin se ehkä kannattaisi muuttaa muotoon "se–es". Näin kahden kielen tapausta ei tarvitsisi käsitellä minään erikoistapauksena. Samalla ajatuksella ohje "–" muutettaisiin muotoon "sre–sre" (eli kaikkiin tunnettuihin kieliin). Siis koko kääntäminen muodostuisi siten, että annettua sanaa etsitään ohjeessa vasemmalla annetuista sarakkeista ja mikäli se jostakin niistä löytyy, tulostettaisiin oikealla annetut sarakkeet paitsi se sarake josta sana löytyi!
Tehtävä 3.3 Erikoistapauksia
Miten muutetaan seuraavat käännöskielet:
–s
r–
Tehtävä 3.4 Algoritmi muuttamiselle
Kirjoita selkeät säännöt (=taulukko), miten käännösohje muutetaan kussakin erikoistapauksessa.
syöttömuoto muunnettu muoto
–––––––––––––––––––––––––––––––––––
s–e se–es
e–s es–se
s–r sr–rs
s– s–sre
...
– sre–sre
...
Eräs ongelma on se, miten tulos muotoillaan siistiksi, eli löydetään pisimmät mahdolliset sanat ja kielet jotta vastinsanat saadaan tulostettua siististi allekkain.
Koodaus jätetään jälleen oppimisen myöhempään vaiheeseen. Taaskaan suunnittelun alkuvaihe ei sisältänyt (eikä tarvinnut sisältää) mitään tietoa siitä, millä ohjelmointikielellä ohjelma toteutettaisiin.