Kiểm tra chuỗi đối xứng trong C, C++
Trong bài học này, bạn sẽ kiểm tra một từ có đọc xuôi và đọc ngược giống nhau hay không bằng cách so sánh các ký tự đối xứng.
Giới thiệu
Chuỗi đối xứng (palindrome) là chuỗi không thay đổi khi đảo ngược thứ tự các ký tự, ví dụ "level" hay "radar". Để kiểm tra, ta so sánh ký tự đầu với ký tự cuối, ký tự thứ hai với ký tự áp chót, và cứ thế tiến dần vào giữa.
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>
#include <string.h>
int main(void) {
const char *text = "level"; size_t length = strlen(text); int palindrome = 1;
// Compare characters mirrored around the center.
for (size_t i = 0; i < length / 2; ++i)
if (text[i] != text[length - 1 - i]) { palindrome = 0; break; }
printf("%s is %sa palindrome\n", text, palindrome ? "" : "not ");
}
level is a palindrome
#include <algorithm>
#include <iostream>
#include <string>
int main() {
std::string text = "level";
// equal compares the first half with a reversed view.
bool palindrome = std::equal(text.begin(), text.begin() + text.size() / 2, text.rbegin());
std::cout << text << " is " << (palindrome ? "" : "not ") << "a palindrome\n";
}
level is a palindrome
So sánh C và C++
Vòng lặp chỉ cần chạy đến giữa chuỗi (length / 2), vì mỗi cặp ký tự đối xứng chỉ cần kiểm tra một lần. Ký tự text[i] được so sánh với text[length - 1 - i]. Ngay khi phát hiện một cặp khác nhau, chương trình kết luận không phải chuỗi đối xứng và dừng vòng lặp bằng break.
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