Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar Değer Döndüren Fonksiyonlar Çok Parametreli Fonksiyonlar Değişken Kapsamları Çok Fonksiyonlu Programlar
Fonksiyon Tanımı Karmaşık ve uzun programları, küçük, basit ve belirli bir amacı olan program parçalarına bölebiliriz. Belirli bir işi yapan bu program parçalarına fonksiyon adı verilir. main ana fonksiyondur.
Fonksiyon Tanımı Örnek: İki fonksiyondan oluşan bir program
Fonksiyon Tanımı Fonksiyon Başlığı döndürme_tipi fonksiyon_ismi (parametre_ listesi)
Örnek:Girilen iki sayıdan büyük olanını bulan max fonksiyonu #include <stdio.h> int max(int a, int b) { if (a>b) return a; else return b; } main() {int i=10; int j=15; int k; k=max(i,j); printf("maksimum deger=%d",k); return 0;
Fonksiyon Tanımı Fonksiyon Prototipi Fonksiyon başlığına benzer, cümle sonunda noktalı virgül vardır. Fonksiyon prototipi program başında yer almalıdır. Böylece, derleyici, fonksiyon prototipini gördüğünde fonksiyon ismini tanır. int topla(int a); veya int topla(int);
Değer Döndürmeyen Fonksiyonlar Parametresiz Fonksiyonlar Parametreler, fonksiyonların çağırıldıkları yerden veri almasını sağlayan değişkenlerdir. Parametresiz, değer döndürmeyen fonksiyonlar çağırıldıkları yerden bir veri almayan ve herhangi bir veri geri döndürmeyen fonksiyonlardır.
Değer Döndürmeyen Fonksiyonlar Parametreli Fonksiyonlar çağırıldıkları yerden veri alan ama herhangi bir veri geri döndürmeyen tip fonksiyonlardır.
Değer Döndüren Fonksiyonlar Parametresiz Fonksiyonlar çağırıldıkları yere bir değer döndüren ve çağırıldıkları yerden bir veri almayan fonksiyonlardır.
Değer Döndüren Fonksiyonlar Parametreli Fonksiyonlar hem çağırıldığı yerden değer alan, hem de çağırıldığı yere değer döndüren fonksiyonlardır.
Çok Parametreli Fonksiyonlar Fonksiyon Başlığı döndürme_tipi fonksiyon_ismi (formal_parametre_listesi) Fonksiyonu çağırma cümlesi fonksiyon_ismi (gerçek_ parametre_listesi);
Çok Parametreli Fonksiyonlar
Değişken Kapsamı Değişken kapsamı, bir değişkenin tanımının programın hangi bölümünde geçerli olduğunu veya tanındığını gösterir. Yerel kapsam, değişkenin tanımlandığı fonksiyona ait olduğunu ve değişkene sadece tanımlandığı fonksiyon içinden erişilebilindiğini gösterir. Bu tip değişkenlerin tanımı fonksiyon içinde yapılır ve bu değişkenler fonksiyonun bitiminde bellekten silinirler. Genel kapsamlı bir değişken, fonksiyonların dışında tanımlanır ve tanımlamanın yapılmasından sonra yazılmış tüm fonksiyonlar tarafından tanınır ve kullanılır.
Değişken Kapsamı
Değişken Kapsamı f() fonksiyonu çağırıldığında Çıktı 10 5 3 30 11 4 10 5 3 30 11 4 10 5 5 f() fonksiyonu içinde
Çok Fonksiyonlu Programlar Bir program birden fazla fonksiyondan oluşursa, main() fonksiyonu, istenen fonksiyonu çağırabilir veya bir fonksiyon başka bir fonksiyonu çağırabilir. #include <stdio.h> int faktoriyel (int k); int kombinasyon (int n, int r); int main(void) { int k,s,cevap; printf(“Iki tamsayi giriniz:”); scanf(“%d%d”,&k,&s); cevap=kombinasyon(k,s); printf("Kombinasyon=%3d ",cevap); return(0); } int faktoriyel (int k) /*Faktoriyel hesabi*/ { int i, s=1; for(i=1;i<=k;++i) s*=i; return (s); int kombinasyon (int n, int r) /*Kombinasyon hesabi*/ { int s; s=faktoriyel(n)/(faktoriyel(r)*faktoriyel(n-r));
Değişkenlerin Kullanım Hakları Global(Genel) veri tanımlamaları: Programın en üstünde main dahil hiçbir blok içerisinde yer almayacak şekilde yapılan tüm tip tanımlamaları bütün ifadeler için globaldir. Global değişkenler kendinden sonra kodlanan her C komutu içinde kullanılabilirler. Global değişkenler program bellekte var olduğu sürece varlıklarını sürdürürler. Herhangi bir fonksiyonun bu değişkene atadığı bilgiye bir diğer fomksiyon rahatlıkla ulaşabildiği için alt programlar ve fonksiyonlar arasında veri transferinde kullanılabilirler
Global değişken kullanım örneği float c(); //prototip int x; void a() { } int y; void b() { } float c() { } main() { } Burada verilen programda x ve y değişkenlerinin geçerliliği her fonksiyon için geçerli değildir. X değişkeni tüm fonksiyonların üstünde tanımlandığı için programın her yerinde kullanılabilirken , y değişkeni a() alt programının altında tanımlandığı için sadece b(), c() alt programları ve main için geçerlidir. a() alt programı için tanımsızdır. Prototipler sadece fonksiyona giriş/çıkış tiplerinin ne olduğunu derleyiciye bildirirken fonksiyon içinde kullanılacak değişkenler hakkında bilgiye sahip değildirler. C() fonksiyonu x ve y değişkenleinden sonra tanımlandığı için her iki değişkenide kullanabilir. Burada verilen programda x ve y değişkenlerinin geçerliliği her fonksiyon için geçerli değildir. X değişkeni tüm fonksiyonların üstünde tanımlandığı için programın her yerinde kullanılabilirken , y değişkeni a() alt programının altında tanımlandığı için sadece b(), c() alt programları ve main için geçerlidir. a() alt programı için tanımsızdır. Prototipler sadece fonksiyona giriş/çıkış tiplerinin ne olduğunu derleyiciye bildirirken fonksiyon içinde kullanılacak değişkenler hakkında bilgiye sahip değildirler. C() fonksiyonu x ve y değişkenleinden sonra tanımlandığı için her iki değişkenide kullanabilir.
Lokal (Yerel) veri tanımlamaları Fonksiyonlar dahil herhangi bir blok içersinde yer alan tüm değişken tanımlamaları yerel tanımlamalardır. Bu tür değişkenler sadece tanımlandıkları blok içerisinde veya bu blok içinde yer alan diğer alt bloklar içersinde kullanılabilirler. Lokal değişkenlerin ömrü, bloğun icra edilme süresi kadardır. Lokal olarak tanımlanmış bir değişken ile global olarak tanımlanmış bir değişkenin aynı olması halinde her iki değişkende farklı bir değişken olarak ele alınır. Lokal değişkene yapılan atamalardan global değişken etkilenmez. Bloğun icrası bittiğinde lokal değişken iptal edileceğinden global değişken yine kullanım hakkını ele geçirir.
Lokal değişken kullanım örneği: #include <stdio.h> int x=5; ----------------- global tanımlama void a() { int x=7;----------------- lokal tanımlama printf(“ %d “,x); { int x=9;-------------- blok içinde lokal değişken printf(“ %d”, x); } printf(“ %d ”,x); main() { a(); printf(“ %d \n”,x); Program çıktısı: 5 7 9 7 5
Yerel değişkenleri varlığının korunması Belli bir bilginin sadece bir fonksiyon veya blok tarafından kullanılması fakat bloğun icrası bittiğinde değerin kaybolmayıp bloğun tekrar icrasına kadar korunması gerektiğinde değişken isminin önünde static anahtar kelimesi kullanılır. Global değişkenlerin önünde static anahtar kelimesinin kullanılması gerekmez.
Static anahtar kullanımına örnek #include <stdio.h> int y=3; void a() { static int x=0; printf(" statik x \'in su anki degeri: %d dir\n",x); ++x; } main() {while (y>0) {printf("y\'nin degeri: %d dir\n",y); y--; a(); #include <stdio.h> int y=3; void a() { int x=0; printf(" statik x \'in su anki degeri: %d dir\n",x); ++x; } main() {while (y>0) {printf("y\'nin degeri: %d dir\n",y); y--; a(); Ekran çıktısı: y’nin değeri 3’dir statik x’in değeri 0’dir y’nin degeri 2’dir statik x’in değeri 1’di, y’nin degeri 1’dir statik x’in degeri 2’dir Ekran çıktısı: y’nin değeri 3’dir statik x’in değeri 0’dir y’nin degeri 2’dir statik x’in değeri 0’di, y’nin degeri 1’dir statik x’in degeri 0’dir
Sabit tanımlama (Const) Const(sabit): değeri programın çalışması boyunca değiştirilemez const tip Belirleyici =değeri; const float PI=3.14; Tip belirtilmez ise tam sayı kabul edilir
Örnek: #include <stdio.h> main() { const float PI=3.14; float r, Alan; scanf(“%f”,r); alan=PI*r*r; printf(“Alan=%f”,alan); }
Öz Yinemeli Fonksiyonlar (Recursive Functions) Kendini çağıran fonksiyonlardır Örneğin: Faktoriyel hesabı long fact(long i) { if( i<2) return 1; else return i* fact (i-1); } Örnegin: n=4 için fonksiyonun kendisini çağırdığı satır şöyledir: 4* fakt(3), 3*fact(2), 2*fact(1) 24=4*6 3*2 2*1