Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.24 KB | None | 0 0
  1. //лабараторная работа №2
  2.  
  3. #include <iostream>
  4. #include <math.h>
  5. #include <string>
  6. #include <vector>
  7. #include <unordered_map>
  8.  
  9. using namespace std;
  10.  
  11. struct KeyValue//хранит пару значение после кодирования и символ
  12. {
  13. string value_;
  14. char symbol_;
  15. KeyValue(string a, char b) :value_(a), symbol_(b)
  16. {}
  17.  
  18. };
  19.  
  20.  
  21. class AlgoritmShenona_Phano //класс хранит алгоритм Шенона-Фано
  22. {
  23. string firstWords_;//слово
  24. vector <double> value_;//вектор хранит значиния частоты символов
  25. vector <char> symbols_;//вектор храни символы
  26. vector <KeyValue> keySymbol_;//вектор пар значение - символ
  27. int size_;//размер
  28. public:
  29.  
  30. AlgoritmShenona_Phano(vector <double> &value, vector <char> &symbols,const string &word) :value_(value), symbols_(symbols),firstWords_(word)//конструктор
  31. {
  32. size_ = value_.size();
  33. }
  34.  
  35. void execute(ostream &os)//расчеты алгоритма и запись результата
  36. {
  37. splitUP(value_, symbols_, "");
  38. int wordSize = firstWords_.size();
  39. os << "\n\nwords: ";
  40.  
  41. for (int i = 0; i < wordSize; i++)
  42. {
  43. os<< searchsymbol (firstWords_[i]) <<" ";
  44. }
  45.  
  46. os << "\n";
  47. }
  48.  
  49. int someCount(const vector <double> &allValue)//находим среднии значения для расчетов
  50. {
  51. int count = 0;
  52. int fullvalue = 0;
  53. double someValue = 0;
  54. double a = 0;
  55.  
  56. for (int i = 0; i < allValue.size(); i++)
  57. {
  58. fullvalue += allValue[i];
  59. }
  60.  
  61. while (a < 0.45)
  62. {
  63. someValue += allValue[count];
  64. count++;
  65. a = someValue / fullvalue;
  66. }
  67. return(count);
  68. }
  69.  
  70. string searchsymbol(char a)//сопостовляем символ с кодом
  71. {
  72. for (int i = 0; i < size_; i++)
  73. {
  74. if (a == keySymbol_[i].symbol_)
  75. {
  76. return(keySymbol_[i].value_);
  77. }
  78. }
  79.  
  80. }
  81.  
  82. void splitUP( vector <double> fullValue,vector <char> fullSymbols, const string &code)//делим массив значений на два массива (рекурсия)
  83. {
  84. int size = fullValue.size();
  85. vector <double> value1;
  86. vector <char> symbols1;
  87. vector <double> value2;
  88. vector <char> symbols2;
  89. if (size < 0)
  90. {
  91. cerr << "\n\nerror!!\n\n";
  92. }
  93.  
  94. if (size == 1)//если массив из одного значения присваиваем значение кодов к символам т.е. базовый случай
  95. {
  96. string code1 = code;
  97. code1 += "0";
  98. KeyValue key(code1, fullSymbols[0]);
  99. keySymbol_.push_back(key);
  100. }
  101.  
  102. if (size == 2)//если массив из двух значений присваиваем значения кодов к символов т.е. базовый случай
  103. {
  104. string code1 = code;
  105. code1 += "0";
  106. string code2 = code;
  107. code2 += "1";
  108.  
  109. KeyValue key(code1, fullSymbols[0]);
  110. keySymbol_.push_back(key);
  111.  
  112. KeyValue key1(code2, fullSymbols[1]);
  113. keySymbol_.push_back(key1);
  114. }
  115.  
  116. if (size >2)//делим алгоритм на две части
  117. {
  118.  
  119. int halfSize = someCount(fullValue);
  120. for (int i = 0; i < halfSize; i++)
  121. {
  122. value1.push_back(fullValue[i]);
  123. symbols1.push_back(fullSymbols[i]);
  124. }
  125.  
  126. for (int i = halfSize; i < size; i++)
  127. {
  128. value2.push_back(fullValue[i]);
  129. symbols2.push_back(fullSymbols[i]);
  130. }
  131.  
  132. string code1 = code;
  133. code1 += "0";
  134. string code2 = code;
  135. code2 += "1";
  136. splitUP(value1, symbols1, code1);
  137. splitUP(value2, symbols2, code2);
  138. }
  139. }
  140.  
  141.  
  142.  
  143. };
  144.  
  145. int main()
  146. {
  147. unordered_map<char, int> myMap;//пара символ значение
  148. string world;//наше слово
  149. cout << "write world: ";
  150. cin >> world;
  151. for (const auto symbol : world)
  152. {
  153. myMap[symbol]++;
  154. }
  155.  
  156. string str("abcdefghijklmnopqrstuvwxyz");
  157. vector <double> value;// массив цифр хранит кол-во повторений цифры
  158. vector<char> symbol;//массив символов
  159.  
  160.  
  161. int buffQty;//промежуточные значения
  162. char buffSymbol;//промежуточные значения
  163. for (size_t j = 0; j < world.size(); j++)
  164. {
  165. buffQty = 1;
  166. buffSymbol = '1';
  167. for (size_t i = 0; i < str.size(); i++)
  168. {
  169. if (buffQty <= myMap[str[i]])//находим наиболее часто повторяющийся символ
  170. {
  171. cout << "\n" <<str[i]<<" "<<myMap[str[i]];
  172. buffQty=myMap[str[i]];//записываем его в промежуточные значения
  173. buffSymbol = str[i];
  174. }
  175.  
  176. }
  177. if (buffSymbol != '1')
  178. {
  179. unordered_map<char, int>::iterator it;
  180. for (it = myMap.begin(); it != myMap.end(); it++)//удаляем этот символ myMap.erase(it);
  181. {
  182.  
  183. if ((it->first) == buffSymbol)
  184. {
  185. myMap.erase(it);
  186. break;
  187. }
  188. }
  189.  
  190. value.push_back(buffQty);//добавляем символ в массив символов и количество его повторения в аналогичный массив
  191. symbol.push_back(buffSymbol);
  192. }
  193. }
  194.  
  195. cout << "\nsecondMap " << myMap['a']<<"\n";
  196.  
  197.  
  198. AlgoritmShenona_Phano algo(value,symbol,world );//создаем класс реализующий алгоритм
  199.  
  200.  
  201. algo.execute(cout);//метод execute принимаем метод для вывода
  202.  
  203. cout <<"\n\n";
  204. system("pause");//ожидание нажатия в консоли
  205. return 0;
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement