Menu
Coddy logo textTech

Итоги: частота слов

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 75 из 104.

challenge icon

Задание

Легко

Давайте создадим анализатор частотности слов, который обрабатывает текст и отображает количество слов, отсортированное по частотности. Это классическая задача обработки текста, объединяющая все изученные вами компоненты STL: map для подсчёта, vector для сортировки, итераторы для обхода и лямбда-выражения для пользовательской логики сортировки.

Вы организуете код в двух файлах:

  • WordAnalyzer.h: определите класс WordAnalyzer, который управляет подсчётом и анализом слов.

    Ваш класс должен использовать внутри std::map<std::string, int> для хранения количества слов. Реализуйте следующие методы:

    • addWord(const std::string& word): увеличивает количество для данного слова
    • getCount(const std::string& word): возвращает количество для конкретного слова (0, если слово не найдено)
    • getTotalWords(): возвращает общее количество добавленных слов (сумму всех количеств)
    • getUniqueWords(): возвращает количество уникальных слов (размер карты)
    • printByFrequency(): выводит все слова, отсортированные по частотности в порядке убывания. Слова с одинаковой частотностью сортируются в алфавитном порядке. Каждая строка должна отображать: word: count

    Для printByFrequency() вам нужно перенести содержимое карты в вектор пар, а затем использовать std::sort с лямбда-выражением, которое сначала сравнивает количество (по убыванию), а при равенстве — слово (по возрастанию).

  • main.cpp: прочитайте целое число n в первой строке, указывающее, сколько слов будет введено далее. Затем прочитайте n слов, по одному в каждой строке.

    Создайте WordAnalyzer, добавьте все слова, затем выведите:

    1. Выведите Total words: <count>
    2. Выведите Unique words: <count>
    3. Выведите Word frequencies:, после чего вызовите printByFrequency()

Например, при следующем вводе:

7
apple
banana
apple
cherry
banana
apple
date

Вывод должен быть таким:

Total words: 7
Unique words: 4
Word frequencies:
apple: 3
banana: 2
cherry: 1
date: 1

Обратите внимание, что apple находится первым (наибольшая частотность), за ним следует banana, а затем cherry и date сортируются в алфавитном порядке, поскольку у них одинаковое количество.

Другой пример с вводом:

5
the
cat
the
sat
the

Вывод:

Total words: 5
Unique words: 3
Word frequencies:
the: 3
cat: 1
sat: 1

Попробуйте сами

#include <iostream>
#include <string>
#include "WordAnalyzer.h"

using namespace std;

int main() {
    int n;
    cin >> n;
    
    WordAnalyzer analyzer;
    
    // TODO: Прочитайте n слов и добавьте их в analyzer
    
    // TODO: Выведите "Total words: <count>"
    
    // TODO: Выведите "Unique words: <count>"
    
    // TODO: Print "Word frequencies:" and call printByFrequency()
    
    return 0;
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C++