5 - Fonksiyonlar
2024
Sözdizimi:
int
, float
, char
vb.). Eğer fonksiyon bir değer döndürmüyorsa, geri dönüş tipi void
olur.return
İfadesi: Fonksiyonun sonucunu döndürür ve fonksiyonun çalışmasını sonlandırır. Geri dönüş tipi void
olan fonksiyonlar değer döndürmez, bu yüzden return
ifadesi kullanılmaz.#include <stdio.h>
int topla(int a, int b) {
int toplam = a + b;
return toplam; // toplam değeri fonksiyonu çağıran yere döndürülür
}
int main() {
int sayi1 = 5;
int sayi2 = 10;
int sonuc = topla(sayi1, sayi2); // topla fonksiyonu çağrılır ve döndürülen değer sonuc değişkenine atanır
printf("%d + %d = %d\n", sayi1, sayi2, sonuc);
return 0;
}
topla
fonksiyonu, iki tamsayı (a
ve b
) alır ve bunları toplar.return toplam;
satırı, toplam
değişkeninin değerini fonksiyonu çağıran yere (bu örnekte main
fonksiyonu) döndürür ve topla
fonksiyonunun çalışmasını sonlandırır.main
fonksiyonu içinde, topla(sayi1, sayi2)
ifadesi, topla
fonksiyonunu çağırır ve sayi1
ve sayi2
değişkenlerinin değerlerini fonksiyona parametre olarak geçirir.topla
fonksiyonu, sayi1
ve sayi2
değerlerini toplar ve sonucu (toplam
değişkeninin değeri) döndürür.sonuc
değişkenine atanır ve ekrana yazdırılır.#include <stdio.h>
int ciftMi(int sayi) {
if (sayi % 2 == 0) {
return 1; // 1, "doğru" anlamına gelir
} else {
return 0; // 0, "yanlış" anlamına gelir
}
}
int main() {
int sayi = 6;
if (ciftMi(sayi)) { // ciftMi fonksiyonu 1 (doğru) döndürürse
printf("%d çift bir sayıdır.\n", sayi);
} else {
printf("%d tek bir sayıdır.\n", sayi);
}
return 0;
}
ciftMi
fonksiyonu, bir tamsayı (sayi
) alır ve bu sayının çift olup olmadığını kontrol eder.sayi % 2 == 0
ifadesi, sayının 2’ye bölümünden kalanın 0 olup olmadığını kontrol eder. Eğer kalan 0 ise, sayı çifttir ve fonksiyon 1
(true) değerini döndürür. Değilse, sayı tektir ve fonksiyon 0
(false) değerini döndürür.main
fonksiyonu içinde, ciftMi(sayi)
ifadesi, ciftMi
fonksiyonunu çağırır ve sayi
değişkeninin değerini fonksiyona parametre olarak geçirir.ciftMi
fonksiyonundan döndürülen değer, if
ifadesinin koşulunda kullanılır. Eğer fonksiyon 1
(true) döndürürse, if
bloğu çalıştırılır ve “çift” mesajı yazdırılır. Eğer fonksiyon 0
(false) döndürürse, else
bloğu çalıştırılır ve “tek” mesajı yazdırılır.#include <stdio.h>
void merhabaDunyaYazdir() {
printf("Merhaba Dünya!\n");
}
int main() {
merhabaDunyaYazdir(); // Fonksiyon çağrısı
return 0;
}
Bu örnekte, merhabaDunyaYazdir
fonksiyonu, ekrana “Merhaba Dünya!” mesajını yazdırır. Fonksiyon hiçbir değer döndürmediği için void
geri dönüş tipine sahiptir.
return
ve printf
Arasındaki Farkreturn
ifadesi, bir fonksiyonun değerini döndürür ve fonksiyonun çalışmasını sonlandırır. Döndürülen değer, fonksiyonu çağıran yere gönderilir ve başka işlemlerde kullanılabilir.printf
fonksiyonu ise, bir değeri ekrana yazdırır, ancak fonksiyonun değerini etkilemez veya fonksiyonu sonlandırmaz. printf
fonksiyonu, ekrana bilgi yazdırmak için kullanılır, ancak bu bilgi programın çalışmasını etkilemez.#include <stdio.h>
int ikiKati(int x) {
int sonuc = x * 2;
printf("Fonksiyon içinde: %d\n", sonuc); // Ekrana yazdırır, ancak fonksiyon devam eder
return sonuc; // Fonksiyonun değeri döndürülür ve fonksiyon sona erer
}
int main() {
int a = 5;
int b = ikiKati(a);
printf("Fonksiyon dışında: %d\n", b);
return 0;
}
Bu örnekte, ikiKati
fonksiyonu, aldığı değeri iki ile çarpar ve sonucu hem ekrana yazdırır (printf
) hem de return
ifadesi ile döndürür. main
fonksiyonunda, ikiKati
fonksiyonu çağrıldığında döndürülen değer b
değişkenine atanır.
Çıktı:
Fonksiyon içinde: 10
Fonksiyon dışında: 10
void
Fonksiyonları: Değer Döndürmeyen Fonksiyonlarvoid
kullanır ve return
ifadesi kullanmazlar.Bu örnekte, yildizYazdir
fonksiyonu, parametre olarak aldığı adet
değerine göre ekrana yıldız karakterleri yazdırır. Fonksiyon herhangi bir değer döndürmez, bu yüzden geri dönüş tipi void
olarak belirtilmiştir ve return
ifadesi kullanılmamıştır.
Sözdizimi:
#include <stdio.h>
// Fonksiyon prototipi
int usAl(int taban, int us);
int main() {
int x = 2, y = 3;
int sonuc = usAl(x, y); // Fonksiyon prototipi sayesinde derleyici bu çağrıyı anlayabilir.
printf("%d üssü %d = %d\n", x, y, sonuc);
return 0;
}
// Fonksiyon tanımı
int usAl(int taban, int us) {
int sonuc = 1;
for (int i = 0; i < us; i++) {
sonuc *= taban;
}
return sonuc;
}
#include <stdio.h>
int main() {
int x = 2, y = 3;
int sonuc = usAl(x, y); // Hata! Derleyici usAl fonksiyonunu henüz tanımıyor.
printf("%d üssü %d = %d\n", x, y, sonuc);
return 0;
}
// Fonksiyon tanımı
int usAl(int taban, int us) {
int sonuc = 1;
for (int i = 0; i < us; i++) {
sonuc *= taban;
}
return sonuc;
}
Özyinelemeli fonksiyonlar, kendini çağıran fonksiyonlardır. Bu tür fonksiyonlar, bir problemi daha küçük alt problemlere bölerek çözer ve her alt problem için kendini tekrar çağırır. Bu işlem, temel bir duruma ulaşılana kadar devam eder.
faktoriyel(5)
çağrılır. 5, 0’dan büyük olduğu için else
bloğuna girilir.5 * faktoriyel(4)
hesaplanır. faktoriyel(4)
’ü hesaplamak için fonksiyon kendini tekrar çağırır.faktoriyel(4)
, 4 * faktoriyel(3)
olarak hesaplanır. Fonksiyon tekrar çağrılır.faktoriyel(0)
çağrısına kadar devam eder.faktoriyel(0)
, temel duruma ulaşır ve 1 değerini döndürür.faktoriyel(5)
, 120 değerini döndürür.static
Değişkenler: Değerini Korumastatic
anahtar kelimesi ile tanımlanan değişkenler, fonksiyon çağrıları arasında değerlerini korur.static
değişkenler programın sonuna kadar bellekte kalır. Bu, fonksiyonun bir sonraki çağrısında değişkenin değerinin korunmasını sağlar.count
değişkeni static
olarak tanımlandığı için, fonksiyon ilk kez çağrıldığında 0 olarak başlatılır ve değeri bellekte saklanır.count
değişkeni tekrar başlatılmaz, bellekteki son değeri kullanılır.count
değişkeni 1 artırılır ve yeni değeri döndürülür.Eğer static
anahtar kelimesi kullanılmasaydı, count
değişkeni her fonksiyon çağrısında 0 olarak başlatılır ve çıktı her zaman 1 olurdu.
static
Değişkenler Hakkında Uyarı:
Warning
static
değişkenlerin değerleri fonksiyon çağrıları arasında korunurken, bu durum beklenmedik sonuçlara yol açabilir. Özellikle, aynı static
değişkeni kullanan birden fazla fonksiyon varsa, bir fonksiyonun yaptığı değişiklik diğer fonksiyonları etkileyebilir. Bu nedenle, static
değişkenleri dikkatli kullanmak ve mümkün olduğunca local değişkenleri tercih etmek iyi bir programlama uygulamasıdır.
#include <stdio.h>
int globalDegisken = 10; // Global değişken
void fonksiyon() {
int localDegisken = 5; // Local değişken
printf("Fonksiyon içinde globalDegisken: %d\n", globalDegisken);
printf("Fonksiyon içinde localDegisken: %d\n", localDegisken);
}
int main() {
printf("main içinde globalDegisken: %d\n", globalDegisken);
fonksiyon();
// printf("main içinde localDegisken: %d\n", localDegisken); // Hata! localDegisken, main fonksiyonunda tanımlı değil.
return 0;
}
Aşağıdaki kodun çıktısı ne olur?
Aşağıdaki fonksiyon tanımı geçerli midir? Neden?
Aşağıdaki kodun çıktısı ne olur?
Aşağıdaki kodun çıktısı ne olur?
Aşağıdaki kodun çıktısı ne olur?
Aşağıdaki fonksiyon, kendisine parametre olarak verilen pozitif bir tamsayının kaç basamaklı olduğunu hesaplamaktadır. Kodda eksik olan kısmı tamamlayın.
Aşağıdaki kodun çıktısı ne olur?
Aşağıdaki kodun çıktısı ne olur?
void
Fonksiyonları: Değer döndürmeyen fonksiyonlardır.static
Değişkenler: Fonksiyon çağrıları arasında değerlerini korur.