2013-05-03 130 views
8

我正在做一个程序,需要输入并将其转换为莫尔斯电码形式的蜂鸣声,但我无法弄清楚如何制作它,所以我可以把多个字母在输入时不会出现错误。允许多个字符在莫尔斯电码转换器

这里是我的代码:

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) 

眼下它需要一个字母在同一时间,但我希望它采取的短语。

+4

+1已经使用字典,并有一个有趣的问题来解决。我从来没有想过要制作一个莫尔斯电码转换器...... FWIW,如果你想处理短语,你可能还需要在字典中添加一个空格。 – mgilson 2013-05-03 01:14:53

+0

是的,我也修好了,谢谢你! – Serial 2013-05-03 01:16:42

回答

1

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

在下面的代码中,我解释了消息被解码之后,它会询问您是否要发送另一个消息,如果输入“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声明中,并在下一个词之前增加一个额外的.4秒!

+0

所以我应该添加“”:x到我的字典?正确 – Serial 2013-05-03 01:15:24

+0

有一个错字,x应该是一个字符串:'“x”'是的,你应该补充一点! – 2013-05-03 01:16:22

+0

非常感谢您的帮助! – Serial 2013-05-03 01:17:16

2

试着改变你的循环,这样的事情:

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]值。

+1

这似乎应该有某种方式来打破这个无限循环...但是,我想这将只是消息后消息后转换消息。 (永远不知道你什么时候想知道摩尔斯电码中听起来像什么) – mgilson 2013-05-03 01:17:53

+0

@mgilson我同意应该有办法打破,我只是想我会保持真实的op代码。 – 2013-05-03 01:18:39

+0

这是事实,我会解决在我的程序感谢指出! – Serial 2013-05-03 01:20:47

1

我相信你需要迭代输入中的字母。

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 
1

替换此行:

a = morseDict[inp] 

这一行:

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

拍摄每一个字符在你输入字符串,查找莫尔斯当量,结果连同串接一个空格分隔符(假设你想在字母之间多出0.4秒的延迟)。

+0

如果我这样做,它只是保持循环相同的短语 – Serial 2013-05-03 01:27:58

+0

它适用于我。我采用了您发布的原始代码,并替换了这一行。你有没有修改别的东西? – 2013-05-03 03:24:30

+0

是的,我改变了我的代码,以什么瑞安萨克斯张贴上面 – Serial 2013-05-03 03:41:22

0

尝试第一个循环,同时消息最后有三个空白空间用于结束循环。或一个/ n字符。它只是一个想法。对不起,我的英语不好。