Я думаю, что вы получите больше отзывов о коде, если добавите регистр по умолчанию для переключателя Select Case
.
Select Case s
Case " .-" : morsCodF = morsCodF + " a"
Case "#" : morsCodF = morsCodF + " "
Case Else : morsCodF = morsCodF + " WRONG! "
End Select
Проверьте, работает ли эта строка oddel = j - oddel
как ожидается.
Исходя из имеющейся у вас логики oddel
должно быть количество символов после ранее найденного /
символа.Если это так, то вычисление oddel = j - oddel
выглядит неправильно.
Поскольку вы обновляете i
текущим j
, вычисление должно быть oddel = j - (i -1)
Проверка For
loop.
Поскольку i
обновляется каждый раз с текущим значением j
, код создаст один дополнительный цикл, который выдаст «неправильное» значение.
Другие предложения.
Декодирование азбуки Морзе в текст - это простое отображение одной строки в другую.
В vb.net Dictionary(Of String, String)
может быть хорошим инструментом для этого.
Вам действительно нужен /
символ?Вместо этого вы можете использовать простой пробел в качестве разделителя букв.
Function FromMorse(code As String) As String
Const DELIMETER As Char = " "c
Static Secret As New Dictionary(Of String, String) From
{
{".-", "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"},
{"#", " "}
}
Return code.Split(DELIMETER).
Select(Function(c) Secret(c)).
Aggregate(New StringBuilder(), Function(b, c) b.Append(c)).
ToString()
End Function
Использование
Dim code = ".... . .-.. .-.. --- # .-- --- .-. .-.. -.."
Dim decoded = FromMorse(code)
Console.WriteLine(decoded) ' => "hello world"