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

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

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

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

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

textual
Листинг программы
const len = 10;
 
type TKey = record
              symb: char;
              num: integer
            end;
 
var s, p, ch: string;
    key: array [1..len] of TKey;
    t: TKey;
    k, b, i, j: integer;
    c: char;
 
begin
  repeat {зацикливаем программу, выход из программы - по выбору}
    {меню, ввод действия}
    writeln('+--------------------------------------------+');
    writeln('| 1 - кодирование                            |');
    writeln('| 2 - декодирование                          |');
    writeln('| Любое другое значение - выход из программы |');
    writeln('+--------------------------------------------+');
    write('Ваш выбор? ');
    readln(ch);
    if (ch = '1') or (ch = '2')
      then begin
        {### общие действия для любого выбора ###}
        {ввод кодового слова}
        repeat
          write('Кодовое слово (2..', len, ' букв): ');
          readln(s)
        until length(s) in [2..len];
        {помещаем символы кодового слова и их номера в массив}
        k := length(s);
        for i := 1 to k do
          begin
            key[i].symb := s[i];
            key[i].num := i
          end;
        {сортируем символы кодового слова в лексикографическом порядке,}
        {заодно переставляем номера}
        for i := 0 to k - 1 do
          for j := i to k do
            if key[i].symb > key[j].symb
              then begin
                t := key[i];
                key[i] := key[j];
                key[j] := t
              end;
        {--- печать транспозиции, можно удалить}
        write('Транспозиция столбцов: ');
        for i := 1 to k  do write(key[i].num:3);
        writeln;
        {---}
        {вводим сообщение}
        writeln('Введите сообщение:');
        readln(s);
        {если длина сообщения не кратна длине ключа, удлиняем сообщение}
        c := 'a';
        while length(s) mod k > 0 do
          begin
            s := s + c;
            c := succ(c)
          end;
        {формируем строку, в которую будем размещать выходное сообщение}
        p := s;
        {###}
        {@@@ действия по выбору @@@}
        case ch[1] of
          '1':
            begin
              {** кодирование **}
              {считаем, что сообщение записано посторочно в таблицу шириной в ключ,}
              {переписываем столбцы в строку в порядке транспозиции}
              for i := 1 to k do
                begin
                  b := length(s) div k * (i - 1);
                  for j := 1 to length(s) div k do  p[b + j] := s[(j - 1) * k + key[i].num]
                end;
              writeln('Кодированное сообщение:');
              writeln(p)
            end;
          '2':
            begin
              {** декодирование **}
              {переписываем всё обратно}
              for i := 1 to k do
                begin
                  b := length(s) div k * (i - 1);
                  for j := 1 to length(s) div k do  p[(j - 1) * k + key[i].num] := s[b + j]
                end;
              writeln('Декодированное сообщение:');
              writeln(p)
            end
          end
        {@@@}
      end
  until not ((ch = '1') or (ch = '2'))
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
Похожие ответы