Всем привет. Очень нужна ваша помощь. Реализовать нужно шифрование с помощью таблицы Виженера, при этом используя StringGrid, и 3 поля ввода (исходное слово, ключ, результат). Вообщем шифрование сделал, там вроде всё более менее ясно. И вот уже целый день сижу с дешифрованием, всё как-то не так работает. В чем проблема понять не могу
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) StringGrid1: TStringGrid; LabeledEdit1: TLabeledEdit; LabeledEdit2: TLabeledEdit; Button1: TButton; Button2: TButton; LabeledEdit3: TLabeledEdit; procedure StringGrid1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.StringGrid1Click(Sender: TObject); var I, J : integer; S : string; V : string; begin S := 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя'; for I := 0 to 32 do begin for J := 0 to 32 do begin StringGrid1.Cells[J, I] := S[J+1]; end; V := S[1]; delete( S, 1, 1 ); insert( V, S, 33 ); end; end;
function shifr( AKey : Integer ) : string; var Keyword, NewS : string; I, J, P, P2, L, K : integer; begin Form1.LabeledEdit2.Text := ''; Keyword := Form1.LabeledEdit3.Text; if AKey = 1 then begin {Шифрование} L := 1; for I := 1 to length( Form1.LabeledEdit1.Text ) do begin if Form1.LabeledEdit1.Text[I] <> ' ' then begin P := 0; P2 := 0; for J := 0 to 32 do begin if Form1.StringGrid1.Cells[0, J] = Form1.LabeledEdit1.Text[I] then P := J; if Form1.StringGrid1.Cells[J, 0] = Keyword[L] then P2 := J; end; Form1.LabeledEdit2.Text := Form1.LabeledEdit2.Text + Form1.StringGrid1.Cells[P2, P]; if L >= length( Keyword ) then L := 1 else L := L + 1; end; end; end else begin {Дешифрование} L := 1; for I := 1 to length( Form1.LabeledEdit1.Text ) do begin if Form1.LabeledEdit1.Text[I] <> ' ' then begin P := 0; P2 := 0; for J := 0 to 32 do begin if Form1.StringGrid1.Cells[0, J] = Form1.LabeledEdit1.Text[I] then begin P := J; for K := 0 to 32 do begin if Form1.StringGrid1.Cells[K, P] = Keyword[L] then P2 := K; end; end; end; Form1.LabeledEdit2.Text := Form1.LabeledEdit2.Text + Form1.StringGrid1.Cells[P2, 0]; if L >= length( Keyword ) then L := 1 else L := L + 1; end; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin shifr( 1 ); end;
procedure TForm1.Button2Click(Sender: TObject); begin shifr( 2 ); end;
end.
|
Прикладываю файл с исходниками, чтоб проще было посмотреть |