
Новичок
Профиль
Группа: Участник
Сообщений: 26
Регистрация: 17.3.2007
Где: Мелитополь
Репутация: нет Всего: нет
|
Помогите найти ошибку,ибо я уже окончательно в тупике. В общем нужно в одной программе с помошью четырёхбуквенного ключа методом Вижинера зашифровать и расшифровать текст. Дешифровка у меня работает, но вот само шифрование... короче, проблему укажу непосредственно в коде. Помогите пожалуйста!: Код | type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Edit1: TEdit; Memo2: TMemo; Button3: TButton; Button2: TButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; ListBox1: TListBox; sg1: TStringGrid; Button4: TButton; Memo3: TMemo; Memo4: TMemo; Edit2: TEdit; Button5: TButton; Button6: TButton; Button7: TButton; OpenDialog2: TOpenDialog; SaveDialog2: TSaveDialog; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button5Click(Sender: TObject);
private { Private declarations } public { Public declarations } end;
var Form1: TForm1; alp: array [0..31] of char =('А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л', 'М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч', 'Ш','Щ','Ы','Ь','Э','Ю','Я',' ');
implementation
{$R *.dfm}
function TakeNum(a: char): integer; //фунукция получения номера var i: integer; begin Result:=-1; for i:=0 to 31 do if a=alp[i] then begin result:=i; break; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.InitialDir:=ExtractFilePath(Application.ExeName); OpenDialog1.Execute; if FileExists(OpenDialog1.FileName) then Memo1.Lines.LoadFromFile(OpenDialog1.FileName); end;
procedure TForm1.Button3Click(Sender: TObject); begin SaveDialog1.InitialDir:=ExtractFilePath(Application.ExeName); SaveDialog1.Execute; if Length(SaveDialog1.FileName)>0 then Memo2.Lines.SaveToFile(SaveDialog1.FileName); end;
procedure TForm1.Button2Click(Sender: TObject); var i,j,k: integer; key,str: string; begin key:=Edit1.Text; k:=1; Memo2.Clear; ListBox1.Clear; for j:=0 to Memo1.Lines.Count-1 do begin k:=1; str:=Memo1.Lines[j]; for i:=1 to Length(str) do begin ListBox1.Items.Add(str[i]+'('+IntToStr(TakeNum(str[i]))+') - '+key[k]+'('+IntToStr(TakeNum(key[k]))+') = '+IntToStr((TakeNum(str[i])+(32-TakeNum(key[k]))) mod 32)+' |'+alp[((TakeNum(str[i])+(32-TakeNum(key[k]))) mod 32)]+'|'); str[i]:=alp[((TakeNum(str[i])+(32-TakeNum(key[k]))) mod 32)]; if k<Length(key) then Inc(k) else k:=1; end; Memo2.Lines.Add(str); end; end;
procedure TForm1.Button4Click(Sender: TObject); var i,j,max, c: integer; s: array [0..31] of integer; str: string; begin for c:=1 to 4 do begin for i:=0 to 31 do s[i]:=0;
for j:=0 to Memo1.Lines.Count-1 do begin str:=Memo1.Lines[j]; for i:=1 to Length(str) do begin if c=4 then begin if ((i mod 4) = 0) then s[TakeNum(str[i])]:=s[TakeNum(str[i])]+1; end else if ((i mod 4) = c) then s[TakeNum(str[i])]:=s[TakeNum(str[i])]+1; end; end;
// showmessage('c='+IntToStr(c));
max:=s[0]; j:=0; for i:=0 to 31 do if (s[i]>max) then begin max:=s[i]; j:=i; end;
ListBox1.Clear; for i:=0 to 31 do ListBox1.Items.Add(alp[i]+' '+IntToStr(s[i])); str:=''; for i:=0 to 31 do str:=str+(alp[i]+' '+IntToStr(s[i]))+#13#10; // showmessage(str); str:=alp[(j+(32-TakeNum(' ')) mod 32)]; sg1.Cells[c-1,0]:=str; end;
end;
procedure TForm1.Button6Click(Sender: TObject); begin // OpenDialog2.InitialDir:=ExtractFilePath(Application.ExeName); OpenDialog2.Execute; if FileExists(OpenDialog2.FileName) then Memo3.Lines.LoadFromFile(OpenDialog2.FileName); end;
procedure TForm1.Button7Click(Sender: TObject); begin //SaveDialog2.InitialDir:=ExtractFilePath(Application.ExeName); SaveDialog2.Execute; if Length(SaveDialog2.FileName)>0 then Memo4.Lines.SaveToFile(SaveDialog2.FileName); end;
procedure TForm1.Button5Click(Sender: TObject); //функция шифрования! var i,j,tt,k,t1,t2: integer; key,str,STR1: string; begin key:=Edit2.Text; k:=0; Memo4.Clear; for j:=0 to Memo3.Lines.Count-1 do begin str:=Memo3.Lines[j]; str1:=''; K:=0; for i:=1 to Length(str) do begin str1[i]:=alp[(TakeNum(str[i])+TakeNum(key[k+1]))mod 32]; //в общем тут и главные трабл. Почему-то строка невозвращает никаких значений. Ни номера буквы, ни изменного, ни вообще ничего. Я в тупике. Эта же функция в обратном порядке спокойно дешифрует тот же текст..... k:=(k+1) mod 4; end; Memo4.Lines.Add(str1); end; end;
end.
|
|