Menu
CoddyTech

Ôn tập: tần suất từ

Thuộc phần Lập trình hướng đối tượng trong hành trình C++ của Coddy. Bài học 75 trên 104.

challenge icon

Thử thách

Dễ

Hãy xây dựng một bộ phân tích tần suất từ, xử lý văn bản và hiển thị số lần xuất hiện của các từ theo thứ tự tần suất. Đây là một tác vụ xử lý văn bản kinh điển, kết hợp tất cả thành phần STL bạn đã học: map để đếm, vector để sắp xếp, trình lặp để duyệt và lambda để tạo logic sắp xếp tùy chỉnh.

Bạn sẽ sắp xếp code trong hai tệp:

  • WordAnalyzer.h: Định nghĩa lớp WordAnalyzer để quản lý việc đếm và phân tích từ.

    Lớp của bạn nên dùng std::map<std::string, int> bên trong để lưu số lần xuất hiện của các từ. Hãy triển khai các phương thức sau:

    • addWord(const std::string& word): tăng số lần xuất hiện của từ đã cho
    • getCount(const std::string& word): trả về số lần xuất hiện của một từ cụ thể (0 nếu không tìm thấy)
    • getTotalWords(): trả về tổng số từ đã thêm (tổng số lần xuất hiện của tất cả các từ)
    • getUniqueWords(): trả về số lượng từ riêng biệt (kích thước của map)
    • printByFrequency(): in ra tất cả các từ theo thứ tự tần suất giảm dần. Nếu các từ có cùng tần suất, hãy sắp xếp chúng theo thứ tự bảng chữ cái. Mỗi dòng cần hiển thị: word: count

    Với printByFrequency(), bạn cần chuyển nội dung của map sang một vector gồm các cặp, sau đó dùng std::sort với lambda so sánh theo số lần xuất hiện trước (giảm dần), rồi theo từ (tăng dần) nếu hòa.

  • main.cpp: Đọc một số nguyên n ở dòng đầu tiên, cho biết sẽ có bao nhiêu từ tiếp theo. Sau đó đọc n từ, mỗi từ trên một dòng.

    Tạo một đối tượng WordAnalyzer, thêm tất cả các từ, rồi hiển thị:

    1. In ra Total words: <count>
    2. In ra Unique words: <count>
    3. In ra Word frequencies:, sau đó gọi printByFrequency()

Ví dụ, với đầu vào:

7
apple
banana
apple
cherry
banana
apple
date

Đầu ra sẽ là:

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

Lưu ý rằng apple xuất hiện đầu tiên vì có tần suất cao nhất, tiếp theo là banana, rồi đến cherry và date, được sắp xếp theo thứ tự bảng chữ cái vì chúng có cùng số lần xuất hiện.

Ví dụ khác với đầu vào:

5
the
cat
the
sat
the

Đầu ra:

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

Tự làm thử

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

using namespace std;

int main() {
    int n;
    cin >> n;
    
    WordAnalyzer analyzer;
    
    // TODO: Đọc n từ rồi thêm vào analyzer
    
    // TODO: In ra "Total words: <count>"
    
    // TODO: In ra "Unique words: <count>"
    
    // TODO: In ra "Word frequencies:" rồi gọi printByFrequency()
    
    return 0;
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch C++ online