Шифрование информации методом постолбцевой транспозиции - 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.
Объяснение кода листинга программы
- Переменная
s
используется для хранения ввода пользователя, который представляет собой строку из 2 до 10 символов. - Переменная
p
используется для хранения итоговой строки, которая будет содержать закодированное сообщение. - Переменная
ch
используется для хранения выбора пользователя. - Переменная
k
используется для хранения количества символов в ключе. - Переменная
t
используется для временного хранения элемента из массиваkey
. - Переменные
i
иj
используются для итерации по массивуkey
и строкеs
соответственно. - Переменная
c
используется для представления символа, который будет добавлен к строкеs
, чтобы сделать ее длиной вk
символов. - В цикле
while
используется для удлинения строкиs
путем добавления символаc
к началу строки до тех пор, пока длина строкиs
не станет кратнойk
. - Переменная
b
используется для вычисления позиции в строкеs
, где должно быть помещено значение изs
с индексомj
в массивеkey
с индексомi
. - В цикле
for
используется для переписывания каждого столбца в строку в порядке транспозиции. - В случае выбора
ch = '1'
происходит кодирование, при котором символы кодового слова и их номера помещаются в массивkey
, затем символы сортируются в лексикографическом порядке и переставляются номера. - В случае выбора
ch = '2'
происходит декодирование, при котором символы в массивеkey
и их номера переставляются обратно. - В конце программы выводится сообщение, заданное пользователем, и его длина проверяется на кратность длине ключа. Если длина сообщения не кратна длине ключа, то к строке
s
добавляется символc
до тех пор, пока это не произойдет.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д