Menu
Coddy logo textTech

Fonksiyonları Argüman Olarak Geçirme

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 36 / 61.

Fonksiyon işaretçilerinin en güçlü kullanım alanlarından biri, onları diğer fonksiyonlara argüman olarak geçirmektir. Bu, bir fonksiyonun kodunu değiştirmeden içine özel davranışlar enjekte etmenize olanak tanır — bazen callback (geri çağırma) olarak adlandırılan bir teknik.

İki sayı üzerinde hesaplama yapan bir fonksiyon düşünün. İşlemi doğrudan kodlamak yerine, hangi işlemin yapılacağını tanımlayan bir fonksiyon göstericisi kabul edebilirsiniz:

typedef int (*Operation)(int, int);

int compute(int a, int b, Operation op) {
    return op(a, b);
}

compute fonksiyonu toplama mı, çıkarma mı yoksa tamamen başka bir şey mi yaptığını bilmez. Sadece kendisine aktarılan fonksiyonu çağırır:

int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

int main() {
    printf("%d\n", compute(5, 3, add));       // Çıktı: 8
    printf("%d\n", compute(5, 3, multiply));  // Çıktı: 15
    return 0;
}

Aynı compute fonksiyonunun, hangi fonksiyonu geçirdiğimize bağlı olarak nasıl farklı sonuçlar ürettiğine dikkat edin. Bu desen, esnek ve yeniden kullanılabilir kod yazmanın temelidir — yapıyı bir kez yazarsınız ve fonksiyonunuzu kullananlar ihtiyaç duydukları özel mantığı sağlarlar.

challenge icon

Görev

Kolay

İki tam sayı ve bir işlem kodu alan, işlemi sayılara sırayla iki kez uygulayan ve nihai sonucu döndüren bir apply_twice fonksiyonu yazın.

Fonksiyonunuz, hangi işlemin kullanılacağını belirleyen bir işlem kodu alacaktır. İşlem fonksiyonlarını çözümünüzün içinde tanımlamalı ve bunları bir fonksiyon göstericisi (function pointer) kabul eden yardımcı bir compute fonksiyonuna iletmelisiniz.

Gerekli yapı:

  • İki int parametresi alan ve bir int döndüren bir fonksiyon göstericisi için Operation adında bir typedef tanımlayın
  • İki işlem fonksiyonu tanımlayın: add (a + b döndürür) ve multiply (a * b döndürür)
  • İki tam sayı ve bir Operation fonksiyon göstericisi alan, ardından işlemi çağırmanın sonucunu döndüren bir compute fonksiyonu tanımlayın
  • apply_twice içinde, koda göre uygun işlemi seçin, ardından compute fonksiyonunu iki kez kullanın: önce orijinal sayılarla, sonra sonuç ve ikinci sayı ile tekrar

Mantık:

  1. op_code değerine göre işlem fonksiyonunu seçin (1 = add, 2 = multiply)
  2. Ara bir sonuç elde etmek için compute(a, b, operation) fonksiyonunu çağırın
  3. Nihai sonucu elde etmek için compute(intermediate, b, operation) fonksiyonunu çağırın
  4. Nihai sonucu döndürün

Parametreler:

  • a (int): Birinci sayı
  • b (int): İkinci sayı
  • op_code (int): İşlem kodu (add için 1, multiply için 2)

Döndürdüğü Değer: İşlemin sırayla iki kez uygulanmasından sonraki sonuç (int)

Örnek: a = 5, b = 3, op_code = 1 (add) ile:

  • Birinci hesaplama: 5 + 3 = 8
  • İkinci hesaplama: 8 + 3 = 11
  • Dönüş: 11

a = 2, b = 4, op_code = 2 (multiply) ile:

  • Birinci hesaplama: 2 × 4 = 8
  • İkinci hesaplama: 8 × 4 = 32
  • Dönüş: 32

Kopya kağıdı

Fonksiyon işaretçileri, diğer fonksiyonlara argüman olarak aktarılabilir; bu da fonksiyonun kodunu değiştirmeden özel davranışlar eklemenin bir yolu olan geri çağırmaları (callbacks) mümkün kılar.

typedef kullanarak bir fonksiyon işaretçisi türü tanımlayın:

typedef int (*Operation)(int, int);

Parametre olarak bir fonksiyon işaretçisi kabul eden bir fonksiyon oluşturun:

int compute(int a, int b, Operation op) {
    return op(a, b);
}

Farklı davranışlar elde etmek için farklı fonksiyonlar aktarın:

int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

int main() {
    printf("%d\n", compute(5, 3, add));       // Çıktı: 8
    printf("%d\n", compute(5, 3, multiply));  // Çıktı: 15
    return 0;
}

Bu desen, yapının bir kez tanımlandığı ve kullanıcıların ihtiyaç duydukları özel mantığı sağladığı esnek ve yeniden kullanılabilir kodlar yazmanıza olanak tanır.

Kendin dene

int apply_twice(int a, int b, int op_code) {
    // 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