You are on page 1of 14

FONKSYONLAR

Fonksiyon, programc tarafndan seilen bir kod blouna isim vermek iin kullanlan aratr.
Fonksiyon ismi program ierisinde arldnda fonksiyonun temsil ettii kod altrlr. rnein bir
saynn faktriyelini hesaplayan aadaki kod parasn program ierisinde birok defa yazmak yerine
ayn ilemi gerekletiren bir fonksiyon tasarlayp faktriyel hesabna ihtiya duyulduunda sadece bu
fonksiyonun ismini yazmak ok daha pratik olacaktr.

int sayi
int faktoriyel

= 5;
= 1;

for(int i=5;i>0;i--)
{
faktoriyel*=i;
}

int faktoriyel(int sayi)


{
int sonuc = 1;
for(int i=sayi;i>0;i--)
sonuc*=i;
return sonuc;
}

Faktriyel Hesab

Faktriyel Fonksiyonu

lk programmzda main fonksiyonunu yazarak aslnda ilk fonksiyonumuzu da tasarlam olduk. Tabi
ki bu fonksiyonu biz deil iletim sisteminin kendisi armaktadr. Yukardaki tasarladmz
fonksiyonu ise biz veya fonksiyonumuzu verdiimiz baka bir programc aracaktr. Aadaki kod
blounda faktriyel fonksiyonunun arlp elde edilen deerin bir deikene atlmas
gsterilmektedir.

int faktoriyel(int sayi)


{
int sonuc = 1;
for(int i=sayi;i>0;i--)
sonuc*=i;
return sonuc;
}
int main()
{
int sayi = faktoriyel(5);
}

Faktriyel fonksiyonu kullanlrken ncelikle arlacak olan fonksiyonun ismi yazlr ardndan
derleyiciye yazlan ismin bir fonksiyona ait olduunu belirten sol parantez ( karakteri yazlr (Bu
karakteri gren derleyici faktoriyel isminin bir deikene deil de bir fonksiyona ait olduunu
anlamaktadr). Eer ki fonksiyon yapaca hesaplama iin bir veya birden fazla deeri arandan
bekliyor ise sol ve sa parantezler arasna bu deerler girilmelidir. faktoriyel fonksiyonu hangi
saynn faktriyelini alacan, arann (biz) buraya girdii deerden almaktadr. Fonksiyonun
dardan ald bu deerlere parametre ad verilmektedir. Yukardaki rnekte faktriyel fonksiyonuna
parametre olarak 5 deeri girilmitir.

YAZIM KURALI (SYNTAX)


C/C++ dillerinde fonksiyon yazm kural aadaki gibidir.

Fonksiyon smi
Tr

Dn Tr

int

Parametreler

faktoriyel (int sayi)

{
int sonuc = 1;
for(int i=sayi;i>0;i--)
sonuc*=i;

Gvde

return sonuc;
}

DN TR
Fonksiyonlar aran kiiye aran (caller) veya istemci(client) ad verilmektedir. rnein
aadaki kod paras ile biz aran olarak faktoriyel fonksiyonundan 5 saysnn faktriyelini
hesaplamasn istiyoruz. Fonksiyon arldktan sonra gerekli ilemleri yapp faktriyel ileminin
sonucunu bulmaktadr. Bulunan sonutan arann da haberdar olmas iin fonksiyon elde ettii
deeri return komutu ile arana getirmektedir. Bu ileme deer dndrmek ad verilir. Fonksiyon
tanmlanrken ilk olarak dndrecei deerin tr belirtilmelidir. Faktriyel fonksiyonu tam say bir
sonu elde edeceinden fonksiyonun dn tr de tam say olacaktr.
Fonksiyonlar almaya baladktan sonra ilettii ilk return komutu ile dn yapmaktadr.
Aadaki return komutu fonksiyonun son satrnda yer almaktadr fakat kimi durumlarda bu
komutun yeri deiebilir.

int faktoriyel(int sayi)


{
int sonuc = 1;
for(int i=sayi;i>0;i--)
sonuc*=i;
return sonuc;
}
int main()
{
int sonuc = faktoriyel(5);
}

int faktoriyel(int sayi)


{
int sonuc = 1;
for(int i=sayi;i>0;i--)
sonuc*=i;
return sonuc;
}
int main()
{
int sonuc = 120;
}

Fonksiyon bulduu sonucu arana dndrr

FONKSYON SM
Fonksiyon ismi yazlrken deiken ismi kurallar aynen geerlidir.

Fonksiyon isimleri ierisinde sadece ngilizce karakterler kullanlmaldr. Trke karakterler


farkl derleyici ve sistemlerde problem kartabilir. Bu sebeple kesinlikle Trke karakter
kullanlmamaldr.
Fonksiyon ismi yapt i hakknda bilgi verecek ekilde seilmelidir. smin balang harfi
kimi sistemlerde kk iken Windows gibi sistemlerde byk harfle balamaktadr. Bu seim
programcya aittir. Mhim olan yaplan seime program boyunca uyulmasdr. Ayrca
fonksiyon ismindeki her kelimenin ilk harfi byk dier harfleri kk olmaldr.

int F (int sayi)

HATALI
int s(int sayi)

HATALI

int faktoriyel(int sayi)

DORU
int kareKokBul(int sayi)

DORU

Fonksiyon ismi ile ayn isme sahip deiken tanmlanmamaldr. rnein aadaki kodda,
faktoriyel ismi ncelikle bir fonksiyon olarak tanmlanrken daha sonra bir tam say
deikeni iin kullanlmtr. Bu ilemin ardndan faktoriyel ismi ile bir fonksiyon ars
yaplmtr. Fakat derleyici isim ezme kurallarn dikkate ald iin faktoriyel ismini bir tam
say deiken olarak alglar ve fonksiyon ars yaplamayacan belirten bir hata verir.
kinci durumda ise tam say deikeni fonksiyon arsndan sonra tanmland iin derleyici
faktriyel isminin bir fonksiyona ait olduunu bilir ve bir hata grmez ve kodu derler.
Sadaki kod almasna ramen pratik adan byk problemler dourabilir. Fonksiyon
isimleri ile deiken isimleri asla kartrlmamaldr.

int faktoriyel(int sayi)


{
int sonuc = 1;
for(int i=sayi;i>0;i--)
sonuc*=i;
return sonuc;
}
int main()
{
int faktoriyel = 7;
int sayi = faktoriyel(5);
}

int faktoriyel(int sayi)


{
int sonuc = 1;
for(int i=sayi;i>0;i--)
sonuc*=i;
return sonuc;
}
int main()
{
int sayi = faktoriyel(5);
int faktoriyel = 7;
}

PARAMETRELER
Fonksiyonlar yapacaklar ilemler iin kullancdan bilgi isteyebilirler. rnein faktriyel fonksiyonu
hangi saynn faktriyelinin alnacan arandan(yani programcdan) parametre olarak
beklemektedir. Fonksiyon tanmlanrken dardan beklenen deerler gz nnde bulundurulmal ve
parametreler buna gre yazlmaldr. rnein bir saynn stn alan fonksiyon tasarlamak istersek
kullancdan iki deer almamz gerekir. lk parametre st alnacak say iken dier parametre st
deeri olmaldr.
Aada st alan bir fonksiyon verilmitir. Fonksiyon iki parametre alacak ekilde tasarlanmtr. Eer
dikkat ederseniz fonksiyonun gvdesinde alnan parametreler kullanlmaktadr. Fonksiyonu aran
kii iki parametre deeri girmek zorundadr yoksa derleyici hata verecektir. ar yaplrken arka
planda derleyici fonksiyonun tasarmna bakar ve fonksiyon armak iin gereken makine kodlarn
oluturur. Eer fonksiyonu arrken eksik parametre girerseniz iki parametre almak zere yazlm
olan makine kodlar da yanl sonular verecektir. Bu yzden derleyici parametre says konusunda
hata kabul etmez.

int ustAl(int taban,int ust)


{
int sonuc = 1;
for(int i=0;i<ust;i++)
sonuc*=taban;
return sonuc;
}
int main(int argc,char** argv)
{
int sayi = ustAl(2,4);
}

int ustAl(int taban,int ust)


{
int sonuc = 1;
for(int i=0;i<ust;i++)
sonuc*=taban;
return sonuc;
}
int main(int argc,char** argv)
{
int sayi = ustAl(2);
}

Doru ar

Hatal ar

Birden fazla parametre alan fonksiyon tasarlanrken parametreleri ayrmak iin virgl
kullanlmaktadr. Ayn ekilde fonksiyonu arrken de yine virgl kullanlr. Ayrca fonksiyonun
alaca parametreler yazlrken deiken tanmlama kurallarna aynen riayet edilmelidir.
Parametreler fonksiyona ait yerel deikenlerdir. mrleri fonksiyon arlrken balar ve fonksiyon
geri dndkten sonra sona erer. Parametre deikenlerin etki alan sadece tanmlandklar fonksiyon
gvdesi ile snrldr. rnein yukardaki rnekte taban parametresi main fonksiyonu ierisinde bir
anlam ifade etmemektedir.
Parametrelere daha nceden tanmlanm deikenler girildiinde deikenin sadece deeri fonksiyona
yollanr. Aadaki rnee bakacak olursak a ve b deikenleri fonksiyona parametre olarak
verilmektedir. Fonksiyon ars yaplmadan nce deikenlerin deerleri hafzadan ekilip fonksiyona
parametre olarak verilmektedir.

int main(int argc,char** argv)


{
int a=2,b=4;
int sayi = ustAl(a,b);
}

int sayi

= ustAl(2,4);

GVDE
Fonksiyon gvdesi { simgesinin hemen ardndan balar ve } simgesi ile sona erer. Fonksiyonu
bitirmenin bir dier yolu ise return komutunu kullanmaktadr. return komutu fonksiyonun arld
noktaya geri dnmesini salar. Fonksiyon ars ilemcinin izledii yolu deitirmesine neden
olmaktadr. Fonksiyon bittiinde ise arnn yapld noktadan yolunda devam etmesi gerekir.
Yazlan btn programlarn bir balang noktasna ihtiyac vardr bizim programmzn ki ise main
fonksiyonu dur. Bu fonksiyon iletim sistemi tarafndan arlr ve ilemci fonksiyon ierisindeki
komutlar sra ile iletir. rnein aadaki kod blounda ilk nce 10. Satr altrlmaktadr. Fakat bu
satrdaki ilemin tamamlanabilmesi iin ustAl fonksiyonunun (2, 4 parametreleri ile) arlmas
gerekmektedir. Bu yzden ilemci alma akn deitirip 3.satra atlar ve buradan sra ile komut
satrlarn iletir. lemci 7. Satra geldiinde return komutu ile karlar ve fonksiyon arlmadan
nceki noktaya yani 10. satra (dn deeri sonuc ile) geri dner. sayi deikenine ustAl
fonksiyonundan gelen deer (8) atandktan sonra ilemci 11.satr iletir ve program sona erer.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

int ustAl(int taban,int ust)


{
int sonuc = 1;
for(int i=0;i<ust;i++)
sonuc*=taban;
return sonuc;
}
int main(int argc,char** argv)
{
int sayi = ustAl(2,4);
cout<<"sayi...:"<<sayi<<endl;
}

return komutu fonksiyonun son satrndan daha ncede kullanlabilir. rnein aadaki fonksiyon,

parametrelerinden birisinin 0 olmas durumunda hemen sonlanp geriye 0 deeri dndrmektedir.


Dikkat edersek bu mantkl bir istek nk 0 saysnn btn stleri yine 0 olacaktr. Bu durumda
program altrlrsa ncelikle12.satrda ustAl fonksiyonu arlacak ve ilemci buradan ynn
deitirip 3. Satrdaki koulu altracaktr. Koul sonucu doru olduu iin return 0 komutu
devreye girer ve ilemci fonksiyonun arld noktaya yani 12. Satra dn deeri ile geri dner.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

int ustAl(int taban,int ust)


{
if(taban==0)
return 0;
int sonuc = 1;
for(int i=0;i<ust;i++)
sonuc*=taban;
return sonuc;
}
int main(int argc,char** argv)
{
int sayi = ustAl(0,4);
cout<<"sayi...:"<<sayi<<endl;
}

DN DEER OLMAYAN FONKSYONLAR


Fonksiyonlar ileri bittikten sonra arldklar noktaya geri dnerler. Fakat kimi fonksiyonlar geri
dnerken bir deer getirmezler. Bu fonksiyonlarn dn deerleri void olmaldr.
rnein programnz ierisinde ekrana * simgelerinden oluan bir ekil izdirmek istiyorsunuz. Bu
ilemi gerekletirecek kodlar srekli yazmak yerine fonksiyon kullanmak istiyorsunuz.
Fonksiyonunuz sadece ekrana yaz kartacak ve size bir deer getirmeyecektir. Bu durumda
fonksiyonun dn deerini void yazmak ok daha mantkl olacaktr.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

void yildiz()
{
for(int i=0;i<10;i++)
cout<<"*";
}
int main(int argc,char** argv)
{
yildiz();
}

Deer getirmemesi fonksiyonun dnmedii anlamna gelmez. Yukardaki yildiz fonksiyonunda


return ifadesi yer almamaktadr. Bu yzden fonksiyon, son satrna kadar iletilecek ve ardndan
(dier btn fonksiyonlarda olduu gibi) arld noktaya geri dnecektir.
Dn deeri olmamasna ramen void fonksiyonlarda return komutu kullanlabilir. Aadaki
fonksiyona dikkat edecek olursanz 3.satr da return komutu kullanlm fakat sanda bir deer
bulunmuyor. Bunun anlam fonksiyon 3.satrda arld noktaya dn yapyor fakat bir deer
getirmiyor. Fonksiyonumuz arld gibi geri dnd iin 4 ve 5. Satr hibir zaman
iletemeyecektir.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

void yildiz()
{
return;
for(int i=0;i<10;i++)
cout<<"*";
}
int main(int argc,char** argv)
{
yildiz();
}

yildiz fonksiyonu ile ilgili bir zellikte parametresinin olmamasdr.

Fonksiyonlarn leyii
Fonksiyonlar arldnda ilemci kodu iletme srasn deitirip farkl satrlardaki komutlar
altrmaya balayacaktr. rnein aadaki kodun 12.satrnda ustAl fonksiyonu arldnda
ilemci artk main fonksiyonunda devam etmeyip 3.satrdaki kodlar iletmeye balar. main fonksiyonu
ustAl fonksiyonu geri dnene kadar beklemede kalacaktr. Bu teknik btn programlama dillerinde
mevcuttur.
Bir fonksiyonu daima baka bir fonksiyon aracaktr. aran fonksiyon arlan fonksiyon iini
bitirene kadar beklemede kalr.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

int ustAl(int taban,int ust)


{
cout<<"ustAl calisti"<<endl;
int sonuc = 1;
for(int i=0;i<ust;i++)
sonuc*=taban;
return sonuc;

EKRAN IKTISI

}
int main(int argc,char** argv)
{
int sayi = ustAl(0,4);
cout<<"main devam ediyor"<<endl;
}

main fonksiyonunun ileyii aadaki ekilde gsterilmitir. ekilden de grlecei gibi ustAl
fonksiyonu arldktan sonra main fonksiyonu ustAl fonksiyonun bitmesini beklemektedir. ustAl
dndkten sonra main yoluna devam etmektedir.

DEER LE AIRMA ( call by value)


Fonksiyon parametrelerinin de birer deiken olduundan bahsetmitik. Ayrca deikenler konusu
sayesinde deikenlerin tanmlandklar etki alanlar ierisinde var olduklarn biliyoruz. Buna gre
aada ki degistir fonksiyonunun a ve b deikenlerinden haberi yoktur. Fonksiyona sadece a ve b
deikenlerinin sahip olduu deerler verilir.
Aada degistir fonksiyonu arlmadan nceki hafzann sembolik bir grnts verilmitir.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

void degistir(int sayi1,int sayi2)


{
int temp = sayi1;
sayi1= sayi2;
sayi2 = temp;
}
int main(int argc,char** argv)
{
int a=2,b=4;
degistir(a,b);
cout<<a<<b;
}

Deiken
Ad
a
b

Hafza Hcre
erii
2
4

Fonksiyon arldktan sonraki hafza grnts de aada verilmitir. degistir fonksiyonuna ait
olan sayi1 ve sayi2 deikenleri, a ve b deikenlerinin sadece deerlerini almtr.
Fonksiyon a ve b deikenlerinin varlndan habersizdir. Dolaysyla onlar maniple edemez.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

void degistir(int sayi1,int sayi2)


{
int temp = sayi1;
sayi1= sayi2;
sayi2 = temp;
}
int main(int argc,char** argv)
{
int a=2,b=4;
degistir(a,b);
cout<<a<<b;
}

Deiken
Ad
a
b
sayi1
sayi2

Hafza Hcre
erii
2
4
2
4

Aslnda fonksiyona parametre olarak bir deiken verilirken sadece deikenin deeri alnmaktadr.
Alnan bu deerler aadaki gibi fonksiyonun sayi1 ve sayi2 deikenlerine ilk deer olarak
atanmaktadr. (aadaki ilem sadece bir gsterimdir)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

void degistir(int sayi1 = 2,int sayi2 =4 )


{
int temp = sayi1;
sayi1= sayi2;
sayi2 = temp;
}
int main(int argc,char** argv)
{
int a=2,b=4;
degistir(a,b);
}

n Tanmlama ( Forward Decleration)


Fonksiyon arsnn da makine kodu karl mevcuttur. Fakat ar yaplmadan nce de baz
hazrlk ilemlerinin yine makine kodu ile yaplmas gerekir. Derleyicinin btn bu ileri doru ekilde
yapabilmesi iin arlacak fonksiyonun dn deeri, ismi ve parametre bilgilerini ardan nce
bilmesi gerekir.
Aada degistir fonksiyonun arsna karlk gelen makine kodlar gsterilmektedir. 5.satrdaki
call komutu fonksiyonu aran asl makine komutudur. nceki satrdaki makine komutlar
fonksiyon arsna yaplan hazrlktr.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

void degistir(int sayi1,int sayi2)


{
int temp = sayi1;
sayi1= sayi2;
sayi2 = temp;
}
int main(int argc,char** argv)
{
int a=2,b=4;
degistir(a,b);
}

1.
2.
3.
4.
5.

mov
push
mov
ecx
call

eax,dword ptr [b]


eax
ecx,dword ptr [a]
ustAl (2111C7h)

Programmz tek bir dosyadan ibaret olduundan u ana kadarki fonksiyon tanmlama yntemi bir
problem tekil etmeyecektir. Fakat byk projelerde birok dosya olmas kanlmazdr. Bugne
kadarki programlarmzda daima bir ktphane eklediimizi dnrsek aslnda bizim projelerimizde
birden fazla dosya ile almaktadr. Dolaysyla fonksiyonlar farkl dosyalarda bulunabilir. Bu
fonksiyonlar armak iin derleyicinin fonksiyona ait dn tr, fonksiyon ismi ve parametre
bilgilerine ihtiya duyacaktr. Bu bilgiler fonksiyon arlmadan nce derleyiciye verilmelidir. C++
programlama dili gvdesi farkl yerde bulunan fonksiyonlarn arlmasna imkn tanyan n
tanmlama (forward decleration) ad verilen bir mekanizmaya sahiptir.
Aa solda bulunan kod parasn incelersek degistir fonksiyonunun gvdesinin arldktan sonra
tanmlandn greceiz. C++ derleyicisi bu durumda bizlere deitir fonksiyonun tanml olmadn
syleyecektir(fonksiyon farkl bir dosyada da olabilirdi). Derleyici, ar yaplmadan nce fonksiyonu
gremedii iin hata vermektedir. Bu problemin zm fonksiyonun n tanmlamasn arlmadan
nce yapmaktr. Fonksiyonun n tanmlamasna prototip ad da verilmektedir.

int main(int argc,char** argv)


{
int a=2,b=4;
degistir(a,b);
cout<<a<<b;
}
void degistir(int sayi1,int sayi2)
{
int temp = sayi1;
sayi1= sayi2;
sayi2 = temp;
}

Hatal ar

void degistir(int sayi1,int sayi2);


int main(int argc,char** argv)
{
int a=2,b=4;
degistir(a,b);
cout<<a<<b;
}
void degistir(int sayi1,int sayi2)
{
int temp = sayi1;
sayi1= sayi2;
sayi2 = temp;
}

Doru ar

Kendini aran Fonksiyonlar (z Yineleme)


Kimi problemler ayn ilemin farkl deerler ile srekli yaplmasyla elde edilebilir. Bu tip durumlar
da uana kadar dngleri kullanmaya altk. Fonksiyonlar sayesinde farkl bir zm daha
retebiliyoruz. rnein aadaki faktriyel hesab yapan fonksiyonu z yinelemeli olarak zm
gsterilmektedir.

int faktoriyel(int sayi)


{
int sonuc = 1;
for(int i=sayi;i>0;i--)
sonuc*=i;
return sonuc;
}
int main()
{
int faktoriyel = 7;
int sayi = faktoriyel(5);
}

int faktoriyel(int sayi)


{
if(sayi==1)
return 1;
return sayi*faktoriyel(sayi-1);
}
int main()
{
int sayi = faktoriyel(5);
}

faktoriyel fonksiyonu 5 deeri ile arldnda gerekleen ilemler aadaki gibidir. Fonksiyon ilk
olarak parametrenin 1 olup olmadn kontrol ediyor. Ardndan bu fonksiyon ierisinde faktoriyel

fonksiyonu 4 deeri ile yeniden arlyor. Ayn ilem ekilde de grld zere parametre 1 olana
kadar devam etmektedir. Ardndan faktoriyel(1) fonksiyonu faktoriyel (2) fonksiyonuna 1
deerini dndrr. faktoriyel (2) fonksiyonu bu deeri 2 ile arpp sonucu faktoriyel (3)
fonksiyonuna dndrr. Bu ilem faktoriyel (5) fonksiyonuna kadar devam eder. faktoriyel(5)
fonksiyonu kendisine dnen deeri 5 ile arpp sonucu ilk ary yapana dndrecektir.

int sayi = faktoriyel(5);

//faktoriyel(4) iin
int faktoriyel(4)
{
if(4==1)
return 1;
return 4*faktoriyel(3);
}

//faktoriyel(2) iin
int faktoriyel(2)
{
if(2==1)
return 1;
return 2*faktoriyel(1);
}

//faktoriyel(5) iin
int faktoriyel(5)
{
if(5==1)
return 1;
return 5*faktoriyel(4);
}

//faktoriyel(3) iin
int faktoriyel(3)
{
if(3==1)
return 1;
return 3*faktoriyel(2);
}

//faktoriyel(1) iin
int faktoriyel(1)
{
if(1==1)
return 1;
}

Aadaki ekle dikkat edecek olursak fonksiyonlar parametre deerini bir azaltarak srekli
ayn fonksiyonu aryorlar. Taki faktoriyel(1) fonksiyonu arlana dek. Parametre 1
olduunda fonksiyon kendisini armay kesip 1 deerini geri dndrmektedir. Bu bir
dngnn biti kouluna benzer. z yineleme ilemininde de bir sona ihtiyac vardr. Aksi
taktirde sonsuz bir fonksiyon ars programmzn hata (stack overflow) verip sonlanmasna
sebep olacaktr.
Dikkat etmemiz gereken bir hususta faktoriyel(2) fonksiyonunun faktoriyel(1) fonksiyonu
bitmeden yoluna devam edemeyecek olmasdr. faktoriyel(1) fonksiyonu 1 deerini
faktoriyel(2) fonksiyonuna dndrecektir. Ayn ekilde faktoriyel(2) fonksiyonu da
hesaplad sonucu faktoriyel(3) fonksiyonuna oda ekilde de grld gibi sonucu
faktoriyel(4) fonksiyona dndrecektir. faktoriyel(4) fonksiyonu z yinelemeyi balatan
faktoriyel(5) fonksiyonuna kombine sonucu dndrecektir. faktoriyel(5) fonksiyonu ise
arld noktaya dndrd deeri brakp ilemi sonlandracaktr.

int sayi = faktoriyel(5);

5*faktoriyel(4)

4*faktoriyel(3)

3*faktoriyel(2)

2*faktoriyel(1)

int sayi = 120

5*24

4*6

3*2

2*1

Kara Kutu Tasarm (Black box)


Fonksiyonlarmz tasarlarken onlar sadece kendimiz iin deil baka programclarnda kullanacan
dnerek tasarlamalyz. Ayn ekilde bizler de bugne kadar bakalar tarafndan tasarlanm
fonksiyonlar kullandk. rnein pow fonksiyonu st almaya yaramaktadr. Bu fonksiyon hakknda
bildiimiz iki parametre ald ve sonucu dn deeri olarak dndrddr. Fonksiyonun gvdesi
hakknda bilgi sahibi deiliz. Bizim amzdan pow fonksiyonu bir kara kutudan ibarettir. Bu
televizyon ile kumanda arasndaki ilikiye benzer. Televizyonun teorik olarak nasl altn
bilmiyoruz ama kumanda sayesinde onu istediimiz gibi kullanp sonu alabiliyoruz.
Aada pow fonksiyonun ars gsterilmitir. pow fonksiyonuna yapaca hesaplama ile ilgili
bilgileri parametre yoluyla veriyoruz. Fonksiyon gerekli ilemleri yaptktan sonra elde ettii sonucu
bize dn deeri olarak bildirmektedir. Binlerce programc bu fonksiyonu bizimle ayn ama iin
kullanmaktadr. Bu yzden bir fonksiyon tasarlarken basitliine zen gsterilmelidir.

pow(2.0,3.0)

pow

pow fonksiyonu tek ve basit bir ii gerekletirmektedir. Bu sayede fonksiyon herkesin isteine karlk
verebilir. pow fonksiyon ierisine sadece bizim iimizi grecek kodlar yerletirseydik fonksiyonu

kullanacak tek kii de biz olurduk. rnein tasarladnz fonksiyonun ierisine konsola yaz
yazdrmak gibi ilemler yaplmamaldr.
Fonksiyon Gvdesinin Bykl
Fonksiyonlar tasarlanrken gvdesi olabildiince kk tutulmaldr. Bunu salayabilmek iin
yazdmz fonksiyonun tek bir grevi gerekletirmesini salamalyz. rnein e saysn
hesaplayacak bir fonksiyon tasarlamak isteyelim. e saysn elde edeceimiz seri aadaki gibi
olduuna gre bu ilemi gerekletirecek fonksiyonda sadaki gibi olacaktr.

float eHesapla(int sinir)


{
float sonuc = 0;
for(int i=0;i<sinir;i++)
{
int faktoriyel = 1;
for(int j=i;j>0;j--)
faktoriyel*=j;
sonuc+=1.0f/faktoriyel;
}
return sonuc;
}

Eer eHesapla fonksiyonuna dikkat edecek olursak iki ilemi bir arada yapmaktadr. erdeki dng
faktriyel ilemi yapmaktadr. Bu ilem iin ayr bir fonksiyon tasarlayabiliriz.

int faktoriyel(int sayi)


{
int sonuc = 1;
for(int i=sayi;i>0;i--)
sonuc*=i;
return sonuc;
}
float eHesapla(int sinir)
{
float sonuc = 0;
for(int i=0;i<sinir;i++)
sonuc+=1.0f/ faktoriyel(i);
return sonuc;
}

Faktriyel ilemi ayr bir fonksiyon ile elde edildiinden eHesapla fonksiyonunun gvdesi daha basit
bir hale geldi. Ayrca eHesapla fonksiyonunda oluacak hatalar fonksiyon gvdesi kk olduundan
ok daha kolay bulunacaktr. Programclk hayatnz boyunca oluturacanz fonksiyon gvdelerinin
kk olmasna dikkat edin. Byk gvdeye sahip olan bir fonksiyonda kacak bir hatay bulmak ok
zor olacaktr. Hlbuki gvde kk olduunda hatay bulmakta kolay olacaktr.

Fonksiyon Dokmantasyonu
Programc olarak yazdmz kodlarn daima bir program reteceini dnmemeliyiz. Kimi zaman
programclarn grevi baka programclara yardmc olacak ktphaneleri tasarlamak olabilir. Bu
durumda sonuta tek bana allabilecek bir rn elde edilmez. Ayrca yazdmz fonksiyonlar
baka programclar kullanacandan fonksiyonlarn kullanm ve davranlar hakknda bilgi verilmesi
gerekir. Genellikle bu bilgiler fonksiyon isminin zerinde yer alr.

/*
Bir saynn istenen stn hesaplar.
@Param taban st alnacak olan say
@Param ust
tabann alnacak st deeri.
Negatif girilmemelidir.
@return
ust alma ileminin sonucu dndrlr.
*/
int ustAl(int taban,int ust)
{
int sonuc = 1;
for(int i=0;i<ust;i++)
sonuc*=taban;
return sonuc;
}

Yazdmz her fonksiyon iin yukarda olduu gibi bir yorum blou eklemeliyiz. Bu sadece baka
programclar iin deil kendimiz iinde faydal olacaktr. Yorum stiliniz yukardaki ile birebir olmak
zorunda deildir. Fakat fonksiyonun yapt i, parametreleri, dn deeri ve kullanm hakknda
temel bilgiler yazlmas arttr.

Fonksiyon Ar Ykleme
Programclk hayatmzda ayn ilemin farkl trde parametreler iin yaplmas gerektiini greceiz.
rnein st alma ilemi tam saylar zerinde alt gibi ondalk saylar zerinde almasn da
istiyoruz. Yaplacak ilem yine st alma ilemi fakat parametreler farkldr. C++ dili bu tip durumlar
iin fonksiyon ar ykleme ad verilen bir teknie sahiptir. Bu teknikte ismi ayn olan farkl
fonksiyonlar tasarlayabilmekteyiz. Aada iki farkl ustAl isminde fonksiyon tanmlanmtr.

int ustAl(int taban,int ust)


{
int sonuc = 1;
for(int i=0;i<ust;i++)
sonuc*=taban;
return sonuc;
}
float ustAl(float taban,float ust)
{
float sonuc = 1;
for(int i=0;i<ust;i++)
sonuc*=taban;
return sonuc;
}
int main(int argc,char** argv)
{
cout<< ustAl(2.4f,4.0f)<<endl;
cout<< ustAl(2,4)<<endl;
}

EKRAN IKTISI

Yukardaki koda dikkat edecek olursak ustAl fonksiyonu iki tanedir. Derleyici hangi fonksiyonun
arlacana, programcnn fonksiyona girdii parametrelerden karar vermektedir. main
fonksiyonundaki ilk ustAl(2.4f,4.0f) ars derleyiciye parametreleri iki float olan ustAl
fonksiyonunun arlacan belirtmektedir. main deki ikinci ar da ise parametreler iki tam saydr.
Bu da derleyiciye arlacak fonksiyonun iki tane tam say olacan belirtir.
Bir fonksiyonu ar ykleyebilmek iin parametre saysnn veya trlerinin deitirmesi gerekir.
Parametre says arttrlabilir veya azaltlabilir. Mhim olan parametrelerin farkl olmasdr.
Ar ykleme iin sadece dn deerlerinin farkl olmas yeterli deildir. Derleyici hangi
fonksiyonun arlacana parametreler zerinden karar verir. Fonksiyon isimleri ayn olmas
fonksiyonlarn ayn olduu anlamna gelmez. Aslnda iki farkl fonksiyon olmasna ramen derleyici
bizlere ayn ismi verme kolayl salamtr. Aadaki ekilde ar yklenmi fonksiyonlarn bizim
tarafmzdan grn ile derleyici tarafndan grnleri verilmitir. Biz float parametreli ustAl
fonksiyonunu ardmzda derleyici bizim hangi fonksiyonu istediimizi anlyor ve ona gre asl
fonksiyonu aryor.

int ustAl(int taban,int ust)

int ustAl_int_int(int taban,int ust)

float ustAl(float taban,float ust)

int ustAl_float_float(float taban,float ust)

Bizim Grdmz

Derleyicinin Grd

You might also like