Написать парсер строк, шифрующий/дешифрующий текст в строке по условию - C (СИ)
Формулировка задачи:
Господа программисты. Я прошу прощения за беспокойство, но мне нужна ваша помшь.
Нужно написать программу:
"Задается натуральное число k и перестановка чисел 1, ... , k с помощью последовательности натуральных чисел c1, ... , ck, в которую входит каждое из чисел 1, ... , k. При шифровке в исходном тексте последовательно выделяются группы по k символов, и к каждой группе применяется зафиксированная перестановка, например: если k=4 и задана перестановка 3 2 4 1, то группу символов абвг следует заменить группой вбга. Если в последней группе меньше k символов, то к ней добавляются пробелы. Пользуясь изложенным способом, зашифровать и расшифровать заданный текст."
Заранее благодарю вас за оказанную помощь.
Всё решил сам. Простите за беспокойство.
Решение задачи: «Написать парсер строк, шифрующий/дешифрующий текст в строке по условию»
textual
Листинг программы
#include <cstdio>
#include <cstring>
int main()
{
int len, newlen, k, i, j, z;
int c[128];
int d[128];
char str[256];
char newstr[256];
char oldstr[256];
printf ("Введите число разбиения на группу - ");
scanf("%d", &k);
printf ("Введите шифровку от 1 до %d через пробел: ", k);
for (i = 0; i < k; i++)
{
scanf("%d", &c[i]);
c[i]--;
}
getchar();
printf ("Введите строку: ");
gets(str);
len = strlen(str);
if (len % k != 0)
{
newlen = (len / k + 1) * k;
for (i = len; i < newlen; i++)
{
str[i] = ' ';
}
str[newlen] = '\0';
len = newlen;
}
for (i = 0; i != len; i += k)
{
for (j = 0; j < k; j++)
{
newstr[i+j] = str[i + c[j]];
}
}
newstr[len] = '\0';
printf("Шифрованная строка: %s", newstr);
printf("\n");
for (i = 0; i < k; i++)
{
d[c[i]] = i;
}
for (i = 0; i != len; i += k)
{
for (j = 0; j < k; j++)
{
oldstr[i+j] = newstr[i + d[j]];
}
}
oldstr[len] = '\0';
printf("Дешифрованная строка: %s\n", oldstr);
printf("\n");
}
Объяснение кода листинга программы
- Объявлены переменные:
- len, newlen, k, i, j, z (для хранения значений и выполнения операций)
- c[128] (массив для хранения значений разбиения)
- d[128] (массив для хранения значений обратного разбиения)
- str[256] (строка для ввода и шифрования текста)
- newstr[256] (строка для хранения шифрованного текста)
- oldstr[256] (строка для хранения дешифрованного текста)
- Пользователю предлагается ввести:
- Число разбиения на группу (переменная k)
- Шифровку от 1 до k через пробел (значения для массива c)
- Строку для шифрования (вводится в str)
- Код выполняет следующие действия:
- Вычисляет длину строки (len)
- Проверяет, является ли длина строки кратной k, если нет, то увеличивает новую длину на 1 и округляет вверх до ближайшего кратного k (newlen)
- Заполняет пробелами новыеstr[newlen] для выравнивания строки до кратности k
- Копирует шифрованный текст из newstr в oldstr, используя обратное разбиение (d)
- Выводит шифрованный текст (newstr)
- Выводит дешифрованный текст (oldstr)