Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/41: Рейтинг темы: голосов - 41, средняя оценка - 4.51
0 / 0 / 0
Регистрация: 20.06.2021
Сообщений: 5

Декодер азбуки Морзе

20.06.2021, 10:12. Показов 8396. Ответов 11

Студворк — интернет-сервис помощи студентам
Добрый день! Я новичок в С#, помогите решить небольшую задачку, декодер азбуки Морзе
на вход у меня дан двумерный словарик и с помощью него нужно раскодировать например Hello world - ".... . .-.. .-.. --- .-- --- .-. .-.. -.."

C#
1
2
3
4
5
6
7
8
9
        public static IDictionary<string, string> MorseCodeDictionary = new Dictionary<string, string>() {
            { ".-", "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"},
        };

С двумя разными списками где в одном коды Морзе а в другом алфавит сделал через for, но вот с двумерным словарём засада никак не могу разобраться. Ниже код который использую для двух списков.

C#
1
2
3
4
5
6
7
8
9
10
11
            string[] message = morzeMessage.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < message.Length; i++)
            {
                for (int j = 0; j <= 25; j++)
                {
                    if (message[i] == tableMorze[j])
                    {
                        endMessage += abc[j];
                    }
                }
            }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.06.2021, 10:12
Ответы с готовыми решениями:

Клавиатурный тренажер азбуки Морзе
Я не очень хорошо разбираюсь в програмировании. Но курсовая уже горит.(Программа на языке C#) Мне нужно доделать клавиатурный тренажер...

Декодирование азбуки морзе
Подскажите пожалуйста как сделать декодирование азбуки морзе. Сделал кодирование и проигрывание введенного сообщения, нужно сделать...

Декодировка Азбуки Морзе
Здраствуйте, нужно декодировать азбуку Морзе. Кодируеться вроде бы верно, при вводе в консоль к примеру &quot;._&quot; точка тире...

11
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
20.06.2021, 10:27
Лучший ответ Сообщение было отмечено darksid как решение

Решение

darksid, если в исходном тексте нет ошибок - то есть там точно не содержатся последовательности отсутствующие в азбуке Морзе, то делаем так
C#
1
2
3
4
5
    string[] message = morzeMessage.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    for (int i = 0; i < message.Length; i++)
    {
        endMessage += MorseCodeDictionary[message[i]];
    }
По сути словарь дает нам возможность получить элемент по "ключу". В данном случае ключ, это последовательность из азбуки Морзе.

Если в исходном тексте могут быть ошибки, то немного меняем код:
C#
1
2
3
4
5
6
7
    string[] message = morzeMessage.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    for (int i = 0; i < message.Length; i++)
    {
        endMessage += MorseCodeDictionary.TryGetValue(message[i], out string letter)
            ? letter
            : "???";
    }
Цитата Сообщение от darksid Посмотреть сообщение
у меня дан двумерный словарик
Просто словарик. Никакой двумерности здесь нет. В словаре хранятся элементы представляющие пару из ключа и значения.
1
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
20.06.2021, 10:42
Лучший ответ Сообщение было отмечено darksid как решение

Решение

Ещё как вариант, это хранить два словаря, чтобы была возможность быстрого поиска не нему как для расшифровки, так и зашифровки.

C#
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace CyberForum
{
    class Program
    {
        // словарь Морзе-Буква
        public static Dictionary<string, string> MorseToAbc = new Dictionary<string, string>() {
            { ".-", "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"},
        };
 
        // словарь Буква-Морзе
        public static Dictionary<string, string> AbsToMorse = MorseToAbc.ToDictionary(k => k.Value, v => v.Key);
 
 
        static void Main()
        {
            // какое-то слово (только буквы)
            string hello = "helloworld";
 
            // перевели слово в Морзе
            string morse = ToMorse(hello);
            Console.WriteLine(morse);
 
            // перевели из Морзе в слово
            Console.WriteLine(FromMorse(morse));
        }
 
        // перевод текста в Морзе
        static string ToMorse(string input)
        {
            input = input.ToUpper();
 
            string[] encoded = new string[input.Length];
 
            for (int i = 0; i < input.Length; i++)
            {
                encoded[i] = AbsToMorse[input[i].ToString()];
            }
 
            return string.Join(" ", encoded);
        }
 
        // перевод из Морзе в текст
        static string FromMorse(string input)
        {
            string[] morse = input.Split();
            string[] decoded = new string[morse.Length];
 
            for (int i = 0; i < morse.Length; i++)
            {
                decoded[i] = MorseToAbc[morse[i]];
            }
 
            return string.Concat(decoded);
        }
    }
}
1
0 / 0 / 0
Регистрация: 20.06.2021
Сообщений: 5
20.06.2021, 11:14  [ТС]
Спасибо большое за помощь!

У меня еще один вопрос возник, а как в той же самой функции декодинга правильно обработать например пробел между словами? при условии что между буквами на Морзе ставиться один пробел, а между словами ставиться два пробела.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
20.06.2021, 11:38
Лучший ответ Сообщение было отмечено darksid как решение

Решение

darksid, можно сделать Split по двойному пробелу, а одиночные просто пропускать.
1
Уважайте чужое время
75 / 23 / 8
Регистрация: 01.02.2013
Сообщений: 191
20.06.2021, 11:45
Я бы в таком случае сначала заменил двойные пробелы, скажем, на цифру 2, а потом одиночные пробелы на цифру 1.
Затем дважды прогнал через реплейс.сплит сначала для слов, потом для букв. И после этого получвшийся двумерный массив прогнал во вложенном цикле, как это делал ты.
Вышло бы что-то вроде такого (да простит меня samana за заимствование его кода):
C#
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
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApp1
{
    class Program
    {
        // словарь Морзе-Буква
        public static Dictionary<string, string> MorseToAbc = new Dictionary<string, string>() {
            { ".-", "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"}, { "", " "},
        };
 
        // словарь Буква-Морзе
        public static Dictionary<string, string> AbsToMorse = MorseToAbc.ToDictionary(k => k.Value, v => v.Key);
 
 
        static void Main()
        {
            // какое-то слово (только буквы)
            string hello = "hello world";
 
            // перевели слово в Морзе
            string morse = ToMorse(hello);
            Console.WriteLine(morse);
 
            // перевели из Морзе в слово
            foreach (var word in FromMorse(morse))
            {
                Console.WriteLine(word);
            }
        }
 
        // перевод текста в Морзе
        static string ToMorse(string input)
        {
            input = input.ToUpper();
 
            string[] encoded = new string[input.Length];
 
            for (int i = 0; i < input.Length; i++)
            {
                encoded[i] = AbsToMorse[input[i].ToString()] + " ";
            }
 
            return string.Concat(encoded);
        }
 
        // перевод из Морзе в текст
        static List<string> FromMorse(string input)
        {
            string[] words = input.Replace("  ", "2").Split('2');
            List<string[]> morseInput = new List<string[]>();
            foreach (var word in words)
            {
                morseInput.Add(word.Split());
            }
 
            
            List<string> morseDecoded = new List<string>();
            foreach (var word in morseInput)
            {
                string[] decoded = new string[word.Length];
                
                for (int i = 0; i < word.Length; i++)
                {
                    decoded[i] = MorseToAbc[word[i]];
                }
                morseDecoded.Add(string.Concat(decoded));
            }
 
            return morseDecoded;
        }
    }
}
Подход выглядит некрасиво, но быстро и просто. Даже думать не нужно =)

P.S. Пока пробовал это написать, решил, что можно пробелы через функцию уже поменять, а не через замену.
1
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
20.06.2021, 11:53
Цитата Сообщение от big1991 Посмотреть сообщение
Вышло бы что-то вроде такого (да простит меня samana за заимствование его кода):
big1991, Ну что вы, что вы, я только поддерживаю!!!
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
20.06.2021, 13:05
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public static IDictionary<string, string> MorseCodeDictionary = new Dictionary<string, string>() {
            { ".-", "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"},
        };
        static void Main(string[] args)
        {
            var morzeMessage = ".... . .-.. .-.. ---  .-- --- .-. .-.. -..";
            var encodedMessage = Regex.Replace(morzeMessage, @"[\.-]+ {0,1}", x => MorseCodeDictionary[x.Value.TrimEnd()]);
            Console.WriteLine(encodedMessage);
        }
2
0 / 0 / 0
Регистрация: 20.06.2021
Сообщений: 5
21.06.2021, 15:12  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
можно сделать Split по двойному пробелу, а одиночные просто пропускать.
Если не сложно можно пример кода реализации через Split? Получилось через замену на буквы и путём добавление пробелов в словарь.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
21.06.2021, 16:15
darksid,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string morse = ".... . .-.. .-.. ---  .-- --- .-. .-.. -..";
string decoded = "";
string[] morseWords = morse.Split(new[] {"  "}, StringSplitOptions.None);
foreach (var mWord in morseWords)
{
    if (decoded.Length > 0) decoded += " ";
    foreach (var m in mWord.Split())
    {
        if (m != " ")
        {
            decoded += MorseToLetter[m];
        }
    }
}
2
22.06.2021, 17:38

Не по теме:

Даже обидно как-то, что я сразу ответил на конечный вопрос и выложил полностью рабочий код с учётом требования по двойному пробелу, но был проигнорирован =)

0
22.06.2021, 18:11

Не по теме:

big1991, не расстраивайтесь. На форуме это не редкость.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2021, 18:11
Помогаю со студенческими работами здесь

Написание азбуки морзе
Подскажите.Хочу сделать азбуку морзе , сделал это программу с помощью map. Но нужно сделать с помощью одномерного массива. Не знаю как...

Программа декодирование азбуки Морзе
Помогите пожалуйста написать программу на паскале для декодирования азбуки Морзе !!! Условие: Программа считывает из файла...

Вывод азбуки Морзе на системный динамик
Помогите, пожалуйста!!!! Мне препод задал написать программу вывода на системный динамик азбуку Морзе. Писать надо на асемблере, а у меня...

Перевод из азбуки Морзе в обычный текст
всем добрый вечер. написал программку для перевода из азбуки Морзе в обычный текст. все вроде бы работает, но не знаю как сделать так,...

Вывод азбуки Морзе на системный динамик
.386 .model flat, stdcall option casemap :none ;linclude\masm32\include\w2k\ntstatus.inc ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru