Форум: "Начинающим";
Текущий архив: 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