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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2012, 21:53   #1
Rayline West
Новичок
Джуниор
 
Регистрация: 15.05.2012
Сообщений: 2
По умолчанию Шифрование методом перестановки

Задание такое:
Разработать Delphi-проект шифрования данных методом простой перестановки. Алфавит - латинские прописные буквы. Предусмотреть автоматическую передачу фокуса и очистку редакционных полей после выполнения программы. Выполнить также шифрование вручную для тестового примера:
Исходное слово - CONNECTION, ключ - 51342

То есть должно получиться следующее - ECNNONCIOT

Я написала код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button2: TButton;
    Button3: TButton;
    Label4: TLabel;
    Edit4: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var str, key:string;
    str2,s :string;
    k,i,j :integer;
begin
 str:=edit1.text;
 key:=edit2.text;
  for i:=1 to length(str) do  begin
   if (length(str)= length(key)) then
    str2:=str2 + str[strtoint(key[i])]
   else
   if (length(str)> length(key)) then  begin
    for j := 1 to (Length(str) div length(Key))  do  begin
     s:=s+key;
     end;
       str2:=str2 + str[strtoint(s[i])];
    end
   else
   if (length(str)< length(key))  then
    ShowMessage('Некорректное заполнение полей!');
  end;
 edit3.Text:=str2 ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Edit1.Clear; Edit2.Clear; Edit3.Clear;
 Edit4.Clear;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then
     Edit1.Text := '';
if not (key in ['A'..'Z']) then   begin
     key := #13;
end;
if key=#13 then
     Form1.ActiveControl:=Edit2;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then
     Edit2.Text := '';
if not (key in ['1'..'9']) then  begin
     key := #13;
end;
if key=#13 then
     Form1.ActiveControl:=Button1;
end;

end.
И проблема в том, что если мы идем по ветви
Код:
 if (length(str)> length(key)) then  begin
    for j := 1 to (Length(str) div length(Key))  do  begin
     s:=s+key;
     end;
       str2:=str2 + str[strtoint(s[i])];
    end
программа выдает не правильный результат, то есть для вышеприведенного примера она должна выдать - ECNNONCIOT, у меня выдает - ECNNOECNNO

Никак не пойму что нужно исправить в коде.
Заранее благодарна.
Rayline West вне форума Ответить с цитированием
Старый 15.05.2012, 22:13   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Код:
function encode(st,k:string):string;
var i,j:byte;
buf:string;
res:string;
begin
res:='';
while Length(k)<=Length(st) do  begin
buf:=Copy(st,1,Length(k));
delete(st,1,Length(k));
for I := 1 to length(k) do
res:=res+buf[strtoint(k[i])];
end;
if trim(st)<>'' then
begin
  while length(st)<Length(k) do
  st:=st+' ';
for I := 1 to length(k) do
res:=res+buf[strtoint(k[i])];
end;
while pos(' ',res)<>0  do delete(res,pos(' ',res),1);
result:=res;
end;
результат
Код:
s:='CONNECTION';key:='51342';
showmessage(encode(s,key));
Цитата:
ECNNONCIOT
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 15.05.2012 в 22:15.
Mad_Cat вне форума Ответить с цитированием
Старый 16.05.2012, 17:38   #3
Rayline West
Новичок
Джуниор
 
Регистрация: 15.05.2012
Сообщений: 2
По умолчанию

Спасибо большое!
Rayline West вне форума Ответить с цитированием
Старый 19.11.2012, 15:18   #4
ST@LKER
Пользователь
 
Регистрация: 25.10.2007
Сообщений: 38
По умолчанию

Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
Код:
function encode(st,k:string):string;
var i,j:byte;
buf:string;
res:string;
begin
res:='';
while Length(k)<=Length(st) do  begin
buf:=Copy(st,1,Length(k));
delete(st,1,Length(k));
for I := 1 to length(k) do
res:=res+buf[strtoint(k[i])];
end;
if trim(st)<>'' then
begin
  while length(st)<Length(k) do
  st:=st+' ';
for I := 1 to length(k) do
res:=res+buf[strtoint(k[i])];
end;
while pos(' ',res)<>0  do delete(res,pos(' ',res),1);
result:=res;
end;
результат
Код:
s:='CONNECTION';key:='51342';
showmessage(encode(s,key));
код работающий отлично, но как быть с пробелами?

Например, слова: абв абв
Ключ: 7654321
Результат: вбавба
а должно быть: вба вба

Последний раз редактировалось ST@LKER; 19.11.2012 в 15:20.
ST@LKER вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование методом гаммирования student_63 Безопасность, Шифрование 9 28.04.2012 17:36
Шифрование методом перестановок Sphex Фриланс 7 18.08.2010 14:06
Шифрование методом Цезаря! Александра1000000 Общие вопросы C/C++ 10 07.06.2010 16:02
Шифрование методом замещения Skytis Помощь студентам 3 25.05.2008 10:24
Шифрование методом сдвига Paul Hindenburg Общие вопросы Delphi 5 24.01.2008 08:30