2014-09-20 3 views
-3

Я пытаюсь сделать программу, которая кодирует строку в другую строку, используя Caesar CodeМоя программа не работает, я не знаю, почему

def encode(letters,code,word): 
    lettersTab = list(letters) 
    lettersTab = lettersTab*2 
    lenghtLetters = len(letters) 
    howMany = code%lenghtLetters 
    wordTab = list(word) 
    secondTab = [None]*len(word) 
    for j in range(0,len(word)): 
     for i in range(0,int(len(lettersTab)/2)): 
      secondTab[j] = wordTab[j].replace(lettersTab[i],lettersTab[i+howMany]) 
    print(secondTab) 
encode("bca",2,"abc") 

Это вход означает, что б превращается в а, и т.д. . b-> а, c-> Ь, а-> с

Вывод должен быть:

['c','a','b'] 

Но это

['b','b','c']

+0

Я думаю, что вы должны размещать больше кода - строка, содержащая свой сборник/синтаксической ошибки ISN 'т присутствует в вашем фрагменте. –

+1

Вам не хватает конечных скобок в строке, начинающейся с 'secondTab [j] = ...'. –

+1

Вы пытались пройти через код * вручную * с помощью карандаша и бумаги? Добавьте этот оператор печати в * верхний * внутреннего цикла. Это может помочь вам диагностировать проблему. '' 'print '{} \ t {: <18} \ t {} \ t {}'. format ((j, i), secondTab, wordTab, lettersTab)' '' – wwii

ответ

0

Ваш алгоритм не делать то, что вы ожидаете, потому что внутренняя петля

for i in range(0,int(len(lettersTab)/2)):

устанавливает secondTab[j] в wordTab[j] на каждом шаге цикла, даже если wordTab[j] не соответствует lettersTab[i], который не то, что вы хотите.

Обратите внимание, что newstr = oldstr.replace(a, b) делает newstr = oldstroldstr, если не содержит a.

Таким образом, приведена очищенная версия вашей функции плюс несколько прогрессивных уточнений, в последнем примере с использованием списка списка. Некоторые из моих версий используют index(), которые выдадут исключение, если он не сможет найти то, что он ищет, но ваш исходный код страдает от аналогичной проблемы.

Я изменил имя функции, потому что encode является стандартной строковой функцией в Python 2 (которую я запускаю).

#! /usr/bin/env python 

''' 
Caeser encryption 
From http://stackoverflow.com/questions/25950099/my-program-dont-work-i-dont-know-why 
''' 

import sys 

def caeser_encode0(letters, code, word): 
    lettersTab = list(letters) * 2 
    howMany = code % len(letters) 
    wordTab = list(word) 
    secondTab = [None] * len(word) 
    for j in range(0, len(word)): 
     for i in range(0, int(len(lettersTab)/2)): 
      if wordTab[j] == lettersTab[i]: 
       secondTab[j] = wordTab[j].replace(lettersTab[i], lettersTab[i + howMany]) 
       print(wordTab[j], lettersTab[i], lettersTab[i + howMany], secondTab) 
    print(secondTab) 


def caeser_encode1(letters, code, word): 
    lettersTab = list(letters) * 2 
    howMany = code % len(letters) 
    wordTab = list(word) 
    secondTab = [] 
    for ch in word: 
     for i in range(0, int(len(lettersTab)/2)): 
      if ch == lettersTab[i]: 
       secondTab.append(lettersTab[i + howMany]) 
       print(ch, lettersTab[i], lettersTab[i + howMany], secondTab) 
    print(secondTab) 


def caeser_encode2(letters, code, word): 
    lettersTab = list(letters) * 2 
    howMany = code % len(letters) 
    secondTab = [] 
    for ch in word: 
     i = lettersTab.index(ch) 
     secondTab.append(lettersTab[i + howMany]) 
     print(ch, lettersTab[i], lettersTab[i + howMany], secondTab) 
    print(secondTab) 


def caeser_encode3(letters, code, word): 
    howMany = code % len(letters) 
    secondTab = [] 
    for ch in word: 
     i = letters.index(ch) 
     newi = (i + howMany) % len(letters) 
     secondTab.append(letters[newi]) 
     print(ch, letters[i], letters[newi], secondTab) 
    print(secondTab) 


def caeser_encode4(letters, code, word): 
    howMany = code % len(letters) 
    secondTab = [] 
    for ch in word: 
     newi = (letters.index(ch) + howMany) % len(letters) 
     secondTab.append(letters[newi]) 
     print(ch, letters[newi], secondTab) 
    print(secondTab) 


def caeser_encode(letters, code, word): 
    howMany = code % len(letters) 
    secondTab = [ 
     letters[(letters.index(ch) + howMany) % len(letters)] for ch in word] 
    print(secondTab) 


def main(): 
    caeser_encode("bca", 2, "abc") 

if __name__ == '__main__': 
    main() 

Будем надеяться, что вы (или кто-то :)) будет узнать больше о Python из этих примеров ...

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