![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с заданием [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];
Но ничего не получилось.