Форум: "Начинающим";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
ВнизОбъекты Найти похожие ветки
← →
News (2006-05-12 22:59) [0]Добрый вечер! Уважаемые программисты, помогите, пожалуйста, с таким вопросом: есть текст программы, реализующий алгоритм шифрования Плейфейера:
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-12 23:09) [1]Задание по учебе чтоли?
По сабжу.
Смотри сам. Что такое объект
это совокупность данных и методов по работе с этими данными.
Попробуй выделить некие сущности этого алгоритма в отдельные сушности, и сделай эти сущности объектами.
PS
Разбираться в том коде что ты написал...
архисложная задача. Не осилил
← →
Джо © (2006-05-13 03:12) [2]Реализуй наследников TStream. Первый, когда в него записываешь, "на лету" шифрует данные. Второй, когда из него читаешь, их расшифровывает. Дешево и практЫчно :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c