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.