Цезарь Шифр ​​Используя Массивы - PullRequest
0 голосов
/ 28 апреля 2018

Мне дали задание для моего класса CompSci, в котором мы должны создать программу, которая использует Цезарь-Шифр для шифрования строки текста, однако я столкнулся с проблемой, когда мой код делает что-то смешное .

Я начал с создания массива строк, содержащих каждую букву алфавита. Затем я беру сообщение, введенное пользователем, делю его на слова, а затем на буквы. Каждая из этих букв затем помещается в массив с именем letters. Как только у меня есть массив букв, я вызываю функцию 'getLetterIndex`.

В функции getLetterIndex у меня есть внешний цикл for, считающий от i = 0 до i = 25 (25 - последний индекс в алфавитном массиве), и внутренний цикл for, повторяющийся по каждой букве в массиве. letters. Если alphabet[i] равно букве в массиве letters, значение i добавляется в массив с именем letterIndexes. Таким образом, каждая буква преобразуется в числовое представление ее размещения в алфавите.

Мне удалось преобразовать каждую букву в значение индекса, но мой массив этих буквенных индексов каким-то образом сортируется от наименьшего к наибольшему.

static String[] alphabet = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
                            "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};


public static void tokenizeEnteredMessage(String message) {
    String[] words = message.split(" ");
    String[] letters = null;
    for (String word : words) {
        letters = word.toUpperCase().split("");
    }                     
    getLetterIndex(letters);
}


public static void getLetterIndex(String[] letters) {
    int indexCount = 0;
    int[] letterIndexes = new int[letters.length];
    for (int i = 0; i < alphabet.length; i++) {
        for (String letter : letters) {
            if (alphabet[i].equals(letter)) {
                letterIndexes[indexCount] = i;
                indexCount++;
            }
        }
    }

Вывод с сообщением «яблоко» и шифром со сдвигом 3:

Enter '0' to type a phrase or enter '1' to specify the path to a text document: 0
Enter message that you would like to have encrypted. Do not enter numerical values: apple

Enter the key you would like to use to encrypt (integer): 3

A P P L E 
   Original Position: 0 4 11 15 15 
Position After Shift: 3 7 14 18 18 

Encrypted Message:
D H O S S

Вы можете видеть выше, что каждая буква была правильно преобразована в свою позицию в алфавите, и смещение позиции было успешно завершено, но индексы по какой-то причине вышли из строя. «Исходное положение» должно быть: 0 15 15 11 4.

Как ни странно, он прекрасно работает, когда я ввожу алфавит в качестве шифруемого сообщения:

Enter '0' to type a phrase or enter '1' to specify the path to a text document: 0
Enter message that you would like to have encrypted. Do not enter numerical values: abcdefghijklmnopqrstuvwxyz

Enter the key you would like to use to encrypt (integer): 3

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
   Original Position: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
Position After Shift: 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 0 1 2 

Encrypted Message:
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

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

1 Ответ

0 голосов
/ 28 апреля 2018

Возможно, вы захотите взглянуть на toCharArray() ( String's Java Doc ) в String, а также на то, как char используется со ASCII-значениями . Преобразовав каждую строку в вашем списке в массив символов, вы можете численно манипулировать их значениями.

Добавьте в метод тестирования следующее:

char A = 'A';
A++;
System.out.println(A);

Это распечатает букву 'B'. Теперь подумайте, что должно произойти, если у вас есть буква «Z», и она увеличивается. Вы хотели бы вернуться к «А».

char Z = 'Z';

if(Z < 'Z') {
   Z++; // If we haven't reached 'Z' (and are only shifting by 1), increment away!
} else {
   Z = 'A'; // Otherwise, reset it to 'A'
}

Эта логика работает только при смещении символов на 1. Вам понадобится общий подход для ALL возможных значений X (при условии, что X больше 0). Вот тут-то и пригодится оператор по модулю %! Вы знаете, что X имеет только 26 возможных значений, поэтому, если пользователь ввел большее число, например, 50, вам просто нужно знать 50%26 = 24, что дает вам значение сдвига X.

Теперь, когда у вас есть вся эта логика, имейте в виду, что массивы / списки поддерживают свой порядок, поэтому первоначальный порядок букв в каждом слове в вашем списке строк останется прежним.

...