İşlevleri Geçirme
Bağımsız değişken olarak geri çağrılar
İşlevleri Geçirme, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
İşlevleri Bağımsız Değişken Olarak Kullanma
İşlev işaretçisi yalnızca bir değer olduğundan, bir işlevi başka bir işleve aktarabilirsiniz. Alınan işleve geri çağrı denir.
Bu, bir yordamın davranışının bir bölümünü özelleştirmenizi sağlar.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
return f(x);
}
int square(int x) { return x * x; }
int main(void) {
printf("%d\n", apply(6, square));
return 0;
}Geri Çağrı Parametresi
Geri çağrı parametresi, bir işlev işaretçisi değişkeniyle aynı şekilde bildirilir. İçeride onu diğer işlevler gibi çağırırsınız.
#include <stdio.h>
void run_twice(void (*action)(void)) {
action();
action();
}
void beep(void) { printf("beep\n"); }
int main(void) {
run_twice(beep);
return 0;
}Davranışı Değiştirme
Aynı üst düzey işleve farklı geri çağrılar aktararak farklı sonuçlar elde edin.
#include <stdio.h>
int combine(int a, int b, int (*op)(int, int)) {
return op(a, b);
}
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main(void) {
printf("%d\n", combine(3, 4, add));
printf("%d\n", combine(3, 4, mul));
return 0;
}Dizi Üzerinde Eşleme
map işlevi, bir geri çağrıyı dizinin her öğesine yerinde uygular.
#include <stdio.h>
void map(int *a, int n, int (*f)(int)) {
for (int i = 0; i < n; i++) a[i] = f(a[i]);
}
int inc(int x) { return x + 1; }
int main(void) {
int a[] = {1, 2, 3};
map(a, 3, inc);
for (int i = 0; i < 3; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}Koşul İşleviyle Filtreleme
Koşul işlevi, doğru veya yanlış döndüren bir geri çağrıdır. Eşleşen öğeleri saymak veya seçmek için bunu kullanın.
#include <stdio.h>
int count_if(int *a, int n, int (*pred)(int)) {
int c = 0;
for (int i = 0; i < n; i++) if (pred(a[i])) c++;
return c;
}
int is_even(int x) { return x % 2 == 0; }
int main(void) {
int a[] = {1,2,3,4,5,6};
printf("%d\n", count_if(a, 6, is_even));
return 0;
}Tek Bir Değere İndirgeme
Bir reduce işlevi, ikili bir geri çağrı ve başlangıç biriktiricisi kullanarak diziyi tek bir değere indirger.
#include <stdio.h>
int reduce(int *a, int n, int init, int (*op)(int,int)) {
int acc = init;
for (int i = 0; i < n; i++) acc = op(acc, a[i]);
return acc;
}
int add(int a, int b) { return a + b; }
int main(void) {
int a[] = {1,2,3,4};
printf("%d\n", reduce(a, 4, 0, add));
return 0;
}Karşılaştırma Aktarma
Sıralama ve arama işlemleri, aynı algoritmanın her türlü sıralama düzeniyle çalışabilmesi için genellikle bir karşılaştırma geri çağrısı alır.
#include <stdio.h>
int max_by(int a, int b, int (*greater)(int,int)) {
return greater(a, b) ? a : b;
}
int gt(int a, int b) { return a > b; }
int main(void) {
printf("%d\n", max_by(3, 8, gt));
return 0;
}Geri Çağrı Türleri İçin typedef
Geri çağrı türünü typedef ile adlandırmak, işlev imzalarını okunabilir hâle getirir.
#include <stdio.h>
typedef int (*IntFn)(int);
int apply(int x, IntFn f) { return f(x); }
int neg(int x) { return -x; }
int main(void) {
printf("%d\n", apply(5, neg));
return 0;
}Varsayılan Geri Çağrı Yedeği
Bir geri çağrı NULL olabiliyorsa, çağıranın geri çağrı kullanmamayı seçebilmesi için varsayılan bir davranış sağlayın.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
if (f == NULL) return x;
return f(x);
}
int dbl(int x) { return x * 2; }
int main(void) {
printf("%d\n", apply(9, NULL));
printf("%d\n", apply(9, dbl));
return 0;
}Geri Çağrılar Kodu Gevşek Bağlar
Geri çağrılar, genel algoritmanın belirli işlemden bağımsız kalmasını sağlar. Kütüphane döngüyü sağlar; davranışı ise siz sağlarsınız.
#include <stdio.h>
void for_each(int *a, int n, void (*visit)(int)) {
for (int i = 0; i < n; i++) visit(a[i]);
}
void show(int x) { printf("[%d]", x); }
int main(void) {
int a[] = {7, 8, 9};
for_each(a, 3, show);
printf("\n");
return 0;
}Geri Çağrıyı Çalışma Zamanında Seçme
Koşul seçimini aktarmayla birleştirin: bir geri çağrı seçin, ardından onu bir üst düzey işleve aktarın.
#include <stdio.h>
int apply(int x, int (*f)(int)) { return f(x); }
int sq(int x) { return x * x; }
int cube(int x) { return x * x * x; }
int main(void) {
int power = 3;
int (*f)(int) = (power == 2) ? sq : cube;
printf("%d\n", apply(2, f));
return 0;
}Hızlı Kontrol
İşlev aktarma hakkındaki anlayışınızı sınayın.
Özet
İşlevleri geri çağrı olarak aktarmayı öğrendiniz:
- Bir geri çağrı parametresini işlev işaretçisi gibi bildirin.
- map, filter, reduce ve for_each gibi üst düzey işlevler oluşturun.
- Geri çağrı türlerini adlandırmak için
typedefkullanın. NULLgeri çağrılara karşı varsayılan bir davranışla önlem alın.
Sıkça Sorulan Sorular
“İşlevleri Geçirme” dersi ücretsiz mi?
Evet — “İşlevleri Geçirme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“İşlevleri Geçirme” dersinde ne öğreneceğim?
Bağımsız değişken olarak geri çağrılar C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“İşlevleri Geçirme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.