Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.11;
Скачать: CL | DM;

Вниз

Помогите с заданием   Найти похожие ветки 

 
Shifr   (2008-04-14 20:29) [0]

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


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.



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

Думал что тут

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

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

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

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


 
HF-Trade ©   (2008-04-14 21:04) [2]

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


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

Все шифруется и дешифруется.
Добавил 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.



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


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


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


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

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];


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

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


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

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

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.05.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
15-1206607633
Ламо777
2008-03-27 11:47
2008.05.11
Apache&SSL - перенаправление


2-1207746625
FoxikM
2008-04-09 17:10
2008.05.11
Как закрыть порт на время.


11-1188820984
Max727
2007-09-03 16:03
2008.05.11
KOLmdvXLGrid


10-1145888035
Ling
2006-04-24 18:13
2008.05.11
Диаграммы в Excell


2-1207819934
Chorniy
2008-04-10 13:32
2008.05.11
Опять ReadProcessMemory :( теперь у всех процессов одни данные?