Листинг 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.