Если вы хотите удалить циклы, закодированные вручную, вы можете использовать алгоритмы STL, такие как std :: transform , чтобы выполнить это:
Но сначала нужно сделать несколько вещей:
Не используйте магические числа, такие как 122, 97 и т. Д. Вместо этого используйте фактические символьные константы, например a
, b
и т. Д. Однако, если мы предположим ASCII, где буквенные коды символов являются смежными, ваш конкретная программа может просто использовать постоянную строку для обозначения алфавита, а затем использовать простое индексирование для выделения символа.
const char *alphabet = "abcdefghijklmnopqrstuvwxyz";
Затем, чтобы получить букву a
, для получения индекса достаточно простого вычитания:
char ch = 'b';
int index = ch - 'a'; // same as 'b' - 'a' == 98 - 97 == 1
std::cout << alphabet[index]; // will print 'b'
Учитывая это, следующее - выяснить, какой символ достигается, если вы добавите 10 к значению, а если больше 26, переходите к началу алфавита. Это можно сделать с помощью модуля (остаток после деления)
char ch = 'x';
int index = (ch - 'a' + 10) % 26; // Same as ('x' - 'a' + 10) % 26 == (120 - 97 + 10) % 26 == 33 % 26 == 7
std::cout << alphabet[index]; // will print 'h'
Следующее, что нужно сделать, это выяснить обратное, где для заданного зашифрованного символа вы должны найти незашифрованный символ, вычитая 10. Здесь это оборачивает противоположный путь, поэтому нужно выполнить немного больше работы (не показано, но пример кода отражает то, что сделано).
Собрав все это вместе и используя std::transform
и лямбды, мы получим следующую маленькую программу:
#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>
#include <cmath>
int main()
{
//Input Message
const char *alphabet="abcdefghijklmnopqrstuvwxyz";
std::string message = "helloworld";
std::string result;
// set the encrypted string using the formula above and std::transform
std::transform(message.begin(), message.end(), std::back_inserter(result),
[&](char ch) { return alphabet[(ch - 'a' + 10) % 26]; });
std::cout << "Encrypted: " << result << '\n';
// convert back to unencrypted using the above formula and std::transform
std::string result2;
std::transform(result.begin(), result.end(), std::back_inserter(result2),
[&](char ch)
{ int index = ch - 'a' - 10; index = index < 0?26 - (abs(index) % 26):index % 26; return alphabet[index];});
std::cout << "Unencrypted: " << result2;
}
Вывод:
Encrypted: rovvygybvn
Unencrypted: helloworld