Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2015, 01:22   #1
Luchfan12
Пользователь
 
Регистрация: 01.03.2014
Сообщений: 37
По умолчанию Работа с шифром Плейфера

У меня статическая матрица(то есть она как бы вшита и не изменяется).Нужно чтобы была динамическая матрица(5 на 5,с использованием только латинского алфавита).Допустим я ввожу ключ "hello world".Матрица в этом случае должна выглядеть так:
HELOW
WRDAB
CFGIJ
KMNPQ
STUVX
Как это реализовать?
Код:
unit U_1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Button1: TButton;
    Button2: TButton;
    Label4: TLabel;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
A:array[1..5,1..5] of char = (('L','A','R','K','X'),
                              ('Z','G','D','Y','B'),
                              ('Q','N','M','H','T'),
                              ('C','O','I','V','E'),
                              ('P','U','F','S','W')); //Ключевая матрица
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
ir,i,j,n,k:integer;
tabi,tabj,findi,findj:1..5;
begin
Memo1.Text:=AnsiUpperCase(Memo1.Text); // Делаем буквы заглавные в первом поле
Memo2.Text:=Memo1.Text; // Делаем буквы заглавные во втором поле
for ir:=0 to Memo1.Lines.Count do begin
s:='';
n:=length(Memo1.Lines[ir]);
for i:=1 to n do
if (Memo1.Lines[ir][i]=Memo1.Lines[ir][i+1]) and
(not (Memo1.Lines[ir][i] in ['0','1','2','3','4','5','6','7','8','9']))
then
s:=s+Memo1.Lines[ir][i]+'I' // Во второй строке слово будет на 1 символ больше
else
s:=s+Memo1.Lines[ir][i];
n:=0;
for i:=1 to length(s) do
if not (Memo1.Lines[ir][i] in ['0','1','2','3','4','5','6','7','8','9']) then
inc(n);
if n mod 2<>0 then  // Если кол-во букв не кратно 2
s:=s+'I';
Memo1.Lines[ir]:=s;
i:=1;
n:=length(s);
s:='';
while i<=n do begin
k:=0;
if (Memo1.Lines[ir][i] in ['0','1','2','3','4','5','6','7','8','9']) then
begin
s:=s+Memo1.Lines[ir][i];
i:=i+1
end
else
begin
for tabi:=1 to 5 do
for tabj:=1 to 5 do
if Memo1.Lines[ir][i]=a[tabi,tabj] then begin
//Ищем по строкам
for findj:=1 to 5 do
if Memo1.Lines[ir][i+1]=a[tabi,findj] then
begin
if tabj+1=6 then
s:=s+a[tabi,1]
else
s:=s+a[tabi,tabj+1];
if findj+1=6 then
s:=s+a[tabi,1]
else
s:=s+a[tabi,findj+1];
k:=k+1
end;
//Ищем по столбцам
if k=0 then
for findi:=1 to 5 do
if Memo1.Lines[ir][i+1]=a[findi,tabj] then
begin
if tabi+1=6 then
s:=s+a[1,tabj]
else
s:=s+a[tabi+1,tabj];
if findi+1=6 then
s:=s+a[1,tabj]
else
s:=s+a[findi+1,tabj];
k:=k+1
end;
//В случае если нет символов
if k=0 then
for findi:=1 to 5 do
for findj:=1 to 5 do
if Memo1.Lines[ir][i+1]=a[findi,findj] then
s:=s+a[findi,tabj]+a[tabi,findj]
end;
i:=i+2;
end;
end;
Memo1.Lines[ir]:=s;
end;
s:=Memo1.Text;
Memo1.Text:=Memo2.Text;
Memo2.Text:=s;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
s:string;
ir,i,j,n,k:integer;
tabi,tabj,findi,findj:1..5;
begin
Memo3.Clear;
Memo3.Text:=Memo2.Text;
for ir:=0 to Memo2.Lines.Count do begin
s:='';
n:=length(Memo2.Lines[ir]);
i:=1;
while i<=n do begin
k:=0;
if (Memo2.Lines[ir][i] in ['0','1','2','3','4','5','6','7','8','9']) then
begin
s:=s+Memo2.Lines[ir][i];
i:=i+1
end
else
begin
for tabi:=1 to 5 do
for tabj:=1 to 5 do
if Memo2.Lines[ir][i]=a[tabi,tabj] then begin
//Ищем по строкам
for findj:=1 to 5 do
if Memo2.Lines[ir][i+1]=a[tabi,findj] then
begin
if tabj-1=0 then
s:=s+a[tabi,5]
else
s:=s+a[tabi,tabj-1];
if findj-1=0 then
s:=s+a[tabi,5]
else
s:=s+a[tabi,findj-1];
k:=k+1
end;
//Ищем по столбцам
if k=0 then
for findi:=1 to 5 do
if Memo2.Lines[ir][i+1]=a[findi,tabj] then
begin
if tabi-1=0 then
s:=s+a[5,tabj]
else
s:=s+a[tabi-1,tabj];
if findi-1=0 then
s:=s+a[5,tabj]
else
s:=s+a[findi-1,tabj];
k:=k+1
end;
//В случае если нигде нет
if k=0 then
for findi:=1 to 5 do
for findj:=1 to 5 do
if Memo2.Lines[ir][i+1]=a[findi,findj] then
s:=s+a[findi,tabj]+a[tabi,findj]
end;
i:=i+2;
end;
end;
n:=length(s);
Memo2.Lines[ir]:='';
for i:=1 to n do
if s[i]<>'I' then
Memo2.Lines[ir]:=Memo2.Lines[ir]+s[i];
end;
s:=Memo2.Text;
Memo2.Text:=Memo3.Text;
Memo3.Text:=s;
end;
 
 
procedure TForm1.FormCreate(Sender: TObject);
var
i,j:byte;
begin
Memo1.Text:='';
Memo2.Text:='';
Memo3.Text:='';
//Заполняем матрицу размером 5 на 5
for i := 0 to 4 do
for j := 0 to 4 do
StringGrid1.Cells[i,j]:=A[i+1,j+1];
end;
end.
Вложения
Тип файла: rar Lab_1.rar (491.5 Кб, 12 просмотров)
Luchfan12 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Плейфера SKyzZz C# (си шарп) 2 18.09.2014 15:43
Проблема с Шифром Цезаря adds Помощь студентам 4 07.09.2011 20:16
Шифр Плейфера Kadett Свободное общение 5 11.08.2010 14:22
Помогите с обратным шифром ара Помощь студентам 2 24.03.2009 09:32
Помогите с шифром smayluk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 20.11.2007 18:20