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
#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
#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
int max = va_____(args, int);
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.