Написать парсер строк, шифрующий/дешифрующий текст в строке по условию - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д