2016-02-08 4 views
0

У меня возникла проблема с оберткой вокруг алфавита с помощью моей программы шифрования Цезаря.Caesar Cipher Верхняя и нижняя регистры Оберните вокруг

Программа отлично работает со всеми строчными буквами. Обтекает отлично и может применять положительные и отрицательные сдвиги. Когда я пытаюсь ввести заглавную букву, прописная буква не обертывается.

Вот мой код:

public static StringBuilder encode(String str, int numShift) 
{ 

    numShift = numShift % 26; 

    //assign each character of the string to a position in the character array 
    char[] strChars = str.toCharArray(); 

    for (int i = 0; i < strChars.length; i++) 
     { 
      //ignore and continue if the character is not within the alphabet 
      if((strChars[i] < 'a' || strChars[i] > 'z') && (strChars[i]<'A' || strChars[i] > 'Z')) 
       continue; 

      //apply the shift to each character 
      strChars[i] += numShift; 

      //wrap around if the shift is beyond Z 
      **if(strChars[i] > 'z') 
       { 
       strChars[i] -= 'z'; 
       strChars[i] += ('a' - 1);   
       }** 

     } 

    StringBuilder encodedStr = new StringBuilder(); 

    encodedStr.append(strChars); 

    return encodedStr; 


} 
public static void init(){ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Please enter the string that you would like to encode:"); 
    String str = scan.nextLine(); 
    System.out.println("Please enter the number of letters you would like to shift:"); 
    int strShift = scan.nextInt(); 
    scan.close(); 

    StringBuilder result = encode(str, strShift); 
    System.out.println(result); 
} 
public static void main(String[] args) 
{ 
     init(); 
} 

}

советы будут оценены! Конечно, я не прошу кого-либо сделать мою работу для меня, но какая-то помощь будет оценена! Спасибо! :)

Edit: вот если утверждение, что делает обертку вокруг только строчными буквами:

if(strChars[i] > 'z') 
{ 
strChars[i] -= 'z'; 
strChars[i] += ('a' - 1);   
} 
+2

Ваш подход не может работать, как он стоит, так как смещение +7 или более сместится некоторые прописные буквы в диапазон строчных букв. Я предлагаю проверить перед тем, как сдвинуть букву в верхнем регистре. Если это так, конвертируйте в нижний регистр, преобразуйте и преобразуйте результат назад. В противном случае просто конвертируйте, как вы уже делаете. –

+0

Это имеет смысл, спасибо джон! –

ответ

0

Давайте реализуем укручения функцию для одного символа. Это будет использоваться другим методом. Когда вы отделите свои задачи и подзадачи с умом, вы заметите, что ваша проблема будет легче решить. Здесь я обосновал свое решение тем, что переменные char представлены в виде чисел, мы знаем количество букв, и мы можем использовать это число как класс modulo, чтобы убедиться, что алгебра помогает нам.

private static char wrapChar(char input, int amount) { 
    //assume for now that we have an upper-case letter 
    char start = 'A'; 
    //if the assumption is mistaken... 
    if (('a' <= input) && (input <= 'z')) { 
     //then, if it is lower-case, then use lower-case 
     start = 'a'; 
    } else if (!(('A' <= input) && (input <= 'Z'))) { 
     //target is not letter 
     return input; 
    } 
    //Calculate total offset compared to the first letter of the alphabet 
    //be it lower or upper 
    int offset = ((input - start) + amount) % 26; 
    //If offset happens to be negative, then shift a modulo period of 26 
    //To get the correct positive offset 
    if (offset < 26) { 
     offset += 26; 
    } 
    //Add the final offset to start and convert it to char 
    return ((char)(start + offset)); 
} 

Теперь вместо

//apply the shift to each character 
    strChars[i] += numShift; 

    //wrap around if the shift is beyond Z 
    **if(strChars[i] > 'z') 
     { 
     strChars[i] -= 'z'; 
     strChars[i] += ('a' - 1);   
     }** 

Вам нужно просто:

strChars[i] = wrapChar(strChars[i], numShift);