Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2012, 13:37   #1
Lilen
Пользователь
 
Регистрация: 04.10.2012
Сообщений: 20
По умолчанию шифр цезаря

написать две программы, первая - сдвигает каждый символ текста на введенное количество символов по русскому алфавиту, вторая - дешифрует текст в исходное состояние
вот код 1 программы: {не работает...почему????}
Код:
program anslovo22;
var alf,anslovo,slovo:string;
    i,n,k,p:integer;
BEGIN
writeln('введите количество сдвигов');
readln(n);
writeln('введите текст');
readln(anslovo);
alf:='абвгдежзийклмнопрстуфхцчшщъыьэюя ';
 for i:=1 to length(slovo) do
   begin
     for k:=1 to length(alf) do
       if slovo[i]=alf[k] then p:=(k+n) mod 34;
                               anslovo:=alf[p];

   end;
 writeln('зашифрованный текст=',anslovo);
 readln;
END.

Последний раз редактировалось Stilet; 02.12.2012 в 14:02.
Lilen вне форума Ответить с цитированием
Старый 02.12.2012, 14:16   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
var
  lalp: integer;

const
  alp = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' +
    'АБВГДЕЁЖЗИЙКЛМНПОРСТУФХЦЧШЩЪЫЬЭЮЯ' + 'abcdefghijklmnopqrstuvwxyz' +
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + '0123456789';

function Caesar_cipher(str: string; way: integer; key: integer): string;
var
  s: string;
  i, t: integer;
begin
  if way > 0 then
    key := -key;
  key := key mod lalp;
  if key = 0 then
  begin
    writeln('Error: wrong key (key not equals zero and not divisible by ',
      lalp, ')');
    Caesar_cipher := str;
    exit;
  end;
  s := str;
  for i := 1 to length(str) do
  begin
    t := pos(str[i], alp);
    if t <> 0 then
      s[i] := alp[(t - 1 + key + lalp) mod lalp + 1];
  end;
  Caesar_cipher := s;
end;

begin
  lalp := length(alp);
  writeln(Caesar_cipher('Тестовая фраза', 0, 12));
  // 0 - шифрование; не 0 - дешифрование
  // 12 - сдвиг
  readln;
end.
Замечания по Вашей программе:
slovo - никак не инициализирована
anslovo:=alf[p] - в anslovo будет 1 буква
(k+n) mod 34 - легко может оказаться равно 0 (ошибка)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 02.12.2012 в 14:25.
BDA на форуме Ответить с цитированием
Старый 10.04.2013, 20:13   #3
вася012
Новичок
Джуниор
 
Регистрация: 10.04.2013
Сообщений: 1
Злость почему не работает ?

v
Код:
ar a,c,f,kods,r,t,kon,nah:string;
i,k,n,b,z,p,xz:integer;
begin
a:='abcdefghijklmnopqrstuvwxyz';
f:=a;
readln(t);
readln(kods);
readln(p);
c:=kods;
b:=length(c);
k:=length(a);
begin
for i:=1 to b do
for n:=1 to k do
if c[i]=a[n] then
delete(a,n,1);
kon:=copy(a,0,p);
xz:=length(a)-length(kon);
nah:=copy(a,xz+1,xz);
a:=nah+kods+kon;
end;
r:='';
begin
for i:=1 to length(t) do
begin
z:=pos(t[i],f);
r:=r+a[z];
end;
writeln(r);
readln
end;
end.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 10.04.2013 в 22:10.
вася012 вне форума Ответить с цитированием
Старый 10.04.2013, 20:46   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

"почему не работает?" - потому что неправильно что-то написали.
Даже после нескольких прочтений не понял алгоритма Вашей программы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 23.10.2015, 20:49   #5
Ceh9i
Новичок
Джуниор
 
Регистрация: 23.10.2015
Сообщений: 1
По умолчанию Вот так правильней будет, думаю

Код:
program anslovo22;
var alf,anslovo,slovo:string;
    i,n,k,p:integer;
BEGIN
writeln('введите количество сдвигов');
readln(n);
writeln('введите текст');
readln(slovo);
alf:='абвгдежзийклмнопрстуфхцчшщъыьэюя ';
 for i:=1 to length(slovo) do
   begin
     for k:=1 to length(alf) do
       if slovo[i]=alf[k] then p:=k+n;
      if p>length(alf) then p:=p-length(alf);
      anslovo:=anslovo+alf[p];
   end;
 writeln('зашифрованный текст=',anslovo);
 readln;
END.

Последний раз редактировалось BDA; 24.10.2015 в 05:02. Причина: Тег CODE
Ceh9i вне форума Ответить с цитированием
Старый 24.10.2015, 05:07   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Ceh9i, некропостить нехорошо. Давайте разберем Ваш код:
1) "anslovo" не инициализируется явно.
2) Если в алфавите буквы не окажется, то "p" в лучшем случае будет иметь значение с предыдущей итерации цикла.
3) Если заданный сдвиг "n" гораздо больше длины алфавита, то однократного вычитания длины не хватит.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифр Цезаря. Апгрейд. unijkoder C# (си шарп) 12 06.02.2012 19:35
шифр Цезаря Defa4ka Помощь студентам 5 23.10.2011 13:48
Шифр цезаря (не работает) Айдар Помощь студентам 3 21.06.2010 11:15
Шифр Цезаря Goracio Помощь студентам 1 19.04.2010 14:53
Шифр Цезаря Jasper92 Помощь студентам 3 02.12.2009 18:47