nesneye yönelik programlama (oop) 3robotics.nigde.edu.tr/cpp/pdf/hafta3.pdf · nesneye yönelik...

26
Nesneye Yönelik Programlama (OOP) 3.Hafta

Upload: others

Post on 24-Dec-2019

22 views

Category:

Documents


0 download

TRANSCRIPT

Nesneye Yönelik Programlama(OOP)

3.Hafta

Fonksiyonlar

Fonksiyonlar programın modüler bir yapıda yazılabilmesini sağlar.Program yazarken fonksiyon kullanmanın çeşitli avantajları vardır.

● Aynı kodların tekrar tekrar yazılmasından kurtarır. Fonksiyon olarak paketlenmiş bir kod, programın istenilen herhangi bir yerinde rahatlıkla çalıştırılabilir.

● Fonksiyonlar, programın parçalara ayrılarak geliştirilmesini sağlar ve yönetilmesini kolaylaştırır.

● İyi tanımlanmış ve belirli bir görevi yerine getiren fonksiyonlar, yeni bir program yazarken tekrar kullanılabilirler. Böylece daha önceden yazılmış fonksiyonlar yeni programların geliştirilmesinde kolaylık sağlar.

Fonksiyonların Tanımlanması

C ve C++ programlama dillerinde bir fonksiyon çağırıldığı noktadan daha önce tanımlanmış olmalıdır. Derleme işlemi sırasında bir fonksiyon çağırma ifadesine denk gelindiğinde derleyici o fonksiyonun geri dönüş değerini bilmelidir. Bu nedenle fonksiyon ya o noktadan daha önce tanımlanmış olmalı ya da bir prototipi oluşturulmuş olmalıdır.

Bir fonksiyon aşağıdaki şekilde tanımlanır.

geri-dönüş-değer-tipi fonksiyon-adı ( parametre-listesi ){

fonksiyonun-yapacağı-işlemler}

Geleneksel olarak bütün fonksiyonlar main( ) fonksiyonundan sonra bildirilir. Eğer böyle bir tercih yapılırsa o fonksiyonun adı main( ) fonksiyonundan önce bildirilmelidir. Bu tip bildirime fonksiyon prototipi denir.

#include <iostream>using namespace std;

int kare ( int ); // Fonksiyon prototipi

int main( ){cout<<kare(5);

}

int kare(int sayi){return sayi*sayi;

}

Eğer fonksiyon tanımlaması main( ) fonksiyonundan önce yapılmışsa fonksiyon prototipine gerek yoktur.

#include <iostream>using namespace std;

int kare(int sayi){return sayi*sayi;

}

int main( ){cout<<kare(5);

}

Başlık Dosyaları (Header Files)

C++ Standart Kütüphanesi program yazılırken ihtiyaç duyulan bir çok fonksiyonun prototipini, bazı veri tanımlamalarını ve sabitleri içerir. Sonu .h ile biten başlık dosyaları eski stildir ve C++ standart kütüphane dosyaları onların yerini almıştır.

C++ Standart Kütüphane dosyalarından bazıları:

<iostream> <iostream.h> başlık dosyasının yerini alır ve standart giriş çıkış fonksiyonları için protoripleri içerir.

<cmath> <math.h> başlık dosyasının yerini alır ve mathkütüphanesi fonksiyonlarının protoriplerini içerir.

Programcı kendi özel başlık doslarınını tanımlayabilir ve program yazerken bunları dahil edebilir.

#include <iostream>using namespace std;

double maksimum (double, double, double);

int main( ){double sayi1,sayi2,sayi3;cout<< “Uc tane sayi giriniz : ”;cin >> sayi1 >> sayi2 >>sayi3;

cout << “Maksimum=”<<maksimum(sayi1,sayi2,sayi3)<<endl;}

double maksimum (double x, double y, double z){double max=x;if(y>max)

max=y;if(z>max)

max=z;

return max;}

Özyineleme (Recursion)

Bir fonksiyon kendisini çağırıyorsa bu fonksiyona özyinelemeli fonksiyon denir.

int main( ){

cout << faktoriyel (4) <<endl;return 0;

}

long faktoriyel ( long number ){if(number <= 1)

return 1;else

return number * faktoriyel ( number-1 ); }

faktoriyel (4)

return 4 * faktoriyel (3)

return 3 * faktoriyel (2)

return 2 * faktoriyel (1)

return 1

Özyinelemeli fonksiyon ile Fibonacci Dizisi

long fibonacci ( long n ){if ( n==0 || n==1 )

return n;else

return fibonacci( n-1 ) + fibonacci ( n-2 ); }

fibonacci (3)

return fibonacci (2) fibonacci (1)+

return 1return fibonacci (1) + fibonacci (0)

return 1 return 0

Fonksiyonları Referans ile Çağırma

Fonksiyonlar değer ile veya referans ile olmak üzere iki farklı biçimde çağırılır. Fonksiyonları şimdiye kadar hep değer ile çağırdık.

Örnek : faktoriyel(5); faktoriyel(sayi);

Fonksiyonlar değer ile çağırılırken kendisine verilen parametrenin bir kopyası oluşturulur ve fonksiyon bu kopyayı kullanır. Bu kopya değer üzerinde yapılan değişiklikler orjinal değeri değiştirmez.

Referans ile çağırma yönteminde ise verilen parametre orjinal değere bir referanstır ve fonksiyonun yapmış olduğu değişiklikler orjinal değere etki eder.

Referans ile çağırma verinin kopyalanması işlemini elemine ettiği için hız kazandırır ancak verinin orjinal değerini değiştirdiği için güvenlik anlamında daha zayıftır.

#include <iostream>using namespace std;

int squareByValue ( int );void squareByReference ( int & );

int main(){

int x=2;int z=4;cout<< “Fonksiyondan donen deger=”<<squareByValue(x)<<endl;cout<< “x'in sonraki degeri=”<<x<<endl;

squareByReference( z );cout<< “Referans ile cagirmadan sonra z=”<<z<<endl;return 0;

}

int squareByValue ( int number ){return number*=number;

}

void squareByReference ( int &numberRef ){numberRef *= numberRef;

}

Fonksiyonlarda Varsayılan Parametre Değeri

Parametre alan fonksiyonlar parametresiz ya da fonksiyonun beklediğinden daha az sayıda parametre ile çağırılırsa hata yapılmış olur. Ancak, fonksiyonun prototipi oluşturulurken varsayılan değerler atanırsa, fonksiyon çağırıldığı sırada eksik parametre gönderilirse fonksiyon prototipte belirtilen varsayılan değerleri kullanır.

#include <iostream>using namespace std;

int boxVolume (int length=1, int width=1, int height=1);

int main(){cout<<boxVolume();return 0;

}

int boxVolume (int length, int width, int height){return length*width*height;

}

Diziler (Arrays)

Diziler, aynı isim ve aynı veri tipine sahip bir grup ardışık hafıza bölgesidir. Bir dizideki bir bölge veya elemana ulaşmak istediğinizde dizi adı ile birlikte pozisyon numarasını (index) da belirtmeniz gerekmektedir.

Dizi elemanları sıfırdan başlar.

-45

6

0

72

1465

-89

diziadi [ 0 ]

diziadi [ 1 ]

diziadi [ 2 ]

diziadi [ 3 ]

diziadi [ 4 ]

diziadi [ 5 ]

Dizi elemanları ile artimetik, lojik ve mantıksal işlemler aynen değişkenlerde olduğu gibi yapılır.

cout << c[ 0 ] + c [ 1 ] <<endl;

x = c[ 6 ] / 2;

Dizilerin Tanımlanması

Diziler tanımlandıklarında hafızada yer tutarlar. Bu nedenle bir dizi tanımlanırken dizinin tipi ve eleman sayısı belirtilmelidir.

Her bir elemanı integer tipinde olan sayilar isimli 12 elemana sahip bir dizi aşağıdaki gibi tanımlanır.

int sayilar[ 12 ];

Örnek :

#include <iostream>#include <iomanip>

using namespace std;

int main(){

int n[10];

for ( int i=0; i<10; i++)n[ i ] = 0;

cout << “Eleman” << setw(10) << “Deger” <<endl;

for (int j=0; j<10; j++)Cout << setw(6) << j << setw(10) << n[ j ] << endl;

return 0;}

Bir dizi tanımlandığı sırada aşağıdaki şekillerde başlangıç değerleri atanabilir.

int n[ 10 ] = { 5, 32, 65, 13, 66, 90, 4, 21, 77, 98};

int n[ 10 ] = { 0 };

int n[ ] = { 1, 2, 3, 4, 5};

Karakter Dizileri

Bu noktaya kadar hep tam veya ondalıklı tipteki sayılardan oluşan dizilerle işlem yaptık. C ve C++ programlama dillerinde tek bir karakteri saklamak için char veri tipini kullanabilirsiniz.

char harf='a';

Tek bir karakterden fazlasını saklamak için C++'ın ileride inceleyeceğimiz string sınıfı kullanılacağı gibi. Aşağıdaki gibi bir tanımlama ile karakter dizisi de oluşturulabilir.

char dizi[20];

Yukarıdaki dizi 19 karaktere kadar olan verileri saklayabilir. Çünkü bir karakter dizisinin sonunda \0 (null karakteri) bulunmak zorundadır.

M e r h a b a \0

char dizi[20] = { 'M', 'e' , 'r' , 'h', 'a' , 'b' , 'a' , '\0' };

char dizi[20] = “Merhaba”;

Dizileri Fonksiyonlara Parametre Olarak Gönderme

Diziler fonksiyonlara parametre olarak gönderilirken, dizinin adı köşeli parantezler kullanılmadan yazılır. Örneğin, aşağıdaki gibi tanımlanmış bir fonksiyon olduğunu varsayalım.

int saatlikSicakliklar [ 24 ];

Bu dizi “diziyiDuzenle” fonksiyonuna aşağıdaki gibi gönderilir.

diziyiDuzenle ( saatlikSicakliklar, 24 );

Dizi boyutu ayrı bir parametre olarak gönderilir ya da dizi boyutu fonksiyon içinde aşağıdaki gibi belirlenebilir.

diziboyutu = sizeof ( saatlikSicakliklar ) / sizeof ( int );

Diziler fonksiyonlara parametre olarak gönderildiğinde bir çeşit referans ile çağırma mantığı ile çalışır ve fonksiyonun dizi üzerinde yaptığı değişiklikler orjinal diziyi etkiler.

Bir dizinin herhangi bir elemanı bir fonksiyona parametre olarak gönderildiğinde ise fonksiyon değer ile çağırılmış olur ve dizinin elemanı üzerinde değişiklik yapılmaz.

void modifyElement ( int e ){e *= 2;

}

Yukarıdaki fonksiyon modifyElement( saatlikSicakliklar[3] ); şeklinde değer ile çağırılır.

saatlikSicakliklar[ 3 ] elemanının değeri değişmez.

Dizileri Sıralama

#include <iostream>using namespace std;

void sortArray(int arrayName[ ], int arraySize){ int temp; for(int j=0; j<arraySize-1; j++) for(int i=0;i<arraySize-1;i++){ if(arrayName[ i ]>arrayName[ i+1 ]){ temp=arrayName[ i ]; arrayName[ i ]=arrayName[ i+1 ]; arrayName[ i+1 ]=temp; } }}

int main(){ const int arraysize = 11; int dizi[arraysize] = {7,2,13,24,4,6,57,0,1,455,9}; sortArray(dizi,arraysize); for(int i=0; i<arraysize; i++){ cout<<dizi[ i ]<<endl; } return 0;}

Çok Boyutlu Diziler

Program yazarken tıpkı bir tablo gibi satır ve sütünlardan oluşan diziler tanımlayabilirsiniz.

a [ 0 ][ 0 ] a [ 0 ][ 1 ] a [ 0 ][ 2 ] a [ 0 ][ 3 ]

a [ 1 ][ 0 ] a [ 1 ][ 1 ] a [ 1 ][ 2 ] a [ 1 ][ 3 ]

a [ 2 ][ 0 ] a [ 2 ][ 1 ] a [ 2 ][ 2 ] a [ 2 ][ 3 ]

Satır 0

Satır 1

Satır 2

Sütun 0 Sütun 1 Sütun 2 Sütun 3

int b[ 2 ][ 2 ] = { { 1, 2 } , { 3, 4 } };

b[ 0 ][ 0 ] = 1

b[ 0 ][ 1 ] = 2

b[ 1 ][ 0 ] = 3

b[ 1 ][ 1 ] = 4

int b[ 2 ][ 2 ] = { { 1 } , { 3, 4 } };

b[ 0 ][ 0 ] = 1

b[ 0 ][ 1 ] = 0

b[ 1 ][ 0 ] = 3

b[ 1 ][ 1 ] = 4

int b[ 2 ][ 3 ] = { 1, 2, 3, 4, 5, 6};

b[ 0 ][ 0 ] = 1

b[ 0 ][ 1 ] = 2

b[ 0 ][ 2 ] = 3

b[ 1 ][ 0 ] = 4

int b[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 };

b[ 1 ][ 1 ] = 5

b[ 1 ][ 2 ] = 6

b[ 0 ][ 0 ] = 1

b[ 0 ][ 1 ] = 2

b[ 0 ][ 2 ] = 3

b[ 1 ][ 0 ] = 4

b[ 1 ][ 1 ] = 5

b[ 1 ][ 2 ] = 0

Çok Boyutlu Dizileri Fonksiyonlara Parametre Olarak Gönderme

Çok boyutlu bir diziyi parametre olarak alan bir fonksiyon tanımlanırken birinci boyut hariç tüm boyutların sınırı belirtilmek zorundadır.

void printArray ( int a[ ][ 3 ] , int row) {

for ( int i=0 ; i<row ; i++ ){

for( int j=0 ; j<3 ; j++ ) {cout<< a[ i ][ j ] << ' ';

}cout<<endl;

}}

int array1[ 2 ][ 3 ] = { 1, 2, 3, 4, 5, 6 };

printArray( array1, 2 );

Tanımlanan Fonksiyon

Tanımlanan Dizi

Fonksiyonun Çağırılması