Ejercicio 5.13 Estadísticas de frecuencia de palabras (30 punto (s))
Escriba un programa para contar todas las palabras diferentes en un fragmento de texto en inglés y el 10% de las palabras con la mayor frecuencia de palabras.
La llamada "palabra" se refiere a una cadena continua compuesta por no más de 80 palabras y caracteres, pero las palabras con una longitud de más de 15 solo serán interceptadas y reservadas para las primeras 15 palabras y caracteres. Los "caracteres de palabra" legales son letras mayúsculas y minúsculas, números y guiones bajos, y otros caracteres se consideran separadores de palabras.
Ejemplo:
#include <iostream>
#include <map>
#include <list>
#include <string>
#include <cstring>
using namespace std;
map<string, int> Read()
{
map<string, int> Freq{};
int top = 0;
while(1) {
char word[16];
char ch;
cin.get(ch);
if(isdigit(ch) || isalpha(ch) || ch == '_') {
if(top < 15) {
if('A' <= ch && ch <= 'Z') ch += 32;
word[top++] = ch;
}
} else if(top) {
word[top] = '\0';
top = 0;
Freq[word] += 1;
}
if(ch == '#') break;
}
return Freq;
}
int main()
{
map<string, int> Freq = Read();
list<pair<string, int>> Seq{};
for(auto &x : Freq) {
auto y = Seq.begin();
while(y != Seq.end()) {
if(y->second < x.second) break;
y++;
}
Seq.insert(y, x);
}
int cnt = Freq.size() / 10;
cout << Freq.size() << endl;
for(auto x = Seq.begin(); x != Seq.end(); x++) {
if(--cnt < 0) break;
cout << x->second << ':' << x->first << endl;
}
return 0;
}
Ideas:
Use map para contar el número de ocurrencias de palabras, luego colóquelas en la lista vinculada en orden descendente y finalmente imprima las primeras N palabras.