Читаем Delphi. Трюки и эффекты полностью

Проверка первого условия осуществляется следующим образом. Изначально считается, что в строке идут пробелы. Как только пробелы заканчиваются, предполагается, что началось число, и до тех пор, пока мы опять не встретим пробел, выделяем это число. Как только встретили пробел, пытаемся преобразовать выделенную часть из строкового представления в численное. После этого добавляем полученное число к итоговой перестановке. Когда фрагмент кода, в котором находится первый цикл с условием после него, отработает, в массиве Rear будет храниться введенная перестановка (в Rear [0] хранится количество чисел в полученной перестановке). Сразу за первой проверкой осуществляется совместно вторая и третья, то есть проверяется допустимость самих введенных чисел, а также их уникальность. После всех проверок при необходимости осуществляется преобразование исходной перестановки к симметричной.

Для получения симметричной перестановки стоит выполнить нехитрое действие по обмену местами индексов чисел и сами х чисел, то есть если имеется перестановка 3 1 2, то она преобразуется в 2 3 1, так как 1 стоит на втором месте, 2 – на 3,3 – на 1.

Исходный код данной функции приведен в листинге 12.10.

...

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

...

Перейти на страницу:

Похожие книги

Забытое
Забытое

Захватывающая история Сиенны Престон продолжается во второй части головокружительной серии «Игра обмана».Семнадцатилетняя Сиенна не понаслышке знает о душевной боли и потерях. Но на этот раз всё по-другому: кто-то вмешался в воспоминания её возлюбленного, и теперь ей предстоит найти ответы.След ведёт её к сверкающим небоскрёбам и роскоши Рубекса, столицы Пасифики, где она проникает в правительственное Ведомство интеллекта и генетики. Но ответы получить не так-то просто, особенно когда её собственные воспоминания могут быть искажены. К счастью, рядом есть Зейн Райдер, готовый помочь ей сложить вместе кусочки головоломки. Его преданность и забота размывают границу между дружбой и чем-то большим.Когда Сиенна подбирается слишком близко к тёмным секретам Ведомства, её обвиняют в убийстве видного государственного деятеля, и ей приходится пуститься в бега. Как бы ни разрывалось сердце Сиенны в попытке понять, кого она любит, это всё вскоре перестаёт иметь значение — потому что единственное, что её сейчас ждёт, это смертный приговор.

Марина Козикова , Александр Степанович Грин , Марина Суржевская , Кристин Смит

Любовное фэнтези, любовно-фантастические романы / Проза / Классическая проза / Самиздат, сетевая литература / Технические науки / Любовно-фантастические романы