Программа должна шифровать текст из текстового файла и выводить ответ в выходной текстовый файл. Пробелы должны учитываться.
В идеале:
Входной файл - Привет как дела
Выходной файл - ТХЭЛФЫ ГЕГ СФЖЕ
и назад - ПРИВЕТ КАК ДЕЛА
Проблема в расшифровке. Что бы я не делала, но, расшифровывая текст, он может написать "ПРИВЕТ ЧХЧ ТРЦА", путает буквы или не до конца расшифровывает текст, как в коде ниже.
Код прилагаю, при компиляции он пишет в выходной файл расшифровки "ПРИВЕТ"
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Key1Edt: TEdit;
Key2Edt: TEdit;
Memo1: TMemo;
Memo2: TMemo;
KeyBtn: TButton;
OpenEdt: TEdit;
SaveEdt: TEdit;
SaveBtn: TButton;
OpenBtn: TButton;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
cipher: TButton;
decipher: TButton;
procedure KeyBtnClick(Sender: TObject);
procedure OpenBtnClick(Sender: TObject);
procedure SaveBtnClick(Sender: TObject);
procedure cipherClick(Sender: TObject);
procedure decipherClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
inFile, outFile : TextFile;
inString, outString : string;
Abc1, Abc2 : array [0..31] of char;
inpStr, outStr : array [0..255] of char;
implementation
{$R *.dfm}
procedure TForm1.KeyBtnClick(Sender: TObject);
var a, b, i, q, w :integer;
begin
Memo1.Text := '';
Memo2.Text := '';
a := StrToInt(Key1Edt.Text);
b := StrToInt(Key2Edt.Text);
for i := 0 to 31 do
begin
Abc1[i] := chr(i+192);
Memo1.Text := Memo1.Text + Abc1[i] + ' ';
end;
for i := 0 to 31 do
begin
q := a * i + b;
w := (q div 32) * 32;
Abc2[i] := chr(q - w + 192);
end;
for i := 0 to 31 do
Memo2.Text := Memo2.Text + Abc2[i] + ' ';
end;
procedure TForm1.OpenBtnClick(Sender: TObject);
begin
If OpenDialog.Execute Then OpenEdt.Text := OpenDialog.FileName;
end;
procedure TForm1.SaveBtnClick(Sender: TObject);
begin
If SaveDialog.Execute Then SaveEdt.Text := SaveDialog.FileName;
end;
function CharArrayToStr(c: array of char): string;
var
x: integer;
begin
result:=''; // blank string
for x:=high(c) downto 0 do
result:=c[x]+result;
end;
procedure TForm1.cipherClick(Sender: TObject);
var i,j,q : integer;
begin
AssignFile(inFile, OpenEdt.Text); //
AssignFile(outFile, SaveEdt.Text); //
// привязка файлов
Reset(inFile); //
Rewrite(outFile); //
Read(inFile,inString);
inString := AnsiUpperCase(inString);
StrPCopy(inpStr,inString);
for i := 0 to length(inpStr) do
begin
for j := 0 to 31 do
begin
if inpStr[i] = Abc1[j] then
outStr[i] := Abc2[j]; end;end;
outString := CharArrayToStr(outStr);
outString:=AnsiUpperCase(outString);
write(outFile,outString);
CloseFile(inFile);
CloseFile(outFile);
end;
procedure TForm1.decipherClick(Sender: TObject);
var i,j,q : integer;
begin
AssignFile(inFile, OpenEdt.Text); //
AssignFile(outFile, SaveEdt.Text); //
// привязка файлов
Reset(inFile); //
Rewrite(outFile); //
Read(inFile,inString);
inString := AnsiUpperCase(inString);
StrPCopy(inpStr,inString);
for i := 0 to length(inpStr) do
if inpStr[i] = ' ' then
write(outFile,' ')
else
for j := 0 to 31 do
begin
if inpStr[i] = Abc2[j] then
outStr[i] := Abc1[j];
end;
outString := CharArrayToStr(outStr);
write(outFile,outString);
CloseFile(inFile);
CloseFile(outFile);
end;
end.
Спасибо за помощь!