8
votes

Permettant plusieurs caractères dans le convertisseur de code morse

Je fais un programme qui prend les entrées et les convient au code morse sous la forme de bips informatiques, mais je ne peux pas comprendre comment le faire, afin que je puisse mettre plus d'une lettre dans l'entrée sans obtenir une erreur .

Voici mon code: P>

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)


2 commentaires

+1 pour déjà utiliser un dictionnaire et pour avoir un problème amusant à résoudre. Je n'ai jamais pensé à faire un convertisseur de codes morse ... FWIW, si vous souhaitez gérer des phrases, vous devrez probablement ajouter une entrée pour espace dans votre dictionnaire.


Ouais j'ai aussi réparé ça, merci!


5 Réponses :


2
votes

Essayez de changer de boucle à quelque chose comme ceci:

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)


3 commentaires

On dirait qu'il devrait y avoir une façon de sortir de cette boucle infinie ... mais je suppose que cela va simplement convertir un message après le message après le message. (Ne sais jamais quand vous voulez savoir ce que quelque chose sonne comme dans le code Morse)


@MGILSON Je conviens qu'il devrait y avoir un moyen de casser, je viens de comprendre que je resterais fidèle au code de l'OP.


C'est vrai que je vais résoudre ce problème, merci de pointer cela!



1
votes

Ajoutez simplement un supplément pour boucle et boucle à travers les caractères de votre entrée pour obtenir le message! Mais n'oubliez pas de mettre fin à votre boucle lorsque cela est nécessaire!

Dans le code suivant, je l'ai fait de telle que, après le décodé, il vous demande si vous souhaitez en envoyer un autre, si vous tapez "n" Ça cessera La boucle! xxx

Vous avez toujours un problème ... vous n'avez pas comptabilisé des espaces !! Donc, vous pouvez toujours envoyer des mots! Si je suis correct, un espace entre les mots est un silence chronométré fixe dans le code Morse, alors ce que je dirais que vous devriez faire est d'ajouter: xxx

de cette façon, cela ne reviendra pas Une erreur lorsque vous essayez de trouver l'instance de l'espace et qu'il s'exécutera dans votre relevé el. / code> et ajoutez un supplément .4 secondes avant le mot suivant!


3 commentaires

Il y avait une typo, X devrait-il s'agir d'une chaîne: "x" et oui, vous devriez ajouter ça!


Merci beaucoup pour l'aide!!


Bien sûr, assurez-vous de terminer votre boucle comme je l'ai fait dans le code, ou le message ira éternellement



1
votes

Je pense que vous devez itérer sur les lettres en entrée.

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


0 commentaires

1
votes

Remplacez cette ligne: xxx

avec cette ligne: xxx

qui prend chaque personnage dans votre chaîne d'entrée, lève les yeux sur la morse équivalent et concaténe les résultats avec un séparateur d'espace (en supposant que vous souhaitiez que 10,4 supplémentaires retardent entre les lettres).


2 commentaires

Si je fais que ça continue de boucler la même phrase


Ça marche pour moi. J'ai pris le code d'origine que vous avez posté et remplacé juste cette ligne. Aviez-vous peut-être modifié quelque chose d'autre aussi?



0
votes

Essayez une première boucle lorsque le message a trois espaces vides à la fin pour la fin de la boucle. Ou caractère A / N. Sa seule une idée. Désolé pour mon mauvais anglais.


0 commentaires