Задача
Морзянка. Вводимый с клавиатуры или из файла текст перевести в последовательность точек и тире с помощью азбуки Морзе. Результат можно иллюстрировать звуком.
Тесты:
Текст | Результат | Комментарий |
SOS | …—… | пройден |
A true SOS !!! | .- -…- — .-. ..- . -…- … — … -…- —..— —..— —..— -…- | пройден |
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <iostream> #include <string> #include <map> #include <cctype> using namespace std; map <char, string> morze = { { 'a', ".-"}, { 'b', "-..."}, { 'w', ".--"}, { 'g', "--."}, { 'd', "-.."}, { 'e', "."}, { 'v', "...-"}, { 'z', "--.."}, { 'i', ".."}, { 'j', ".---"}, { 'k', "-.-"}, { 'l', ".-.."}, { 'm', "--"}, { 'n', "-."}, { 'o', "---"}, { 'p', ".--."}, { 'r', ".-."}, { 's', "..."}, { 't', "-"}, { 'u', "..-"}, { 'f', "..-."}, { 'h', "...."}, { 'c', "-.-."}, { 'q', "--.-"}, { 'y', "-.--"}, { 'x', "-..-"}, { '1', ".----"}, { '2', "..---"}, { '3', "...--"}, { '4', "....-"}, { '5', "....."}, { '6', "-...."}, { '7', "--..."}, { '8', "---.."}, { '9', "----."}, { '0', "-----"}, { '.', "......"}, { ',', ".-.-.-"}, { ':', "---..."}, { ';', "-.-.-."}, { '(', "-.--.-"}, { ')', "-.--.-"}, { '"', ".-..-."}, { '-', "-....-"}, { '/', "-..-."}, { '?', "..--.."}, { '!', "--..--"}, { ' ', "-...-"}, { '@', ".--.-."}, }; int main() { string text; while(cin >> text) { for(int i = 0; i < text.length(); i++) { text[i] = tolower(text[i]); cout << morze.find( text[i] )->second <<" "; } cout << morze.find(' ')->second << " "; } return 0; } |
Я создала ассоциативный массив через map, и связала буквы («ключ«) и соответствующие им значения в азбуке Морзе («значение«). Чтобы не заполнять его еще и большими буквами, во вводимом тексте уменьшаю буквы с помощью функции tolower .
Решение через c-string :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#include <iostream> #include <cstring> #include <stdio.h> #include <cctype> using namespace std; int main() { char text[254]=""; char mrz[10] ; if ( fgets( text, sizeof(text), stdin ) == NULL ) { cout << "Произошла ошибка или был прочитан EOF\n"; } else { for(int i = 0; i < strlen(text); i++) { text[i]=tolower(text[i]); switch (text[i]){ case 'a': sprintf(mrz,".-"); break; case 'b': sprintf(mrz,"-..."); break; case 'w': sprintf(mrz,".--"); break; case 'g': sprintf(mrz,"--."); break; case 'd': sprintf(mrz,"-.."); break; case 'e': sprintf(mrz,"."); break; case 'v': sprintf(mrz,"...-"); break; case 'z': sprintf(mrz,"--.."); break; case 'i': sprintf(mrz,".."); break; case 'j': sprintf(mrz,".---"); break; case 'k': sprintf(mrz,"-.-"); break; case 'l': sprintf(mrz,".-.."); break; case 'm': sprintf(mrz,"--"); break; case 'n': sprintf(mrz,"-."); break; case 'o': sprintf(mrz,"---"); break; case 'p': sprintf(mrz,".--."); break; case 'r': sprintf(mrz,".-."); break; case 's': sprintf(mrz,"..."); break; case 't': sprintf(mrz,"-"); break; case 'u': sprintf(mrz,"..-"); break; case 'f': sprintf(mrz,"..-."); break; case 'h': sprintf(mrz,"...."); break; case 'c': sprintf(mrz,"-.-."); break; case 'q': sprintf(mrz,"--.-"); break; case 'y': sprintf(mrz,"-.--"); break; case 'x': sprintf(mrz,"-..-"); break; case '1': sprintf(mrz,".----"); break; case '2': sprintf(mrz,"..---"); break; case '3': sprintf(mrz,"...--"); break; case '4': sprintf(mrz,"....-"); break; case '5': sprintf(mrz,"....."); break; case '6': sprintf(mrz,"-...."); break; case '7': sprintf(mrz,"--..."); break; case '8': sprintf(mrz,"---.."); break; case '9': sprintf(mrz,"----."); break; case '0': sprintf(mrz,"-----"); break; case '.': sprintf(mrz,"......"); break; case ',': sprintf(mrz,".-.-.-"); break; case ':': sprintf(mrz,"---..."); break; case ';': sprintf(mrz,"-.-.-."); break; case '(': sprintf(mrz,"-.--.-"); break; case ')': sprintf(mrz,"-.--.-"); break; case '"': sprintf(mrz,".-..-."); break; case '-': sprintf(mrz,"-....-"); break; case '/': sprintf(mrz,"-..-."); break; case '?': sprintf(mrz,"..--.."); break; case '!': sprintf(mrz,"--..--"); break; case ' ': sprintf(mrz,"-...-"); break; case '@': sprintf(mrz,".--.-."); break; default: sprintf(mrz,""); break; } cout << " "<< mrz; } cout << endl; } return 0; } |
Ссылки:
Решение на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
import java.util.*; import java.lang.*; import java.io.*; class Main { public static void main (String[] args) throws java.lang.Exception { BufferedReader br = new BufferedReader(new InputStreamReader (System. in) ) ; char rsim; Map<String, String> morze = new HashMap<String, String>(); morze.put( "a", ".-"); morze.put( "b", "-..."); morze.put( "w", ".--"); morze.put( "g", "--."); morze.put( "d", "-.."); morze.put( "e", "."); morze.put( "v", "...-"); morze.put( "z", "--.."); morze.put( "i", ".."); morze.put( "j", ".---"); morze.put( "k", "-.-"); morze.put( "l", ".-.."); morze.put( "m", "--"); morze.put( "n", "-."); morze.put( "o", "---"); morze.put( "p", ".--."); morze.put( "r", ".-."); morze.put( "s", "..."); morze.put( "t", "-"); morze.put( "u", "..-"); morze.put( "f", "..-."); morze.put( "h", "...."); morze.put( "c", "-.-."); morze.put( "q", "--.-"); morze.put( "y", "-.--"); morze.put( "x", "-..-"); morze.put( "1", ".----"); morze.put( "2", "..---"); morze.put( "3", "...--"); morze.put( "4", "....-"); morze.put( "5", "....."); morze.put( "6", "-...."); morze.put( "7", "--..."); morze.put( "8", "---.."); morze.put( "9", "----."); morze.put( "0", "-----"); morze.put( ".", "......"); morze.put( ",", ".-.-.-"); morze.put( ":", "---..."); morze.put( ";", "-.-.-."); morze.put( "(", "-.--.-"); morze.put( ")", "-.--.-"); morze.put( "\"", ".-..-."); morze.put( "-", "-....-"); morze.put( "/", "-..-."); morze.put( "?", "..--.."); morze.put( "!", "--..--"); morze.put( " ", "-...-"); morze.put( "@", ".--.-."); while( (int)(rsim = (char) br.read()) != 65535 ) { String sim=String.valueOf(Character.toLowerCase(rsim)); System.out.printf(" %s",morze.get(sim) ); } } } |
Зачтено
Мы всё же изучаем структуры данных и у нас есть интерфейс Map и несколько его реализаций. Можно сделать с их помощью?
Сделано через Map — это очень хорошо, только очень странно прописано условие чтения — br.read() вернет -1 в случае конца файла. Логичнее (хотя и чуть более громоздко):
10 баллов