Реализация ROT13 с использованием массивов символов

Я начинающий программист, который работал над реализацией ROT13 в рамках учебного пособия и наткнулся на следующий код. Он выводит правильные символы, однако я не совсем уверен, как это работает, и нет никаких объяснений.

char rot13[] = { 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M' };
std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

for (int i = 0; i < alphabet.length(); i++) {
std::cout << rot13[alphabet[i] - 'A'];
}

В частности, я не совсем понимаю, как минус «A» из символа в строковом алфавите дает нам номер ROT13. Сначала я подумал, что «A» соответствует индексу в пределах rot13 [] и минус, что даст нам новый индекс, однако это не будет означать, что любые числа под индексом A (Z, Y, X …) станут отрицательные показатели в результате и выкидывать ошибки.

Кто-нибудь может объяснить мне логику этого кода?

0

Решение

Конечно, alphabet[i] является заглавной буквой (что имеет место в вашем примере), alphabet[i] - 'A' вычислит расстояние до буквы «А» в таблице ASCII. Так 'A'-'A' будет 0, 'B'-'A' будет 1 и так далее, до 'Z'-'A' который 25

Ваш массив персонажей rot13 написано так, что индекс 0 имеет букву 'N', индекс 1 является буквой 'O' и так до индекса 12 с буквой 'Z' а затем индекс 13 'A'индекс 14 'B' и так до индекса 25, который 'M'

Чтобы прояснить ситуацию, давайте перепишем эту строку:

std::cout << rot13[alphabet[i] - 'A'];

Как:

char letterBeforeRot13 = alphabet[i];
int index = letterBeforeRot13 - 'A';
char letterAfterRot13 = rot13[index];
std::cout << letterAfterRot13;

Это в значительной степени то, что делает ваш компилятор, но с более подробной информацией.

Если мы выберем пример, где alphabet[i] равняется букве 'A', letterBeforeRot13 присваивается букве 'A', index назначен на 'A'-'A' который 0, letterAfterRot13 присваивается элементу массива rot13 по указателю 0, который 'N', Итак, письмо 'A' превращается в 'N',

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]