解码莫尔斯电码问题

时间:2015-07-20 16:42:21

标签: vb.net

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

  

使用典型的点(。)和短划线( - )作为代码的书面表示,摩尔斯电码中的单词...... --- ..- ....-可能是索菲亚名称的编码或者Eugenia取决于你打破字母的位置:   ... | --- | ..-。| .. | .-索菲亚   。| ..- | - 。|。| - 。| .. | .- 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个符号,匹配符号到字母,发送到temp,将字符串连接成单词,将每个单词输出到列表框

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

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

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

3 个答案:

答案 0 :(得分:5)

  

我已经尝试了#34; For Each"循环," For"循环,写入文本文件和回读,将字符串拆分1到4个字符,选择案例方法以及上面的所有组合我都能想到没有运气。

这就像说"我想准备一顿美味的饭,我尝试过糖,肉,牛奶,盐,燃气灶,电炉,打扫厨房,煎锅,叉子和上面的所有组合,我可以想到没有运气。"

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

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

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

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

  4. 现在您可以开始将算法转换为您选择的编程语言。

  5. 如果您在执行上述任何步骤时遇到问题,我建议您开始一个新问题并专门询问 这一点。别忘了提及你尝试过的方法以及你遇到的困境。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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()