So sánh tổng quá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 52 trên 61.
Các hàm tổng quát như qsort và bsearch trong thư viện chuẩn của C cần một cách để so sánh các phần tử mà không cần biết kiểu dữ liệu của chúng. Giải pháp là một hàm so sánh: một hàm bạn viết để thuật toán tổng quát gọi mỗi khi cần so sánh hai phần tử.
Khai báo chuẩn của các hàm so sánh là:
int compare(const void* a, const void* b);Cả hai tham số đều là const void* vì hàm tổng quát không biết bạn đang sắp xếp kiểu dữ liệu nào. Giá trị trả về tuân theo quy ước cụ thể:
| Giá trị trả về | Ý nghĩa |
|---|---|
| Âm | a đứng trước b |
| Không | a bằng b |
| Dương | a đứng sau b |
Bên trong hàm so sánh, bạn ép các con trỏ void* sang kiểu dữ liệu thực tế rồi so sánh các giá trị. Sau đây là cách so sánh các số nguyên:
int compare_ints(const void* a, const void* b) {
int val_a = *(const int*)a;
int val_b = *(const int*)b;
return val_a - val_b;
}Mẹo dùng phép trừ hoạt động hiệu quả với số nguyên: nếu a nhỏ hơn, kết quả là số âm; nếu bằng nhau, kết quả bằng không; nếu lớn hơn, kết quả là số dương. Giờ đây, bạn có thể truyền hàm này cho qsort để sắp xếp mảng số nguyên theo thứ tự tăng dần.
Thử thách
DễViết một hàm (function) compare_ints để so sánh hai số nguyên (integer) theo quy ước của hàm so sánh tiêu chuẩn dùng trong các thuật toán tổng quát như qsort.
Hàm của bạn cần so sánh hai giá trị và trả về kết quả cho biết thứ tự của chúng.
Quy ước về giá trị trả về:
- Trả về giá trị âm nếu số nguyên thứ nhất đứng trước số thứ hai (số thứ nhất < số thứ hai)
- Trả về 0 nếu hai số nguyên bằng nhau
- Trả về giá trị dương nếu số nguyên thứ nhất đứng sau số thứ hai (số thứ nhất > số thứ hai)
Tham số:
a(int): Số nguyên thứ nhất cần so sánhb(int): Số nguyên thứ hai cần so sánh
Giá trị trả về: Một số nguyên cho biết thứ tự: số âm nếu a < b, 0 nếu a == b, số dương nếu a > b.
Gợi ý: Mẹo dùng phép trừ trong bài học giúp bạn viết lời giải gọn gàng chỉ trên một dòng.
Tự làm thử
int compare_ints(int a, int b) {
// Viết code ở đây
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật7Con trỏ hàm
Khai báo con trỏ hàmGọi con trỏ hàmDùng typedef cho con trỏ hàmTruyền hàm làm đối sốÔn tập: điều phối máy tính10Bộ chứa tổng quát
Ôn tập con trỏ voidTrình bao bọc tổng quátHoán đổi tổng quátSo sánh tổng quátÔn tập: mảng tổng quát2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online