Vb.net 莫尔斯电码解码问题
我已经为如何完成这项任务苦苦挣扎了很长一段时间,我决定需要一些帮助。我必须将摩尔斯电码转换成英语,并将所有可能的翻译输出到列表框(甚至是胡言乱语)。 搜索已经找到了许多不同的线程,但没有任何用处,因为它们要么不是这种语言,要么是过时的(VB6)代码。 转让声明如下: 使用典型的点(.)和破折号(-)作为电码的书面表示形式,摩尔斯电码中的单词…--…--…-可能是索菲亚或尤金妮亚的编码,具体取决于字母的拆分位置: 索菲亚 欧金妮亚 管道的位置只是为了显示管柱是如何断裂的 我尝试过“For Each”循环、“For”循环、写入文本文件并读回、将字符串拆分为1到4个字符、选择大小写方法以及上述所有组合,但运气不佳。 我的For循环会产生一组26个单词,但没有单词,只有一系列空格,然后是一个字母26次,然后是该字母两次26次,依此类推。 文本文件和将字符串拆分为一个或两个字符会导致输出为E、A或T,每一行都乘以字符串中的迭代次数,如果字符串未平均拆分,则将字符串拆分为三个或四个字符会导致相同或索引自动转换错误。 我回到了我编写的最接近实际工作的代码,但是输出结果仍然是英语字母表被输出 这一次我使用的是Linq查询,如果您能帮我弄清楚如何正确地遍历字符串以完成作业要求的操作,我将不胜感激 以下是我迄今为止的代码:Vb.net 莫尔斯电码解码问题,vb.net,Vb.net,我已经为如何完成这项任务苦苦挣扎了很长一段时间,我决定需要一些帮助。我必须将摩尔斯电码转换成英语,并将所有可能的翻译输出到列表框(甚至是胡言乱语)。 搜索已经找到了许多不同的线程,但没有任何用处,因为它们要么不是这种语言,要么是过时的(VB6)代码。 转让声明如下: 使用典型的点(.)和破折号(-)作为电码的书面表示形式,摩尔斯电码中的单词…--…--…-可能是索菲亚或尤金妮亚的编码,具体取决于字母的拆分位置: 索菲亚 欧金妮亚 管道的位置只是为了显示管柱是如何断裂的 我尝试过“For Each
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()