Guest User

Untitled

a guest
Jul 21st, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.77 KB | None | 0 0
  1. /*
  2. 10. Напишите программу кодировщик-декодировщик для кодирования символов методом простой одноалфавитной замены.
  3. Буквы русского алфавита кодируйте буквами английского алфавита, в качестве дополнительных символов используйте
  4. другие знаки клавиатуры, например: {,},[,],/. Взломайте шифр с помощью таблицы относительных частот, встречаемости
  5. букв русского алфавита. Распечатайте частоты букв русского алфавита с буквы с1 по букву с2. Используйте для создания
  6. ключей кодирования и декодирования класс map. Текст для кодирования должен содержать не менее 100 символов.
  7. */
  8. #include <iostream>
  9. #include <windows.h>
  10. #include <fstream>
  11. #include <string>
  12. #include <deque>
  13. #include <map>
  14. using namespace std;
  15. char to_lower(int k)
  16. {
  17. if(k>=192&&k<=223)
  18. {
  19. k=k+32;
  20. }
  21. return k;
  22. }
  23. template <class T,class S> void pair_print(pair<T,S> a)
  24. {
  25. cout<<a.second<<' '<<a.first;
  26. }
  27. template <class T,class S> void multimap_print(multimap<T,S>&a)
  28. {
  29. for(multimap<T,S>::iterator i=a.begin();i!=a.end();i++)
  30. {
  31. pair_print(*i);
  32. cout<<endl;
  33. }
  34. }
  35. template <class T,class S> void map_print(map<T,S>&a)
  36. {
  37. for(map<T,S>::iterator i=a.begin();i!=a.end();i++)
  38. {
  39. pair_print(*i);
  40. cout<<endl;
  41. }
  42. }
  43. template<class T>void deque_print(deque<T>&a)
  44. {
  45. for(deque<T>::iterator i=a.begin();i!=a.end();i++)
  46. {
  47. cout<<(*i)<<endl;
  48. }
  49. }
  50. void code_the_text(deque<string>&a)
  51. {
  52. for(unsigned int k=0;k<a.size();k++)
  53. {
  54. for(unsigned int i=0;i<a[k].size();i++)
  55. {
  56. a[k][i]-=3;
  57. }
  58. }
  59. }
  60. void main()
  61. {
  62. setlocale(LC_ALL,"RUSSIAN");
  63. SetConsoleCP(1251);
  64. SetConsoleOutputCP(1251);
  65. ifstream in("newman.txt",ios::in);
  66. if(!in)
  67. {
  68. cout<<"Не удалось открыть файл (1)\n";
  69. exit(0);
  70. }
  71. deque<string> a;
  72. for(;in.peek()!=EOF;)
  73. {
  74. string k;
  75. getline(in,k);
  76. a.push_back(k);
  77. }
  78. for(unsigned int k=0;k<a.size();k++)
  79. {
  80. for(unsigned int i=0;i<a[k].size();i++)
  81. {
  82. int b=(int)(a[k][i]);
  83. if(b>=-64&&b<=-1)
  84. b=toascii(a[k][i])+128;
  85. a[k][i]=to_lower(b);
  86. }
  87. }
  88. cout<<"Исходный текст в нижнем регистре:\n\n";
  89. deque_print(a);
  90. cout<<"\n";
  91. in.close();
  92. ifstream inut("table1.txt");
  93. if(!inut)
  94. {
  95. cout<<"Не удалось открыть файл (2)\n";
  96. exit(0);
  97. }
  98. multimap<double,char> b;
  99. for(;inut.peek()!=EOF;)
  100. {
  101. char k;
  102. double t;
  103. inut>>k>>t;
  104. b.insert(make_pair(t,k));
  105. }
  106. // multimap_print(b);
  107. code_the_text(a);
  108. cout<<"Текст, закодированный методом одноалфавитной замены:\n\n";
  109. deque_print(a);
  110. cout<<"\n";
  111. map<char,double>sequence;
  112. int size_of_text=0;
  113. for(unsigned int k=0;k<a.size();k++)
  114. {
  115. for(unsigned int i=0;i<a[k].size();i++)
  116. {
  117. char f=a[k][i];
  118. sequence[f]+=1;
  119. size_of_text+=1;
  120. }
  121. }
  122. for(map<char,double>::iterator i=sequence.begin();i!=sequence.end();i++)
  123. {
  124. (*i).second=(double)((int)(1000*((*i).second/size_of_text)))/1000;
  125. }
  126. map_print(sequence);
  127. for(unsigned int k=0;k<a.size();k++)
  128. {
  129. for(unsigned int i=0;i<a[k].size();i++)
  130. {
  131. char r=a[k][i];
  132. double q=sequence[r];
  133. multimap<double,char>::iterator j=b.lower_bound(q);
  134. if(j==b.end())
  135. continue;
  136. a[k][i]=(*j).second;
  137. }
  138. }
  139. cout<<"Текст, раскодированный с помощью таблицы частот:\n\n";
  140. deque_print(a);
  141. cout<<"\n";
  142. }
Add Comment
Please, Sign In to add comment