Ну, я не уверен, если это домашнее задание, поэтому я буду скуп с Кодексом.
Вы пишете Цезарь со сдвигом 5.
Для решения вашей проблемы Z
-> _
... Я предполагаю, что вы хотите, чтобы все буквы были заменены на закодированные (а не странные символы).Проблема в том, что значения ASCII A-Z
лежат между 65 и 90. При кодировании Z
(например,) вы добавляете к нему 5, что дает вам значение 95 (_
).
Что вам нужно сделать, это обернуть вокруг доступных алфавитов.Сначала выделите, относительную позицию символа в алфавите (то есть A = 0, B = 1 ...). Вы должны вычесть 65 (то есть ASCII из A
. Добавьте свой Shift
, а затем примените modulus 26
Это заставит ваше значение обернуться вокруг.
Например, это ваша кодировка Z
, (ASCII = 90), поэтому относительная позиция равна 25 (= 90 - 65). Теперь 25 + 5 = 30, но вам нужно, чтобы значение было в пределах 26. поэтому вы берете modulus 26
, поэтому 30 % 26
равно 4
, что составляет E
.
Итак, вот оно
char letter = message(i);
int relativePosition = letter - 'A'; // 0-25
int encode = (relativePosition + shift) % 26
char encodedChar = encode + 'A' // convert it back to ASCII.
Таким образом, в одной строке,
char encodedChar = 'A' + ( ( (letter - 'A') + shift ) % 26)
Обратите внимание, это будет работать только в верхнем регистре, если вы планируете использовать нижний регистр, вам потребуется дополнительная обработка.
Вы можете использовать Character.isUpperCase()
для проверки заглавных букв.