2013-01-01 3 views
0

Voici mon code:Qu'est-ce qui est incorrect avec ma boucle infinie?

#!/usr/bin/env python 

encodec = { 
    'a':22 , 'b':24 , 'c':26 , 'd':28 , 'e':12 , 'f':14 , 'g': 16 , 'h':18 , 'i':32 , 'j':34 , 'k':36 , 'l':38 , 'm':42 , 'n':44 , 'o':46 , 'p':48 , 'q':50 , 'r':52 , 's':54 , 't':56 , 'u':58 , 'v': 62 , 'w':64 , 'x':66, 'y': 68 , 'z':72 , ' ':74 , '.':76 , ',':78 , "'":82 , '?':84 , '"':86 
} 
decodec = { 
    22:'a' , 24:'b' , 26:'c' , 28:'d' , 12:'e' , 14:'f' , 16:'g' , 18:'h' , 32:'i' , 34:'j' , 36:'k' , 38:'l' , 42:'m' , 44:'n' , 46:'o' , 48:'p' , 50:'q' , 52:'r' , 54:'s' , 56:'t' , 58:'u' , 62:'v' , 64:'w' , 66:'x', 68:'y' , 72:'z' , 74:' ' , 76:"." , 78:',' , 82:"'" , 84:'?' , 86:'"' 
} 
option = raw_input("Would you like to 'encode' or 'decode' a word? ") 
while option.lower() not in ('encode' , 'decode'): 
    option = raw_input("Please enter a valid response ('encode' or 'decode'): ") 

if option.lower() == 'encode': 
    word = raw_input("Enter a string to be encoded: ").lower() 
    length = len(word) 
    z = 1 
    result = [] 
    while z < length+1: 
     a = word[z-1] 
     result += str(encodec[a]) 
     z = z + 1 
    print int(''.join(result)) 


elif option.lower() == 'decode': 
    num = (raw_input("Enter your text to be decoded: ")) 
    length = len(num) 
    z = 1 
    result = [] 
    while z < length+1: 
     a = num[z-1:z+1] 
     result += str(decodec[int(a)]) 
     z = z + 1 
    print ''.join(result) 

Ceci est l'extrait qui ne fonctionnera pas tout à fait:

elif option.lower() == 'decode': 
    num = (raw_input("Enter your text to be decoded: ")) 
    length = len(num) 
    z = 1 
    result = [] 
    while z < length+1: 
     a = num[z-1:z+1] 
     result += str(decodec[int(a)]) 
     z = z + 1 
    print ''.join(result)  

Je ne comprends pas pourquoi cette boucle continue à boucle. Le conditionnel de la boucle est que tandis que la valeur de la variable z est inférieure à la valeur de la longueur, continuer la boucle. La longueur n'augmente pas dans la boucle, et j'ajoute une ligne dans la boucle qui ajoute 1 à z à chaque itération. Pour une raison quelconque, cependant, il continue à boucle infiniment. Je ne comprends pas pourquoi?

+0

sont les accolades "()" entourant le dernier raw_input prévu? Parce qu'ils vont transformer l'entrée en un tuple au lieu d'une chaîne. –

+3

@ManishMulani: Non, ils ne le feront pas. Vous auriez besoin d'une virgule pour ça. –

+5

Vous n'utilisez pas le code que vous pensez être. Utilisez la première règle de débogage: En cas de doute, Imprimez plus. Ajoutez des instructions d'impression, par exemple, pour voir ce qu'il se passe. –

Répondre

1

Ce code fonctionne-t-il pour vous?

elif option.lower() == 'decode': 
    num = (raw_input("Enter your text to be decoded: ")) 
    result = '' 
    index = 0 
    while index < len(num) -1: 
     result += decodec[int(num[index:index +2])] 
     index += 2 
    print result 

Si je mets l'entrée comme 222426, la sortie est abc

6

On dirait une utilisation irrégulière des espaces pour moi. Essayez d'exécuter votre code à l'aide

python -tt your_program_name.py 

pour le confirmer. Si je regarde le code brut que vous avez posté, le premier extrait ressemble à ceci:

" elif option.lower() == 'decode':\n", 
' \tnum = (raw_input("Enter your text to be decoded: "))\n', 
' \tlength = len(num)\n', 
' \tz = 1\n', 
' \tresult = []\n', 
' \twhile z < length+1:\n', 
' \t\ta = num[z-1:z+1]\n', 
' \t\tresult += str(decodec[int(a)])\n', 
'  \tz = z + 1\n', 
"  print ''.join(result)\n", 
' \t\n', 

et vous pouvez voir l'empreinte étrange de la ligne z = z + 1. En particulier, bien qu'il semble que vous utilisiez des onglets pour l'indentation, cette ligne n'a qu'une seule tabulation, donc même si elle semble correctement indentée à l'écran, je ne pense pas qu'elle soit réellement exécutée car elle ne se trouve pas dans le while boucle.

Toujours utiliser quatre onglets espace: rend la vie beaucoup plus facile. La plupart des éditeurs peuvent être configurés pour cela.