2017-02-19 6 views
1

У меня проблемы с моей программой Ceasar Chiper.Python. Индекс строки вне диапазона. Ceasar Cipher

Это то, что я до сих пор:

def enchiper(s,n): 
    ''' 
    This function takes a string(s) and an integer(n) and 
    shifts the elements of s around the alphabet 
    ''' 
    Alpha1 = 'abcdefghijklmnopqrstuvwxyz' 
    Alpha2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
    if 1 == len(s): 
     if 'a' <= s[0] <= 'z': 
      spot1 = myIndex(s[0],Alpha1) 
      x = spot1 + n 
      if 26 < x: 
       y = x - 26 
       return Alpha1[y] 
      else: 
       return Alpha1[x] 
     elif 'A' <= s[0] <= 'Z': 
      spot1 = myIndex(s[0],Alpha2) 
      x = spot1 + n 
      if 26 < x: 
       y = x - 26 
       return Alpha2[y] 
      else: 
       return Alpha2[x] 
     else: 
      return s[0] 
    else: 
     if 'a' <= s[0] <= 'z': 
      spot1 = myIndex(s[0],Alpha1) 
      y = spot1 + n 
      if 26 < y: 
       x = y - 26 
       return Alpha1[x] + enchiper(s[1:],n) 
      else: 
       return Alpha1[y] + enchiper(s[1:],n) 
     elif 'A' <= s[0] <= 'Z': 
      spot1 = myIndex(s[0],Alpha2) 
      y = spot1 + n 
      if 26 < y: 
       x = y - 26 
       return Alpha2[x] + enchiper(s[1:],n) 
      else: 
       return Alpha2[y] + enchiper(s[1:],n) 
     else: 
      return s[0] + enchiper(s[1:],n) 

def myIndex(element, sequence): 
    ''' returns the number of times that an element appears in a list 
    returns a random number from 0 to length of sequence if the element 
    does not appear in the list 
    Input: element is either an integer or string 
    sequence is a list of strings and integers 
    ''' 
    if 0 == len(sequence): 
     return 0 
    elif sequence[0] == element: 
     return 0 
    else: 
     return 1 + myIndex(element, sequence[1:]) 

Программа работает довольно хорошо, несколько раз Струны Вхожу дать мне «индекс строки из диапазона». Например:

>>> enchiper('hello',15) 
Traceback (most recent call last): 
    File "<pyshell#48>", line 1, in <module> 
    enchiper('hello',15) 
    File "/Users/spencerzanardi/Documents/hw3pr2.py", line 41, in enchiper 
    return Alpha1[y] + enchiper(s[1:],n) 
    File "/Users/spencerzanardi/Documents/hw3pr2.py", line 41, in enchiper 
    return Alpha1[y] + enchiper(s[1:],n) 
    File "/Users/spencerzanardi/Documents/hw3pr2.py", line 41, in enchiper 
    return Alpha1[y] + enchiper(s[1:],n) 
IndexError: string index out of range 

Кроме того, у меня есть использование для рекурсии в моей программе. Я не разрешается использовать циклы

+0

положить 'попробовать: ... кроме IndexError: ... 'вокруг строки 41, а затем вы можете распечатать значения Alpha1, s, y и n. – Harvey

ответ

0

Хотя это не делает верхний/нижний регистр (хотя быстрый верхний или нижний, и было бы)

def encyp(string,shift): 
     Alpha1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
     c=string[0] 
     pos=Alpha1.find(c) 
     pos=(pos+shift)%26 
     if len(string)==1: 
      return Alpha1[pos] 
     else: 
      return encyp(string[0], shift) + encyp(string[1:], shift) 

Вы можете сделать это короче ...

+0

Точно так же вы сейчас, 'Alpha1' (and2) уже определена в Python: ' импорта string', 'string.ascii_lowercase',' печать string.ascii_uppercase' Так что это плохая практика, чтобы использовать 'строку 'как переменная. Хороший код, хотя. –

+0

@ MaxChrétien большое спасибо за информацию о струнном модуле. Согласовано имя переменной. С уважением Т. –

0

Я debuged вашу программу, когда я печатаю y в Alpha1[y] я 26. Действительно Alpha1 (или 2) начальный индекс в 0. Попробуйте изменить все свои вхождений if 26 < x: и if 26 < y: по if 26 <= x: и if 26 <= y: и он должен работать.

Редактировать

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

0

Проблема заключается в том, что вы используете индекс 26, в то время как индексы ваших массивов Alpha1 и Alpha2 перейти от 0 до 25. В частности, вызов enchiper('hello',15), проблема заключается в том, что письмо l находится в положении 11. Когда вы добавите 15, вы получите ровно 26. Затем условие 26 < y будет удовлетворено , а не, и поэтому вы попытаетесь вернуть Alpha1[26], которого не существует. Если вы меняете каждый случай something > 26 на something >= 26 свой код shouold.

0
def encipher(s, n): 
    diff = ord('Z') - ord('A') 
    if len(s) == 1: 
     num = ord(s) 
     num += n % diff 

     if s.isupper(): 
     if num > ord('Z'): 
      num -= diff 
     elif num < ord('A'): 
      num += diff 
     elif s.islower(): 
     if num > ord('z'): 
      num -= diff 
     elif num < ord('a'): 
      num += diff 
     return chr(num) 

    return encipher(s[0], n) + encipher(s[1:], n) 
+2

Дай человеку рыбу, и ты накормишь его на день; научите человека ловить рыбу, и вы кормите его на всю жизнь. –

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