Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с заданием [D7, XP]


Shifr ©   (2008-04-14 20:29:00) 

Нужно реализовать кодирование тектса методом Цезаря.
Каждый символ заменяется символом сдвинутым на определеный шаг(ключ).
Вот моя прога только чето ни чего не заменятется.
Подсажите пожалуйста что не так


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Memo2: TMemo;
   Button1: TButton;
   Edit1: TEdit;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

 F: TFileStream;
 i,j: integer;
 N: integer;
 

 buf : array [0..512] of Char;
 buf2 : array [0..512] of Char;
 alf : array [0..25]  of Char = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T' ,'U','V','W','X','Y','Z');

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 N := 0;
 memo1.Clear;
 memo2.Clear;

 F := TFileStream.Create(edit1.Text,fmOpenReadWrite);
 N := F.Seek(0,soFromEnd);
 F.Free;

 F := TFileStream.Create(edit1.Text,fmOpenReadWrite);
 F.Seek(0,soFromCurrent);
 F.Read(buf,N);
 F.Free;

 for I := 0 to 256 do
   for j := 0 to 25 do
   if buf[i] = alf[j] then buf2[i] := buf[i];

  memo1.Lines.Add(buf);
  memo2.Lines.Add(buf2);

end;

end.


Servy   (2008-04-15 00:49:00) [1]

Код бредовый.

buf2[i] := alf[j-step];

При положительном step и присутствии в шифруемой последовательности буквы 'A' ты вылезешь за границы массива. При нулевом step смысл всех этих операций вообще не ясен. При отрицательном step ты вылезешь за границы при шифровании буквы ' '.

Зачем убивается и создается заного поток? Что будет, если размер шифруемого файла больше 513 байт? Почему цикл по I идет до 256, когда I - это индекс в массиве buf, максимальный индекс у которого 512, а реальных данных ты туда поместил ровно N байт?

Вывод: удалить _это_, выучить язык программирования, на котором пытаешься писать, понять алгоритм, который пытаешься реализовать, после чего задача станет элементарной.


Shifr   (2008-04-14 23:54:00) [2]

Как решить с пробелом ?


Shifr   (2008-04-14 21:25:00) [3]

AIK ©   (14.04.08 21:21) [4]

> if buf[i] = alf[j] then buf2[i] := buf[i+3];

А когда цикл дойдет до последних трех букв то тогда что делать?


Я же исправил Вот:

for I := 0 to 256 do
  for j := 0 to 26 do
  if (buf[i] = AnsiLowerCase(alf[j])) or (buf[i] = AnsiUpperCase(alf[j])) then
    buf2[i] := alf[j-step];


AIK   (2008-04-14 21:21:00) [4]


> if buf[i] = alf[j] then buf2[i] := buf[i+3];


А когда цикл дойдет до последних трех букв то тогда что делать?


Shifr   (2008-04-14 21:19:00) [5]

Все шифруется и дешифруется.
Добавил 26 -той  символ пробела.
Шифруется, почему то пробел заменется символом 's' ?
А при разшифровке получется что  пробел заменется символом 'p' ?
Разшифровал я просто отнимая шаг,  а не прибавляя.
Вот исходник что не так?

И что это означает:
       alf[i]:=chr(65+i);


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   Edit1: TEdit;
   Edit2: TEdit;
   GroupBox1: TGroupBox;
   Memo1: TMemo;
   Edit3: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   Button2: TButton;
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

 F: TFileStream;
 i,j: integer;
 N: integer;

 step : integer;

 buf : array [0..512] of Char;
 buf2 : array [0..512] of Char;
 alf : array [0..26]  of Char = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T' ,'U','V','W','X','Y','Z',' ');

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
 N := 0;
 memo1.Clear;
//  memo2.Clear;
 Step := strtoint(edit2.Text);

 F := TFileStream.Create(edit1.Text,fmOpenReadWrite);
 N := F.Seek(0,soFromEnd);
 F.Free;

 F := TFileStream.Create(edit1.Text,fmOpenReadWrite);
 F.Seek(0,soFromCurrent);
 F.Read(buf,N);
 F.Free;

 for I := 0 to 256 do
   for j := 0 to 26 do
   if (buf[i] = AnsiLowerCase(alf[j])) or (buf[i] = AnsiUpperCase(alf[j])) then
     buf2[i] := alf[j-step];

  memo1.Lines.Add(buf2);
  ShowMessage('Файл успешно зашифрован');

end;

end.


HF-Trade   (2008-04-14 21:04:00) [6]

alf : array [0..25] of char;
.....
for i:=0 to 25 do
alf[i]:=chr(65+i);


Shifr   (2008-04-14 20:31:00) [7]

Думал что тут

if buf[i] = alf[j] then buf2[i] := buf[i];

должно быть так

if buf[i] = alf[j] then buf2[i] := buf[i+3];

Но ничего не получилось.


Наверх

Титульная страница Поиск, карта сайта Написать письмо