Другие языки программирования и технологии

Шифр цезаря паскаль в чем ошибкаили что дописать?

Шифр цезаря на паскале, почему не выдает при дешифрации букву В с ключом 3 и 5 и дальше! что исправить?

 program SHIFR_CEZERYA; 
uses crt;
 var a,b,c:string;
 i,j,k,d,g:integer;
begin 
 clrscr;
  writeln('Шифрование? 1-да, 0-нет'); 
 readln(g);
  writeln('Исходный текст ');
  readln(a); 
 writeln('ключ'); 
 readln(d); 
 c:=''; //Результат
  b:='абвгдеёжзийклмнопрстуфхцчшщъыьэюя'; 
 for i:=1 to length(a) do //цикл
  for j:=1 to length(b) do 
  begin 
  If g=1 then k:=(j+d) mod 33 else k:=(j-d)mod 33;  
 if a[i]=b[j] then c:=c+b[k];
   If k>33 then k:=k-33 else k:=k+33;
   end;
  writeln(c);
  readkey;
 end.
Гораздо проще оперировать двумя строками:
первая — строка с алфавитом

вторая — строка со сдвинутыми буквами

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Тогда, для замены значений символов исходной строки при шифровании или дешифровке, достаточно получить позицию очередного символа в строке–алфавита и подставить символ из данной позиции второй строки.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

К примеру:

    const ABC = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'; { это исходный алфавит }

    …

    { подготовим новый алфавит сдвигом исходного на ключевое количество позиций Key }

    NewABC := Copy(ABC, 1+Key, Length(ABC));
NewABC := NewABC + Copy(ABC, 1, Length(ABC) - Length(NewABC));

    …

    { зашифруем строку }

    for N := 1 to Length(Str) do
      begin
        P := Pos(Str[N], ABC);
        if P > 0 then
          Str[N] := NewABC[P];
      end;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Аналогично при расшифровке.

Всё просто и красиво!

Александр Лазарев
Александр Лазарев
91 647
Лучший ответ
Если хочешь брать остатки от отрицательных чисел - добавляй модуль, чтобы получить положительное число. Формула:
"(x + n) mod n" или "((x mod n) + n) mod n"

В твоей программе проблема, с тем что mod возвращает значения от 0 до n-1, а тебе нужно как индексы в строке от 1 до n. Вот примерно накидал:

n := Length(b);
if g = 0 then d := n - d;
for i:=1 to length(a) do begin
j := Pos(a[i], b) - 1;
if j >= 0 then c := c + b[1 + ((j + d) mod n)];
end;

Таких проблем не будет если пользоваться функция Ord итд..
АI
Аzamat Iskaliyev
3 734