Шифрование информации методом постолбцевой транспозиции - 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до тех пор, пока это не произойдет.