1. Yksinkertainen tulkkiohjelma

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

.

1.1 Tehtävän tarkennus

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.

1.2 Tietorakenteet ja tiedostot

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!

1.3 Käyttöohje

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ä ruotsisuomi ja suomiruotsi.   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

 

1.4 Algoritmien hahmottaminen

1.4.1 Ylemmän tason aliohjelmat

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" (suomienglanti) 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.

1.4.2 Alemman tason aliohjelmat

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.

1.5 Koodaus ohjelmointikielelle

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.