Подсчитать вероятности символов, встречающихся в текстовом файле. Отсортировать вероятности символов по убыванию
Мой код:
#include <iostream>
#include <string.h>
#include <fstream>
#include <string>
using namespace std;
int main(){
setlocale(LC_ALL, "Russian");
string str, text;
int chars[256] = {0}, i = 0;
ifstream fin("test1.txt");
if (fin.is_open())
{
while (getline(fin, str))
{
text += str;
text += ' ';
}
}
int s = text.length();
text.erase(s-1,1);
cout << text << endl;
s--;
for(int i=0; text[i]; i++)
chars[text[i]]++;
for(int i = 0; i < 256; i++)
{
if(chars[i])
cout << "Symbol probability '" << char(i) << "is" << float(chars[i])/s*100 << "%" << endl;
}
system("PAUSE");
return 0;
}
Не могу понять как отсортировать вероятности по убыванию, пытался отсортировать при помощи sort в результате получал отсортированные вероятности, но буквы были не те которые находились в файле. Пример с sort: Symbol probability ы is 3 Не понятно откуда взялась русская буква ы. В файле были латинские буквы.
Ответы (1 шт):
Автор решения: KoVadim
→ Ссылка
сортировка работает, но выводит странные ответы, потому что индексы являются и кодами символов. А после сортировки эта привязка теряется... и видим странное-странное.
Перепишем
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
ifstream fin("test1.txt");
if (!fin.is_open())
{
return 1;
}
std::map<char, int> m;
char c;
int counter = 0;
// читаем по символу и сразу в мапу
// ключ мапы - символы
while (fin.get(c))
{
m[c]++;
counter++;
}
using record = std::pair<char, int>;
// мапа уже отсортирована, но не так, как нам нужно
// перепишем в вектор
std::vector<record> sm{m.begin(), m.end()};
std::sort(sm.begin(), sm.end(), [](const record& a, const record& b) {return a.second > b.second;});
// и выводим так, как Вы хотели
for(const record& ch : sm)
{
cout << "Symbol probability '" << ch.first << "' is " << float(ch.second)/counter*100 << "%" << endl;
}
return 0;
}
в выводе будет одна странность, но думаю, одним маленьким if Вы ее поборите.