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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2011, 16:17   #1
adds
Новичок
Джуниор
 
Регистрация: 07.09.2011
Сообщений: 2
Вопрос Проблема с Шифром Цезаря

Шифр цезаря это смещение каждой буквы на некоторое число(ключ)
Вообщем народ! Необходимо чтоб на вход поступала зашифрованная строка на латинице и далее выдавались все варианты перебора...
Не могу понять как реализовать сдвиг, помогите...

Код:
#include <iostream.h>
#include <conio.h>
int main(){
    int shift=0;
    char alf[]={'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    char input[100]={0};
    cout<<"Input anything: "<<endl;
    cin>>input;
    for(int i=0;i<strlen(input);i++){
     
     
     for(int j=0;j<26;j++){
            if(input[i]==alf[j]){
            
            while (j >= 26) j -= 26;// это если  значение вышло за диапазон
            while (j < 0) j += 26;// то мы корректируем его
            cout<<input<<endl;
        }
        }   
    } 
    getch();
    return 0;  
}
adds вне форума Ответить с цитированием
Старый 07.09.2011, 16:44   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

В Delphi я бы написал вот так:
Код:
const sdvig=3;

var
     alf: array[1..26] of char =('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
    input:string;
    i,g:byte;



begin
 readln(input); // вводим в строку зашифрованный текст
for i := 1 to length (input) bo
  begin
    g:=1;
    while input[i]<>alf[g] do g:=g+1; //пока не нашли нашу букву в массиве alf, продолжаем
//теперь нам известен номер буквы, который находится в "g". Нам осталось 
сдвинуть на некоторое число порядковый номер буквы и выделить остаток 
от деления на 26 (так как в английском 26 букв)
    g:= (g+sdvig) mod 26;
    input[i]:=alf[g];// здесь мы присваиваем расшифрованную букву
  end;
end;
просто С++ ещё учу пока.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 07.09.2011 в 16:46.
Rin вне форума Ответить с цитированием
Старый 07.09.2011, 17:33   #3
adds
Новичок
Джуниор
 
Регистрация: 07.09.2011
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Rin Посмотреть сообщение
В Delphi я бы написал вот так:
Код:
const sdvig=3;

var
     alf: array[1..26] of char =('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
    'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
    input:string;
    i,g:byte;



begin
 readln(input); // вводим в строку зашифрованный текст
for i := 1 to length (input) bo
  begin
    g:=1;
    while input[i]<>alf[g] do g:=g+1; //пока не нашли нашу букву в массиве alf, продолжаем
//теперь нам известен номер буквы, который находится в "g". Нам осталось 
сдвинуть на некоторое число порядковый номер буквы и выделить остаток 
от деления на 26 (так как в английском 26 букв)
    g:= (g+sdvig) mod 26;
    input[i]:=alf[g];// здесь мы присваиваем расшифрованную букву
  end;
end;
просто С++ ещё учу пока.
почему сдвиг равен 3?
надо чтоб он все варианты просмотрел...
adds вне форума Ответить с цитированием
Старый 07.09.2011, 18:10   #4
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Вот рабочая версия на Делфи...
Вообще, Шифр Цезаря легко вскрывается неполным перебором.
Вложения
Тип файла: txt cezar.txt (2.1 Кб, 145 просмотров)
Хакинг - не преступление, а способ выживания.
Ghost of Night вне форума Ответить с цитированием
Старый 07.09.2011, 20:16   #5
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Код:
var sdvig:byte;
var_input:string;
.........
.......
.....
begin
  sdvig:=0;
  readln(input); // вводим в строку зашифрованный текст
  repeat // начало цикла
    sdvig:=sdvig+1;
    var_input:=input;
    for i := 1 to length (var_input) bo
    begin
      g:=1;
      while var_input[i]<>alf[g] do g:=g+1; 
      g:= (g+sdvig) mod 26;
      var_input[i]:=alf[g];
    end;
    writeln(var_input);
  until sdvig<100;// конец цикла (будет продолжаться пока sdvig меньше
100)
end;
Вот так пойдет?
Правда я тут увидел, что шифр Цезаря в нескольких темах уже обсуждался на этом форуме и тоже на С++.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 07.09.2011 в 20:20.
Rin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Шифр Цезаря" на СИ, проблема с русским алфавитом Antowka Помощь студентам 9 30.01.2010 18:32
Шифр Цезаря Jasper92 Помощь студентам 3 02.12.2009 18:47
Помогите с обратным шифром ара Помощь студентам 2 24.03.2009 09:32
Помогите с шифром smayluk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 20.11.2007 18:20
Алгоритм Цезаря ***СкаЙ*** Помощь студентам 2 27.04.2007 02:40