C/C++

Помогите доработать шифр Цезаря на C/С++

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

#include
#include
#pragma warning(disable : 4996)
int main()
{
setlocale(LC_ALL, "Russian");
int i = 0, n = 0, k, d;

char alf[] = "abcedfghijklmnopqrstuvwxyz";
char slovo[99];
char decod[99];

printf("Введите ваше слово : ");
scanf("%s", &slovo);
printf("Введите числовой ключ, (шаг от 1 до 99): ");
scanf("%i", &k);
for (n = 0; n < 99; n++)
{
for (i = 0; i < 26; i++)
{
if (slovo[n] == alf[i])
{
slovo[n] = alf[i + k];
break;
}
}
}
printf("Ваш шифр = %s\n", slovo);

printf("Введите ваше слово : ");
scanf("%s", &decod);
printf("Введите числовой ключ, (шаг от 1 до 99): ");
scanf("%i", &d);
for (n = 0; n < 99; n++)
{
for (i = 0; i < 26; i++)
{
if (decod[n] == alf[i])
{
decod[n] = alf[i - d];
}
}
}
printf("Ваш шифр = %s\n", decod);

return 0;
}
Бессмысленно вводить ключ до 99: т. к. у нас алфавит состоит из 26 символов, то ключ 26 в точности равен ключу 0, ключ 27 - ключу 1, ключ 28 - ключу 3 и т. д.

char slovo[99];
int k;

// Кодирование
printf("Введите ваше слово : ");
scanf("%s", slovo);
printf("Введите числовой ключ, (шаг от 1 до 25): ");
scanf("%i", &k);
for (int i = 0; slovo[i]; ++i) {
if (slovo[i] >= 'a' && slovo[i] <= 'z') { slovo[i] = (slovo[i] - 'a' + k) % 26 + 'a'; }
}
printf("Шифр = %s\n", slovo);

// Декодирование
printf("Введите ваше слово : ");
scanf("%s", slovo);
printf("Введите числовой ключ, (шаг от 1 до 25): ");
scanf("%i", &k);
k = 26 - k;
for (int i = 0; slovo[i]; ++i) {
if (slovo[i] >= 'a' && slovo[i] <= 'z') { slovo[i] = (slovo[i] - 'a' + k) % 26 + 'a'; }
}
printf("Расшифровано = %s\n", slovo);

Обрати внимание: шифрование и дешифровка различаются ОДНОЙ строчкой:
если шифрование делается ключом k, то для дешифровки надо зашифровать зашифрованное ещё раз, но уже ключом 26 - k.
Куандык Избаев
Куандык Избаев
87 881
Лучший ответ
Константин Комасов Пpaвдa ли что TуреSсriрt это Jаvа с дpyгим cинтaкcиcoм?
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
bool is_alpha(char ch) {
if (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') return true;
if (ch >= 'А' && ch <= 'Я' || ch >= 'а' && ch <= 'я') return true;
return false;
}
string splus(const string& line) {
auto s = line;
for (auto& ch : s) {
if (ch == ' ') continue;
if (is_alpha(ch)) {
if (ch == 'Z' || ch == 'z') ch -= 25;
else if (ch == 'Я' || ch == 'я') ch -= 31;
else ++ch;
} else {
++ch;
}
}
return s;
}
string sminus(const string& line) {
auto s = line;
for (auto& ch : s) {
if (ch == ' ') continue;
if (is_alpha(ch)) {
if (ch == 'A' || ch == 'a') ch += 25;
else if (ch == 'А' || ch == 'а') ch += 31;
else --ch;
} else {
--ch;
}
}
return s;
}
string encode(const string& line, int shift) {
auto s = line;
for (int i = 0; i < shift; ++i) s = splus(s);
return s;
}
string decode(const string& line, int shift) {
auto s = line;
for (int i = 0; i < shift; ++i) s = sminus(s);
return s;
}
int main() {
system("chcp 1251 > nul");
cout << "Исходная строка: ";
string line;
getline(cin, line);
cout << "Числовой код сдвига: ";
int shift;
cin >> shift;
cin.ignore(cin.rdbuf()->in_avail());
line = encode(line, shift);
cout << "Кодированная строка: " << line << '\n';
line = decode(line, shift);
cout << "Декодированная строка: " << line << '\n';
system("pause > nul");
}
Евгений Козырев Конечно всё это круто, но мне нужно доработать именно тот код, т. к. преподаватель уже видел его
Евгений Козырев Если смещение будет дальше алфавита, то программа не перейдёт на начало а продолжит двигаться куда то дальше. Например кодирую xyz, то на выходе будет не yza, а yz
то есть > 26 не работает?
W/
Wanted-05 /
21 700
Wanted-05 / k= k/26; потом d= k достаточно будет