Perbandingan Generik
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 52 dari 61.
Fungsi generik seperti qsort dan bsearch dalam standard library C memerlukan cara untuk membandingkan elemen tanpa mengetahui tipe datanya. Solusinya adalah fungsi pembanding: fungsi yang kamu tulis dan dipanggil oleh algoritma generik setiap kali perlu membandingkan dua item.
Signature standar untuk fungsi perbandingan adalah:
int compare(const void* a, const void* b);Kedua parameter bertipe const void* karena fungsi generik tidak mengetahui tipe apa yang sedang kamu urutkan. Nilai kembaliannya mengikuti konvensi tertentu:
| Nilai Kembalian | Makna |
|---|---|
| Negatif | a berada sebelum b |
| Nol | a sama dengan b |
| Positif | a berada setelah b |
Di dalam fungsi pembandingmu, kamu mengubah pointer void* ke tipe sebenarnya dan membandingkan nilainya. Berikut cara membandingkan bilangan bulat:
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;
}Trik pengurangan bekerja dengan baik untuk bilangan bulat: jika a lebih kecil, hasilnya negatif; jika sama, nol; jika lebih besar, positif. Fungsi ini sekarang dapat diteruskan ke qsort untuk mengurutkan array bilangan bulat dalam urutan menaik.
Tantangan
Mudah Tulis sebuah fungsi compare_ints yang membandingkan dua bilangan bulat mengikuti konvensi fungsi perbandingan standar yang digunakan oleh algoritma generik seperti qsort.
Fungsimu harus membandingkan kedua nilai dan mengembalikan hasil yang menunjukkan hubungan urutannya.
Konvensi Nilai Kembalian:
- Kembalikan nilai negatif jika bilangan bulat pertama berada sebelum yang kedua (first < second)
- Kembalikan nol jika kedua bilangan bulat sama
- Kembalikan nilai positif jika bilangan bulat pertama berada setelah yang kedua (first > second)
Parameter:
a(int): Bilangan bulat pertama yang dibandingkanb(int): Bilangan bulat kedua yang dibandingkan
Nilai kembalian: Bilangan bulat yang menunjukkan urutan: negatif jika a < b, nol jika a == b, positif jika a > b.
Petunjuk: Trik pengurangan dari pelajaran ini memberikan solusi satu baris yang elegan.
Coba sendiri
int compare_ints(int a, int b) {
// Tulis kodemu di sini
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia7Pointer Fungsi
Mendeklarasikan Pointer FungsiMemanggil Pointer FungsiTypedef untuk Pointer FungsiMengirim Fungsi sebagai ArgumenRangkuman: Dispatch Kalkulator10Wadah Generik
Tinjauan Ulang Pointer VoidPembungkus GenerikPertukaran GenerikPerbandingan GenerikTinjauan Ulang: Generic array2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online