![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объекты [D2005, XP]
News © (2006-05-12 22:59:00)Добрый вечер! Уважаемые программисты, помогите, пожалуйста, с таким вопросом: есть текст программы, реализующий алгоритм шифрования Плейфейера:
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const matr: array [1..8,1..8] of char=(('ш','Ш','и','И','ф','Ф','р','Р'),
('п','П','л','Л','е','Е','а','А'),
('б','Б','в','В','г','Г','д','Д'),
('ж','Ж','з','З','й','Й','к','К'),
('м','М','н','Н','о','О','с','С'),
('т','Т','у','У','х','Х','ц','Ц'),
('ч','Ч','щ','Щ','ы','ь','э','Э'),
('ю','Ю','я','Я',',','.',' ','-'));
code='шШиИфФрРпПлЛеЕаАбБвВгГдДжЖзЗйЙкКмМнНоОсСтТуУхХцЦчЧщЩыьэЭюЮяЯ,. -';
VAR
Form2: TForm2;
Stream,Stream1: TFileStream;
str, new: String;
Buf: array [1..400] of char;
num, Dlina_str, Dlina_new: Byte;
implementation
{$R *.dfm}
{Шифрование исходного текста}
procedure TForm2.Button1Click(Sender: TObject);
var c,i,num,k,l,m,n: integer;
begin
{Открытие файла}
try
Stream:=TFileStream.Create('d:\input.txt', fmOpenRead);
Stream.Seek(0,soFromEnd);
count:=Stream.Size;
Stream.Seek(0,soFromBeginning);
Stream.Read(Buf,count);
finally
Stream.Free;
end;
New:='';
Str:='';
{Преобразование считанного текста в строку}
for i:=1 to count do
Str:=Str+buf[i];
{Разбиение строки на пары символов}
Dlina_str:= Length(str) div 2;
FOR num:= 1 TO dlina_str DO
New:= (New + Str[2*num-1] + Str[2*num]);
{Шифрование открытого текста по матрице алфавита Плэйфера}
str:='';
Dlina_new:= Length(New)div 2;
FOR num:= 1 TO Dlina_new DO
begin
p1:=pos(New[2*num-1],code);
p2:=pos(New[2*num],code);
k:=(p1 div 8)+1;
l:=(p1 mod 8);
if l=0 then begin k:=k-1; l:=8; end;
m:=(p2 div 8)+1;
n:=p2 mod 8;
if n=0 then begin m:=m-1; n:=8; end;
if k=m then {Если символы находятся в одной строке матрицы алфавита}
begin
if l=8 then Str:=Str+matr[k,1] else Str:=Str+matr[k,l+1];
if n=8 then str:=Str+matr[m,1] else Str:=Str+matr[m,n+1];
end
else
if l=n then {Если в одном столбце}
begin
if k=8 then Str:=Str+matr[1,l] else Str:=Str+matr[k+1,l];
if m=8 then Str:=Str+matr[1,n] else Str:=Str+matr[m+1,n];
end
else begin
Str:=Str+matr[k,n];
Str:=Str+matr[m,l];
end;
end;
c:=Length(New);
New:='';
{Вывод полученного текста на экран}
for i:=1 to c do
begin
Buf[i]:=Str[i]; New:=New+Str[i];
end;
Memo1.Lines.Add('');
Memo1.Lines.Add('*************** Зашифрованный текст ***************');
Memo1.Lines.Add(New);
c:=Length(New);
{Запись полученного текста в файл}
try
Stream1:=TFileStream.Create('d:\output.txt', fmOpenWrite);
Stream1.Seek(0,soFromBeginning);
Stream1.Write(Buf,c);
finally
Stream1.Free;
end;
end;
{Дешифрование полученного текста}
procedure TForm2.Button2Click(Sender: TObject);
var i, count: integer;
begin
try
Stream:=TFileStream.Create('d:\input.txt', fmOpenRead);
Stream.Seek(0,soFromEnd);
count:=Stream.Size;
Stream.Seek(0,soFromBeginning);
Stream.Read(Buf,count);
finally
Stream.Free;
end;
New:= '';
Str:='';
for i:=1 to count do New:=New+buf[i];
Dlina_str:= Length(New)div 2;
FOR num:= 1 TO Dlina_str DO
begin
p1:=pos(New[2*num-1],code);
p2:=pos(New[2*num],code);
k:=(p1 div 8)+1;
l:=(p1 mod 8);
if l=0 then begin k:=k-1; l:=8; end;
m:=(p2 div 8)+1;
n:=p2 mod 8;
if n=0 then begin m:=m-1; n:=8; end;
if k=m then
begin
if l=1 then Str:=Str+shifr[k,8] else Str:=Str+shifr[k,l-1];
if n=1 then Str:=Str+shifr[m,8] else Str:=Str+shifr[m,n-1];
end
else
if l=n then
begin
if k=1 then Str:=Str+shifr[8,l] else Str:=Str+shifr[k-1,l];
if m=1 then Str:=Str+shifr[8,n] else Str:=Str+shifr[m-1,n];
end
else begin
Str:=Str+shifr[k,n];
Str:=Str+shifr[m,l];
end;
end;
count:=Length(New);
New:='';
for i:=1 to count do
begin
Buf[i]:='0';
Buf[i]:=Str[i];
end;
For i:=(count+1) to 400 do
Buf[i]:=' ';
Memo1.Lines.Add('');
Memo1.Lines.Add('');
Memo1.Lines.Add('*************** Расшифрованный текст ***************');
Memo1.Lines.Add(Buf);
try
Stream1:=TFileStream.Create('d:\output.txt', fmOpenWrite);
Stream1.Seek(0,soFromBeginning);
Stream1.Write(Buf,count);
finally
Stream1.Free;
end;
end;
{Открытие исходного файла}
procedure TForm2.Button3Click(Sender: TObject);
begin
try
Stream:=TFileStream.Create('d:\input.txt', fmOpenRead);
Stream.Seek(0,soFromEnd);
count:=Stream.Size;
Stream.Seek(0,soFromBeginning);
Stream.Read(Buf,count);
Memo1.Lines.Clear;
Memo1.Lines.Add('*************** Исходный текст ***************');
Memo1.Lines.Add(Buf);
finally
Stream.Free;
end;
end;
Мне нужно добавить в эту программу объекты (собственные, не стандартные), чтобы были реализованы все три принципа объектно-ориентированного программирования (использование property тоже требуется). Помогите, пожалуйста, это сделать, а то у самого не очень получается. Заранее спасибо!
Джо (2006-05-13 03:12:00) [1]Реализуй наследников TStream. Первый, когда в него записываешь, "на лету" шифрует данные. Второй, когда из него читаешь, их расшифровывает. Дешево и практЫчно :)
Гаврила (2006-05-12 23:09:00) [2]Задание по учебе чтоли?
По сабжу.
Смотри сам. Что такое объект
это совокупность данных и методов по работе с этими данными.
Попробуй выделить некие сущности этого алгоритма в отдельные сушности, и сделай эти сущности объектами.
PS
Разбираться в том коде что ты написал...
архисложная задача. Не осилил