Advertisement
RadioNurshat

Advanced Letter Usage Statistics

Oct 7th, 2020 (edited)
983
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6. //Правильное склонение числительного для количества букв
  7. string timesTypo(int i) {
  8.     if (i % 100 / 10 == 1) {
  9.         return "раз";
  10.     }
  11.     switch (i % 10)
  12.     {
  13.     case 2:
  14.     case 3:
  15.     case 4:
  16.         return "раза";
  17.         break;
  18.  
  19.     default:
  20.         return "раз";
  21.         break;
  22.     }
  23. }
  24. //Проверка наличия символа в строке (Полюбому библиотечная функция есть для этого)
  25. bool isCharIncluded(char x, string s) {
  26.     for (int i = 0; i < s.size(); i++) {
  27.         if (s[i] == x) {
  28.             return true;
  29.             break;
  30.         }
  31.     }
  32.     return false;
  33. }
  34. //Перевод значения из одного диапазона в другой
  35. int rangeConverter(double value, double input_start, double input_end, double output_start, double output_end) {
  36.     return round(output_start + ((output_end - output_start) / (input_end - input_start)) * (value - input_start));
  37. }
  38. int main()
  39. {
  40.     const int GRAPH_VERTICAL_HEIGHT = 10; //Высота графика
  41.     const string ALPHABET = "abcdefghijklmnopqrstuvwxyz";//Алфавит
  42.     setlocale(LC_ALL, "ru");
  43.     string s = "";
  44.     getline(cin, s);//Просто cin нельзя - читает только до первого пробела
  45.  
  46.     map <char, int> counter;//Количество по буквам
  47.     map <char, double> percentage;//Проценты по буквам
  48.     map <char, int> column_height;//Высота столбца по буквам
  49.     vector<vector<char>> graph;//График готовый
  50.     graph.resize(GRAPH_VERTICAL_HEIGHT + 1);//Количество строк графика
  51.     for (int i = 0; i <= GRAPH_VERTICAL_HEIGHT; i++) {
  52.         graph[i].resize(26);//Количество столбцов графика
  53.     }
  54.  
  55.     //Инициализация
  56.     int j = 0;
  57.     for (char i = 'a'; i <= 'z'; i++) {
  58.         counter[i] = 0;
  59.         percentage[i] = 0;
  60.         column_height[i] = 0;
  61.         graph[graph.size() - 1][j] = i;
  62.         j++;
  63.     }
  64.  
  65.  
  66.     int TOTAL_COUNT = 0; //Количество всех букв в тексте кроме спецсимволов и пробелов.
  67.     //Большие буквы преобразованы в маленькие
  68.     for (int i = 0; i < s.size(); i++) {
  69.         s[i] = tolower(s[i]);
  70.         counter[s[i]] = counter[s[i]] + 1;
  71.         if (isCharIncluded(s[i], ALPHABET)) {
  72.             TOTAL_COUNT++;
  73.         }
  74.  
  75.     }
  76.  
  77.     int MAX_PERCENTAGE = -1;
  78.     for (char i = 'a'; i <= 'z'; i++) {
  79.         percentage[i] = (double)counter[i] / (double)TOTAL_COUNT * 100;//Подсчет процента встречаемости каждой буквы
  80.         if (percentage[i] > MAX_PERCENTAGE) MAX_PERCENTAGE = percentage[i];//Максимальный процент
  81.     }
  82.     for (char i = 'a'; i <= 'z'; i++) {
  83.         //Расчет высоты столца графика относительно масимального процента
  84.         column_height[i] = rangeConverter(percentage[i], 0, MAX_PERCENTAGE, 0, GRAPH_VERTICAL_HEIGHT);
  85.     }
  86.  
  87.     for (int i = 0; i < GRAPH_VERTICAL_HEIGHT; i++) {
  88.         for (int j = 0; j < 26; j++) {
  89.             graph[i][j] = ' ';
  90.             if (column_height[ALPHABET[j]] >= i + 1) {
  91.                 graph[i][j] = '|';//Рисование графика
  92.             }
  93.         }
  94.     }
  95.  
  96.  
  97.  
  98.     cout << "Статистика использования букв: " << endl;
  99.     cout << "Общее количество: " << TOTAL_COUNT << endl;
  100.     for (char i = 'a'; i <= 'z'; i++) {
  101.         if (counter[i] > 0) {
  102.             cout << "Буква [" << i << "] встречается " << counter[i] << " " << timesTypo(counter[i]) << ". Соотношение: " << round(percentage[i]) << "%" << endl;
  103.         }
  104.  
  105.     }
  106.     cout << endl << endl;
  107.    
  108.     for (int i = GRAPH_VERTICAL_HEIGHT-1; i >=0 ; i--) {
  109.         for (int j = 0; j < 26; j++) {
  110.             cout << graph[i][j];
  111.         }
  112.         cout << endl;
  113.     }
  114.     for (int i = 0; i < 26; i++) cout << ALPHABET[i]; cout << endl;
  115.     system("pause");
  116.  
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement