Vb.net 莫尔斯电码解码问题

Vb.net 莫尔斯电码解码问题,vb.net,Vb.net,我已经为如何完成这项任务苦苦挣扎了很长一段时间,我决定需要一些帮助。我必须将摩尔斯电码转换成英语,并将所有可能的翻译输出到列表框(甚至是胡言乱语)。 搜索已经找到了许多不同的线程,但没有任何用处,因为它们要么不是这种语言,要么是过时的(VB6)代码。 转让声明如下: 使用典型的点(.)和破折号(-)作为电码的书面表示形式,摩尔斯电码中的单词…--…--…-可能是索菲亚或尤金妮亚的编码,具体取决于字母的拆分位置: 索菲亚 欧金妮亚 管道的位置只是为了显示管柱是如何断裂的 我尝试过“For Each

我已经为如何完成这项任务苦苦挣扎了很长一段时间,我决定需要一些帮助。我必须将摩尔斯电码转换成英语,并将所有可能的翻译输出到列表框(甚至是胡言乱语)。 搜索已经找到了许多不同的线程,但没有任何用处,因为它们要么不是这种语言,要么是过时的(VB6)代码。 转让声明如下:

使用典型的点(.)和破折号(-)作为电码的书面表示形式,摩尔斯电码中的单词…--…--…-可能是索菲亚或尤金妮亚的编码,具体取决于字母的拆分位置: 索菲亚 欧金妮亚

管道的位置只是为了显示管柱是如何断裂的

我尝试过“For Each”循环、“For”循环、写入文本文件并读回、将字符串拆分为1到4个字符、选择大小写方法以及上述所有组合,但运气不佳。 我的For循环会产生一组26个单词,但没有单词,只有一系列空格,然后是一个字母26次,然后是该字母两次26次,依此类推。 文本文件和将字符串拆分为一个或两个字符会导致输出为E、A或T,每一行都乘以字符串中的迭代次数,如果字符串未平均拆分,则将字符串拆分为三个或四个字符会导致相同或索引自动转换错误。 我回到了我编写的最接近实际工作的代码,但是输出结果仍然是英语字母表被输出

这一次我使用的是Linq查询,如果您能帮我弄清楚如何正确地遍历字符串以完成作业要求的操作,我将不胜感激

以下是我迄今为止的代码:

Imports System.IO
Imports System.Text

Public Class Form1

    Dim MorseCode() = File.ReadAllLines("MorseCode2.txt")

    Private Sub input_TextChanged(sender As Object, e As EventArgs) Handles input.TextChanged

    End Sub

    Private Sub output_SelectedIndexChanged(sender As Object, e As EventArgs) Handles output.SelectedIndexChanged

    End Sub

    Private Sub help_Click(sender As Object, e As EventArgs) Handles help.Click

        'Displays the Morse Code and English letter equivalents
        Process.Start("MorseCode.txt")

    End Sub

    Private Sub translate_Click(sender As Object, e As EventArgs) Handles translate.Click

        Dim userText As String = input.Text
        Dim temp As String
        Dim word As String

        'Search the users entry for possible translations
        Dim query = From line In MorseCode
                    Let data = line.split(","c)
                    Let engLtr = data(0)
                    Let code = data(1)
                    Select engLtr, code

        For Each code In query
            If userText.Contains(code.code) Then
                temp = code.engLtr
                word = String.Concat(temp + temp)
                output.Items.Add(word)
            End If
        Next

    End Sub

End Class
我很确定我的错误在.Concat调用中,但我尝试过的任何方法都无法解决问题

谢谢你能给我的任何建议

编辑以添加伪代码:

1-读取输入字符串

2-将字符串拆分为单独的元素,每个元素1个符号,将符号与字母匹配,发送到temp,将字符串转换为单词,将每个单词输出到列表框

3-重新读取字符串,将其分成两个符号“…”

4-“…”各三个符号“…”

5-“…”每个符号四个“…”

我尝试过“For Each”循环、“For”循环、写入文本文件并读回、将字符串拆分为1到4个字符、选择大小写方法以及上述所有组合,但运气不佳

这就好比说:“我想准备一顿美味的饭菜,我试过糖、肉、牛奶、盐、煤气炉、电炉、厨房清洁、煎锅、叉子以及我想不到的所有这些组合。”

你明显缺少的是一个食谱。用计算机科学的术语来说,这是一种算法。我建议您执行以下操作:

  • 离开电脑。拿一张纸和一支铅笔

  • 试着用手解决这个问题。以
    为例,尝试找出所有可能的含义

  • 完成后,想想你是如何解决问题的。你做了什么来确保你不会错过任何可能的意义?试着用简单的英语写下你采取的步骤。这就是你的算法

  • 现在,您可以开始将算法转换为所选的编程语言


  • 如果您在这些步骤中遇到任何问题,我建议您开始一个新问题,并具体询问这一点。别忘了提及你尝试过的方法以及你的困境。

    我[在这里]得到了答案,并且能够将这个想法落实到我自己的计划中。谢谢所有帮助过我的人

    他们在教VB?真恶心。至于赋值,它是返回可枚举字符串的方法中的尾部递归。收益率报表将使这一点非常清晰。“查找与字符串开头匹配的所有字符。对于每个字符,再次调用相同的方法并传入剩余的字符串,然后将每个返回的结果与此字符连接起来,并将其传递给直接调用方。”就这么简单。@一些学校还会教cobol吗?那又怎样?你应该删除你的第一句话……@如果他们教C#或Java,会不会“更酷”因为这些语言与VB.Net非常相似。关于伪代码:这将为您提供
    。|.|.|.|-|-|-|-|等
    。|-|-|-|等
    ,但
    。|-|-|等
    ,这就是问题所在,我试图在每个子字符串方法中使用If语句来获得所有可能的字符串组合,但它要么将我放入infinte循环中,要么使应用程序完全崩溃。纸是一回事,我不会像这段代码那样崩溃或抛出异常错误。我通过substring方法分割字符串,类似于for循环中的“I=0 to userInput.substring(0,2)步骤2”,但这不起作用。我在一个点上使用了四个if语句,用莫尔斯等效于英文字母的可能长度来分割字符串。所以,现在我回到上面的代码,它可以识别每一组代码字符并输出相关的字母,只是不通过迭代字符串来生成单词。这就是我被困的地方,这就是我要问的。我不认为对同一材料单独提问对任何方面都有好处,但是我很感激你的回答。@Stryke_the_Orc:我明白了。那么,让我们从您的算法开始。你能把它添加到你的问题中吗(用普通的伪代码)?然后我们可以检查一下,看看是否正确。如果不是,那么所有将其放入代码中的尝试都是徒劳的。除了递归(在本例中,它将是大量的)之外,我将进行检查以确保它是一个有效的字符,因为不是所有的字符都是有效的
    Lang = {}
    Concealer = {}
    Reveal = {}
    bottle = []
    Mess1 = []
    Mess2 = []
    
    with open('69_Morse.txt', 'r') as translate:
        for line in translate:
            L, M = line.split()
            Lang[M] = L
    
    secret = open('SECRET.txt', 'r')
    glasses = secret.read()
    bottle = (glasses.replace("\n", " \n ")).split(" ")
    secret.close()
    
    for i in range(0, len(bottle)):
        if bottle[i] in Lang:
            Mess1.append(Lang[bottle[i]])
        if bottle[i] == "\n":
            Mess1.append(bottle[i])
    
    for i in range(0, len(Mess1)):
        if Mess1[i] in Reveal:
            Mess2.append(Reveal[Mess1[i]])
        else:
            Mess2.append(Mess1[i])
    Final = ("".join(Mess2))
    
    with open("CodeBook.txt", 'r') as rosetta:
        for line in rosetta:
            a, b = line.split()
            Concealer[a] = b
            c, d = line.split()
            Reveal[d] = c
    
    f = open('69_MSG.txt', 'w')
    f.write(Final)
    f.close()
    
    
    #Second file of code
    
    import numpy as np
    np.random.seed(20201123)
    
    RandNumb = []
    Code = []
    RandLet = []
    
    AlphaNum = {1: }
    
    while len(RandNumb) != 26:
        val = np.random.randint(1,27)
        if val not in RandNumb:
        RandNumb.append(val)
    for i in range(0, len(RandNumb)):
        RandLet.append(AlphaNum[RandNumb[i]])
    
    with open("MorseCode.txt", 'r') as Morse:
        for line in Morse:
            line = line.strip('\n')
            Code.append(line[2:])
    
    
    
    f = open('69_Morse.txt', 'w')
    
    for i in range(0, len(RandLet)):
        f.write(RandLet[i] + " " + Code[i] + "\n")
    
    f.close()