Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
2-1207833052
Снежинка
2008-04-10 17:10
2008.05.11
Запрос


2-1208109639
Shifr
2008-04-13 22:00
2008.05.11
Шифрование даных


15-1206644556
Andy BitOff
2008-03-27 22:02
2008.05.11
Алгоритмы искусственного интеллекта


2-1208168688
Новичек
2008-04-14 14:24
2008.05.11
Помогите с запросом к Paradox


15-1206529654
Галинка
2008-03-26 14:07
2008.05.11
Можно ли как то в моцилле предопределить размер шрифта?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский