Đếm nguyên âm (vowels) trong chuỗi sử dụng con trỏ. Duyệt qua từng ký tự qua con trỏ, so sánh với tập {a,e,i,o,u,A,E,I,O,U}.
Thuật toán
countVowels(str):
count = 0
for each char ch in str (via pointer):
if ch in {a,e,i,o,u,A,E,I,O,U}:
count++
return count
end
Code ví dụ (hỗ trợ cả chữ hoa/thường)
#include <iostream>
#include <cctype>
using namespace std;
int countVowels(const char *str) {
int count = 0;
while(*str != '\0') {
char c = tolower(*str); // Chuyển về thường để so sánh
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
count++;
str++;
}
return count;
}
int main() {
string input;
cout << "Nhap chuoi: ";
getline(cin, input); // Đọc cả dòng có space
cout << "So nguyen am: " << countVowels(input.c_str());
return 0;
}
Kết quả
Nhap chuoi: EDucation So nguyen am: 5
Giải thích con trỏ
const char *str: con trỏ đến ký tự const (không sửa đổi chuỗi).*str: lấy giá trị ký tự tại vị trí con trỏ.str++: di chuyển con trỏ đến ký tự tiếp theo.*str != '\0': dừng khi gặp null terminator.
Phiên bản hiện đại (C++11) - Không dùng con trỏ thô
int countVowelsModern(const string& s) {
int count = 0;
for(char c : s) {
c = tolower(c);
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
count++;
}
return count;
}
// Hoặc dùng algorithm
#include <algorithm>
int countVowelsAlgo(const string& s) {
return count_if(s.begin(), s.end(), [](char c) {
c = tolower(c);
return c=='a' || c=='e' || c=='i' || c=='o' || c=='u';
});
}
So sánh
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| Con trỏ C-style | Hiểu bản chất bộ nhớ, nhanh | Dễ lỗi, không an toàn |
| Range-based for | Đọc dễ, an toàn, hiện đại | Ít control hơn |
| std::count_if | Functional, tái sử dụng | Hơi verbose |