Привет! Я работаю над этим расшифровщиком шифра Цезаря, который принимает зашифрованные строки и дешифрует их всеми ключами (а затем другая функция сопоставит их, если они похожи на другое сообщение). У меня есть функция Decipher, но мне было просто интересно, есть ли другой способ написать эту функцию. Любые идеи очень приветствуются. Спасибо!
void Decipher(char cip[], char key){
for(int i = 0; cip[i] != '\0'; i++){
if(cip[i] == ' '){
cip[i]= cip[i];
}else if(int(cip[i] >= int(key){
cip[i] = char(int(cip[i]) - ((int(key) - 65) % 26));
}else{
cip[i] = char(26 + int(cip[i]) - ((int(key)-65) % 26);
}
}
}
Там в всегда по-другому. Обычно еще полдюжины способов. Во-первых, я бы переместил часть, которая выполняет дешифрование, в функцию сама по себе.
char decipher(char in, char key) {
// ..
return in;
}
Затем, учитывая степень общности в вашем коде, я постараюсь удалить хотя бы часть повторений:
char decipher(char in, char key) {
if (in != ' ') {
in = char(in - ((key - 'A') % 26));
if (in < 0)
in += 26;
}
return in;
}
Это оставляет нам внешнюю процедуру, которая проходит через строку и расшифровывает каждый элемент. Я бы, вероятно, использовал стандартный алгоритм для этого и ссылку на std::string
в качестве параметра):
void decipher(std::string &s, char key) {
std::transform(s.begin(), s.end(), s.begin(),
[key](char c) { return decipher(c, key); });
}
Кроме того, вы можете использовать диапазон на основе for
цикл вместо transform
:
for (auto &c : s)
c = decipher(c, key);
Если вы хотите правильный C ++ (11), тогда …
void Decipher(std::string& cip, unsigned char key) {
for (auto&& c : cip) {
if (c == ' ')
continue;
if (((unsigned char)c) >= key)
c = (char)(((int)c) - (((int)key) - 'A') % 26);
else
c = (char)(26 + ((int)c) - ((((int)key) - 'A') % 26));
}
}
Это берет строку в качестве ссылки, а затем использует цикл for на основе диапазона для итерации по символам в строке, принимая ссылку на r-значение, чтобы изменения в символе влияли на исходную строку.
Я не внес никаких изменений в то, как вы выполняете вращательную математику, поскольку это не имеет отношения к тому, как C ++ иш это.