29
C++ Dersi: Nesne Tabanlı Programlama Çiğdem Turhan Fatma Cemile Serçe Bölüm 5: Fonksiyonlar

C++ Dersi: Nesne Tabanlı Programlama · C++ dilinde parametreler iki şekilde yollanabilir. • Değer Parametresi: Çağırılan fonksiyona gerçek parametre değerinin bir kopyası

Embed Size (px)

Citation preview

C++ Dersi:Nesne Tabanlı Programlama

Çiğdem Turhan

Fatma Cemile Serçe

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 C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

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.

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

3

Standart Kütüphane Fonksiyonları • Standart kütüphanelerde değişik amaçlar içinkullanı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.

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

4

16

Matematiksel İfade Fonksiyon

35 pow(3.0,5.0)

sqrt(16.0)

|-8| abs(-8)

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

5

#include <iostream>#include <cmath>using namespace std;int main(){

cout<<"3 uzeri 5= "<<pow(3.0,5.0)<<endl; // 35

cout<<"16'nin kare koku= "<<sqrt(16.0)<<endl; //

cout<<"-8'in mutlak degeri= "<<abs(-8)<<endl; // |-8|

return 0;}

16

ÇIKTI3 uzeri 5= 24316’nin kare koku= 4-8’in mutlak degeri= 8

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

6

Kullanıcı Tarafından Tanımlanan Fonksiyonlar

VeriTipi fonksiyonAdı (parametre listesi)

{

}

int main ()

{

cout << "Merhaba C++ !";

return 0;

}

Veri TipiFonksiyon Adı

Parametre Listesi

Fonksiyon Başlığı

Fonksiyon

Gövdesi

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

7

ÇIKTISayi giriniz:44!=24

#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

Gövdesi

Fonksiyon

Başlığı

Fonksiyon

Çağırma

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

8

#include <iostream>

using namespace std;

int fakt(int x)

{

.

.

.

return f;

}

main(){

.

.

.

cout<<sayi<<"!="<<fakt(sayi)<<endl;

...

}

1

2

3

4

5

#include <iostream>

using namespace std;

int fakt(int x) // Faktoriyel hesaplayan fonksiyon

{

int f=1;

for (int i=1;i<=x;i++)

f *= i;

return f;

}

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;

}

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

9

ÇIKTIBir sayi giriniz:4Sonuc=13

Fonksiyon Prototipi

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

10

• 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); // veyaint fakt(int);

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

11

#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;

}

void Fonksiyonları

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

12

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); // Fonksiyon prototipiint main(){

mesaj(); // Fonksiyon çağırımıreturn 0;

}void mesaj(void) // Mesaj yazan fonksiyon{

cout<<”Kullaniciya mesaj “;cout<<”ileten bir fonksiyon”<<endl;

}ÇIKTIKullaniciya mesaj ileten bir fonksiyon

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

13

#include <iostream>using namespace std;void buyuk(float,float); // Fonksiyon prototipi

int main(){

float x,y;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

}

ÇIKTI

Iki deger giriniz:3.4 2.1Sayilarin buyugu :3.4

main

x y

3.4 2.1

buyuk

a b

3.4 2.1

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

14

#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.3Alan = 7.26

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

15

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.

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

16

void fon(int,float);int main() {

int x=5;float y=3.6;fon(x,y);

Gerçek parametre…

}void fon(int a, float b)

Formal parametre{

… }

Bu parametreler değer parametresi(call by value) veya referans parametresi (call by reference) olarak kullanılabilir.

C++ Dersi: Nesne Tabanlı Programlama © 2012

Çiğdem TurhanFatma Cemile Serçe

17

• 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.

Referans Değişkeni

int deger = 5;int &ref = deger;

deger

5 ref

ref = 7;

deger

5 ref7

Referans değişkenlerini tanımladığımızda mutlaka ilkdeğer atamasını yapmamız gerektiğini, bir başka deyişle hangi değişkenin referansı olacağını belirtmemizgerektiğini unutmayalım.

int &ref; // X geçersiz tanımlama

int x=5,y=6;int &ref=x;ref=y; // X Geçersiz atama

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.

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)

Referans

Parametresi

Değer

Parametresi

fun(a,b); // Fonksiyon çağırımı

a 2

x 2

b 3 y

//Fonksiyon başlığı

#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;

}

a

5

i

10 b

10

j

620

ÇIKTIa= 5 b= 6i= 10 j= 6

• Ç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.

Varsayılan Parametreler

#include <iostream>using namespace std;void fon(int x=1,int y=20) // Varsayılan değerlerle 2 formal parametre

{ cout<<x<<” ”<<y<<endl;

}int main(){

fon(5,10); // 2 gerçek parametre ile fonksiyon çağırımı

fon(5); // 1 gerçek parametre ile fonksiyon çağırımı

fon(); // Gerçek parametresiz fonksiyon çağırımı

return 0;}

ÇIKTI5 105 201 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) // Fonksiyon tanımı

{int y=8; // Yerel degisken

cout<<"Fonksiyon icinde genel x ve yerel y: ";cout<<x<<" "<<y<<endl;x=10;

}

ÇIKTIFonksiyon cagirmadan once genel x:5Fonksiyon icinde genel x ve yerel y:5 8Fonksiyon bittiginde genel x: 10

Tekli Kapsam Çözme Operatörü ::Genel değişkenlere, içinde aynı isimde yerel değişken tanımı olanfonksiyonlardan erişmek için Tekli Kapsam Çözme Operatörünü (::) kullanabiliriz.

#include <iostream>using namespace std;void fon();int i; // Genel i değişkeniint main(){ i=3;

fon(); return 0;

}void fon(){

char i; // Yerel i değişkenii='B';::i=6;cout<<"Yerel i: "<<i<<endl;cout<<"Genel i: "<<::i<<endl;

}

ÇIKTIYerel i: BGenel i: 6

Fonksiyon YüklemeAynı isimde birden fazla fonksiyonu, farklı parametrelerletanımlayabiliriz. Bu yönteme, fonksiyon yükleme ismi verilir.

#include <iostream>using namespace std;int topla (int,int);double topla (double,double )int main(){ 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; }

ÇIKTI1.topla fonksiyonu: 52.topla fonksiyonu: 9.9

Satıriçi Fonksiyonlar Satıriçi (inline) fonksiyonlar, fonksiyonun kullanıldığı yerleredoğrudan yapıştırılır, böylece fonksiyon çağırma işleminin yapılmasına gerek kalmaz.

inline VeriTipi fonksiyonAdı()

{

//tanımlamalar

}

Örnek:

inline double alan()

{

return a*a;

}