Jenerik Karşılaştırma
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 52 / 61.
C'nin standart kütüphanesindeki qsort ve bsearch gibi jenerik fonksiyonlar, türlerini bilmeden öğeleri karşılaştırmak için bir yola ihtiyaç duyarlar. Çözüm, jenerik algoritmanın iki öğeyi karşılaştırması gerektiğinde çağırdığı, sizin yazdığınız bir fonksiyon olan karşılaştırma fonksiyonudur.
Karşılaştırma fonksiyonları için standart imza şöyledir:
int compare(const void* a, const void* b);Her iki parametre de const void* türündedir çünkü genel (generic) fonksiyon hangi türü sıraladığınızı bilmez. Dönüş değeri belirli bir kuralı takip eder:
| Dönüş Değeri | Anlamı |
|---|---|
| Negatif | a, b'den önce gelir |
| Sıfır | a, b'ye eşittir |
| Pozitif | a, b'den sonra gelir |
Karşılaştırma fonksiyonunuzun içinde, void* işaretçilerini gerçek türe dönüştürür ve değerleri karşılaştırırsınız. Tam sayıları şu şekilde karşılaştırabilirsiniz:
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;
}Çıkarma hilesi tam sayılar için iyi çalışır: eğer a daha küçükse, sonuç negatiftir; eşitse, sıfırdır; daha büyükse, pozitiftir. Bu fonksiyon artık bir tam sayı dizisini artan düzende sıralamak için qsort fonksiyonuna aktarılabilir.
Görev
Kolayqsort gibi genel algoritmalar tarafından kullanılan standart karşılaştırma fonksiyonu kuralına uygun olarak iki tam sayıyı karşılaştıran bir compare_ints fonksiyonu yazın.
Fonksiyonunuz iki değeri karşılaştırmalı ve bunların sıralama ilişkisini belirten bir sonuç döndürmelidir.
Dönüş Değeri Kuralı:
- Eğer ilk tam sayı ikinciden önce geliyorsa (ilk < ikinci) negatif bir değer döndürün
- Eğer her iki tam sayı eşitse sıfır döndürün
- Eğer ilk tam sayı ikinciden sonra geliyorsa (ilk > ikinci) pozitif bir değer döndürün
Parametreler:
a(int): Karşılaştırılacak ilk tam sayıb(int): Karşılaştırılacak ikinci tam sayı
Döner: Sıralamayı belirten bir tam sayı: a < b ise negatif, a == b ise sıfır, a > b ise pozitif.
İpucu: Dersteki çıkarma hilesi, zarif ve tek satırlık bir çözüm sağlar.
Kopya kağıdı
Karşılaştırma fonksiyonları, qsort ve bsearch gibi genel algoritmaların, öğelerin türlerini bilmeden onları karşılaştırmasına olanak tanır.
Karşılaştırma fonksiyonları için standart imza:
int compare(const void* a, const void* b);Parametreler const void* türündedir çünkü genel fonksiyon sıralanan türü bilmez.
Dönüş değeri kuralı:
| Dönüş Değeri | Anlamı |
|---|---|
| Negatif | a, b'den önce gelir |
| Sıfır | a, b'ye eşittir |
| Pozitif | a, b'den sonra gelir |
Karşılaştırma fonksiyonunun içinde, void* işaretçilerini gerçek türe dönüştürün ve değerleri karşılaştırı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;
}Çıkarma yöntemi tam sayılar için işe yarar: Eğer a daha küçükse sonuç negatif; eşitse sıfır; daha büyükse pozitiftir.
Kendin dene
int compare_ints(int a, int b) {
// Kodu buraya yazın
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu7Fonksiyon İşaretçileri
Fonksiyon İşaretçilerini TanımlamaFonksiyon İşaretçilerini ÇağırmaFonksiyon İşaretçileri için TypedefFonksiyonları Argüman Olarak GeçirmeÖzet: Hesap Makinesi Yönlendirme10Jenerik Kapsayıcılar
Void İşaretçiler ÖzetiJenerik SarmalayıcıJenerik Yer DeğiştirmeJenerik KarşılaştırmaÖzet: Jenerik Dizi2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi