## 4 Morse-koodaaja **Tehtävä:** Luvun neljännessä tehtävässä tehdään jälleen ainakin jollain tapaa hyödyllinen ohjelma. Tällä kertaa ohjelman tehtävänä on lukea käyttäjän antama tekstisyöte ja muuttaa se Morse-koodiksi. Ohjelmaa varten on luotu tiedosto 8-4_tiedosto.txt, joka sisältää kaikki englanninkielen aakkosten Morse-aakkoset muodossa [kirjain]:[morsekoodi] \n [kirjain]:[morsekoodi]\n jne... Tiedosto sisältää kaikki aakkoset väliltä A-Z. Tehtävänäsi on siis luoda ohjelma, joka pyytää käyttäjältä syötteen muodossa "Kirjoita muutettava lause: " ja tämän jälkeen taulukoiden ja merkkijonojen metodeja apuna käyttäen muuttaa käyttäjän syötteen merkki merkiltä kirjainta vastaavaksi morsekoodiksi, erotellen morsekoodimerkit toisistaa "/"-merkillä. Toimiessaan oikein ohjelma tulostaa seuraavaa: Example output: ``` Kirjoita muutettava lause: ohjelmointi Morse-koodina vastaava on seuraavaa: /---/..../.---/./.-../--/---/../-./-/.. ``` **Vastaus** ``` #!/usr/bin/env ruby # coding: utf-8 morseTiedosto = "8-4_tiedosto.txt" $_jakajaMerkki = ":" def morseKaantaja(aakkoset) morseTeksti = "" puts "Kirjoita muutettava lause: " syote = String(gets.chomp).gsub(/[^a-zA-Z]/,"").upcase.split("") for i in syote morseTeksti += "/" + aakkoset[i] end puts "Morse-koodina vastaava on seuraavaa:\n#{morseTeksti}" end def aakkosetMap(tiedosto) taulukko = {} if File.readable?(tiedosto) linenum = 1 File.foreach(tiedosto) do |line| # On hyvä tarkistaa, että sisäänluettavan tiedoston tämänhetkinen # rivi on oikean pituinen. Muussa tapauksessa rivi ohitetaan. if line.split($_jakajaMerkki).length == 2 aakkonen = line.split($_jakajaMerkki)[0] morse = line.split($_jakajaMerkki)[1].chomp if aakkonen.length != 1 warn "Merkki '#{aakkonen}' ei ole kelvollinen aakkonen" next end taulukko.merge!(Hash[aakkonen, morse]) else warn "Havaittiin viallinen syntaksi rivillä #{linenum}. Ohitetaan rivi." end linenum += 1 end end return taulukko end morseKaantaja(aakkosetMap(morseTiedosto)) ``` Tiedosto 8-4_tiedosto.txt: ``` A:.- B:-... C:-.-. D:-.. E:. F:..-. G:--. H:.... I:.. J:.--- K:-.- L:.-.. M:-- N:-. O:--- P:.--. Q:--.- R:.-. S:... T:- U:..- V:...- W:.-- X:-..- Y:-.-- Z:--.. ```