Advertisement
Ansaid

Шифр Цезаря

Feb 4th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include "locale.h"
  4.  
  5. using namespace std;
  6.  
  7. int space(string ptr_str, int SIZE, int *ptr_len);
  8.  
  9. int main()
  10. {
  11.     setlocale(LC_ALL, "RUS");
  12.     int choice;
  13.     cout << "Выберете вариант действий:\n1. Шифрование сообщения\n2. Расшифровка сообщения\nВведите цифру выбранного вами варианта: ";  // выбираем вариант действий
  14.     cin >> choice;   // вводим вариант действий
  15.     if(choice == 1)   // если выбрали 1
  16.     {
  17.         char sdvig;
  18.         string str;
  19.         cin.ignore(32767, '\n');    //игнор
  20.         cout << "Введите исходное сообщение: ";
  21.         getline(cin, str); // ввод исходного сообщения
  22.         cout << "Введите смещение: ";
  23.         //cout << (int)(str[0]);
  24.         cin  >> sdvig;  //Ввод смещения на которое будет производиться сдвиг
  25.         sdvig = sdvig - '0';    //Приведение значения к "Реальному" значению
  26.         for(int i = 0; i < str.length(); i++) //С 1 по последний символ строки
  27.         {
  28.             if(str[i] != 32)
  29.             {   // Если символ не пробел производим сдвиг
  30.                 if(((str[i] < 91) && (str[i] + sdvig > 90)) || ((str[i] > 96) && (str[i] + sdvig > 122)))   //Условие для выполнения КРУГОВОГО свдига(из конца алфавита в начало) для заглавных и строчных букв
  31.                     str[i] = str [i] + sdvig - 26; // циклический сдвиг(из конца алфавита в начало)
  32.                 else
  33.                     str[i] = str[i] + sdvig;    // сдвиг
  34.             }
  35.         }
  36.         cout << "Закодированная строка: " << str << endl; // Вывод получившейся закодированной строки
  37.     }
  38.     else  //если выбрали 2
  39.     {
  40.         char sdvig;
  41.         string str;
  42.         int choice_2;
  43.         cout << "Выберете вариант действий:\n1. Сдвиг известен\n2. Сдвиг не известен\nВведите цифру выбранного вами варианта: "; // Выбираем вариант действий
  44.         cin >> choice_2;    // вводим вариант действий
  45.         if(choice_2 == 1) // если выбрали 1
  46.         {
  47.             cin.ignore(32767, '\n');    //игнор
  48.             cout << "Введите закодированное сообщение: ";
  49.             getline(cin, str); // ввод закодированного сообщения
  50.             cout << "Введите смещение: ";
  51.             cin  >> sdvig;  //Ввод смещения на которое будет производиться сдвиг
  52.             sdvig = sdvig - '0';    //Приведение значения к "Реальному" значению
  53.             for(int i = 0; i < str.length(); i++)  //С 1 по последний символ строки
  54.             {
  55.                 if(str[i] != 32)   // Если символ не пробел производим сдвиг
  56.                 {
  57.                     if(((str[i] < 91) && (str[i] - sdvig < 65)) || ((str[i] > 96) && (str[i] - sdvig < 97)))   //Условие для выполнения КРУГОВОГО свдига(из конца алфавита в начало) для заглавных и строчных букв
  58.                         str[i] = str [i] - sdvig + 26; // циклический сдвиг(из конца алфавита в начало)
  59.                     else
  60.                         str[i] = str[i] - sdvig;    // сдвиг
  61.                 }
  62.             }
  63.             cout << "Раскодированная строка: " << str << endl;
  64.         }
  65.         else // если выбрали 2 !!!НУЖНО ОФОРМИТЬ ФУНКЦИЕЙ
  66.         {
  67.             cin.ignore(32767, '\n');    //игнор
  68.             cout << "Введите закодированное сообщение: ";
  69.             getline(cin, str); // ввод закодированного сообщения
  70.             string copy = str; // создаем дубликат строки
  71.             int len = 0; // переменная которая будет хранить длинну максимального слова
  72.             int itog = space(str, str.length(), &len); // переменная хранит номер пробела после самым длинным словом(точка конца слова)
  73.             cout << "Сейчас мы будем перебирать варианты,\nмаксимум их может быть 26, так что запаситесь терпением!\n";
  74.             int sdvig = 0;  // сдвиг
  75.             int otvet = 0; //  переменная для проверки от пользователя, имеет ли слово смысл
  76.             while(otvet == 0) // пока слово не имеет смысл перебирать возможные слова
  77.             {  
  78.                 sdvig++; // при каждом новом переборе увеличивает счетчик сдвига на 1
  79.                 for(int i = itog - len; i < itog; i++) // цикл для перебора вариантов слова(выполняется до 1ого пробела в строке)
  80.                 {
  81.                     if(((str[i] < 91) && (str[i] - 1 < 65)) || ((str[i] > 96) && (str[i] - 1 < 97)))   //Условие для выполнения КРУГОВОГО сдвига(из конца алфавита в начало) для заглавных и строчных букв
  82.                         str[i] = str [i] - 1 + 26; // циклический сдвиг(из конца алфавита в начало)
  83.                     else
  84.                         str[i] = str[i] - 1;    // сдвиг
  85.                     cout << str[i]; // вывод буквы
  86.                 }
  87.                 cout << "\nЕсли слово имеет смысл нажмите 1, иначе 0: "; // проверка от пользователя
  88.                 cin >> otvet; // имеет ли слово смысл
  89.                 if(otvet == 1) // если слово имеет смысл
  90.                 {
  91.                     for(int i = 0; i < copy.length(); i++)  //С 1 по последний символ строки
  92.                     {
  93.                         if(copy[i] != 32)   // Если символ не пробел производим сдвиг
  94.                         {
  95.                             if(((copy[i] < 91) && (copy[i] - sdvig < 65)) || ((copy[i] > 96) && (copy[i] - sdvig < 97)))   //Условие для выполнения КРУГОВОГО сдвига(из конца алфавита в начало) для заглавных и строчных букв
  96.                                 copy[i] = copy [i] - sdvig + 26; // циклический сдвиг(из конца алфавита в начало)
  97.                             else
  98.                                 copy[i] = copy[i] - sdvig;    // сдвиг
  99.                         }
  100.                     }
  101.                     cout << "Раскодированная строка: " << copy << endl; // выводит ответ, раскодированную строку
  102.                 }
  103.             }
  104.         }
  105.     }
  106.     return 0;
  107. }
  108.  
  109. int space(string ptr_str, int SIZE, int *ptr_len)
  110. {
  111.     int j = -1, itog;
  112.     for(int i = 0; i < SIZE; i++)
  113.     {
  114.         if(ptr_str[i] == 32)
  115.         {    
  116.             if(i - j - 1 > *ptr_len)
  117.             {
  118.                 *ptr_len = i - j - 1;
  119.                 itog = i;
  120.             }
  121.             j = i;
  122.         }
  123.         if((i == SIZE - 1) && (SIZE - 1 - j > *ptr_len))
  124.         {
  125.             *ptr_len = SIZE - 1 - j;
  126.             itog = i + 1;
  127.         }
  128.     }
  129.     return itog;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement