Menu
Coddy logo textTech

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ğeriAnlamı
Negatifa, b'den önce gelir
Sıfıra, b'ye eşittir
Pozitifa, 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.

challenge icon

Görev

Kolay

qsort 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ğeriAnlamı
Negatifa, b'den önce gelir
Sıfıra, b'ye eşittir
Pozitifa, 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
}
quiz iconKendini test et

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