Rästitehtävä 3

Morsekoodin lukija (400 p)

Tällä rästitehtävällä voit korvata toisen kierroksista 7 tai 8. Jos sinulta puuttuu minimipisteet molemmilta näistä kierroksista, sinun pitää tehdä sekä tämä tehtävä että rästitehtävä 1 tai 2. Jotta rästitehtävä korvaisi tehtäväkierroksen, siitä on saatava vähintään 300 pistettä. Vaikka saisit tehtävästä enemmän pisteitä, niin harjoitustehtäväarvosanaa määrättäessä tällä tehtävällä korvatun kierroksen pistemääräksi lasketaan kuitenkin vain korvattavan kierroksen minimipistemäärä.

Tee Eclipseen uusi projekti, jonka nimi on tehtava10_3. Luo sitten tähän projektiin moduuli morsetus ja kirjoita siihen ohjelma, joka lukee tiedostosta morseaakkosilla kirjoitettuja merkkejä ja tulostaa ne tavallisena tekstinä.

Aluksi ohjelma lukee tiedostosta, mikä kirjain vastaa mitäkin morsekoodia. Tiedoston nimi pyydetään käyttäjältä. Koodit on annettu tiedostossa siten, että rivillä on ensin kirjain tai muu merkki, sitten kaksoispiste ja sitten merkkiä vastaava morsekoodi. Voit katsoa mallia tiedostosta morseaakkoset1.txt. Ohjelma tekee sanakirjarakenteen, joissa avaimena on morseaakkonen ja arvona morseaakkosta vastaava merkki.

Tämän jälkeen ohjelma kysyy, mistä tiedostosta morseaakkoset luetaan. Ohjelma lukee morseaakkoset tiedostosta rivi kerrallaan ja tulostaa vastaavat rivit kirjaimina kuvaruudulle. (Katso mallia esimerkkiajosta.) Tiedostossa morseaakkoset on erotettu toisistaan välilyönnillä. Kaksi sanaa on taas erotettu toisistaan normaalisti kaksoispistettä merkitsevällä morseaakkosella "---...". (Oikeasti sähkötyksessä kirjaimet erotetaan toisistaan lyhyemmillä ja sanat toisistaan pidemmillä väleillä, mutta tässä tehtävissä on tehtävän helpottamiseksi valittu erikoismerkki erottamaan sanat toisistaan.) Kaksoispistettä tarkoittava merkki siis käännetään aina välilyönniksi. Tätä kaksoispistettä tarkoittavaa merkkiä ei ole valmiiksi annetuissa kooditiedostoissa, vaan sinun pitää itse lisätä se sanakirjarakenteeseen.

Voit katsoa esimerkkejä morsekoodia sisältävistä tiedostoista morsetekstia1.txt ja morsetekstia2.txt.

Morseaakkosia sisältävä tiedosto voi sisältää myös sellaisia merkkejä, joita ei pystytä tunnistamaan tehdyn sanakirjan perusteella. Siinä tapauksessa näiden merkkien kohtaan kirjoitetaan riviä tulkittaessa *-merkki. Jos morseaakkosia sisältävä tiedosto sisältää tyhjän rivin, ohjelma tulostaa vastaavaan kohtaan tyhjän rivin.

Myös aluksi luettavassa kooditiedostossa voi olla virheitä. Jos rivillä ei ole täsmälleen kahta toisistaan kaksoispisteellä erotettua osaa (esimerkiksi rivi on tyhjä tai sillä on kolme toisistaan kaksoispisteellä erotettua osaa), ohjelma hyppää tämän rivin yli eikä ota sitä mitenkään huomioon sanakirjaa tehdessään. Ohjelma ei kuitenkaan anna virheilmoitusta, vaan se jatkaa ihan normaalisti suoritustaan lukemalla tiedoston seuraavan rivin. Esimerkiksi tiedosto morseaakkoset2.txt sisältää virheellisiä rivejä. Voit kuitenkin olettaa, että jos rivillä on täsmälleen kaksi toisistaan kaksoispisteellä erotettua osaa, niin ne ovat merkki ja morseaakkonen. Tätä ei siis tarvitse enää tarkistaa erikseen.

Jos ohjelma ei pysty lukemaan jompaa kumpaa tiedostoa, se ilmoittaa virheestä ja lopettaa toimintansa (katso mallia esimerkkiajoista).

Ohjelman rakennetta ei ole tässä sen tarkemmin määrätty, vaan voit suunnitella itse esimerkiksi sen, mitä funktioita ohjelmasi sisältää. Älä kuitenkaan kirjoita koko ohjelmaa yhteen pääohjelmaan.

Kopioi tiedostot morseaakkoset1.txt, morseaakkoset2.txt, morsetekstia1.txt ja morsetekstia2.txt samaan hakemistoon ohjelmasi kanssa, jotta pystyisit testaamaan ohjelmaasi. Palauta Gobliniin tiedosto morsetus.py.

Esimerkkejä ohjelman suorituksesta:

[ohjelman suoritus alkaa]
Ohjelman avulla voi lukea morsemerkkeja sisaltavan tiedoston.
Anna kooditiedot sisaltavan tiedoston nimi.
morseaakkoset1.txt
Mista tiedostosta morseaakkoset luetaan?
morsetekstia1.txt
OHJELMOINNIN PERUSKURSSI
ON PIAN LOPPU.
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa]
Ohjelman avulla voi lukea morsemerkkeja sisaltavan tiedoston.
Anna kooditiedot sisaltavan tiedoston nimi.
morseaakkoset1.txt
Mista tiedostosta morseaakkoset luetaan?
morsetekstia2.txt
TAMA ON VAHAN PITEMPI
TESTI. KATSOTAAN
OSAAKO OHJELMASI
TULKITA SEN.
TOIVOTTAVASTI OSAA.
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa, kooditiedostossa virheellisia riveja]
Ohjelman avulla voi lukea morsemerkkeja sisaltavan tiedoston.
Anna kooditiedot sisaltavan tiedoston nimi.
morseaakkoset2.txt
Mista tiedostosta morseaakkoset luetaan?
morsetekstia2.txt
TAMA *N VAHAN P*TEMP*
TE*T*. KAT**TAAN
**AAK* *HJELMA**
TULK*TA *EN.
T**V*TTAVA*T* **AA.
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa, kooditiedostoa ei pystyta lukemaan]
Ohjelman avulla voi lukea morsemerkkeja sisaltavan tiedoston.
Anna kooditiedot sisaltavan tiedoston nimi.
ei_olekaan.txt
Kooditiedostoa ei pystytty lukemaan.
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa, merkit sisaltavaa tiedostoa ei pystyta lukemaan]
Ohjelman avulla voi lukea morsemerkkeja sisaltavan tiedoston.
Anna kooditiedot sisaltavan tiedoston nimi.
morseaakkoset1.txt
Mista tiedostosta morseaakkoset luetaan?
ei_mistaan.txt
Merkkien luku tiedostosta ei onnistunut.
[ohjelman suoritus päättyy]

Värikoodit:
Sininen: Syöte käyttäjältä
Vihreä: Ohjelman tuloste
Punainen: Erityishuomatus: ei tulosteta