Написать парсер строк, шифрующий/дешифрующий текст в строке по условию - 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");
}

Объяснение кода листинга программы

  1. Объявлены переменные:
    • len, newlen, k, i, j, z (для хранения значений и выполнения операций)
    • c[128] (массив для хранения значений разбиения)
    • d[128] (массив для хранения значений обратного разбиения)
    • str[256] (строка для ввода и шифрования текста)
    • newstr[256] (строка для хранения шифрованного текста)
    • oldstr[256] (строка для хранения дешифрованного текста)
  2. Пользователю предлагается ввести:
    • Число разбиения на группу (переменная k)
    • Шифровку от 1 до k через пробел (значения для массива c)
    • Строку для шифрования (вводится в str)
  3. Код выполняет следующие действия:
    • Вычисляет длину строки (len)
    • Проверяет, является ли длина строки кратной k, если нет, то увеличивает новую длину на 1 и округляет вверх до ближайшего кратного k (newlen)
    • Заполняет пробелами новыеstr[newlen] для выравнивания строки до кратности k
    • Копирует шифрованный текст из newstr в oldstr, используя обратное разбиение (d)
    • Выводит шифрованный текст (newstr)
    • Выводит дешифрованный текст (oldstr)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы