Đếm nguyên âm trong chuỗi bằng C, C++
Trong bài học này, bạn sẽ đếm số nguyên âm trong một dòng văn bản, bỏ qua sự khác biệt giữa chữ hoa và chữ thường.
Giới thiệu
Bài tập đếm nguyên âm kết hợp ba kỹ năng: duyệt từng ký tự của chuỗi, chuẩn hóa ký tự về chữ thường và kiểm tra ký tự có thuộc một tập hợp hay không. Các nguyên âm trong tiếng Anh là a, e, i, o và u.
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 <ctype.h>
#include <stdio.h>
#include <string.h>
int main(void) {
const char *text = "Code Utility"; int count = 0;
// strchr performs a compact membership check.
for (; *text; ++text) if (strchr("aeiou", tolower((unsigned char)*text))) ++count;
printf("vowels=%d\n", count);
}
vowels=5
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
int main() {
std::string text = "Code Utility";
// count_if counts characters accepted by the predicate.
auto vowels = std::count_if(text.begin(), text.end(), [](unsigned char c) {
return std::string("aeiou").find(std::tolower(c)) != std::string::npos;
});
std::cout << "vowels=" << vowels << '\n';
}
vowels=5
So sánh C và C++
Hàm tolower chuyển mỗi ký tự về chữ thường để chữ hoa và chữ thường được xử lý như nhau. Ký tự được ép kiểu sang unsigned char trước khi truyền vào tolower để tránh lỗi với các ký tự đặc biệt. Hàm strchr("aeiou", ...) trả về con trỏ khác NULL nếu ký tự nằm trong chuỗi nguyên âm, nên bộ đếm tăng lên. Chuỗi "Code Utility" có 5 nguyên âm.
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