C++ Dersi: Nesne Tabanlı Programlama Bölüm 5: Fonksiyonlar
İçerik Standart Kütüphane Fonksiyonları Kullanıcı Tarafından Tanımlanan Fonksiyonlar Fonksiyon Tanımı Fonksiyon Prototipi void Fonksiyonları Parametreli Fonksiyonlar Varsayılan Parametreler Değişken Kapsamı Tekli Kapsam Çözme Operatörü :: Fonksiyon Yükleme Satıriçi Fonksiyonlar 2
Fonksiyonlar bir görevi yapan komutlar grubudur. Fonksiyonlar uzun bir problemi daha küçük problemlere bölerek çözmek ve program yazımını basitleştirmek için kullanılır. Fonksiyonu bir kere yazıp programın farklı yerlerinden çağırmak mümkündür. 3
Standart Kütüphane Fonksiyonları Standart kütüphanelerde değişik amaçlar için kullanılabilen birçok fonksiyon tanımlanmıştır. Örneğin, aşağıdaki fonksiyonları kullanabilmek için <cmath> kütüphanesini #include komutu ile programa katmamız gerekir. Matematiksel İfade Fonksiyon 3 5 pow(3.0,5.0) 16 sqrt(16.0) -8 abs(-8) 4
#include <iostream> #include <cmath> using namespace std; int main() cout<<"3 uzeri 5= "<<pow(3.0,5.0)<<endl; // 3 5 cout<<"16'nin kare koku= "<<sqrt(16.0)<<endl; // 16 cout<<"-8'in mutlak degeri= "<<abs(-8)<<endl; // -8 return 0; ÇIKTI 3 uzeri 5= 243 16 nin kare koku= 4-8 in mutlak degeri= 8 5
Kullanıcı Tarafından Tanımlanan Fonksiyonlar VeriTipi fonksiyonadı (parametre listesi) Veri Tipi Fonksiyon Adı Parametre Listesi int main () cout << "Merhaba C++!"; return 0; Fonksiyon Başlığı Fonksiyon Gövdesi 6
#include <iostream> using namespace std; int fakt(int x) int f=1; for (int i=1;i<=x;i++) f *= i; return f; main() int sayi; cout<<"sayi giriniz:"; cin>>sayi; cout<<sayi<<"!="<<fakt(sayi)<<endl; Fonksiyon Başlığı Fonksiyon Gövdesi Fonksiyon Çağırma ÇIKTI Sayi giriniz:4 4!=24 7
#include <iostream> using namespace std; int fakt(int x) 3... return f; 4 main() 1... 5 cout<<sayi<<"!="<<fakt(sayi)<<endl;... 2 8
#include <iostream> using namespace std; int fakt(int x) int f=1; for (int i=1;i<=x;i++) f *= i; return f; int main() int n,sonuc; cout<<"bir sayi giriniz:"; // Faktoriyel hesaplayan fonksiyon cin>>n; // Girilen n değerini kullanarak fonksiyon 4 kez çağırılır sonuc=(fakt(n)/4)*(6/fakt(n-1))+(fakt(n-2)/2)*(7/fakt(n-3)); cout<<"sonuc="<<sonuc<<endl; return 0; ÇIKTI Bir sayi giriniz:4 Sonuc=13 9
Fonksiyon Prototipi Kullandığımız her ismin (değişken, sabit, fonksiyon, vs.) kullanımından önce tanımlanması gerekir. Fonksiyonları önceden tanıtıp fonksiyon içeriğini istediğimiz yere, hatta başka bir dosyaya bile yazmamız, fonksiyon prototipi (function prototype) ile mümkün olabilmektedir int fakt(int x); int fakt(int); // veya 10
#include <iostream> using namespace std; int fakt(int); // Fonksiyon prototipi int main() int n,sonuc; cout<<"bir sayi giriniz:"; cin>>n; // Girilen n değerini kullanarak fonksiyon 4 kez çağırılır sonuc=(fakt(n)/4)*(6/fakt(n-1))+(fakt(n-2)/2)*(7/fakt(n-3)); cout<<"sonuc ="<<sonuc<<endl; return 0; int fakt(int x) // Faktoriyel hesaplayan fonksiyon int f=1; for (int i=1;i<=x;i++) f *= i; return f; 11
void Fonksiyonları Bir fonksiyon değer döndürmüyorsa veya parametre içermiyorsa, bu durumu void yazarak belirtmemiz gerekir. #include <iostream> using namespace std; void mesaj(void); int main() mesaj(); return 0; void mesaj(void) // Fonksiyon prototipi // Fonksiyon çağırımı // Mesaj yazan fonksiyon cout<< Kullaniciya mesaj ; cout<< ileten bir fonksiyon <<endl; ÇIKTI Kullaniciya mesaj ileten bir fonksiyon 12
#include <iostream> main using namespace std; void buyuk(float,float); // Fonksiyon prototipi int main() float x,y; buyuk cout<<"iki deger giriniz:"; cin>>x>>y; // İki sayı girilir buyuk(x,y); // İki sayı fonksiyona yollanır return 0; void buyuk(float a,float b) // İki sayının büyüğünü bulan fonksiyon cout<<"sayilarin buyugu :"; if (a>b)cout<<a<<endl; // İki sayı karşılaştırılır else cout<<b<<endl; // Büyüğü ekrana yazdırılır 3.4 2.1 x y 3.4 2.1 a b ÇIKTI Iki deger giriniz:3.4 2.1 Sayilarin buyugu :3.4 13
#include <iostream> using namespace std; double alan(void); // Fonksiyon prototipi int main() double sonuc; sonuc=alan(); // alan() fonksiyonu çağırılır, döndürdüğü değer sonuc'a atanır cout<<"alan = "<<sonuc<<endl; return 0; double alan(void) // En ve boyu okuyup dikdörtgenin alanını hesaplayan fonksiyon double en,boy; cout<<"dikdortgenin en ve boyunu giriniz:"; cin>>en>>boy; // En ve boyu okur return en*boy; // Alanı hesaplayıp döndürür ÇIKTI Dikdortgenin en ve boyunu giriniz: 2.2 3.3 Alan = 7.26 14
Parametreli Fonksiyonlar Çağırılan fonksiyonla çağıran fonksiyon arasında veri alışverişi parametre kullanılarak yapılır. Çağıran fonksiyonda yer alan parametrelere gerçek parametre, çağırılan fonksiyonda yer alan parametrelere formal parametre ismi verilir. Bu parametrelerin sayısının ve veri tipinin uyumlu olması gerekir. 15
void fon(int,float); int main() int x=5; float y=3.6; fon(x,y); void fon(int a, float b) Gerçek parametre Formal parametre Bu parametreler değer parametresi (call by value) veya referans parametresi (call by reference) olarak kullanılabilir. 16
Referans Değişkeni Referans değişkenleri bir değişkene farklı bir isim vermek için kullanılır. Referans değişkenleri & (referans) operatörü ile tanımlanır. int deger = 5; int &ref = deger; 5 ref deger ref = 7; 5 ref 7 deger 17
Referans değişkenlerini tanımladığımızda mutlaka ilk değer atamasını yapmamız gerektiğini, bir başka deyişle hangi değişkenin referansı olacağını belirtmemiz gerektiğini unutmayalım. int &ref; // X geçersiz tanımlama Bir referans değişkeni tek bir değişkenin referansı olabilir ve bu ilk atama sırasında belirlenir. Daha sonra bu referans değişkeni farklı bir değişkenle ilişkilendirilemez. int x=5,y=6; int &ref=x; ref=y; // X Geçersiz atama
Fonksiyon Parametreleri C++ dilinde parametreler iki şekilde yollanabilir. Değer Parametresi: Çağırılan fonksiyona gerçek parametre değerinin bir kopyası yollanır. Fonksiyonda formal parametre için bellekte bir yer açılır ve yollanan değer bu yere kopyalanır. Fonksiyon bitiminde yeni açılan yer yok olur ve gerçek parametrenin değeri etkilenmez. Referans Parametresi: Fonksiyona gerçek parametrenin referansı yollanır. Böylece fonksiyon başlığında yer alan formal parametre ve yollanan gerçek parametre bellekte aynı hücreyi paylaşır. Fonksiyonda formal parametreye yapılan herhangi bir değişiklik gerçek parametreye de yansır.
void fun (int x, int &y) //Fonksiyon başlığı Değer Parametresi Referans Parametresi fun(a,b); // Fonksiyon çağırımı a 2 b 3 y x 2
#include <iostream> using namespace std; void surpriz (int a, int &b) a=5; b=6; cout<<"a= "<<a<<" b= "<<b<<endl; int main() int i=10, j=20; surpriz(i,j); cout << "i= "<<i<<" j= "<<j<<endl; return 0; 5 10 a 10 6 20 b i ÇIKTI a= 5 b= 6 i= 10 j= 6 j
Varsayılan Parametreler Çağırılan fonksiyondaki formal parametreler ile fonksiyon çağırımında yer alan gerçek parametrelerin sayı ve tip olarak uyuşması gerekir. Çağıran fonksiyon, çağırdığı fonksiyona gerçek parametre yollamayacaksa, varsayılan parametreler (default parameter) kullanılır. Gerçek parametre yollanmadığında daha önce tanımlanmış değeri alan parametrelere varsayılan parametre denir.
#include <iostream> using namespace std; void fon(int x=1,int y=20) cout<<x<< <<y<<endl; int main() fon(5,10); fon(5); fon(); return 0; // Varsayılan değerlerle 2 formal parametre // 2 gerçek parametre ile fonksiyon çağırımı // 1 gerçek parametre ile fonksiyon çağırımı // Gerçek parametresiz fonksiyon çağırımı ÇIKTI 5 10 5 20 1 20
Varsayılan parametreler parametre listesinin sonunda yer almalıdır. void fon(int x=5, int y) // X Hata Varsayılan parametreleri fonksiyon prototipinde veya fonksiyon başlığında belirtebiliriz, ancak ikisinde birden belirtmememiz gerekir. void fon(int, int=5); // fonksiyon prototipi... void fon (int y, int x=5) // fonksiyon başlığı...
Değişken Kapsamı Her değişkenin program içinde hangi bölgelerde kullanılabileceğini gösteren bir kapsamı (scope) vardır. Değişken kapsamı yerel (local) ve genel (global) kapsam olmak üzere ikiye ayrılır. Genel Kapsam: Genel değişkenler fonksiyonlardan önce, programın başında yaratılan ve aynı isim yeniden tanımlanmadıkça programın her yerinde kullanılabilen değişkenlerdir. Yerel Kapsam: Yerel değişkenler fonksiyon içinde tanımlanan ve sadece o fonksiyon içinde kullanılabilen değişkenlerdir.
#include <iostream> using namespace std; void bir(void); int x; // Genel değisken int main() x=5; cout<<"fonksiyon cagirmadan once genel x: "; cout<<x<<endl; bir(); // Fonksiyon çağırımı cout<<"fonksiyon bittiginde genel x: "; cout<<x<<endl; return 0; void bir(void) int y=8; ÇIKTI Fonksiyon cagirmadan once genel x:5 Fonksiyon icinde genel x ve yerel y:5 8 Fonksiyon bittiginde genel x: 10 // Fonksiyon tanımı // Yerel degisken cout<<"fonksiyon icinde genel x ve yerel y: "; cout<<x<<" "<<y<<endl; x=10;
Tekli Kapsam Çözme Operatörü :: Genel değişkenlere, içinde aynı isimde yerel değişken tanımı olan fonksiyonlardan erişmek için Tekli Kapsam Çözme Operatörünü (::) kullanabiliriz. #include <iostream> using namespace std; void fon(); int i; int main() i=3; fon(); return 0; void fon() char i; // Genel i değişkeni // Yerel i değişkeni i='b'; ::i=6; cout<<"yerel i: "<<i<<endl; cout<<"genel i: "<<::i<<endl; ÇIKTI Yerel i: B Genel i: 6
Fonksiyon Yükleme Aynı isimde birden fazla fonksiyonu, farklı parametrelerle tanımlayabiliriz. Bu yönteme, fonksiyon yükleme ismi verilir. #include <iostream> using namespace std; int topla (int,int); double topla (double,double ) int main() ÇIKTI 1.topla fonksiyonu: 5 2.topla fonksiyonu: 9.9 cout<<"1.topla fonksiyonu: "<<topla(2,3)<<endl; cout<<"2.topla fonksiyonu: "<<topla(4.3,5.6)<<endl; return 0; int topla (int x, int y) // Tamsayı toplayan fonksiyon return x+y; double topla (double x, double y) // Reel sayı toplayan fonksiyon return x+y;
Satıriçi Fonksiyonlar Satıriçi (inline) fonksiyonlar, fonksiyonun kullanıldığı yerlere doğrudan yapıştırılır, böylece fonksiyon çağırma işleminin yapılmasına gerek kalmaz. inline VeriTipi fonksiyonadı() Örnek: //tanımlamalar inline double alan() return a*a;