![]() |
|
|
#1
|
|||
|
|||
|
Задача проекта написать программу, которая позволяет кодировать и декодировать сообщения, заданными способами, например "Шифр Цезаря".
Проблема в том, что я не знаю как это реализовать т.е. как в программу вставить нужный программный код. Если ещё проще, то как сделать так, чтобы после нажатия на кнопку введёный текст зашифровывался? За основу взят обычный текстовый редактор... Редактор... Код:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Menus, XPMan, ToolWin, Printers, Buttons;
type
TForm1 = class(TForm)
stat1: TStatusBar;
tlb1: TToolBar;
XPManifest1: TXPManifest;
mm1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
redt1: TRichEdit;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N15: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
N18: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
N23: TMenuItem;
N25: TMenuItem;
pm1: TPopupMenu;
N26: TMenuItem;
N27: TMenuItem;
N28: TMenuItem;
N29: TMenuItem;
N30: TMenuItem;
N31: TMenuItem;
dlgFind1: TFindDialog;
dlgReplace1: TReplaceDialog;
dlgOpen1: TOpenDialog;
dlgSave1: TSaveDialog;
dlgPnt1: TPrintDialog;
dlgPntSet1: TPrinterSetupDialog;
N32: TMenuItem;
dlgFont1: TFontDialog;
dlgColor1: TColorDialog;
btn1: TSpeedButton;
procedure N2Click(Sender: TObject);
procedure StatusBar(Sender: TObject; var Done:Boolean);
procedure FormCreate(Sender: TObject);
procedure N13Click(Sender: TObject);
procedure N14Click(Sender: TObject);
procedure N15Click(Sender: TObject);
procedure N18Click(Sender: TObject);
procedure N17Click(Sender: TObject);
procedure N19Click(Sender: TObject);
procedure dlgFind1Find(Sender: TObject);
procedure N20Click(Sender: TObject);
procedure dlgReplace1Find(Sender: TObject);
procedure dlgReplace1Replace(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N32Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N23Click(Sender: TObject);
procedure N25Click(Sender: TObject);
// procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
EditFile:string;
implementation
{$R *.dfm}
procedure TForm1.N2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.StatusBar(Sender: TObject; var Done:Boolean);
var
MS: TMemoryStatus;
begin
stat1.Panels[0].Text:=' ' + Application.Hint;
stat1.Panels[2].Text:=' Время: ' + TimeToStr(Time);
if GetKeyState(VK_Numlock)=1
then stat1.Panels[1].Text:=' ' + '"Num Lock" Включен'
else stat1.Panels[1].Text:=' ' + '"Num Lock" Выключен';
if GetKeyState(VK_Insert)=1
then stat1.Panels[3].Text:=' ' + 'Режим замены'
else stat1.Panels[3].Text:=' ' + 'Режим вставки';
GlobalMemoryStatus(MS);
stat1.Panels[4].Text:=' Память загружена на: ' + Format('%d %%', [MS.dwMemoryLoad]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle:=StatusBar;
end;
procedure TForm1.N13Click(Sender: TObject); // Вырезать
begin
redt1.CutToClipboard;
end;
procedure TForm1.N14Click(Sender: TObject); // Копировать
begin
redt1.CopyToClipboard;
end;
procedure TForm1.N15Click(Sender: TObject); // Вставить
begin
redt1.PasteFromClipboard;
end;
procedure TForm1.N18Click(Sender: TObject); // Удалить
begin
redt1.ClearSelection;
end;
procedure TForm1.N17Click(Sender: TObject); // Выделить всё
begin
redt1.SelectAll;
end;
procedure TForm1.N19Click(Sender: TObject);
begin
dlgFind1.Execute;
end;
procedure TForm1.dlgFind1Find(Sender: TObject); // Найти
var
Buff,P,FT: PChar;
BuffLen: Word;
begin
with Sender as TFindDialog do
begin
GetMem(FT, Length(FindText) + 1);
StrPCopy(FT, FindText);
BuffLen:= redt1.GetTextLen + 1;
GetMem(Buff, BuffLen);
redt1.GetTextBuf(Buff, BuffLen);
P:= Buff + redt1.SelStart + redt1.SelLength;
P:= StrPos(P, FT);
if P=nil then MessageBeep(0)
else
begin
redt1.SelStart:= P - Buff;
redt1.SelLength:= Length(FindText);
end;
FreeMem(FT, Length(FindText) + 1);
FreeMem(Buff, BuffLen);
end;
end;
procedure TForm1.N20Click(Sender: TObject);
begin
dlgReplace1.Execute;
end;
procedure TForm1.dlgReplace1Find(Sender: TObject); // Найти чтобы заменить
begin
with Sender as TReplaceDialog do
while True do
begin
if redt1.SelText <> FindText then
dlgFind1Find(Sender);
if redt1.SelLength = 0 then Break;
redt1.SelText:= ReplaceText;
if not (frReplaceAll in Options) then Break;
end;
end;
procedure TForm1.dlgReplace1Replace(Sender: TObject); // Заменить
label 10;
begin
redt1.HideSelection:=true;
10:
if pos(dlgReplace1.FindText,redt1.Text)<>0 then
begin
redt1.SelStart:=pos(dlgReplace1.FindText,redt1.Text)-1;
redt1.SelLength:=Length(dlgReplace1.FindText);
redt1.SelText:=dlgReplace1.ReplaceText;
goto 10;
end;
redt1.HideSelection:=false;
end;
procedure TForm1.N3Click(Sender: TObject); // Создать
begin
redt1.Lines.Clear;
end;
procedure TForm1.N4Click(Sender: TObject); // Открыть
begin
if dlgOpen1.Execute then
begin
EditFile:=dlgOpen1.FileName;
redt1.Lines.LoadFromFile(EditFile);
Form1.Caption:='Документ - '+ExtractFileName(EditFile);
end;
end;
procedure TForm1.N6Click(Sender: TObject); // Сохранить
begin
if dlgSave1.Execute then
redt1.Lines.SaveToFile(EditFile);
if redt1.Modified then redt1.Modified:=false;
end;
procedure TForm1.N7Click(Sender: TObject); // Сохранить как
begin
if dlgSave1.Execute then
begin
EditFile:=dlgSave1.FileName;
redt1.Lines.SaveToFile(EditFile);
Form1.Caption:='Документ - '+ExtractFileName(EditFile);
if redt1.Modified then redt1.Modified:=false;
end;
end;
procedure TForm1.N32Click(Sender: TObject); // Настройка печати
begin
dlgPntSet1.Execute;
end;
procedure TForm1.N9Click(Sender: TObject); // Печать
var
Stroka:System.TextFile;
i:integer;
begin
if dlgPnt1.Execute then
begin
AssignPrn(Stroka);
Rewrite(Stroka);
Printer.Canvas.Font:=redt1.Font;
for i:=0 to redt1.Lines.Count-1 do
Writeln(Stroka,redt1.Lines[i]);
System.CloseFile(Stroka);
end;
end;
procedure TForm1.N23Click(Sender: TObject); // Шрифт
begin
if dlgFont1.Execute then redt1.Font:=dlgFont1.Font;
end;
procedure TForm1.N25Click(Sender: TObject); // Цвет фона
begin
if dlgColor1.Execute then redt1.Color:=dlgColor1.Color;
end;
end.Код:
/Шифрование Цезаря
function Cesar_Crypt(s:string):string;
const
SizeA = 33; //Размер алфавита
RusA = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'; //Алфавит
var i, P :integer;
temp:string;
begin
s:=AnsiLowerCase(s);
temp:='';
//удаление символов сообщения, не входящих в наш алфавит
for i := 1 to length(s) do if pos(s[i],RusA)<>0 then temp:=temp+s[i];
s:=temp;
for i:=1 to length(s) do
begin
P:=pos(s[i],RusA)+3;
if P>SizeA then P:=P-SizeA;
Result:=Result+RusA[P];
end;
end;
//Дешифрование Цезаря
function Cesar_DeCrypt(s:string):string;
const
SizeA = 33; //Размер алфавита
RusA = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'; //Алфавит
var i, P :integer;
temp:string;
begin
s:=AnsiLowerCase(s);
temp:='';
//удаление символов сообщения, не входящих в наш алфавит
for i := 1 to length(s) do if pos(s[i],RusA)<>0 then temp:=temp+s[i];
s:=temp;
for i:=1 to length(s) do
begin
P:=pos(s[i],RusA)-3;
if P<=0 then P:=P+SizeA;
Result:=Result+RusA[P];
end;
end; |
|
#2
|
|||
|
|||
|
Код:
function decode(s: string; code: integer): string; var t: integer; begin for t:=1 to length(s) do s[t]:=chr(ord(s[t]) xor code); result:=s; end; функция кодирует и декодирует вызывается так: Код:
decode(rezult,1); rezult это строковая переменная далее можно еще поставить функцию ReversString(rezult); которая позволит записать строку в обратном порядке ну можно прописать и так <Строковая переменная>:=ReversString(decode(rezult,1)); P.S. функцию не я придумывал нашол в нете где не помню уже иначе скинул бы ссылку но работает просто прекрасно, если я не ошибаюсь и это алгоритм цезаря правда без ReversString'a это уже я добавил так сказать свое немножко стандартной функцией делфи ![]() |
|
#3
|
|||
|
|||
|
Да еще следует добавить что в отличие от предложенного вами алгоритма шифрования текста данная функция шифрует любые символы из таблицы аски а не только русский алфавит даже знаки препинания шифрует
![]() |
|
#4
|
||||
|
||||
|
Ну что тут сказать...
кошмар... SawA, какое будет значение edit1.Text, если: PHP код:
И это не ш. Цезаря. |
|
#5
|
|||
|
|||
|
Цитата:
бес коментариев посмотри прогу она рабочая и работает все верно |
|
#6
|
|||
|
|||
|
а по поводу шифра цезаря я не утверждал что это шифр я его не знаю точно я говорю о шифровании вообще а пользователь задавший вопрос сказал например шифр цезаря а не именно шифр цезаря ему надо
|
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
|||
|
|||
|
Цитата:
различия между моим кодом chr(ord(s[t]) xor code); и вашим chr(ord('z') xor ord('z')); не видно никак? вы добавили дополнительно функцию ord зачем спрашивается? |