
Вот шифр цезаря на паскале но в чем заключаеться вопрос , в том что если в слове есть буква близкая к концу алфавита например я то прибавляя ключ(например 3) он не может перескочить к началу алфавита! помогите пожалуйста!
program z1;
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=0 then k:=(j-d) mod 32 else k:=(j+d);
if a[i]=b[j] then c:=c+b[k];
end;
writeln(c);
readkey;
end.
Ответы на вопрос

Проблема, которую вы описываете, заключается в том, что при шифровании с использованием шифра Цезаря для букв в конце алфавита (например, буквы "и", "я") результат может выйти за пределы алфавита. Чтобы решить эту проблему, необходимо корректно обрабатывать такие случаи и делать так, чтобы индекс не выходил за границы допустимых значений.
Ваш код не обрабатывает ситуацию, когда значение индекса выходит за пределы допустимого диапазона, особенно в случае с шифрованием в сторону конца алфавита (то есть если буква сдвигается на 3, например, и выходит за пределы "я").
Рассмотрим, как можно исправить код:
Корректное вычисление индекса после сдвига:
Чтобы при сдвиге букв на заданный шаг не выходить за пределы алфавита, нужно после сдвига обрабатывать индексы, чтобы они оставались в пределах от 1 до 32 (для русского алфавита из 33 букв).Использование операции модуль для индекса:
Если вы сдвигаете индекс на определённое количество символов, вам нужно будет использовать операцию деления по модулю. Это поможет "обернуть" индекс, если он выходит за пределы.
Исправленный код с учетом вашего запроса может выглядеть так:
Пояснение изменений:
Модуль индекса:
В строках сk := (j + d) mod 32
иk := (j - d) mod 32
происходит вычисление сдвига по индексу буквы в строке. Модуль 32 гарантирует, что индекс всегда будет в пределах от 0 до 31. Однако индексация в Pascal начинается с 1, поэтому добавляем условие:Это условие позволяет корректно работать с отрицательными значениями индекса, которые могут появляться после сдвига влево. Мы добавляем 32, чтобы индекс оставался в пределах допустимого диапазона (1-32).
Переменная
g
:
Вы задаете переменнуюg
для выбора шифрования или дешифрования. Еслиg = 0
, то выполняется сдвиг влево, а еслиg = 1
, то сдвиг вправо.Алфавит:
В переменнойb
хранится строка русского алфавита, которая используется для поиска индекса символа и его сдвига.
Пример работы программы:
- Если вы введете строку
"привет"
и ключ сдвига3
, то результат будет"сфйхг"
, так как каждая буква сдвигается вправо на 3 позиции. - Если ключ отрицательный или вы хотите дешифровать, программа будет сдвигать буквы влево.
Таким образом, теперь программа корректно обрабатывает все буквы, включая те, которые находятся в конце алфавита.
Похожие вопросы









Топ вопросов за вчера в категории Информатика









Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili