2017-10-21 36 views
1

Lorsque j'exécute ceci dans IDLE et que je tape 0 pour la réponse, il imprime le message mais n'arrête pas le programme. Je pensais que le réglage de keepGoing sur False l'arrêterait mais je ne sais pas ce qui se passe. S'il vous plaît aiderComment arrêter ce programme Python

""" crypto.py 
Implements a simple substitution cypher 
""" 

alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
key = "XPMGTDHLYONZBWEARKJUFSCIQV" 

def main(): 
    keepGoing = True 
    while keepGoing: 
    response = menu() 
    if response == "1": 
     plain = input("text to be encoded: ") 
     print(encode(plain)) 
    elif response == "2": 
     coded = input("code to be decyphered: ") 
     print (decode(coded)) 
    elif response == "0": 
     print ("Thanks for doing secret spy stuff with me.") 
     keepGoing = False 
    else: 
     print ("I don't know what you want to do...") 
    return main() 

def menu(): 
    print("Secret decoder menu") 
    print("0) Quit") 
    print("1) Encode") 
    print("2) Decode") 
    print("What do you want to do?") 
    response = input() 
    return response 

def encode(plain): 
    plain = plain.upper() 
    new = "" 
    for i in range(len(plain)): 
     y = alpha.index(plain[i]) 
     new += key[y] 
    return new 

def decode(coded): 
    coded = coded.upper() 
    x = "" 
    for i in range(len(coded)): 
     z = key.index(coded[i]) 
     x += alpha[z] 
    return x 

main() 
+0

Essayez d'augmenter une erreur de valeur ou en utilisant une instruction break. – mikey

Répondre

-1

Vous appelez principal() à nouveau, avant de quitter la boucle while, et le redémarrage du programme:

def main(): 
    keepGoing = True 
    while keepGoing: 
     response = menu() 
     if response == "1": 
      plain = input("text to be encoded: ") 
      print(encode(plain)) 
     elif response == "2": 
      coded = input("code to be decyphered: ") 
      print (decode(coded)) 
     elif response == "0": 
      print ("Thanks for doing secret spy stuff with me.") 
      keepGoing = False 
     else: 
      print ("I don't know what you want to do...") 
#  return main() # <-- delete this line 

Une meilleure conception, comme l'a suggéré @Barmar, est d'utiliser un while True boucle, et une déclaration break pour sortir après avoir atteint une certaine condition:

def main(): 
    while True: 
     response = menu() 
     if response == "1": 
      plain = input("text to be encoded: ") 
      print(encode(plain)) 
     elif response == "2": 
      coded = input("code to be decyphered: ") 
      print (decode(coded)) 
     elif response == "0": 
      print ("Thanks for doing secret spy stuff with me.") 
      break 
     else: 
      print ("I don't know what you want to do...") 
+0

En fait, il l'appelle AVANT de répéter la boucle 'while'. – Barmar

+0

Oui, je viens de le remarquer, je me suis fait avoir par le retrait de 2 espaces. Merci. –

+0

Aussi un simple 'return' mettrait fin au programme lorsque la récursivité est supprimée. Pas besoin de 'keepGoing'. –