Đếm tần suất chữ cái trong chuỗi bằng C, C++
Trong bài học này, bạn sẽ đếm số lần xuất hiện của từng chữ cái thường trong một chuỗi bằng một mảng 26 phần tử.
Giới thiệu
Bảng tần suất gắn mỗi ký tự với một bộ đếm. Vì chỉ có 26 chữ cái thường từ a đến z, ta có thể dùng một mảng 26 phần tử, trong đó phần tử thứ 0 đếm chữ a, phần tử thứ 1 đếm chữ b, và cứ thế tiếp tục.
Những điểm quan trọng
- Luôn bật cảnh báo của trình biên dịch (compiler warning) và sửa hết các cảnh báo.
- Hiểu rõ kiểu dữ liệu và thời gian tồn tại (lifetime) của từng giá trị.
- Luôn kiểm tra dữ liệu đầu vào và giới hạn chỉ số của mảng.
Code ví dụ bằng C và C++
#include <stdio.h>
int main(void) {
const char *text = "banana"; int counts[26] = {0};
// Convert each lowercase letter to an array index.
for (; *text; ++text) ++counts[*text - 'a'];
for (int i = 0; i < 26; ++i) if (counts[i]) printf("%c=%d\n", 'a' + i, counts[i]);
}
a=3
b=1
n=2
#include <array>
#include <iostream>
#include <string>
int main() {
std::string text = "banana"; std::array<int, 26> counts{};
// Convert each lowercase letter to an array index.
for (char character : text) ++counts[character - 'a'];
for (size_t i = 0; i < counts.size(); ++i) if (counts[i]) std::cout << char('a' + i) << '=' << counts[i] << '\n';
}
a=3
b=1
n=2
So sánh C và C++
Biểu thức *text - 'a' chuyển một chữ cái thành chỉ số từ 0 đến 25, vì các chữ cái có mã liên tiếp nhau. Chương trình tăng bộ đếm tại vị trí đó, rồi vòng lặp thứ hai chỉ in những chữ cái có bộ đếm khác 0. Với "banana", kết quả là a=3, b=1 và n=2.
C dùng các hàm thủ tục gọn nhẹ và thể hiện rõ cách dữ liệu được biểu diễn trong bộ nhớ.
C++ vẫn cho phép làm việc ở mức thấp nhưng bổ sung các kiểu dữ liệu thư viện và công cụ trừu tượng an toàn hơn.
Bài tập mở rộng
Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.
- Thử nhập dữ liệu sai và các giá trị ở biên.
- Biên dịch với các cờ -Wall -Wextra -Wpedantic để bật thêm cảnh báo.
- Tách phần khai báo dùng chung ra file header và phần cài đặt ra file riêng.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
Tất cả thử thách