Ruby fundamentals through coding exercises
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.5 KiB

4 years ago
  1. ## 4 Morse-koodaaja
  2. **Tehtävä:**
  3. 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.
  4. 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...
  5. 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ä.
  6. Toimiessaan oikein ohjelma tulostaa seuraavaa:
  7. Example output:
  8. ```
  9. Kirjoita muutettava lause:
  10. ohjelmointi
  11. Morse-koodina vastaava on seuraavaa:
  12. /---/..../.---/./.-../--/---/../-./-/..
  13. ```
  14. **Vastaus**
  15. ```
  16. #!/usr/bin/env ruby
  17. # coding: utf-8
  18. morseTiedosto = "8-4_tiedosto.txt"
  19. $_jakajaMerkki = ":"
  20. def morseKaantaja(aakkoset)
  21. morseTeksti = ""
  22. puts "Kirjoita muutettava lause: "
  23. syote = String(gets.chomp).gsub(/[^a-zA-Z]/,"").upcase.split("")
  24. for i in syote
  25. morseTeksti += "/" + aakkoset[i]
  26. end
  27. puts "Morse-koodina vastaava on seuraavaa:\n#{morseTeksti}"
  28. end
  29. def aakkosetMap(tiedosto)
  30. taulukko = {}
  31. if File.readable?(tiedosto)
  32. linenum = 1
  33. File.foreach(tiedosto) do |line|
  34. # On hyvä tarkistaa, että sisäänluettavan tiedoston tämänhetkinen
  35. # rivi on oikean pituinen. Muussa tapauksessa rivi ohitetaan.
  36. if line.split($_jakajaMerkki).length == 2
  37. aakkonen = line.split($_jakajaMerkki)[0]
  38. morse = line.split($_jakajaMerkki)[1].chomp
  39. if aakkonen.length != 1
  40. warn "Merkki '#{aakkonen}' ei ole kelvollinen aakkonen"
  41. next
  42. end
  43. taulukko.merge!(Hash[aakkonen, morse])
  44. else
  45. warn "Havaittiin viallinen syntaksi rivillä #{linenum}. Ohitetaan rivi."
  46. end
  47. linenum += 1
  48. end
  49. end
  50. return taulukko
  51. end
  52. morseKaantaja(aakkosetMap(morseTiedosto))
  53. ```
  54. Tiedosto 8-4_tiedosto.txt:
  55. ```
  56. A:.-
  57. B:-...
  58. C:-.-.
  59. D:-..
  60. E:.
  61. F:..-.
  62. G:--.
  63. H:....
  64. I:..
  65. J:.---
  66. K:-.-
  67. L:.-..
  68. M:--
  69. N:-.
  70. O:---
  71. P:.--.
  72. Q:--.-
  73. R:.-.
  74. S:...
  75. T:-
  76. U:..-
  77. V:...-
  78. W:.--
  79. X:-..-
  80. Y:-.--
  81. Z:--..
  82. ```