Вопрос задан 15.04.2025 в 22:18. Предмет Информатика. Спрашивает Муждабаева Эльзара.

Вот шифр цезаря на паскале но в чем заключаеться вопрос , в том что если в слове есть буква близкая к концу алфавита например я то прибавляя ключ(например 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. Корректное вычисление индекса после сдвига:
    Чтобы при сдвиге букв на заданный шаг не выходить за пределы алфавита, нужно после сдвига обрабатывать индексы, чтобы они оставались в пределах от 1 до 32 (для русского алфавита из 33 букв).

  2. Использование операции модуль для индекса:
    Если вы сдвигаете индекс на определённое количество символов, вам нужно будет использовать операцию деления по модулю. Это поможет "обернуть" индекс, если он выходит за пределы.

Исправленный код с учетом вашего запроса может выглядеть так:

pascal
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) mod 32; // сдвиг вправо if k <= 0 then // если индекс оказался 0 или отрицательным, делаем его положительным k := k + 32; if a[i] = b[j] then c := c + b[k]; end;

writeln(c); readkey; end.

Пояснение изменений:

  1. Модуль индекса:
    В строках с k := (j + d) mod 32 и k := (j - d) mod 32 происходит вычисление сдвига по индексу буквы в строке. Модуль 32 гарантирует, что индекс всегда будет в пределах от 0 до 31. Однако индексация в Pascal начинается с 1, поэтому добавляем условие:

    pascal
    if k <= 0 then k := k + 32;

    Это условие позволяет корректно работать с отрицательными значениями индекса, которые могут появляться после сдвига влево. Мы добавляем 32, чтобы индекс оставался в пределах допустимого диапазона (1-32).

  2. Переменная g:
    Вы задаете переменную g для выбора шифрования или дешифрования. Если g = 0, то выполняется сдвиг влево, а если g = 1, то сдвиг вправо.

  3. Алфавит:
    В переменной b хранится строка русского алфавита, которая используется для поиска индекса символа и его сдвига.

Пример работы программы:

  1. Если вы введете строку "привет" и ключ сдвига 3, то результат будет "сфйхг", так как каждая буква сдвигается вправо на 3 позиции.
  2. Если ключ отрицательный или вы хотите дешифровать, программа будет сдвигать буквы влево.

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

Похожие вопросы

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

Последние заданные вопросы в категории Информатика

Задать вопрос