Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 10. Напишите программу кодировщик-декодировщик для кодирования символов методом простой одноалфавитной замены.
- Буквы русского алфавита кодируйте буквами английского алфавита, в качестве дополнительных символов используйте
- другие знаки клавиатуры, например: {,},[,],/. Взломайте шифр с помощью таблицы относительных частот, встречаемости
- букв русского алфавита. Распечатайте частоты букв русского алфавита с буквы с1 по букву с2. Используйте для создания
- ключей кодирования и декодирования класс map. Текст для кодирования должен содержать не менее 100 символов.
- */
- #include <iostream>
- #include <windows.h>
- #include <fstream>
- #include <string>
- #include <deque>
- #include <map>
- using namespace std;
- char to_lower(int k)
- {
- if(k>=192&&k<=223)
- {
- k=k+32;
- }
- return k;
- }
- template <class T,class S> void pair_print(pair<T,S> a)
- {
- cout<<a.second<<' '<<a.first;
- }
- template <class T,class S> void multimap_print(multimap<T,S>&a)
- {
- for(multimap<T,S>::iterator i=a.begin();i!=a.end();i++)
- {
- pair_print(*i);
- cout<<endl;
- }
- }
- template <class T,class S> void map_print(map<T,S>&a)
- {
- for(map<T,S>::iterator i=a.begin();i!=a.end();i++)
- {
- pair_print(*i);
- cout<<endl;
- }
- }
- template<class T>void deque_print(deque<T>&a)
- {
- for(deque<T>::iterator i=a.begin();i!=a.end();i++)
- {
- cout<<(*i)<<endl;
- }
- }
- void code_the_text(deque<string>&a)
- {
- for(unsigned int k=0;k<a.size();k++)
- {
- for(unsigned int i=0;i<a[k].size();i++)
- {
- a[k][i]-=3;
- }
- }
- }
- void main()
- {
- setlocale(LC_ALL,"RUSSIAN");
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- ifstream in("newman.txt",ios::in);
- if(!in)
- {
- cout<<"Не удалось открыть файл (1)\n";
- exit(0);
- }
- deque<string> a;
- for(;in.peek()!=EOF;)
- {
- string k;
- getline(in,k);
- a.push_back(k);
- }
- for(unsigned int k=0;k<a.size();k++)
- {
- for(unsigned int i=0;i<a[k].size();i++)
- {
- int b=(int)(a[k][i]);
- if(b>=-64&&b<=-1)
- b=toascii(a[k][i])+128;
- a[k][i]=to_lower(b);
- }
- }
- cout<<"Исходный текст в нижнем регистре:\n\n";
- deque_print(a);
- cout<<"\n";
- in.close();
- ifstream inut("table1.txt");
- if(!inut)
- {
- cout<<"Не удалось открыть файл (2)\n";
- exit(0);
- }
- multimap<double,char> b;
- for(;inut.peek()!=EOF;)
- {
- char k;
- double t;
- inut>>k>>t;
- b.insert(make_pair(t,k));
- }
- // multimap_print(b);
- code_the_text(a);
- cout<<"Текст, закодированный методом одноалфавитной замены:\n\n";
- deque_print(a);
- cout<<"\n";
- map<char,double>sequence;
- int size_of_text=0;
- for(unsigned int k=0;k<a.size();k++)
- {
- for(unsigned int i=0;i<a[k].size();i++)
- {
- char f=a[k][i];
- sequence[f]+=1;
- size_of_text+=1;
- }
- }
- for(map<char,double>::iterator i=sequence.begin();i!=sequence.end();i++)
- {
- (*i).second=(double)((int)(1000*((*i).second/size_of_text)))/1000;
- }
- map_print(sequence);
- for(unsigned int k=0;k<a.size();k++)
- {
- for(unsigned int i=0;i<a[k].size();i++)
- {
- char r=a[k][i];
- double q=sequence[r];
- multimap<double,char>::iterator j=b.lower_bound(q);
- if(j==b.end())
- continue;
- a[k][i]=(*j).second;
- }
- }
- cout<<"Текст, раскодированный с помощью таблицы частот:\n\n";
- deque_print(a);
- cout<<"\n";
- }
Add Comment
Please, Sign In to add comment