Шифрование информации методом постолбцевой транспозиции - Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста написать программу на языке Pascal для шифровки информации методом постолбцевой транспозиции.

Решение задачи: «Шифрование информации методом постолбцевой транспозиции»

textual
Листинг программы
  1. const len = 10;
  2.  
  3. type TKey = record
  4.               symb: char;
  5.               num: integer
  6.             end;
  7.  
  8. var s, p, ch: string;
  9.     key: array [1..len] of TKey;
  10.     t: TKey;
  11.     k, b, i, j: integer;
  12.     c: char;
  13.  
  14. begin
  15.   repeat {зацикливаем программу, выход из программы - по выбору}
  16.     {меню, ввод действия}
  17.     writeln('+--------------------------------------------+');
  18.     writeln('| 1 - кодирование                            |');
  19.     writeln('| 2 - декодирование                          |');
  20.     writeln('| Любое другое значение - выход из программы |');
  21.     writeln('+--------------------------------------------+');
  22.     write('Ваш выбор? ');
  23.     readln(ch);
  24.     if (ch = '1') or (ch = '2')
  25.       then begin
  26.         {### общие действия для любого выбора ###}
  27.         {ввод кодового слова}
  28.         repeat
  29.           write('Кодовое слово (2..', len, ' букв): ');
  30.           readln(s)
  31.         until length(s) in [2..len];
  32.         {помещаем символы кодового слова и их номера в массив}
  33.         k := length(s);
  34.         for i := 1 to k do
  35.           begin
  36.             key[i].symb := s[i];
  37.             key[i].num := i
  38.           end;
  39.         {сортируем символы кодового слова в лексикографическом порядке,}
  40.         {заодно переставляем номера}
  41.         for i := 0 to k - 1 do
  42.           for j := i to k do
  43.             if key[i].symb > key[j].symb
  44.               then begin
  45.                 t := key[i];
  46.                 key[i] := key[j];
  47.                 key[j] := t
  48.               end;
  49.         {--- печать транспозиции, можно удалить}
  50.         write('Транспозиция столбцов: ');
  51.         for i := 1 to k  do write(key[i].num:3);
  52.         writeln;
  53.         {---}
  54.         {вводим сообщение}
  55.         writeln('Введите сообщение:');
  56.         readln(s);
  57.         {если длина сообщения не кратна длине ключа, удлиняем сообщение}
  58.         c := 'a';
  59.         while length(s) mod k > 0 do
  60.           begin
  61.             s := s + c;
  62.             c := succ(c)
  63.           end;
  64.         {формируем строку, в которую будем размещать выходное сообщение}
  65.         p := s;
  66.         {###}
  67.         {@@@ действия по выбору @@@}
  68.         case ch[1] of
  69.           '1':
  70.             begin
  71.               {** кодирование **}
  72.               {считаем, что сообщение записано посторочно в таблицу шириной в ключ,}
  73.               {переписываем столбцы в строку в порядке транспозиции}
  74.               for i := 1 to k do
  75.                 begin
  76.                   b := length(s) div k * (i - 1);
  77.                   for j := 1 to length(s) div k do  p[b + j] := s[(j - 1) * k + key[i].num]
  78.                 end;
  79.               writeln('Кодированное сообщение:');
  80.               writeln(p)
  81.             end;
  82.           '2':
  83.             begin
  84.               {** декодирование **}
  85.               {переписываем всё обратно}
  86.               for i := 1 to k do
  87.                 begin
  88.                   b := length(s) div k * (i - 1);
  89.                   for j := 1 to length(s) div k do  p[(j - 1) * k + key[i].num] := s[b + j]
  90.                 end;
  91.               writeln('Декодированное сообщение:');
  92.               writeln(p)
  93.             end
  94.           end
  95.         {@@@}
  96.       end
  97.   until not ((ch = '1') or (ch = '2'))
  98. end.

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

  1. Переменная s используется для хранения ввода пользователя, который представляет собой строку из 2 до 10 символов.
  2. Переменная p используется для хранения итоговой строки, которая будет содержать закодированное сообщение.
  3. Переменная ch используется для хранения выбора пользователя.
  4. Переменная k используется для хранения количества символов в ключе.
  5. Переменная t используется для временного хранения элемента из массива key.
  6. Переменные i и j используются для итерации по массиву key и строке s соответственно.
  7. Переменная c используется для представления символа, который будет добавлен к строке s, чтобы сделать ее длиной в k символов.
  8. В цикле while используется для удлинения строки s путем добавления символа c к началу строки до тех пор, пока длина строки s не станет кратной k.
  9. Переменная b используется для вычисления позиции в строке s, где должно быть помещено значение из s с индексом j в массиве key с индексом i.
  10. В цикле for используется для переписывания каждого столбца в строку в порядке транспозиции.
  11. В случае выбора ch = '1' происходит кодирование, при котором символы кодового слова и их номера помещаются в массив key, затем символы сортируются в лексикографическом порядке и переставляются номера.
  12. В случае выбора ch = '2' происходит декодирование, при котором символы в массиве key и их номера переставляются обратно.
  13. В конце программы выводится сообщение, заданное пользователем, и его длина проверяется на кратность длине ключа. Если длина сообщения не кратна длине ключа, то к строке s добавляется символ c до тех пор, пока это не произойдет.

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


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

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

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы