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