Есть код, он рабочий, но есть проблема, если ввести ключ для сдвига такой, при котором сдвиг заходит за пределы алфавита, то текст не шифруется. А по правилу, в таком случае программа должна продолжить сдвиг с начала алфавита, а у меня получается выходит за его пределы.
И такая же проблема с дешифровкой.
#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;
}
C/C++
Помогите доработать шифр Цезаря на C/С++
Бессмысленно вводить ключ до 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.
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.
Константин Комасов
П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");
}
#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 не работает?
Wanted-05 /
k= k/26; потом d= k достаточно будет
Похожие вопросы
- Написать код расшифровки шифра Цезаря на C++
- Помогите доработать код на СИ по теме строки
- Помогите решить задачу пожалуйста, в C++
- Помогите пожалуйста написать код на c++, выводящий имя, фамилию и дату рождения нескольких человек
- Помогите пожалуйста написать код на C++
- Помогите решить пример на языке C++
- Помогите, пожалуйста, написать программу на C++ (массивы)
- Помогите пожалуйста решить задачу на C ИЛИ C#
- Помоги пожалуйста написать программу на C++
- Помогите понять отношения между классами / C/C++