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: Вывести "Word frequencies:" и вызвать printByFrequency()
    
    return 0;
}

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