CodeBlanks Logo Icon CodeBlanks

Değişken argüman desenleri

  • C kursu
  • Orta seviye
  • Ders 80/116
  • 5 dk

Değişken argümanlı fonksiyon desenlerini öğrenirsin.

Değişken argüman desenleri

Değişken argümanların yaygın bir deseni: ilk argümanı başlangıç değeri yap, sonra geri kalanları döngüde işle. Bu, max, min veya avg gibi fonksiyonlarda kullanılır.

max_n için: va_start'tan sonra ilk va_arg okumasını int max'a ata. Sonra for (int i = 1; i < count; i++) döngüsünde her yeni v = va_arg(args, int) için if (v > max) max = v; yap. İlk döngü adımı 1'den başlar çünkü 0. elemanı zaten okuduk. Bu desen, biriktirme (accumulator) deseninin değişken argümanlı varyantıdır. sum_n'de total = 0 ile başlardık; max_n'de ise ilk argüman ile başlarız çünkü boş kümenin maksimumu tanımsızdır.

max_n uygulaması

Tam bir max_n uygulaması yazalım. İlk argüman max'a atanır, sonra döngü ile her yeni değer karşılaştırılır.

Tanım: int max_n(int count, ...) { va_list args; va_start(args, count); int max = va_arg(args, int); for (int i = 1; i < count; i++) { int v = va_arg(args, int); if (v > max) max = v; } va_end(args); return max; }. Döngü 1'den başlar çünkü 0. argüman zaten max'ta. Her adımda v okunur ve max'tan büyükse max güncellenir. Çağrı: max_n(4, 5, 12, 8, 3) → 12. Bu desen, min_n için sadece >'yi < ile değiştirerek çalışır. Esneklik, değişken argümanların gücüdür.

Uygulama max_n fonksiyonu

int max_n(int count, ...) yaz. va_list args; va_start(args, count);. int max = va_arg(args, int); ile başla. for (int i = 1; i < count; i++) döngüsünde int v = va_arg(args, int); ve if (v > max) max = v;. va_end(args); return max;. main'de printf("%d\n", max_n(4, 5, 12, 8, 3));.

Başlangıç kodu

main.c
#include <stdio.h>
#include <stdarg.h>

// max_n: count adet int'in en büyüğünü döndür
// va_list tanımla, va_start ile başlat, ilkini max yap, for ile va_arg oku, büyüğü güncelle, va_end
// main: printf("%d\n", max_n(4, 5, 12, 8, 3));

int main(void) {
    // buraya yaz
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <stdarg.h>

int max_n(int count, ...) {
    va_list args;
    va_start(args, count);
    int max = va_arg(args, int);
    for (int i = 1; i < count; i++) {
        int v = va_arg(args, int);
        if (v > max) max = v;
    }
    va_end(args);
    return max;
}

int main(void) {
    printf("%d\n", max_n(4, 5, 12, 8, 3));
    return 0;
}

Beklenen çıktı

12

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İlk argümanı başlangıç yap

Soru
int max = va_____(args, int);
Cevap
int max = va_arg(args, int);

Açıklama: va_arg ile ilk değeri okur ve max'a atarsın.

2 Akümülatör desenleri

Kavram Anlamı
sum_n 0 ile başla
max_n ilk argümanla başla
print_numbers direkt yazdır
log_msg vprintf ile

3 max_n'de döngü neden 1'den başlar?

  • ilk argüman zaten okundu Doğru cevap
  • va_arg 0'dan başlayamaz
  • count 1'den büyük olmalı
  • for döngüsü böyle çalışır

Açıklama: 0. argüman zaten max'a atandı; döngü 1'den başlar.

Orta seviye bölümündeki tüm dersler