2016-02-27 2 views
0

Это из-за двух выражений if и else внутри друг друга?Цезарь Cypher Программа: Индекс строки за пределами диапазона

Я работаю над программой Cesar Cipher для класса. Я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    main() 
    File "C:\Users\Chandler\Desktop\CSCI220-S16-Assign2-CaesarEncode-CTL.py", line 31, in main 
    print("You coded message is: ", (code(message))) 
    File "C:\Users\Chandler\Desktop\CSCI220-S16-Assign2-CaesarEncode-CTL.py", line 25, in code 
    textInput += alphabet[letterPos] 
IndexError: string index out of range 

Просто примечание стороны я также буду создать другой раздел цикла этой программы разворачивать текст обратно к первоначальному входу

def main(): 

    alphabet = "abcdefghijklmnopqrstuvwxyz" 

    message = input("Enter the message you wish to be encoded: ") 
    message = message.lower() 

    key = eval(input("Enter the key shift: ")) 

    def code(message): 
     textInput = "" 
     for ch in message: 
      if ch in alphabet:   
       letterPos = alphabet.find(ch) + key 
       if letterPos > 26: 
        letterPos % key 
       else: 

        letterPos + key 
       textInput += alphabet[letterPos] 

      else: 
       cyphertext += ch 
     return textInput 

    print("You coded message is: ", (code(message))) 



#end main 
main() 
+0

Блок if неправильный. Вы не назначаете результаты, и операция неверна. – purpletentacle

+0

Вы хотите использовать '(букву + ключ)% 26' для выполнения сдвига и нанести его на алфавит. –

+0

Это, безусловно, школьное упражнение. Я не уверен, должны ли мы давать прямые ответы. – purpletentacle

ответ

0
заявлению

Вставки печати, чтобы увидеть значение letterPos по мере продвижения программы. Узнайте, когда это 26 или больше. 26 или более потребовалось бы утверждение if: if letterPos> = 26.

+0

Отладчики ничего не стоят сейчас! –

+0

На самом деле у меня все еще есть один на layaway – John

0

Вы уже сдвинули букву с letterPos = alphabet.find(ch) + key и обертываете ее, когда это необходимо, в блок if letterPos > 26. Однако вы должны использовать modulo 26, а не значение key. Кроме того, блок else является избыточным и также оскорбительным, поскольку вы меняете букву во второй раз без обхода.

Вы должны использовать модуль каждый раз, так как ветка медленнее. В общем, это должно решить проблему.

if ch in alphabet: 
    letterPos = (alphabet.find(ch) + key) % 26 
    textInput += alphabet[letterPos] 
else: 
    textInput += ch 

Кроме того, заметьте имя cyphertext, которое нигде не определено.

Смежные вопросы