【问题标题】:Allowing multiple characters in morse code converter在莫尔斯电码转换器中允许多个字符
【发布时间】:2013-04-27 08:03:15
【问题描述】:

我正在制作一个程序,它接受输入并将其转换为计算机哔哔声形式的摩尔斯电码,但我不知道如何制作它,因此我可以在输入中输入多个字母而不会出错.

这是我的代码:

import winsound
import time

morseDict = {
'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': '--..'
}
while True: 
    inp = raw_input("Message: ")
    a = morseDict[inp] 
    morseStr =  a
    for c in morseStr:
        print c
        if c == '-':
            winsound.Beep(800, 500)
        elif c == '.':
            winsound.Beep(800, 100)
        else:
            time.sleep(0.4)  
        time.sleep(0.2)

现在一次只需要一个字母,但我希望它带短语。

【问题讨论】:

  • +1 表示已经在使用字典并且有一个有趣的问题要解决。我从来没有想过要制作一个莫尔斯电码转换器……FWIW,如果你想处理短语,你可能还需要在字典中添加一个空格条目。
  • 是的,我也解决了,谢谢!

标签: python dictionary morse-code


【解决方案1】:

试着把你的循环改成这样:

while True:
    inp = raw_input("Message: ")
    for char in inp:
        for x in morseDict[char]:
            print x
            if x == "-":
                winsound.Beep(800, 500)
            elif x == ".":
                winsound.Beep(800, 100)
            else:
                time.sleep(0.4)
            time.sleep(0.2)

这样您首先迭代输入中的字符,然后查找morseDict 中的字符并迭代morseDict[char] 的值。

【讨论】:

  • 似乎应该有一些方法可以打破这个无限循环......但是,我想这只会在一个又一个消息之后转换消息。 (永远不知道什么时候你想知道摩尔斯电码的发音)
  • @mgilson 我同意应该有办法打破,我只是想我会忠于 op 的代码。
  • 这是真的,我会在我的程序中解决这个问题,感谢您指出这一点!
【解决方案2】:

只需添加一个额外的 for 循环并遍历输入中的字符即可获取消息!但不要忘记在必要时结束循环!

在下面的代码中,我将消息解码后询问您是否要发送另一个,如果您输入“n”,它将退出循环!

going = True
while going: 
    inp = raw_input("Message: ")
    for i in inp:
        a = morseDict[i] 
        morseStr =  a
        for c in morseStr:
            print c
            if c == '-':
                winsound.Beep(800, 500)
            elif c == '.':
                winsound.Beep(800, 100)
            else:
                time.sleep(0.4)  
            time.sleep(0.2)
    again = raw_input("would you like to send another message? (y)/(n) ")
    if again.lower() == "n":
         going = False

现在你还有一个问题……你没有考虑空格!!所以你仍然只能发送文字!如果我是正确的,单词之间的空格是摩尔斯电码中的固定定时静音,所以我想说你应该做的是添加:

" ": 'x'

这样它在尝试查找空间实例时不会返回错误,它会在您的 else 语句中运行,并在下一个单词之前添加额外的 0.4 秒!

【讨论】:

  • 有一个错字,x 应该是一个字符串:"x" 是的,你应该添加它!
  • 非常感谢您的帮助!!
  • 当然,请确保您也像我在代码中所做的那样结束了循环,否则消息将永远消失
【解决方案3】:

我相信您需要遍历输入中的字母。

while True: 
    inp = raw_input("Message: ")
    for letter in inp:          # <- Edit in this line
        a = morseDict[letter]   # <- and this one, rest have increased indent
        morseStr =  a
        for c in morseStr:
            print c
            if c == '-':
                winsound.Beep(800, 500)
            elif c == '.':
                winsound.Beep(800, 100)
            else:
                time.sleep(0.4)  
            time.sleep(0.2)
        time.sleep(0.4)        # Or desired time between letters

【讨论】:

    【解决方案4】:

    替换这一行:

    a = morseDict[inp]
    

    用这一行:

    a = ' '.join([morseDict[c] for c in inp])
    

    获取输入字符串中的每个字符,查找莫尔斯等效值,然后将结果与空格分隔符连接起来(假设您希望字母之间有 0.4 秒的额外延迟)。

    【讨论】:

    • 如果我这样做,它只会不断循环相同的短语
    • 它对我有用。我采用了您发布的原始代码并仅替换了那一行。您是否也修改了其他内容?
    【解决方案5】:

    在消息末尾有三个空格时尝试第一个循环以结束循环。或 /n 字符。它只是一个想法。对不起我的英语不好。

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多