2013-05-03 7 views
8

Robię program, który pobiera dane wejściowe i przenosi je do kodu Morse'a w postaci sygnałów dźwiękowych komputera, ale nie mogę wymyślić, jak to zrobić, abym mógł umieścić więcej niż jedną literę na wejściu bez otrzymania błędu.Umożliwienie wielu znaków w konwerterze kodu Morse'a

Oto mój kod:

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) 

Teraz trwa jedną literę na raz, ale chcę go do podjęcia zwrotów.

+4

+1 za korzystanie ze słownika i problem z zabawą do rozwiązania. Nigdy nie myślałem o zrobieniu konwertera kodu Morse'a ... FWIW, jeśli chcesz poradzić sobie z frazami, prawdopodobnie będziesz musiał dodać wpis dotyczący spacji również w twoim słowniku. – mgilson

+0

tak też naprawiłem to dziękuję! – Serial

Odpowiedz

1

po prostu dodaj dodatkową pętlę for i przejrzyj znaki w danych wejściowych, aby otrzymać wiadomość! Ale nie zapomnij zakończyć pętli, kiedy to konieczne!

W poniższym kodzie ustawiłem go tak, że po odkodowaniu wiadomości, zapyta, czy chcesz wysłać drugą, jeśli wpiszesz "n", to zamknie pętlę!

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 

teraz nadal masz jeden problem ... nie uwzględniłeś spacji !! Nadal możesz wysyłać tylko słowa! Jeśli się nie mylę, przestrzeń między słowami jest stałe czasowe cisza w kodzie Morse'a, więc to, co chciałbym powiedzieć należy zrobić, to dodać:

" ": 'x' 

w ten sposób, że nie zwróci błąd, gdy próbuje znaleźć instancję przestrzeni i będzie działał w twoim oświadczeniu else i doda dodatkowe 0,4 sekundy przed następnym słowem!

+0

, więc powinienem dodać "": x do mojego słownika?poprawny – Serial

+0

był literówka, x powinien być ciągiem: '" x "' i tak, powinieneś to dodać! –

+0

Bardzo dziękuję za pomoc !! – Serial

2

Spróbuj zmienić swoją pętlę na coś takiego:

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) 

ten sposób iteracyjne ciągu znaków pierwszy na wejściu, a następnie spojrzeć na postać w morseDict i iteracyjne nad wartością morseDict[char].

+1

Wygląda na to, że powinien istnieć jakiś sposób na wyjście z tej nieskończonej pętli ... Ale myślę, że to po prostu konwertuje wiadomość po wiadomości po wiadomości. (nigdy nie wiesz, kiedy chcesz wiedzieć, jak brzmi coś w alfabecie Morse'a). – mgilson

+0

@mgilson Zgadzam się, że powinien być sposób na złamanie, po prostu pomyślałem, że pozostanę wierny kodowi op. –

+0

To prawda, naprawię to w moim programie, dziękuję za wskazanie tego! – Serial

1

Uważam, że trzeba powtórzyć litery na wejściu.

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

Wymień ten wiersz:

a = morseDict[inp] 

z tej linii:

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

To wymaga każdy znak w ciągu wejściowego, patrzy równowartość Morse'a, a Łączy wyników wraz z separator przestrzeni (zakładając, że chcesz dodatkowe 0,4 sekundy opóźnienia między literami).

+0

jeśli to zrobię, to po prostu zapętla to samo zdanie – Serial

+0

To działa dla mnie. Wziąłem oryginalny opublikowany kod i zastąpiłem tylko jedną linię. Czy mógłbyś też zmodyfikować coś innego? –

+0

tak, zmieniłem kod do tego, co Ryan Saxe opublikował powyżej – Serial

0

Wypróbuj pierwszą pętlę, gdy wiadomość ma trzy wolne miejsca na końcu, aby zakończyć pętlę. Lub znak/n. To tylko pomysł. Przepraszam za mój zły angielski.

Powiązane problemy