Вы находитесь на странице: 1из 41

Fonksiyonlar

Fonksiyon Nedir ?
Bir amaca hizmet eden program paracklardr. Fonksiyon altrldnda, bir ilemi yerine getirmesi yada bir deer dndrmesi istenecektir. arlm olan bir fonksiyon ya geriye bir sonu deeri dndrr ve/veya fonksiyon ierisindeki operasyonlarn ilemlerini tamamlayp arlan yere geri dner. Dier programlama dillerinde metod, prosedr (yordam) v.b. isimlendirme ile adlandrlrlar. Programclar, programlarn yapaca ii fonksiyonlar vastasyla anlaml paralara blerek programlarnn modlerlik kazanmalarn salar.

Fonksiyon Trleri
Bildiiniz gibi, C++'da iki fonksiyon tr ile karlayoruz.

C++'nn kullanma sunduu hazr fonksiyonlar. Kullanc tarafndan oluturulan fonksiyonlardr.

Hazr Fonksiyonlarn Tanm ve Kullanlmas


C++'nn hazr fonksiyonlar, adndan da anlalabilecei gibi, programcya hazr olarak sunulan fonksiyonlardr. Bu fonksiyonlar bir C++ kitaplnda yer alr. Bu kitaplk dosyas programn banda #include <....> deyimi ile programa dahil edilir. Bylece program bu kitaplk iinde yer alan tm fonksiyonlar dorudan kullanabilir.

rnek: Program iinde C++'nn karakk alma sqrt() matematiksel fonksiyonu kullanmak istiyoruz. Bu fonksiyonun kullanlabilmesi iin, programn banda matematik kitapl programa #include <cmath> eklinde dahil edilme ve program ierisinde sqrt(sayi) eklinde fonksiyon arlmaldr.

<cmath> Ktphanesi

Kullanc Tanml Fonksiyonlarn Tanm ve Uygulamas Fonksiyonun Deklarasyonu (Function (Function Definitions) Definitions)
Bir fonksiyon main veya dier bir fonksiyon tarafndan kullanlmadan nce deklare edilmesi ve tanmlanmas gerekmektedir. Bu yap aada belirtildii biimde olacaktr. Her eyden nce bir fonksiyonun mutlaka bir ad olmaldr.
<dn deeri tipi> <fonksiyon ad/ismi> (<parametreleri>) { ...... return ... }

Fonksiyon deklerasyonu ve tanmlanmas iki farkl yoldan yaplabilir; (1) Fonksiyon arlmadan nce mutlaka ayr ayr fonksiyon deklarasyonu ve tanm yaplmaldr. (2) Fonksiyon arlmadan nce mutlaka fonksiyon deklarasyonu ve tanm birlikte yaplmaldr.

Prototip ve Tanmn Yaplmas


#include <iostream> using namespace std; int hesap1(int); int hesap2(int x); int hesap3(int x=25, int y=25); int hesap4(int x) { x=66; return x; } int main() { int a=3, b=4, c=5, d=6, e=7; int hesap5 (int x); // // // // 1.tip 2.tip 3.tip 4.tip int hesap1 (int a) { a=33; return a; } int hesap2 (int a) { a=44; return a; } int hesap3 (int a, int b) { return a+b; } int hesap5 (int a) { a=55; return a; }

// 5.tip

cout <<"a="<<hesap1(a)<<endl; cout <<"b="<<hesap2(b)<<endl; cout <<"c="<<hesap3(a,e)<<endl; cout <<"c="<<hesap3()<<endl;//dikkat! cout <<"d="<<hesap4(a)<<endl; cout <<"e="<<hesap5(d)<<endl; return 0; }

Fonksiyonun Deer Dndrmesi


Bir fonksiyon altnda, bir sonu retecektir ve bu sonucu kendisini aran fonksiyona istenmesi (return sonuc) durumunda gnderecektir. Bu sonucun, kendisini aran fonksiyona gnderilmesi veya bir baka deyile dndrlmesi sz konusu ise, fonksiyon iinde return deyimine yer vermek gerekecektir. Fonksiyon tanmlamasnda aksi belirtilmedii srece fonksiyonlarn int tipinde deer dndrdkleri kabul edilir. Eer fonksiyonumuzun farkl tipte bir deer dndrmesini istiyorsak fonksiyon tanmlamasnda bu dn deer tipini belirtmemiz gerekmektedir.

Foksiyonlar return anahtar kelimesi araclyla deer dndrr ve program ak srasnda return anahtar kelimesine ulaldnda foksiyondan klr. rnein bir saynn karesini alan bir fonksiyon yazalm; kareal(int sayi) { return (sayi * sayi); } veya kareal(int sayi) { int k = sayi * sayi; return k; }

Eer geri dndrd deer tipi void ise, fonksiyondan bir deer dnmez ve return yazlmaz. Eer geri dndrd deer tipi void deilse, fonksiyonda en az bir tane return ifadesi olmaldr.

#include <iostream> using namespace std; void hesap(int); int main() { int a=3; hesap(a); cout <<a<<endl; return 0; } void hesap(int b) { b=33; }

#include <iostream> using namespace std; int hesap(int); int main() { int a=3; a=hesap(a); cout <<a<<endl; return 0; } int hesap(int b) { b=33; return b; }

rnein, sayi isimli fonksiyon;


tamsay deer dndrecek ise int sayi(); biiminde tanmlanabilir. herhangi bir parametre listesi iermiyorsa int sayi(void); biiminde ifade edilebilir. tamsay trnde bir x parametresine sahip ise, int sayi(int x); tanm yaplr. herhangi bir deer dndrmeyecek ise, void sayi(); biiminde tanm yaplabilir. herhangi bir deer dndrmeyecek ve tamsay trnde bir x parametresini kullanacak ise, void sayi(int x); tanm yaplabilir.

Fonksiyonlar Arasnda Parametre Geirme


Her fonksiyon bir dierinden bamsz olarak dzenlenir. Bir fonksiyon iinde yer alan bir deikeni bir baka fonksiyon iinde aynen kullanamayz. Bunun iin farkl yntemlere bavurulur. Bunlardan birincisi, fonksiyonlar arasnda parametre geirilmesidir. Hi parametresi olmayan fonksiyonlar da olabilir. Bu gibi durumlarda parametre listesi bo braklabilecei gibi void de yazlabilir. Bir fonksiyon yardmyla s alma ilemlerini yerine getirmek istiyoruz. Bu ilem, x ve y verildiinde ifadesinin deerini hesaplayacaktr. Amacmza uygun C++ programn fonksiyonlardan yararlanmak suretiyle u ekilde dzenleyebiliriz.

Global Deikenler (:: Scope Resolution) :: operatr yardmyla Fonksiyonlar Arasnda Deer Tamak
Fonksiyonlar arasnda parametre geirerek veri aktarlmas ileminin nasl gerekletirilebildiini grdk. Benzer bir sonuca ulamak iin kresel deikenlerden de yararlanabiliriz. Kresel deikenleri dersimizin balarnda ele alarak incelemitik. Kresel deikenler, programn almas boyunca, fonksiyonlar dahil, deeri geerli olan deikenlerdir. Kresel deikenler fonksiyonlarn iinde deil, ondan nce tanmlanr. Bir kresel deiken tanmndan sonra yer alan tm fonksiyonlar iin bu deikenin deeri geerlidir.

Static Deikeninin Fonksiyonlarda Kullanm


static deikenler fonksiyon terkedildiinde deerlerini kaybetmezler. Ayn fonksiyon bir daha altrldnda, daha nceki deer yeniden kullanlabilir. Program iindeki bir fonksiyonun ya da kresel deikenin bana static tanm yapld takdirde, bu fonksiyon veya deiken dier kaynak program dosyalarna kar eriilmez olacaktr. Bunun anlam, dier dosyalardan yaplacak eriimlere kar "gizli" kalacaktr.

Fonksiyon arma Yntemleri


C++ programlama dilinde fonksiyonlarn arlmas iki farkl yntemle gerekletirilmektedir: 1) Deer ile arma int topla(int a, int b) eklinde fonksiyon tanml z=topla(x,y); eklinde aryoruz bu durumda a=x ve b=y olur. 2) Referans (Bavuru) ile arma Bellek adresleri kullanlr. void hesap (*p) eklinde fonksiyon tanml hesap(&x); bavuru veriliyor

Deer ile arma


aran fonksiyondan arlan fonksiyona aktarlan deiken deerlerinde bir deiiklik olsa bile, bu deiiklik aran programdaki deiken deerlerine etki etmez. Bu deiiklikler arlan fonksiyon iinde parametrelerin kopyalar zerinde gerekleir.
#include <iostream> using namespace std; int hesap(int); int main() { int x=5; x=hesap(x); cout <<x; return 0; } int hesap (int a) { a=55; return a; }

Buradan u sonu kmaktadr; Fonksiyonlar deere gre arldnda, arlan fonksiyon iinde parametrenin deeri deitirilse bile bu deiiklik aran programda ayn isimli deikenin deerine etki yapmaz.

Referans (Bavuru) ile arma Bellek adreslerini kullanarak fonksiyonlar arabiliriz. Bu durumda, arlan fonksiyon iinde parametre deerleri zerinde yaplacak deiikliklerin, onu aran fonksiyon zerinde de etkili olduu grlecektir.
#include <iostream> using namespace std; void hesap(int*); int main() { int x=5; hesap(&x); cout <<x; return 0; } void hesap (int *p) { *p=55; } #include <iostream> using namespace std; void hesapla(int&, int&); int main() { int x=3,y=5; cout <<x<<" "<<y<<endl;// 3 5 hesapla(x,y); cout <<x<<" "<<y; //13 15 return 0; } void hesapla (int& x, int& y) { x=x+10; y=y+10; }

#include <iostream> using namespace std; void hesap(); int main () { int x=7; cout<< x <<endl; hesap(); cout<< x <<endl; return 0; } void hesap() { x=77; }

#include <iostream> using namespace std; int hesap(int); int main () { int x=7; cout<< x <<endl; x=hesap(x); cout<< x <<endl; return 0; } int hesap(int a) { a=77; return a; }

#include <iostream> using namespace std; void hesap(); int x=7; int main() { cout<< ::x <<endl; hesap(); cout<< ::x <<endl; return 0; }

#include <iostream> using namespace std; void hesap(int *); int main() { int x=7; cout<< x <<endl; hesap(&x); cout<< x <<endl; return 0; }

void hesap () { ::x=77; }

void hesap (int *p) { *p=77; }

Kendini aran fonksiyonlar


Bir fonksiyon kendi kendini srekli ararak altrabilir. Bu tr fonksiyonlara zarl fonksiyonlar denir.

Fonksiyonlarn Ar Yklenmesi (Function Overloading)


ki yada daha fazla fonksiyon ayn isime sahipseler, ar yklenmilerdir. Ar yklenmi fonksiyonlar kullanarak birbirleriyle ilikili ilemleri ayn isimle ararak program daha sade bir hale gelir, ok fazla fonksiyon isimlerinden oluabilecek muhtemel hatalar nlenmi olur. Birden fazla fonksiyon argman saylar ve/veya argman tipleri farkl ise ayn ismi kullanabilirler. Ar yklenmi fonksiyon tanmlanrken, fonksiyonun tm versiyonlar deklare edilir. Bu farkl versiyonlardan derleyici, argman says ve tipine gre otomatik olarak aracaktr.

Aadaki rnek programda tarih datalar string ve tamsay olarak iki farkl ekilde kullanlmtr. Tarih isimli fonksiyon arlrken derleyici bu farkl tiplere gre tarih fonksiyonunu icra edecektir.

Fonksiyonlarn Ar Yklenmesi

Esnek Argmanl Fonksiyonlar #include <cstdarg> ktphanesi kullanlr. Esnek argmanlar oluturan kme ardk olarak listeye eklenmelidir. Bu trden argmanlar fonksiyonun parametre listesi ksmnda nokta ... ile belirtilir.

Esnek Argmanl Fonksiyonlar cstdargda cstdargda tanml macro fonksiyonlar


Esnek Argumanl Fonksiyon tanmlamas yapabilmek iin cstdarg ktphanesinde adet makro fonksiyon bir adet tip tanmlanmtr.

Tip / Fonksiyon va_list va_start(a, n)

Aklama
Tip: ardk esnek argmalar iin tip belirleyici. macro: va_list tipinde bildirilmi a gstericisi iin bellekten n elemanl yer ayrr. macro: Veri tipi tip (int, double v.b.) ile belirlenmi kme elemanlarna eritirir. macro: va_list tipinde bildirilmi a gstericisi iin bellekten blgeyi boaltr.

va_arg(a, tip) va_end(a)

Esnek Argmanl Fonksiyonlarn Tanmlanmas


dn_tipi fonksiyon_ad( tip_deike_listesi, int liste adedi, ...) { macro fonksiyon ve dier ilemler return donen_deger; } dn_tipi= int fonksiyon_ad = Hesapla tip_deike_listesi = int a, double b, float c int liste adedi = 5

...=

3,4,5,6

Burada deerler va_arg(a, tip) tip tanmna gre yaplr. rnein double olsayd 3.0, 4.0, 5.0, 6.0 eklinde tanmlanmaldr.

Esnek Argmanl Fonksiyonlarn

Esnek Argmanl Fonksiyonlarn

Esnek Argmanl Fonksiyonlarn

Esnek Argmanl Fonksiyonlar Polinom hesab

P(x,n) = a0 + a1x + a2x2 + ... + anxn


double phesap(double x, int n, ... )
{ macro fonksiyon ve dier ilemler } x=1.5 ve n=4 iin; phesap(1.5, 4, 1.0, -2.0, 0.2, 1.1) a4 iin : a1=1.0, a2=-2.0, a3=0.2, a4=1.1 olur.

Polinom hesab : P(x,n) = a0 + a1x + a2x2 + ... + anxn ai (i = 0, 1, 2, ..., n) katsaylar esnek argman olarak bildirilmitir.

Вам также может понравиться