Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include "locale.h"
- using namespace std;
- int space(string ptr_str, int SIZE, int *ptr_len);
- int main()
- {
- setlocale(LC_ALL, "RUS");
- int choice;
- cout << "Выберете вариант действий:\n1. Шифрование сообщения\n2. Расшифровка сообщения\nВведите цифру выбранного вами варианта: "; // выбираем вариант действий
- cin >> choice; // вводим вариант действий
- if(choice == 1) // если выбрали 1
- {
- char sdvig;
- string str;
- cin.ignore(32767, '\n'); //игнор
- cout << "Введите исходное сообщение: ";
- getline(cin, str); // ввод исходного сообщения
- cout << "Введите смещение: ";
- //cout << (int)(str[0]);
- cin >> sdvig; //Ввод смещения на которое будет производиться сдвиг
- sdvig = sdvig - '0'; //Приведение значения к "Реальному" значению
- for(int i = 0; i < str.length(); i++) //С 1 по последний символ строки
- {
- if(str[i] != 32)
- { // Если символ не пробел производим сдвиг
- if(((str[i] < 91) && (str[i] + sdvig > 90)) || ((str[i] > 96) && (str[i] + sdvig > 122))) //Условие для выполнения КРУГОВОГО свдига(из конца алфавита в начало) для заглавных и строчных букв
- str[i] = str [i] + sdvig - 26; // циклический сдвиг(из конца алфавита в начало)
- else
- str[i] = str[i] + sdvig; // сдвиг
- }
- }
- cout << "Закодированная строка: " << str << endl; // Вывод получившейся закодированной строки
- }
- else //если выбрали 2
- {
- char sdvig;
- string str;
- int choice_2;
- cout << "Выберете вариант действий:\n1. Сдвиг известен\n2. Сдвиг не известен\nВведите цифру выбранного вами варианта: "; // Выбираем вариант действий
- cin >> choice_2; // вводим вариант действий
- if(choice_2 == 1) // если выбрали 1
- {
- cin.ignore(32767, '\n'); //игнор
- cout << "Введите закодированное сообщение: ";
- getline(cin, str); // ввод закодированного сообщения
- cout << "Введите смещение: ";
- cin >> sdvig; //Ввод смещения на которое будет производиться сдвиг
- sdvig = sdvig - '0'; //Приведение значения к "Реальному" значению
- for(int i = 0; i < str.length(); i++) //С 1 по последний символ строки
- {
- if(str[i] != 32) // Если символ не пробел производим сдвиг
- {
- if(((str[i] < 91) && (str[i] - sdvig < 65)) || ((str[i] > 96) && (str[i] - sdvig < 97))) //Условие для выполнения КРУГОВОГО свдига(из конца алфавита в начало) для заглавных и строчных букв
- str[i] = str [i] - sdvig + 26; // циклический сдвиг(из конца алфавита в начало)
- else
- str[i] = str[i] - sdvig; // сдвиг
- }
- }
- cout << "Раскодированная строка: " << str << endl;
- }
- else // если выбрали 2 !!!НУЖНО ОФОРМИТЬ ФУНКЦИЕЙ
- {
- cin.ignore(32767, '\n'); //игнор
- cout << "Введите закодированное сообщение: ";
- getline(cin, str); // ввод закодированного сообщения
- string copy = str; // создаем дубликат строки
- int len = 0; // переменная которая будет хранить длинну максимального слова
- int itog = space(str, str.length(), &len); // переменная хранит номер пробела после самым длинным словом(точка конца слова)
- cout << "Сейчас мы будем перебирать варианты,\nмаксимум их может быть 26, так что запаситесь терпением!\n";
- int sdvig = 0; // сдвиг
- int otvet = 0; // переменная для проверки от пользователя, имеет ли слово смысл
- while(otvet == 0) // пока слово не имеет смысл перебирать возможные слова
- {
- sdvig++; // при каждом новом переборе увеличивает счетчик сдвига на 1
- for(int i = itog - len; i < itog; i++) // цикл для перебора вариантов слова(выполняется до 1ого пробела в строке)
- {
- if(((str[i] < 91) && (str[i] - 1 < 65)) || ((str[i] > 96) && (str[i] - 1 < 97))) //Условие для выполнения КРУГОВОГО сдвига(из конца алфавита в начало) для заглавных и строчных букв
- str[i] = str [i] - 1 + 26; // циклический сдвиг(из конца алфавита в начало)
- else
- str[i] = str[i] - 1; // сдвиг
- cout << str[i]; // вывод буквы
- }
- cout << "\nЕсли слово имеет смысл нажмите 1, иначе 0: "; // проверка от пользователя
- cin >> otvet; // имеет ли слово смысл
- if(otvet == 1) // если слово имеет смысл
- {
- for(int i = 0; i < copy.length(); i++) //С 1 по последний символ строки
- {
- if(copy[i] != 32) // Если символ не пробел производим сдвиг
- {
- if(((copy[i] < 91) && (copy[i] - sdvig < 65)) || ((copy[i] > 96) && (copy[i] - sdvig < 97))) //Условие для выполнения КРУГОВОГО сдвига(из конца алфавита в начало) для заглавных и строчных букв
- copy[i] = copy [i] - sdvig + 26; // циклический сдвиг(из конца алфавита в начало)
- else
- copy[i] = copy[i] - sdvig; // сдвиг
- }
- }
- cout << "Раскодированная строка: " << copy << endl; // выводит ответ, раскодированную строку
- }
- }
- }
- }
- return 0;
- }
- int space(string ptr_str, int SIZE, int *ptr_len)
- {
- int j = -1, itog;
- for(int i = 0; i < SIZE; i++)
- {
- if(ptr_str[i] == 32)
- {
- if(i - j - 1 > *ptr_len)
- {
- *ptr_len = i - j - 1;
- itog = i;
- }
- j = i;
- }
- if((i == SIZE - 1) && (SIZE - 1 - j > *ptr_len))
- {
- *ptr_len = SIZE - 1 - j;
- itog = i + 1;
- }
- }
- return itog;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement