Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 1
Регистрация: 28.11.2015
Сообщений: 28

Как изменить тип ключа в шифре цезаря с числового на буквенный(Ключове слово), в данной программе

20.02.2016, 16:27. Показов 1840. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
К примеру если я введу:
ключ: AAB
строку: SIFRUJI SIFRU
зашифрованный текст получится: TJHSVLJ TKGSW
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
const CKey = 3;
 
function Encrypt(arg: char): char;
var x: integer;
begin
x:= Ord(arg)+ CKey;
if x>255 then x:= x-256+32;
Encrypt:= Chr(x);
end;
 
function Decrypt(arg: char): char;
var x: integer;
begin
x:= Ord(arg)- CKey;
if x<32 then x:= x+256-32;
Decrypt:= Chr(x);
end;
 
procedure EncryptStr(var arg: string);
var k: integer;
begin
for k:=1 to Length(arg) do
arg[k]:= Encrypt(arg[k]);
end;
 
procedure DecryptStr(var arg: string);
var k: integer;
begin
for k:=1 to Length(arg) do
arg[k]:= Decrypt(arg[k]);
end;
 
var S: string;
Oper: integer;
begin
repeat
Write('Введите строку: '); Readln(S);
Writeln('Укажите операцию: 1– шифровать,’+’ 2– расшифровать,’+’ Прочие – выход');
Readln(Oper);
case Oper of
1: EncryptStr(S);
2: DecryptStr(S);
else Break;
end;
Writeln(S); 
until false;
end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2016, 16:27
Ответы с готовыми решениями:

Отображение русских букв в шифре Цезаря и шифре Атбаш
Доброго времени суток. Нужна помощь в доработке приложения по шифрованию и дешифрование некой сточки на русском языке. У меня получается...

Как учесть пробелы в шифре Цезаря?
Как учесть пробелы. Шифр Цезаря. Помогите пожалуйста. Никак не могу понять. string alfavit = &quot;1234567890&quot;; ...

Шифр Цезаря: Как сделать сортировку в шифре, чтобы дешифратор выдал единственно верное решение
Люди, как сделать сортировку в шифре, чтобы дешифратор выдал единственно верное решение Нужно как то по этой библиотеке прогнать... ...

15
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
20.02.2016, 21:51
Цитата Сообщение от Pascal2015 Посмотреть сообщение
К примеру если я введу:
Цитата Сообщение от Pascal2015 Посмотреть сообщение
зашифрованный текст получится: TJHSVLJ TKGSW
из чего это следует?

Добавлено через 4 часа 12 минут
В общем, проще переписать программу.
0
1 / 1 / 1
Регистрация: 28.11.2015
Сообщений: 28
20.02.2016, 22:12  [ТС]
Текст шифруется путем перемещения букв алфавита. Ключ это слово, состоящее из букв 'A' - 'Z',
'A' представляет смещение 1 пункт , 'B' означает сдвиг 2 буквы и т.д., 'Z' представляет собой смещение 26 букв. Сдвиг циклический, после буквы Z снова следуют буквы А.
0
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
20.02.2016, 22:38
Лучший ответ Сообщение было отмечено Pascal2015 как решение

Решение

Текст шифруется путем перемещения букв алфавита. Ключ это слово, состоящее из букв 'A' - 'Z',
'A' представляет смещение 1 пункт , 'B' означает сдвиг 2 букв и т.д., 'Z' представляет собой смещение 26 букв. Сдвиг циклический, после буквы Z снова следуют буквы А.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
const
  C = 64;
 
var
  S, key: string;
  Oper: integer;
 
function charCrypt(arg: char; z: byte): char;
var
  x: integer;
begin
  case Oper of
    1: x := Ord(arg) + Ord(key[z]) - c;
    2: x := Ord(arg) - Ord(key[z]) + c;      
  end;
  charCrypt := Chr(x);
end;
 
procedure Crypto(var arg: string);
var
  k, ik: integer;
begin
  ik := 1;
  for k := 1 to Length(arg) do
    case arg[k] of 
      #65..#90:
        begin
          arg[k] := charCrypt(arg[k], (ik - 1) mod length(key) + 1 );
          ik := ik + 1;
        end;
    else  arg[k] := s[k];
    end;   
end;
 
begin
  repeat
    Write('Введите строку: ');Readln(S);
    Write('Введите ключ: ');Readln(key);
    Writeln('Укажите операцию: 1– шифровать,  2– расшифровать, Прочие – выход');
    Readln(Oper);
    case Oper of
      1, 2: Crypto(S);
    else Break;
    end;
    Writeln(S); 
  until true;
end.
2
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
21.02.2016, 05:20
capricornus CF, отлично.
Вот только использовать впеременшку глобальные переменные с параметрами - некузявно.
А в остальном - супер!
0
21.02.2016, 09:56

Не по теме:

Sergio Leone, не придумал ничего лучше как использовать глобальные, показалось что куча параметров в передаче тоже не красиво. Благо что oper не меняется ни как.

0
21.02.2016, 10:29

Не по теме:

capricornus CF, понимаю, но я бы лично предпочёл большую кучу параметров, чем использовать глобальные.
Но, тем не менее, я тебя прекрасно понимаю :)
Главное, что задача решена и решана правильно, TC счастлив, а остальное - ерунда и понты! :)

0
1 / 1 / 1
Регистрация: 28.11.2015
Сообщений: 28
21.02.2016, 15:52  [ТС]
Как изменить 1, 2 в case Oper of на sifrovat и desifrovat?

Добавлено через 19 минут
При каждой попытке изменить пишет требуется константное выражение или sifrova или desifrovat неявляется меткой
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
21.02.2016, 18:19
capricornus CF,
все много проще
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure Crypt(var s: String; key: String; Encode: Boolean);
var i: Integer;
begin
  for i:=1 to Length(key) do key[i]:=Chr(Ord(UpCase(key[i]))-Ord('A')+1);
  if Encode
  then for i:=1 to Length(s) do Inc(s[i],Ord(key[(i-1) mod Length(key)+1]))
  else for i:=1 to Length(s) do Dec(s[i],Ord(key[(i-1) mod Length(key)+1]))
end;
var
  s, k: String;
  o: Char;
begin
  Write('Строка: '); ReadLn(s);
  Write('Ключ: '); ReadLn(k);
  Write('Операция: 1–зашифровать,  2–расшифровать, иначе – выход: ');
  ReadLn(o);
  if o in ['1','2'] then begin
    Crypt(s,k,o='1');
    WriteLn('Результат: ',s); 
  end;
end.
Добавлено через 7 минут
Sergio Leone,
никак не понты.
0
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
21.02.2016, 18:44
bormant, а если по условию? У вас кодирует то не так как требуется.

Добавлено через 15 минут
Pascal2015, Не понимаю, зачем
Цитата Сообщение от Pascal2015 Посмотреть сообщение
Как изменить 1, 2 в case Oper of на sifrovat и desifrovat?
, для меня это видится как усложнение, но ... может так и лучше:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const
  C = 64;
 
type
  select = (shifrovat, deshifrovat);
 
var
  S, key: string;
  Oper: select;
  Z: integer;
 
function charCrypt(arg: char; z: byte): char;
var
  x: integer;
begin
  case Oper of
    shifrovat:   x := Ord(arg) + Ord(key[z]) - c;
    deshifrovat: x := Ord(arg) - Ord(key[z]) + c;      
  end;
  charCrypt := Chr(x);
end;
 
procedure Crypto(var arg: string);
var
  k, ik: integer;
begin
  ik := 1;
  for k := 1 to Length(arg) do
    case arg[k] of 
      #65..#90:
        begin
          arg[k] := charCrypt(arg[k], (ik - 1) mod length(key) + 1 );
          ik := ik + 1;
        end;
    else  arg[k] := s[k];
    end;   
end;
 
begin
  repeat
    Write('Введите строку: ');Readln(S);
    Write('Введите ключ: ');Readln(key);
    Writeln('Укажите операцию: 1– шифровать,  2– расшифровать, Прочие – выход');
    Readln(Z);
    if      Z=1 then Oper:=shifrovat 
    else if Z=2 then Oper:=deshifrovat  
    else             Break;
    Crypto(S);  
    Writeln(S); 
  until false;
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
21.02.2016, 18:50
capricornus CF,
от вашего отличается позиционированием ключа по всем символам, а не по только кодируемым.
Оба варианта содержат ошибку в виде выхода за алфавит.
Поправить несложно.
0
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
21.02.2016, 18:51
В моем пример входной и выходной вариант строки кодируется и декодируется в обе стороны, в чем ошибка?
О, что то не так. Щас поправлю.
0
1 / 1 / 1
Регистрация: 28.11.2015
Сообщений: 28
21.02.2016, 19:25  [ТС]
при shifrovat или deshifrovat Ошибка времени выполнения: Входная строка имела неверный формат.
0
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
21.02.2016, 19:29
Теперь выхода за пределы A..Z нет, при условии , что шифрует теми же A..Z :
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const
  C = 65;
 
type
  select = (shifrovat, deshifrovat);
 
var
  S, key: string;
  Oper: select;
  Z: integer;
 
function charCrypt(arg: char; z: byte): char;
var
  x: integer;
begin
  case Oper of
    shifrovat:     x := (Ord(arg) + Ord(key[z])-129) mod 26+ c;
    deshifrovat: x := (Ord(arg) - Ord(key[z])+129) mod 26 + c;      
  end;
  charCrypt := Chr(x);
end;
 
procedure Crypto(var arg: string);
var
  k, ik: integer;
begin
  ik := 1;
  for k := 1 to Length(arg) do
    case arg[k] of 
      #65..#90:
        begin
          arg[k] := charCrypt(arg[k], (ik - 1) mod length(key) + 1 );
          ik := ik + 1;
        end;
    else  arg[k] := s[k];
    end;   
end;
 
begin
  repeat
    Write('Введите строку: ');Readln(S);
    Write('Введите ключ: ');Readln(key);
    Writeln('Укажите операцию: 1– шифровать,  2– расшифровать, Прочие – выход');
    Readln(Z);
    if      Z=1 then Oper:=shifrovat 
    else if Z=2 then Oper:=deshifrovat  
    else             Break;
    Crypto(S);
    Writeln(S); 
  until false;
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
21.02.2016, 20:09
capricornus CF,
говорю же, все проще:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure Crypt(var s: String; k: String; Encode: Boolean);
var i, j, p: Integer;
begin
  j:=0; p:=-1+2*Ord(Encode);
  for i:=1 to Length(k) do Dec(k[i],Ord('A')-1);
  for i:=1 to Length(s) do
    if s[i] in ['A'..'Z'] then begin
      Inc(s[i],p*(Ord(k[j mod Length(k)+1])));
      if not (s[i] in ['A'..'Z']) then Dec(s[i],p*(Ord('Z')-Ord('A')+1));
      Inc(j);
    end;
end;
var
  s, k: String;
  o: Char;
begin
  Write('Строка: '); ReadLn(s);
  Write('Ключ: '); ReadLn(k);
  Write('Операция: 1–зашифровать,  2–расшифровать, иначе – выход: ');
  ReadLn(o);
  if o in ['1','2'] then begin
    Crypt(s,k,o='1');
    WriteLn('Результат: ',s); 
  end;
end.
другой вариант:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure Crypt(var s: String; k: String; Encode: Boolean);
var i, j, p: Integer;
begin
  j:=0; p:=-1+2*Ord(Encode);
  for i:=1 to Length(k) do Dec(k[i],Ord('A')-1);
  for i:=1 to Length(s) do
    if s[i] in ['A'..'Z'] then begin
      s[i]:=Chr(Ord('A')+
        (Ord('A')+Ord(s[i])+p*(Ord(k[j mod Length(k)+1])))
        mod (Ord('Z')-Ord('A')+1));
      Inc(j);
    end;
end;
Добавлено через 19 минут
И вариант для произвольных алфавитов:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure Crypt(var s: String; k: String; Encode: Boolean);
const ABC: String[62] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  {'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'};
var i, j, p: Integer;
begin
  j:=0; p:=-1+2*Ord(Encode);
  for i:=1 to Length(k) do Dec(k[i],Ord('A')-1);
  for i:=1 to Length(s) do begin
    j:=Pos(s[i],ABC);
    if j>0 then
      s[i]:=ABC[(j-1+Length(ABC)+p*(Ord(k[j mod Length(k)+1]))) mod Length(ABC)+1];
      Inc(j);
    end;
end;
1
318 / 208 / 162
Регистрация: 08.12.2015
Сообщений: 863
21.02.2016, 21:36
Pascal2015,
Цитата Сообщение от Pascal2015 Посмотреть сообщение
при shifrovat или deshifrovat Ошибка времени выполнения: Входная строка имела неверный формат.
Цитата Сообщение от capricornus CF Посмотреть сообщение
Как изменить 1, 2 в case Oper of на sifrovat и desifrovat?
все так же вводите 1 или 2 или что то еще

Добавлено через 14 минут
Pascal2015, если вам нужно руками ввести на латинице, то предупреждаю, это не лучшая идея, разве что только преподаватель требует. Лучшее решение в теме у bormant.
Код по вашему вопросу:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
const
  C = 65;
var
  S, key: string;
  Oper: string;
  
function charCrypt(arg: char; z: byte): char;
var
  x: integer;
begin
  case Oper of
    'shifrovat':     x := (Ord(arg) + Ord(key[z])-129) mod 26+ c;
    'deshifrovat': x := (Ord(arg) - Ord(key[z])+129) mod 26 + c;      
  end;
  charCrypt := Chr(x);
end;
 
procedure Crypto(var arg: string);
var
  k, ik: integer;
begin
  ik := 1;
  for k := 1 to Length(arg) do
    case arg[k] of 
      #65..#90:
        begin
          arg[k] := charCrypt(arg[k], (ik - 1) mod length(key) + 1 );
          ik := ik + 1;
        end;
    else  arg[k] := s[k];
    end;   
end;
 
begin
  repeat
    Write('Введите строку: ');Readln(S);
    Write('Введите ключ: ');Readln(key);
    Writeln('Укажите операцию: shifrovat, deshifrovat, Прочее – выход');
    Readln(Oper);
    case  Oper of
     'shifrovat','deshifrovat' :  Crypto(S);
      else  Break;   
      end;
    Writeln(S); 
  until false;
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.02.2016, 21:36
Помогаю со студенческими работами здесь

Баг в шифре Цезаря
Задача: Реализовать на С# алгоритмы шифрования и расшифрования системы Цезаря. Баг в том, что если я ввожу текст &quot;ЯЯЯЯ&quot; или...

Абстрактный тип данных (С++). Как именно она реализуется в данной программе
Здравствуйте. Есть программа, преподаватель при защите работы спрашивает, что такое абстрактный тип данных, в ответ слышит (абстрактный тип...

Абстрактный тип данных (С++). Как именно она реализуется в данной программе
Здравствуйте. Есть программа, преподаватель при защите работы спрашивает, что такое абстрактный тип данных, в ответ слышит (абстрактный тип...

Перевод из числового формата в буквенный
Помогите !!!! это наверняка тут уже промелькало ..... мне нужно , чтоб числа переводились в слова например , 1999 рез-т : одна...

Как расшифровать шифр Цезаря без ключа, но не перебором
Всем доброго времени суток =) Интересует вопрос - как расшифровать шифр Цезаря без ключа, но не перебором?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru