2013-05-03 4 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) 

それは、一度に1つの文字を取りますが、私はそれがフレーズをしたい:

は、ここに私のコードです。

+4

+1はすでに辞書を使用しており、楽しい問題を解決するためです。私はモールスコードコンバータを作ることについて決して考えなかった... FWIW、もしあなたがフレーズを扱いたいのであれば、おそらくあなたの辞書のスペースのためのエントリーを追加する必要があるだろう。 – mgilson

+0

ええ、私もそれはあなたに感謝した固定! – Serial

答えて

1

メッセージを取得するために、余分な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 

今のところあなたには1つの問題があります...あなたはスペースを占めていません!あなたはまだ単語を送ることができます!私が正しいだ場合は、単語間のスペースは、モールス信号で固定タイミング沈黙があるので、私はあなたがすべきだと思いますして追加することです:

" ": 'x' 

インスタンスを検索しようとしたとき、それはエラーを返しません。この方法をあなたのelseステートメントで実行され、次の単語の前に余分な.4秒を追加します!

+0

"":xを辞書に追加する必要がありますか?正しい – Serial

+0

タイプミスがありました。xは文字列でなければなりません: '' x "'そしてそれを追加してください! –

+0

ありがとうございました! – Serial

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

+0

@mgilson私は休憩する方法があるはずですが、私はopのコードに真実を残していると思っています。 –

+0

それは本当です私はそれを指摘してくれてありがとう私のプログラムに修正されます! – Serial

1

私はあなたが入力中の文字を反復処理する必要があると信じています。このラインで

a = morseDict[inp] 

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 = ' '.join([morseDict[c] for c in inp]) 

スペース区切り文字(文字の間に余分な0.4秒の遅延があることを前提とします)。

+0

もし私が同じフレーズをループし続けるとすれば – Serial

+0

私にとってはうまくいきます。あなたが投稿した元のコードを取り出し、その1行だけを置き換えました。あなたはおそらく他のものを変更したでしょうか? –

+0

ええ、上の投稿ryan saxeに私のコードを変更しました – Serial

0

メッセージにループを終了するために最後に3つの空白がある間に最初のループを試してください。または/ n文字。唯一のアイデアです。私の悪い英語のために申し訳ありません。