Данная программа анализирует текстовый файл содержащий художественное произведение. Файл должен иметь имя “example.txt” и находиться в одной директории с программой.
Программа читает текст, подсчитывает число различных слов в произведении. Показывает как часто встречается каждое слово. Вывод слов осуществляется в алфавитном порядке и в порядке по уменьшению частоты употребления.
В программе убираются знаки препинания, каждое слова приводится к нижнему регистру с заглавной буквой.
Функция outText выводит любые контейнеры и list и map, т.к. оформлена как шаблонная функция и может ограничивать вывод либо по числу строк, либо по появлению элементов счетчик которых равен 1.
#include <iostream>
#include <sstream>
#include <fstream>
#include <map>
#include <list>
#include <vector>
#include <string>
#include <algorithm>
template <typename T>
void outText(T ar, int maxStr = 0, bool find1 = false) {
using std::cout;
using std::endl;
int i{};
int nStr{}; //номер строки
for (auto it : ar) {
cout.width(20);
cout << it.first << " => " << it.second;
if (i++ >= 3) {
cout << endl;
i = 0;
if ((maxStr > 0 && nStr++ > maxStr) || (find1 && it.second == 1))
return;
}
}
}
int main()
{
using std::cout;
using std::endl;
using std::string;
setlocale(LC_ALL, "Russian");
typedef std::map<std::string, int> mapT;
std::ifstream myFile("example.txt", std::ios_base::in);
mapT my_map{};
mapT::iterator it;
std::string str{};
const char* strArrSimv = ".,()<>:!«»-;?"; //знаки препинания, которые убираем из текста
int npos{};
if (myFile) {
while (!myFile.eof()) {
while (myFile >> str) {
// cout << str << endl; //вывод из потока сырых данных
npos = 0;
while ((npos = str.find_first_of(strArrSimv, npos)) != std::string::npos) {
str.erase(npos);
}
std::transform(str.begin(), str.end(), str.begin(), [](auto c) { return std::tolower(c); });
str[0] = std::toupper(str[0]);
it = my_map.find(str);
if (it != my_map.end())
my_map[str] += 1;
else {
if (str.length() > 2)
my_map.insert(std::make_pair(str, 1));
}
}
}
cout << endl << endl;
cout << "Всего слов: " << my_map.size() << endl;
std::list<std::pair<std::string, int>> my_list{};
copy(my_map.begin(), my_map.end(), std::back_inserter(my_list));//копируем содержимое my_map в контайнер list
outText(my_map);
cout << endl << "После сортировки" << endl << endl;
my_list.sort([](auto a, auto b) {return a.second > b.second; }); // сортировка для list с использованием лямбда функции
outText(my_list, 0, true);
cout << endl << endl << "Наиболее часто встречающиеся слова:" << endl << endl;
outText(my_list, 3);
}
else {
cout << "Файл не найден.";
}
cout << endl;
}