2013-05-03 252 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字符。它只是一個想法。對不起,我的英語不好。