previous next Title Contents Index

3. Yksinkertainen tulkkiohjelma


3.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.

3.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.4 Kielen lisääminen

Lisää sanastoon Savon kieli!

3.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:

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 

3.4 Algoritmien hahmottaminen

3.4.1 Ylemmän tason aliohjelmat

Voimme jälleen havaita seuraavat suuremmat ohjelman kokonaisuudet:
1.
tiedoston lukeminen
1.
sanan lukeminen ja kielten erottaminen
1.
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.

3.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ä)
1.
pitkän merkkijonon pilkkominen osamerkkijonoihin annetun merkin kohdalta
1.
loppuvälilyöntien poistaminen merkkijonosta
1.
isojen ja pienien kirjainten muuttaminen merkkijonossa. Esim:
	AKU ANKKA     - >  Aku Ankka
	aku ankka     - >  Aku Ankka
	aKU ANkKa     - >  AKU ANKKA
1.
ovatko merkkijonot "*aku*" ja "AKU ANKKA" samoja?

Tehtävä 3.5 Aliohjelmien käyttö

1.
Mikä edellisistä sopii sanan perässä olevan kommentin poistoon (suluissa oleva sana)?
1.
Voidaanko jotain edellistä soveltaa sanan ja kielten erottamiseen?
1.
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.6 Erikoistapauksia

Miten muutetaan seuraavat käännöskielet:
- s
r-

Tehtävä 3.7 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.

3.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.


previous next Title Contents Index