Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
#1

Нужно сделать функцию расшифровки (алгоритм Цезаря) - C++

02.11.2012, 19:02. Просмотров 990. Ответов 11
Метки нет (Все метки)

Всем привет ! Есть моя функция шифрования
C++
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
char find_and_encr_char(char what_find,int key){
      char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
bool founded= false; // найдено ?
 
      char encr_char;
      for(int i=0;i<27;i++){
 
          if(what_find==' ') {
          encr_char='_';
          founded=true;
          return encr_char;
                             }
 
          int abskey=i+key; // номер елемента в массиве + ключ
                            if(engl_abet[i]==what_find){
                                if((i+key)>26){ abskey=(i+key)%26 ; }
                                encr_char=engl_abet[abskey];
                                founded=true;
                                break;
 
                                                       }
 
                            }
 
 
if(founded==false) encr_char=what_find; 
 
                              return encr_char; }

Нужно сделать обратную к ней, то есть расшифровки. Делаю так

C++
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
char find_and_decr_char(char what_find,int key){
      char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
bool founded= false;
 
      char decr_char;
      for(int i=0;i<27;i++){
 
          if(what_find=='_') {
          decr_char=' ';
          founded=true;
          return decr_char;
                             }
 
          int abskey=i-key; 
                            if(engl_abet[i]==what_find){
                                if(abskey<-26){
                 
                                      abskey=(-1)*(i-key)%26 ;  //думаю ошибка где-то здесь 
 
                                           }
 
                                decr_char=engl_abet[abskey];
                                founded=true;
                                break;
 
                                                       }
 
                            }
 
 
if(founded==false) decr_char=what_find; 
 
                              return decr_char; }
Не корректно расшифровывает при больших ключах
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2012, 19:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужно сделать функцию расшифровки (алгоритм Цезаря) (C++):

Оптимизация расшифровки файла | алгоритм хаффмана - C++
Привет, форумчани! Собственно сразу к вопросу. У меня имеется зашифрованный файл весом 390 КБ и считывание (расшифровка) в режиме debug ...

Алгоритм Цезаря - C++
Здраствуйте, я очень надеюсь что вы мне поможете! Мне нужно написать алгоритм шифрования и дешифрования Цезаря Алгоритм такой: ...

Нужно сделать алгоритм, решающий задачу за время н - C++
Всем привет! Есть задача: Исходные данные В первой строке записано целое число N — количество бильярдных шаров (1 ≤ N ≤ 100000). В...

Шифр Цезаря: программа выводит не то, что нужно - C++
Пытался реализовать код цезаря на С++ #include &lt;iostream&gt; using namespace std; const char alphavit={'A', 'B', 'C', 'D', 'E',...

Сделать функцию ввода элементов, функцию вывода элементов, и функцию обработки - C++
Добрый день форумчане, помогите сделать функцию ввода элементов, функцию вывода элементов, и функцию обработки. Сам код #include...

Пожалуйста, нужно найти ошибки в этом коде, нужно сделать в Codeblocks! - C++
Задание было такое:Написать программу для работы с одномерным массивом размера N (0 &lt; N &lt; 100). В начале работы программы предложить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jettard
40 / 38 / 5
Регистрация: 27.05.2010
Сообщений: 253
03.11.2012, 19:19 #2
Цитата Сообщение от seruy-t Посмотреть сообщение
char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
Не хотите нормально написать алфавит?
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
03.11.2012, 19:40  [ТС] #3
Jettard, как я и предполагал, результат прежний

C++
1
 char engl_abet[26]={'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'};
Kuzia domovenok
03.11.2012, 19:46
  #4

Не по теме:

//founded
По-моему правильнее found, т.к. это уже вторая форма глагола (в прошедшем времени) от find. Грамматика важна даже в комментариях С++.

kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
03.11.2012, 19:49 #5
Цитата Сообщение от seruy-t Посмотреть сообщение
char engl_abet[26]
Цитата Сообщение от seruy-t Посмотреть сообщение
for(int i=0;i<27;i++){
Цитата Сообщение от seruy-t Посмотреть сообщение
if(engl_abet[i]==what_find){
Ничего не смущает?
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
03.11.2012, 19:59  [ТС] #6
kazak, Поправил
C++
1
for(int i=0;i<26;i++){
Но все по прежнему

Добавлено через 1 минуту
Kuzia domovenok,

Не по теме:

Возьму на заметку, извините

kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
03.11.2012, 19:59 #7
Цитата Сообщение от seruy-t Посмотреть сообщение
if(abskey<-26){
abskey=(-1)*(i-key)%26 ;
Логичнее if(abskey<0)
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
03.11.2012, 20:03  [ТС] #8
kazak, Возможно, но ничего не изменилось
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
03.11.2012, 21:01 #9
C++
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
char find_and_encr_char(char what_find,int key)
{
   char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
   for(int i=0;i<26;i++)
   {
      if(what_find == ' ')
         return '_';
      if (what_find == engl_abet[i])
         if ((i + key) > 25)
            return engl_abet[(i+key)%26];
         else
            return engl_abet[i+key];
   }
 
   return what_find;
}
 
char find_and_decr_char(char what_find,int key)
{
   char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
   for(int i=0;i<26;i++)
   {
      if(what_find == ' ')
         return '_';
      if (what_find == engl_abet[i])
         if ((i-key) < 0)
            return engl_abet[26 - abs(i - key)%26];
         else
            return engl_abet[i-key];
   }
 
   return what_find;
}
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
04.11.2012, 12:37  [ТС] #10
kazak,
C++
1
     return engl_abet[26 - abs(i - key)%26];
invalid operands of types ‘__gnu_cxx::__enable_if<true, double>::__type {aka double}’ and ‘int’ to binary ‘operator%’|
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
04.11.2012, 13:08  [ТС] #11
Сделал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
char find_and_decr_char(char what_find, int key)
{
   char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
   for(int i=0;i<26;i++)
   {
      if(what_find == ' ')         return '_';
      if (what_find == engl_abet[i]){
         if ((i-key) < 0)         return engl_abet[26 - (-1*(i - key)%26)];
         else            return engl_abet[i-key];
   }
   }
Ввожу qwerty, при расшифровке теряется q.
Миниатюры
Нужно сделать функцию расшифровки (алгоритм Цезаря)  
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
04.11.2012, 15:23 #12
Цитата Сообщение от seruy-t Посмотреть сообщение
return engl_abet[26 - (-1*(i - key)%26)];
C++
1
return engl_abet[(26 - (-1*(i - key)%26))%26];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 15:23
Привет! Вот еще темы с ответами:

Нужно сделать что бы давало рандомно числа и нужно написать ответ - C++
В командной строке. Тоесть примерно так: Запускаешь программу, показывает числа что выбрались рандомно : 15*3=? После этого...

Сделать задачу через функцию (добавить функцию) - C++
#pragma hdrstop #pragma argsused #include &lt;tchar.h&gt; #include &lt;iostream.h&gt; int _tmain(int argc, _TCHAR* argv) { int...

Нужно сделать задание по c++! Через 3 часа нужно сдать! - C++
ТРЕБОВАНИЯ К ВЫПОЛНЕНИЮ ЗАДАНИЙ: Требования к выполнению задания №1: 1. Требуется решить систему линейных алгебраических...

даны 2 последовательности в файлах, в двух разных, нужно их обьединить и отсортировать по возрастанию. Но нужно сделать прогу с помошью указателей - C++
вот текст проги которую я сделал, но без указателей. переделайте пожалуйста #include&lt;fstream.h&gt; #include&lt;iostream.h&gt; void main(){ ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.11.2012, 15:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru