Шифр цезаря на паскале, почему не выдает при дешифрации букву В с ключом 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;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Аналогично при расшифровке.
Всё просто и красиво!

первая — строка с алфавитом
вторая — строка со сдвинутыми буквами
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Тогда, для замены значений символов исходной строки при шифровании или дешифровке, достаточно получить позицию очередного символа в строке–алфавита и подставить символ из данной позиции второй строки.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
К примеру:
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;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Аналогично при расшифровке.
Всё просто и красиво!

Если хочешь брать остатки от отрицательных чисел - добавляй модуль, чтобы получить положительное число. Формула:
"(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 итд..
"(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 итд..
Похожие вопросы
- помогите написать программу в Турбо Паскале, Шифр цезаря,с сдвигом на три шага!!!!
- помогите пожалуйста шифр цезаря
- Расшифруйте шифр Цезаря код 8
- Помогите дописать прогу на паскале
- Дописать код на паскале.
- Люди добрые извиняюсь за тупой и простой вопрос по паскалю но всё же помогите прогу дописать
- ПРОШУ ДОПИСАТЬ ПРОГРАМУ ПО ПАСКАЛЮ, С меня 10-ка
- Ребят помогите дописать прогу в паскале абс
- Аналог ассоциативного массива в Паскале.
- Я внутри написал, что я знаю про паскаль не то что решать и все такое а так теоретический в общем, смысл проги, я прав?