【问题标题】:Decoding Morse Code problems解码莫尔斯电码问题
【发布时间】:2015-07-20 16:42:20
【问题描述】:

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

使用典型的点 (.) 和破折号 (-) 作为代码的书面表示,摩尔斯电码中的单词 ...----..-..- 可能是名称 Sofia 的编码或 Eugenia,具体取决于您将字母分解的位置: ...|---|..-.|..|.- 索非亚 .|..-|--.|.|-.|..|.- 尤金妮亚

管道只是为了显示字符串是如何分解的。

我尝试过“For Each”循环、“For”循环、写入文本文件和回读、将字符串拆分为 1 到 4 个字符、Select Case 方法以及我能想到的上述所有组合,但没有运气. 我的 For 循环会生成 26 组所有内容,但没有单词,只有一系列空格,然后是一个字母 26 次,然后是那个字母两次 26 次,依此类推。 文本文件和将字符串分割为一个或两个字符会导致 E、A 或 T 用于输出,每个在其自己的行上乘以字符串中的迭代次数,并将字符串分割为三个或四个字符的结果相同或如果字符串不均分,则会出现 IndexOutOfRange 错误。 我已经回到我编写的代码最接近实际工作的地方,但输出仍然只输出英文字母。

这次我使用的是 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 个符号,将符号匹配到字母,发送到临时,将字符串连接成单词,将每个单词输出到列表框

3 - 重新读取字符串分成两个符号,每个“...”

4 - “...”三个符号,每个“...”

5 - “...”四个符号,每个“...”

【问题讨论】:

  • 哎呀,他们在教VB?总的。至于赋值,它是一个返回可枚举字符串的方法中的尾递归。收益声明将使这非常干净。 “查找与字符串开头匹配的所有字符。对于每个字符,再次调用相同的方法并传入剩余的字符串,然后将每个返回的结果与该字符连接起来,并将其交给直接调用者。”就这么简单。
  • @一些学校还会教cobol吗?你应该删除你的第一句话....
  • @Will 如果他们教 C# 或 Java,会不会“更酷”? '因为这些语言与 VB.Net 非常相似。
  • 关于你的伪代码:这会给你.|.|.|-|-|-|etc..|.-|--|etc,但是..|.|---|etc呢?
  • 这就是问题所在,我尝试将 If 语句与每个子字符串方法一起使用来获取所有可能的字符串组合,但它要么让我陷入无限循环,要么只是让应用程序完全崩溃。

标签: vb.net


【解决方案1】:

我尝试过“For Each”循环、“For”循环、写入文本文件和回读、将字符串拆分为 1 到 4 个字符、Select Case 方法以及我能想到的上述所有组合,但没有运气.

这就像在说“我想准备一顿美味的饭菜,我试过糖、肉、牛奶、盐、煤气炉、电炉、打扫厨房、煎锅、叉子等等上面的组合我可以想到没有运气。”

您显然缺少的是食谱。在计算机科学术语中,这是一种算法。我建议您执行以下操作:

  1. 远离计算机。拿一张纸和一支铅笔。

  2. 尝试手动解决问题。以...---..-....-为例,尝试找出所有可能的含义。

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

  4. 现在您可以开始将您的算法翻译成您选择的编程语言。

如果您在执行上述任何步骤时遇到问题,我建议您提出一个新问题并具体地询问这一点。不要忘记提及您尝试过的方法以及遇到的问题。

【讨论】:

  • 好的,我卡住的地方是通过正确的输入莫尔斯电码进行迭代。纸是一回事,我不会像这段代码那样崩溃或抛出异常错误。我通过 substring 方法拆分字符串,类似于我的 for 循环中的“i = 0 to userInput.Substring(0,2) step 2”,但这不起作用。我有四个在 if 语句中,以将字符串按莫尔斯等效英文字母的可能长度分割。
  • 所以,现在我回到上面的代码,它确实识别每组代码字符并输出相关的字母,只是不会遍历字符串来生成单词。这就是我卡住的地方,这就是我问的。我不认为针对相同的材料提出单独的问题有任何好处,但是我非常感谢您的回答。
  • @Stryke_the_Orc:我明白了。那么,让我们从您的算法开始。您可以将其添加到您的问题中(以纯伪代码)吗?然后我们可以检查它,看看它是否正确。如果不是,所有将其放入代码中的尝试都是徒劳的。
  • 随着递归(在这种情况下将是巨大的),我会进行检查以确保它是有效字符,因为并非所有组合都是有效的,它可以帮助您减少一些递归。
【解决方案2】:

[这里]给了我一个答案,并且能够将这个想法实施到我自己的程序中。感谢所有帮助过我的人!1

【讨论】:

    【解决方案3】:
    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()
    

    【讨论】:

    • 请考虑添加对您提供的代码的解释。对更改的简要描述(如果这是对 OP 代码的修改)或说明它有何不同。
    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2015-09-03
    相关资源
    最近更新 更多