Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2012, 13:40   #1
Flaina
 
Регистрация: 09.02.2012
Сообщений: 4
По умолчанию Шифрование. Метод аффинных подстановок Цезаря.

Программа должна шифровать текст из текстового файла и выводить ответ в выходной текстовый файл. Пробелы должны учитываться.
В идеале:
Входной файл - Привет как дела
Выходной файл - ТХЭЛФЫ ГЕГ СФЖЕ
и назад - ПРИВЕТ КАК ДЕЛА
Проблема в расшифровке. Что бы я не делала, но, расшифровывая текст, он может написать "ПРИВЕТ ЧХЧ ТРЦА", путает буквы или не до конца расшифровывает текст, как в коде ниже.
Код прилагаю, при компиляции он пишет в выходной файл расшифровки "ПРИВЕТ"

Код:
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.
Спасибо за помощь!
Flaina вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аффинная система подстановок Цезаря Flaina Помощь студентам 0 09.02.2012 20:00
шифрование метод Цезаря MISHAIL Помощь студентам 5 05.02.2011 16:26
Шифрование методом Цезаря! Александра1000000 Общие вопросы C/C++ 10 07.06.2010 16:02
Аффинная система подстановок Цезаря Karyuudo Помощь студентам 12 10.02.2010 19:26
Шифрование текста по методу Цезаря с лозунгом (с ключевым словом) SASHA19 Помощь студентам 3 11.10.2009 15:18