...

Листинг 12.10.

Функция разбора строки и проверки допустимости перестановки

function TfmTransposition.RecalcRearrangement(nKey: Integer):

Boolean;

var

i: Integer;

s: String;

Space: Boolean;

Used: array [1..MaxTerm] of Boolean;

ExRear: TRearrangement;

begin

Result := False;

Rear[0] := 0;

Space := True;

//выделяем каждое слово, разделенное пробелом,

//и преобразуем его к числу

for i := 1 to Length(edRearrangement.Text) do

if (edRearrangement.Text[i] = \' \') and (not Space) then

begin

Inc(Rear[0]);

Rear[Rear[0]] := StrToInt(s);

Space := True;

end

else

if (edRearrangement.Text[i] <> \' \') then

begin

if Space then

begin

Space := False;

s := \'\

end;

s := s + edRearrangement.Text[i];

end;

if not Space then

begin

Inc(Rear[0]);

Rear[Rear[0]] := StrToInt(s);

end;

//проверяем допустимость полученных чисел

FillChar(Used, SizeOf(Used), False);

for i := 1 to Rear[0] do

if (0 < Rear[i]) and (Rear[i] <= Rear[0])

and not Used[Rear[i]] then

Used[Rear[i]] := True

else

Exit;

//преобразуем перестановку к шифровке, обратной

//для симметричности процесса дешифровки

if nKey = 1 then

begin

ExRear[0] := Rear[0];

for i := 1 to Rear[0] do

ExRear[Rear[i]] := i;

Rear := ExRear;

end;

Result := Rear[0] > 1;

end;

Еще для упрощения алгоритма шифрования необходимо уметь получать часть текста заданной длины, начиная с указанной позиции, в виде одной строки, пропуская все переводы строк. Это действие выполняет следующая описываемая функция. Алгоритм ее работы довольно прост. Изначально в результирующей строке нет ни единого символа. Далее осуществляется двойной вложенный цикл. Цикл верхнего уровня осуществляет изменение значения переменной, начиная с указанной строки до самой последней. Вложенный цикл, в свою очередь, изменяет значение переменной, первый раз начиная с указанной позиции в строке, а в остальных случаях всегда с 1, до длины текущей обрабатываемой строки. Каждый очередной символ добавляется к результирующей строке до тех пор, пока не будет достигнута заданная длина строки, равная периоду транспозиции. Соответствующий код приведен в листинге 12.11.

Загрузка...