Рис. 12.1. Интерфейс программы «Шифр простой подстановки»
Текстовый редактор mmDecryptMessage будет служить для ввода и отображения открытого текста нашего сообщения, mmEncryptMessage – для текста, преобразованного при помощи шифра. Редактор значений vleSubst мы будем использовать для задания перестановки алфавита, при помощи которой будет шифроваться и дешифроваться текст сообщения. Кнопка btnEncryptMessage будет отвечать за шифрование сообщения из текстового peflaKTopammDecryptMessage и помещение результата в mmEncryptMessage. Кнопка btnDecpyptMessage предназначена для противоположных действий. Последняя кнопка btnGenRearrangement будет служить для генерации случайной перестановки алфавита, чтобы не утруждать себя ее вводом вручную. Необходимо добавить обработчики событий Onclick для каждой из кнопок и обработчик события OnCreate для формы (он нужен для инициализации редактора значений vleSubst).
Теперь стоит оговориться, что программа будет шифровать и дешифровать только русский текст, отставляя неизменным все остальное. Далее рассмотрим исходный код нашей программы.
Первым делом нужно ввести необходимые типы для лучшего понимания написанного кода, а также следует соответствующим образом объявить класс формы. Как это сделать, показано в листинге 12.1.
...
Листинг 12.1. Объявление типов и класса нашей формы
type
TRusDstAlphabet = array [Char] of Char;
TfmSubstitution = class(TForm)
mmDecryptMessage: TMemo;
mmEncryptMessage: TMemo;
lbDecryptMessage: TLabel;
lbEncryptMessage: TLabel;
btnEncryptMessage: TButton;
btnDecpyptMessage: TButton;
btnGenRearrangement: TButton;
vleSubst: TValueListEditor;
procedure FormCreate(Sender: TObject);
procedure btnGenRearrangementClick(Sender: TObject);
procedure btnEncryptMessageClick(Sender: TObject);
procedure btnDecpyptMessageClick(Sender: TObject);
private
{ Private declarations }
RusDstAlphabet: TRusDstAlphabet;
procedure GenRearrangment;
function ValidateRearrangement: Boolean;
function UpCaseRus(Ch: Char): Char;
function LowCaseRus(Ch: Char): Char;
procedure RecalcAlphabet(nKey: Integer);
function EncryptDecryptString(strMsg: String): String;
public
{ Public declarations }
end;
Каждую задачу следует рассматривать детально и выделять необходимые подзадачи, решение которых позволит облегчить и упростить общее решение. Помимо ряда стандартных обработчиков событий, мы добавили несколько собственных методов для лучшей структуризации кода и повышения его читабельности, что является немаловажным фактором при разработке приложений. Рассмотрим каждый метод и поясним их работу.
В нашем приложении для удобства и простоты работы будет реализована возможность задания случайной автоматической перестановки. Первым рассматриваемым методом является функция, реализующая алгоритм генерации случайной перестановки заданной длины из букв русского алфавита. Принцип ее работы заключается в следующем. Сначала считается, что в перестановке нет ни единого символа, о чем свидетельствует установка всех элементов массива WasGen в значение False. Далее в цикле случайным образом генерируются буквы русского алфавита. На очередном шаге цикла буква генерируется до тех пор, пока она будет присутствовать среди уже сгенерированных. Как только такая буква получена, то соответствующий элемент массива WasGen устанавливается в значение True, которое свидетельствует о том, что буква больше не может быть сгенерирована. Мы также не забываем добавить ее в перестановку. Код, соответствующий данному описанию, приведен в листинге 12.2.
...
Листинг 12.2.
Реализация метода генерации случайной перестановки
procedure TfmSubstitution.GenRearrangment;
var
Ch, c: char;
//нужен для определения, встречался ли символ ранее
WasGen: array [Char] of Boolean;
begin
//заполняем массив значением False
FillChar(WasGen, SizeOf(WasGen), False);
for Ch := \'А\' to \'Я\' do
begin
//генерируем случайный символ до тех пор, пока
//не будет получен еще не сгенерированный
repeat
c := Chr(Ord(\'А\') + random(32));
until not WasGen[c];
//помечаем, что символ сгенерирован
WasGen[c] := True;
vleSubst.Values[Ch] := c;
end;
end;
В нашем приложении пользователь может сам задавать необходимую перестановку букв алфавита, поэтому стоит учесть тот факт, что он может ошибиться при ее вводе. Для решения данной проблемы реализуем функцию, которая будет отвечать на вопрос о том, является ли введенная перестановка корректной. Определимся с тем, каким критериям должна отвечать перестановка, чтобы считаться допустимой. Во-первых, в каждой ячейке ввода должна присутствовать лишь одна буква – ни больше, ни меньше. Во-вторых, каждая введенная буква обязана принадлежать множеству букв русского алфавита. И в-третьих, ни одна введенная буква не должна ни разу повторяться. Проверка первого критерия довольно проста. Для этого достаточно лишь проверить длину строки, введенной в каждой ячейке. Второй критерий также проверяется довольно простой конструкцией принадлежности заданному множеству. Третий критерий проверяется подобно тому, как в предыдущем реализованном методе проверялось, сгенерирована данная буква или нет. Следующий исходный код, представленный в листинге 12.3, показывает, как эта проверка осуществляется.
Читать дальше
Конец ознакомительного отрывка
Купить книгу