Na planecie Morsjusz wszyscy obywatele komunikują się ze sobą pisemnie, kodując komunikaty z wykorzystaniem alfabetu Morse'a. Używają przy tym tylko pięciu liter:
A – w alfabecie Morse'a: .-
P – w alfabecie Morse'a: .--.
M – w alfabecie Morse'a: --
L – w alfabecie Morse'a: .-..
K – w alfabecie Morse'a: -.-
Państwo Kowalscy lubią grać w grę w literki. Każde wykorzystane w rozgrywce słowo zapisują przy użyciu pięciu liter zakodowanych za pomocą alfabetu Morse'a (przy czym litery w danym wyrazie mogą się powtarzać).
Plik literki.txt zawiera wierszy – w każdym z nich zapisano alfabetem Morse'a jedno słowo; poszczególne litery rozdzielone są spacjami.
Napisz program, który odkoduje sekwencje sygnałów alfabetu Morse'a z pliku literki.txt, oznaczające wykorzystane w grze słowa, a następnie zapisze je do pliku literki_odkodowane.txt. Każdy odkodowany wyraz powinien być zawarty w osobnej linii pliku wyjściowego.
Poprawny wynik dla przykładowych danych wejściowych:
Linia 1. ALPAKA.
Linia 2. LAMPKA.
Linia 3. PLAM.
Linia 4. MAPKA.
Linia 5. KALKA.
Linia 6. KA.
Linia 7. MAPA.
Linia 8. ALA.
Linia 9. AM.
Linia 10. MAKAK.
Do oceny oddajesz:
plik literki_odkodowane.txt, zawierający odpowiedź do zadania (odkodowane sekwencje sygnałów),
plik(i) z kodem źródłowym programu.
Przedstaw rozwiązanie zadania w postaci programu napisanego w wybranym języku programowania (C++, Java lub Python). Zadbaj o prawidłowy odczyt i zapis danych z/do pliku tekstowego. Odpowiedź do zadania znajdziesz pod omówieniem rozwiązania.
Rozwiązanie
Rozpoczynamy od wczytania danych z pliku literki.txt do tablicy literki.
Tablica literki to tablica jednowymiarowa, która będzie przechowywać wszystkie słowa (łańcuchy znaków) zapisane za pomocą alfabetu Morse'a z pliku.
Następnie deklarujemy zmienne linia, podciag oraz odkodowane.
linia – zmienna przechowująca kolejne słowa do odkodowania zapisane alfabetem Morse'a z tablicy literki;
odkodowane – zmienna, do której dopisywane są kolejne odkodowane litery; po odkodowaniu całego kodu Morse'a dla danego słowa w zmiennej znajdzie się słowo składające się z kolejnych odkodowanych liter;
podciag – zmienna służąca do odczytywania kolejnych znaków danego słowa.
Linia 1. literki otwórz nawias kwadratowy 0 kropka kropka 99 zamknij nawias kwadratowy ⟵ wczytaj dane z pliku cudzysłów literki kropka txt cudzysłów.
Linia 2. linia ⟵ cudzysłów cudzysłów.
Linia 3. odkodowane ⟵ cudzysłów cudzysłów.
Linia 4. podciag ⟵ cudzysłów cudzysłów.
Kolejnym krokiem jest utworzenie pętli. W każdej iteracji zostanie przetworzone pojedyncze słowo zapisane w tablicy literki. Liczba cykli będzie zatem odpowiadać liczbie wierszy w pliku literki.txt.
Pierwszą operacją wykonywaną w pętli będzie przypisanie zmiennej liniai-tego elementu tablicy literki (czyli i-tego zakodowanego słowa). Za ciągiem symboli alfabetu Morse'a umieszczony zostanie znak odstępu.
Linia 1. dla i znak równości 0 przecinek 1 przecinek … 99 wykonuj.
Linia 2. linia ← literki otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 3. linia ← linia plus cudzysłów cudzysłów.
Tworzymy pętlę wewnętrzną. Będziemy sprawdzać kolejne znaki przechowywane w zmiennej linia. Przed wejściem do pętli należy jednak pamiętać o wyzerowaniu zmiennej podciąg.
Linia 1. dla i znak równości 0 przecinek 1 przecinek … 99 wykonuj.
Linia 2. linia ← literki otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 3. linia ← linia plus cudzysłów cudzysłów.
Linia 4. podciag ← cudzysłów cudzysłów.
Linia 6. dla j znak równości 0 przecinek 1 przecinek … długość otwórz nawias okrągły linia zamknij nawias okrągły minus 1 wykonuj.
Zapisujemy instrukcję warunkową sprawdzającą, czy aktualnie analizowany element jest znakiem odstępu.
W momencie napotkania znaku odstępu następuje odkodowanie kodu Morse'a dla danej litery. Wykorzystywany jest przy tym zestaw zagnieżdżonych instrukcji warunkowych, pozwalający zinterpretować ciągi znaków alfabetu Morse'a jako litery A, M, K, L, P. Jeśli analizowany podciąg jest jedną z tych liter zakodowaną alfabetem Morse'a, litera to zostaje dopisana do zmiennej odkodowane.
Po odkodowaniu kodu dla danej litery wartość zmiennej podciag zostaje wyzerowana.
Jeżeli odczytany znak z ciągu linia nie jest znakiem spacji, to znak ten jest dopisywany do zmiennej podciag. W ten sposób do zmiennej podciag dopisywane są kolejne znaki kodu Morse'a dla jednej litery (tak długo, dopóki odczytany znak nie będzie spacją).
Na przykład, jeżeli kodem Morse'a dla litery jest .--., to znaki te są sukcesywnie dopisywane do zmiennej podciag dopóki nie napotkamy na spację, która sygnalizuje koniec kodu danej litery. Następnie program sprawdza, jaką literę zakodowano za pomocą znaków przechowywanych w zmiennej podciag.
Po zakończeniu działania pętli wewnętrznej łańcuch znaków przechowywany w zmiennej odkodowane jest zapisywany do pliku literki_odkodowane.txt. Jest to odkodowane słowo z pliku.
Następnie wartość tej zmiennej jest zerowana.
Zamykamy pliki.
Linia 1. tablica literki otwórz nawias kwadratowy 0 kropka kropka 99 zamknij nawias kwadratowy otwórz nawias ostrokątny minus wczytaj dane z pliku cudzysłów literki kropka txt cudzysłów.
Linia 2. linia ← cudzysłów cudzysłów.
Linia 3. litera ← cudzysłów cudzysłów.
Linia 4. odkodowane ← cudzysłów cudzysłów.
Linia 6. dla i znak równości 0 przecinek 1 przecinek … 99 wykonuj.
Linia 7. linia ← literki otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 8. linia ← linia plus cudzysłów cudzysłów.
Linia 9. podciag ← cudzysłów cudzysłów.
Linia 11. dla j znak równości 0 przecinek 1 przecinek … długość otwórz nawias okrągły linia zamknij nawias okrągły minus 1 wykonuj.
Linia 12. jeżeli linia otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości cudzysłów cudzysłów wykonuj.
Linia 13. jeżeli podciag znak równości cudzysłów kropka minus cudzysłów wykonuj.
Linia 14. odkodowane ← odkodowane plus cudzysłów A cudzysłów.
Linia 15. w przeciwnym razie jeżeli podciag znak równości cudzysłów minus minus cudzysłów wykonuj.
Linia 16. odkodowane ← odkodowane plus cudzysłów M cudzysłów.
Linia 17. w przeciwnym razie jeżeli podciag znak równości cudzysłów minus kropka minus cudzysłów wykonuj.
Linia 18. odkodowane ← odkodowane plus cudzysłów K cudzysłów.
Linia 19. w przeciwnym razie jeżeli podciag znak równości cudzysłów kropka minus kropka kropka cudzysłów wykonuj.
Linia 20. odkodowane ← odkodowane plus cudzysłów L cudzysłów.
Linia 21. w przeciwnym razie jeżeli podciag znak równości cudzysłów kropka minus minus kropka cudzysłów wykonuj.
Linia 22. odkodowane ← odkodowane plus cudzysłów P cudzysłów.
Linia 23. podciag ← cudzysłów cudzysłów.
Linia 24. w przeciwnym razie.
Linia 25. podciag ← podciag plus linia otwórz nawias kwadratowy j zamknij nawias kwadratowy.
Linia 27. zapisz odkodowane do pliku literki podkreślnik odkodowane kropka txt.
Linia 28. odkodowane znak równości cudzysłów cudzysłów.
Linia 30. zamknij plik cudzysłów literki kropka txt cudzysłów.
Linia 31. zamknij plik cudzysłów literki podkreślnik odkodowane kropka txt cudzysłów.
Ważne!
W programie wykorzystaliśmy funkcję długość(x). Funkcja długość(x) zwraca długość łańcucha znaków x. Ma ona swoje odpowiedniki w językach programowania.
Język C++
Linia 1. x kropka length otwórz nawias okrągły zamknij nawias okrągły.
Język Java
Linia 1. x kropka length otwórz nawias okrągły zamknij nawias okrągły.
Język Python
Linia 1. len otwórz nawias okrągły x zamknij nawias okrągły.
Odpowiedź
Poprawna odpowiedź do zadania dla danych z pliku:
RFXdWIhrZRtuM
Słownik
alfabet łaciński
alfabet łaciński
alfabet składający się z 26 liter: 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; należy pamiętać o tym, że mogą być to zarówno małe, jak i wielkie litery
alfabet Morse'a
alfabet Morse'a
sposób reprezentacji alfabetu, cyfr i znaków specjalnych za pomocą dźwięków, błysków światła, impulsów elektrycznych lub znaków popularnie zwanych kreską i kropką