Песни о Паскале | страница 94



Завершение шпионского проекта

Подойдя к финалу нашего проекта, мы научились: 1) шифровать отдельную строку, 2) читать строки из файла и 3) записывать строки в файл. Пора соединить все это: читая строки исходного файла, будем шифровать их, и записывать в другой файл, – так будет работать наша программа.

Прежде всего договоримся об именах файлов. Назначив зашифрованному файлу постоянное имя, например «CRYPT.TXT», мы избавим себя от ввода его имени с клавиатуры. Вводить мы будем либо имя исходного файла – при шифровании, либо имя конечного файла – при расшифровке. Обозначим эти неизвестные нам имена файлов как X1 и X2, и тогда схема обработки файлов будет такой.



Рис. 57 – Схема именования файлов при шифровании и расшифровке

С учетом этих договоренностей составим блок-схему программы (рис. 58).



Рис.58 – Блок-схема программы шифрования/расшифровки

Основную работу поручим процедуре шифрования-расшифровки, блок-схема которой показана на рис. 59. В неё передаём два параметра: имя обрабатываемого файла и код операции (зашифровать или расшифровать).



Рис.59 – Блок-схема процедуры шифрования-расшифровки

Теперь мы готовы смастерить шпионскую программу. Может быть, сами справитесь? По крайней мере, попытайтесь. Функции и процедуры шифрования символов и строк возьмите из программы «P_24_1». Написав свой вариант, сравните с представленным ниже.


>{ P_26_2 – шифрование и расшифровка файлов }


>const CKey = 2; { Ключ Цезаря }


>      { Шифрование одного символа }

>function Encrypt(arg: char): char;

>var x: integer;

>begin

>Encrypt:=arg;

>if Ord(arg)>=32 then begin { управляющие символы не трогаем! }

>x:= Ord(arg)+ CKey;

>if x>255 then x:= x-256+32;

>Encrypt:= Char(x);

>end;

>end;

>      { Расшифровка одного символа }

>function Decrypt(arg: char): char;

>var x: integer;

>begin

>Decrypt:=arg;

>if Ord(arg)>=32 then begin { управляющие символы не трогаем! }

>x:= Ord(arg)- CKey;

>if x<32 then x:= x+256-32;

>Decrypt:= Char(x);

>end;

>end;

>      { Шифрование строки }


>procedure EncryptStr(var arg: string);

>var k: integer;

>begin

>      for k:=1 to Length(arg) do arg[k]:= Encrypt(arg[k]);

>end;

>      { Расшифровка строки }


>procedure DecryptStr(var arg: string);

>var k: integer;

>begin

>      for k:=1 to Length(arg) do arg[k]:= Decrypt(arg[k]);

>end;

>      {----- Процедура шифрования-расшифровка файла -----}

>procedure CryptFile(const aFile: string; aOper: boolean);

>const CFixName='Crypt.txt'; { фиксированное имя файла }

>var FileIn: text; { входной файл для чтения }

>      FileOut: text; { выходной файл для записи }