Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- #include <string>
- #include <vector>
- using namespace std;
- //Правильное склонение числительного для количества букв
- string timesTypo(int i) {
- if (i % 100 / 10 == 1) {
- return "раз";
- }
- switch (i % 10)
- {
- case 2:
- case 3:
- case 4:
- return "раза";
- break;
- default:
- return "раз";
- break;
- }
- }
- //Проверка наличия символа в строке (Полюбому библиотечная функция есть для этого)
- bool isCharIncluded(char x, string s) {
- for (int i = 0; i < s.size(); i++) {
- if (s[i] == x) {
- return true;
- break;
- }
- }
- return false;
- }
- //Перевод значения из одного диапазона в другой
- int rangeConverter(double value, double input_start, double input_end, double output_start, double output_end) {
- return round(output_start + ((output_end - output_start) / (input_end - input_start)) * (value - input_start));
- }
- int main()
- {
- const int GRAPH_VERTICAL_HEIGHT = 10; //Высота графика
- const string ALPHABET = "abcdefghijklmnopqrstuvwxyz";//Алфавит
- setlocale(LC_ALL, "ru");
- string s = "";
- getline(cin, s);//Просто cin нельзя - читает только до первого пробела
- map <char, int> counter;//Количество по буквам
- map <char, double> percentage;//Проценты по буквам
- map <char, int> column_height;//Высота столбца по буквам
- vector<vector<char>> graph;//График готовый
- graph.resize(GRAPH_VERTICAL_HEIGHT + 1);//Количество строк графика
- for (int i = 0; i <= GRAPH_VERTICAL_HEIGHT; i++) {
- graph[i].resize(26);//Количество столбцов графика
- }
- //Инициализация
- int j = 0;
- for (char i = 'a'; i <= 'z'; i++) {
- counter[i] = 0;
- percentage[i] = 0;
- column_height[i] = 0;
- graph[graph.size() - 1][j] = i;
- j++;
- }
- int TOTAL_COUNT = 0; //Количество всех букв в тексте кроме спецсимволов и пробелов.
- //Большие буквы преобразованы в маленькие
- for (int i = 0; i < s.size(); i++) {
- s[i] = tolower(s[i]);
- counter[s[i]] = counter[s[i]] + 1;
- if (isCharIncluded(s[i], ALPHABET)) {
- TOTAL_COUNT++;
- }
- }
- int MAX_PERCENTAGE = -1;
- for (char i = 'a'; i <= 'z'; i++) {
- percentage[i] = (double)counter[i] / (double)TOTAL_COUNT * 100;//Подсчет процента встречаемости каждой буквы
- if (percentage[i] > MAX_PERCENTAGE) MAX_PERCENTAGE = percentage[i];//Максимальный процент
- }
- for (char i = 'a'; i <= 'z'; i++) {
- //Расчет высоты столца графика относительно масимального процента
- column_height[i] = rangeConverter(percentage[i], 0, MAX_PERCENTAGE, 0, GRAPH_VERTICAL_HEIGHT);
- }
- for (int i = 0; i < GRAPH_VERTICAL_HEIGHT; i++) {
- for (int j = 0; j < 26; j++) {
- graph[i][j] = ' ';
- if (column_height[ALPHABET[j]] >= i + 1) {
- graph[i][j] = '|';//Рисование графика
- }
- }
- }
- cout << "Статистика использования букв: " << endl;
- cout << "Общее количество: " << TOTAL_COUNT << endl;
- for (char i = 'a'; i <= 'z'; i++) {
- if (counter[i] > 0) {
- cout << "Буква [" << i << "] встречается " << counter[i] << " " << timesTypo(counter[i]) << ". Соотношение: " << round(percentage[i]) << "%" << endl;
- }
- }
- cout << endl << endl;
- for (int i = GRAPH_VERTICAL_HEIGHT-1; i >=0 ; i--) {
- for (int j = 0; j < 26; j++) {
- cout << graph[i][j];
- }
- cout << endl;
- }
- for (int i = 0; i < 26; i++) cout << ALPHABET[i]; cout << endl;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement