Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Nesneye Yönelik Programlama

Benzer bir sunumlar


... konulu sunumlar: "Nesneye Yönelik Programlama"— Sunum transkripti:

1 Nesneye Yönelik Programlama
(4. Sunu)

2 Diziler (Arrays) Diziler (arrays), aynı veri tipine sahip birden fazla veriyi bünyelerinde saklayan veri yapılarıdır. (Data Structures) Değişkenler içerisinde yalnız bir tek bilgi depolarken dizileri kullanarak aynı türden birden fazla bilgiyi saklayabiliriz. Programımız içerisinde kullanacağımız 100 adet tamsayıyı 100 farklı değişken içinde saklamak yerine bu amaçla içinde 100 tamsayı saklı bir dizi kullanmak daha mantıklıdır.

3 Diziler (Arrays) C++’ta diziler statik veri yapılarıdır. Yani program işletilmeden önce depolayacakları bilgi miktarı belirlidir ve işletilme esnasında bu miktar hiçbir şekilde değiştirilemez. Daha sonraki derslerimizde göreceğimiz bazı veri yapılarının (örneğin list, queue ve stack) işletilme esnasında (dinamik) kapasiteleri büyüyebilir veya küçülebilir.

4 Diziler (Arrays) Bir dizinin elemanlarına indis (index) ile ulaşılır.
Bir dizinin elemanlarının hepsi aynı veri tipine sahiptir ve bellekte ardışıl olarak sıralanırlar. Bir dizinin elemanlarına indis (index) ile ulaşılır. İndis: Belirli bir dizi elemanına ulaşmak amacıyla pozisyon numarası olarak kullanılır. Köşeli parantezler “[ ]” içerisine yazılır. Dizinin ilk elemanının indis değeri daima sıfırdır.!!!!!!! Örneğin (a=5 ve b=6 değerleri için) c[a+b]+=2; deyimi c[11] dizi elemanının değerine 2 ekler.

5 “c” dizinin adıdır. “c” dizisi 12 elemana sahiptir. ( c[0], c[1], … c[11] ) “c[0]” `ın (yani dizinin ilk elemanının) değeri -45 tir.

6 !!! Dikkat !!! C++’ta dizilerin indis numaraları sıfırdan başladığı için, c[7] ile bu dizinin yedinci elemanı farklı şeyleri ifade eder. c[7] normalde dizinin sekizinci elemanıdır.

7 Dizilerin Deklare Edilmesi
Dizinin boyutunu ve dizi elemanlarının veri tipini programcı belirler. Örnek: int c[12]; deyimi c adında ve içinde 12 adet integer saklayan bir dizi tanımlar. Bir dizinin boyutu sıfırdan büyük bir integer değere sahip olmalıdır.

8 Döngü ile Dizi Elemanlarına İlk Değer Atama
Diziyi boyutu ve saklayacağı veri tipi ile deklare et. Herhangi bir döngü yapısı kullanarak her bir dizi elemanına bir ilk değer ata. (Mesela, çok yaygın bir uygulama olarak, başlangıçta tüm dizi elemanlarına sıfır değeri atanabilir.)

9 //Dizi Elemanlarına İlk Değer Atanması
#include <iostream>//cout, left, right ve endl #include <iomanip> //setw using namespace std; int main() { //İçerisinde 10 Tamsayı Saklayan n Adlı Diziyi Deklare Et int n[10]; //Bir Döngü Yardımıyla Dizi Elemanlarına İlk Değer Olarak Sıfır Ata for(int i=0;i<10;i++)//i<=10 Yap Ve Çalıştır??? n[i]=0;//Dizinin i. Elemanına Sıfır Ata cout<<"Eleman"<<setw(13)<<"Deger"<< endl; //Dizinin Her Bir Elemanını Ekrana Yazdır for(int j=0;j<10;j++)//i<=10 Yap Ve Çalıştır??? cout<<setw(6)<<j<<setw(13)<<n[j]<<endl; return 0; } cout <<"Eleman"<<setw(13)<<"Deger"<< endl;//Varsayılan Olarak Sağa Dayalı cout <<"Eleman"<<right<<setw(13)<<"Deger"<<endl;//Sağa Dayalı cout <<"Eleman"<<left<<setw(13)<<"Deger"<<endl;//Sola Dayalı

10 İlk Değer Atama Listesi ile Dizi Oluşturma
Bir dizi hem deklare edilebilir ve hem de aynı anda ilk değer atama listesi (initializer list) yardımıyla dizi elemanlarına ilk değerleri atanabilir. Dizi elemanları parantezler içerisine (“{ }”) yazılan ilk değer atama listesindeki değerlerle atanırlar ve bu elemanlar birbirlerinden virgül ile ayrılırlar. Örnek: int n[]={10, 20, 30, 40, 50}; Dizinin boyutu bu tanımda yazılmadığı için derleyici bu dizinin boyutunu ilk değer atama listesinin eleman sayısını temel alarak belirler. Yukaridaki deyim 5 elemanlı bir dizi tanımlar. Dizi elemanlarının indis değerleri sırasıyla: 0, 1, 2, 3, 4 Dizi elemanlarının ilk değerleri sırasıyla: 10, 20, 30, 40, 50

11 İlk Değer Atama Listesi ile Dizi Oluşturma
Eğer ilk atama değer listesindeki eleman sayısı dizinin boyutundan az ise kalan elemanlara sıfır değeri atanır. Örnek: int n[10]={0}; Dizinin ilk elemanının değeri olarak sıfır seçildiği açıkça bellidir. Kalan dokuz elemanın değeri olarak yine sıfır atanacağı dolaylı olarak bilinir. Eğer ilk değer atama listesindeki eleman sayısı dizinin boyutundan fazla ise derleyici hata verir.

12 Sabit Değişkenler (Constant Variables)
Bu başlık sizlere de ilginç geldi mi? (Oxymoron) Bu tür değişkenler “const” anahtar kelimesi ile deklare edilirler. Sadece okunabilir değişkenler (read-only variables) olarak da adlandırılırlar. Bu tür değişkenlere, deklare edildikleri anda muhakkak bir ilk değer ataması yapılır ve bu değer daha sonra değiştirilemez. Sabit değişken tanımlamak ve bunu dizilerin boyutu olarak kullanmak genel olarak tercih edilen bir yoldur. Sebep?

13 Sabit Değişkenler (Constant Variables)
Sabit değişkenleri diğer değişkenlerden ayırt edebilmek için kullanılabilecek bir notasyon: Sabit değişken isimlerinin bütün karakterlerini büyük harfle yaz, değişken ismi birden fazla kelimeden oluşuyorsa kelimeleri birbirlerinden alt çizgilerle ayır. ÖRNEK: const int DIZI_BOYUTU=12;

14 //Sabit Değişken Tanımlama ve Kullanma
#include <iostream>//cout ve endl using namespace std; int main() { //İlk Değer Atanmış Sabit Değişken const int x=7; cout<<"Sabit x Degiskeninin Degeri: "<<x<<endl; return 0; }

15 //Sabit Bir Değişkene Deklarasyon Anında
//Muhakkak Bir İlk Değer Atanmalıdır #include <iostream>//cout ve endl using namespace std; int main() { const int x; x=7; return 0; }

16 Bir Dizinin Elemanlarını Toplayan Program
//Bir Dizinin Elemanlarının Değerlerinin Toplanması #include <iostream>//cout ve endl using namespace std; int main() { int toplam=0; //Dizinin Boyutunu Saklayan Sabit Değişken const int DIZI_BOYUTU=10;//const Silinirse Ne olur? int a[DIZI_BOYUTU]={87,68,94,100,83,78,85,91,76,87}; for(int i=0;i<DIZI_BOYUTU;i++) toplam+=a[i]; cout<<"Dizi Elemanlarinin Toplami: "<<toplam<<endl; return 0; } Dizi boyutu olarak 10 yerine 20 kullanılırsa toplam değişkeninin değeri ne olur?

17 !!! Dikkat !!! Eğer bir dizinin elemanları bir döngü içerisinde değerlendiriliyorsa, diziye ulaşmamızı sağlayan indis değeri hiçbir zaman sıfır değerinin altına düşmemeli ve daima dizinin sahip olduğu eleman sayısından küçük olmalıdır.

18 Karakter Dizileri Kullanarak String Manipülasyonu
Karakter dizileri kullanarak string depolayabilir ve manipüle edebiliriz. string leri char veri tipi ile tanımladığımız dizilerde depolayabiliriz. Örnek: (Aşağıdaki iki kullanım birbirine denktir.) char string1[]="Hi"; char string1[]={'H','i','\0'}; Örnekteki dizi, depolanması istenen karakterleri ve dizinin en son elamanı olarak da özel bir karakter olan ve null karakteri ('\0') diye adlandırılan string sonlandırma karakterini (string-termination character) muhafaza eder.

19 Karakter Dizileri Kullanarak String Manipülasyonu
cin>> kullanarak klavyeden girilen bir string i bir karakter dizisinin içine atayabiliriz. Örnek: cin >> string1; Fakat “cin>>” ile dizinin kapasitesinden fazla karakterin okunabileceği unutulmamalıdır. Fazladan girilen bilgi kaybolacaktır. null ile sonlandırılmış bir string i temsil eden bir karakter dizisi cout<< ile ekrana yazdırılabilir.

20 //Karakter Dizileri string Manipülasyonu İçin Kullanılabilir
#include <iostream>//cout, cin ve endl using namespace std; int main() { //20 Karakter Saklayan Bir Dizi (null Dahil) char string1[20]; //6 Karakter Rezerve Edilen İkinci Bir Dizi (null Dahil) char string2[]="Dunya"; cout<<"Adinizi Giriniz: "; cin>>string1;//string1 İçerisinde Adınız Saklanır cout<<"Adiniz: "<<string1<<endl; cout<<"Merhaba "<<string2<<endl; cout<<"Karakterleri Arasina 1 Bosluk Birakilmis Adiniz:\n"; //null Karakterine Rastlayıncaya Kadar Döngüyü İşlet for(int i=0;string1[i]!='\0';i++) cout<<string1[i]<<' '; cout<<endl; return 0; }

21 Bir Diziyi Bir Fonksiyonun Argümanı Olarak Kullanma
Bir diziyi bir fonksiyona argüman olarak iletmek için: Dizinin adı parantezler olmadan kullanılır. Mesela dizimiz şu şekilde deklare edilmiş olsun. int a[24]; Bu dizinin argüman olarak kullanıldığı fonksiyon ise: DiziyiDegistir(a,24); dizinin adı ve boyutu fonksiyona argüman olarak iletilir. Fonksiyon diziden istenen kadar elemanı işleyebilsin diye dizinin boyutu fonksiyona ikinci bir argüman olarak verilir. Fonksiyon ise şöyle tanımlanır: void DiziyiDegistir(int [ ],int);//Prototip void DiziyiDegistir(int b[ ],int diziBoyutu){ }//Tanım

22 Bir Diziyi Bir Fonksiyonun Argümanı Olarak Kullanma
Diziler fonksiyon argümanı olarak referansla (call-by-reference) çağrılırlar. Fonksiyon, dizinin baslangıç adresini argüman olarak kullanır ve böylece bellekteki yeri bilinmiş olur. Çağıran fonksiyon böylelikle çağırdığı fonksiyona argüman olarak verilen bilgiyi manipule edebilme hakkını da vermiş olur. Diziler değer ile (call-by-value) fonksiyonlara argüman olarak atansalardı eğer bu bir performans eksikliğine yol açardı. (Fonksiyon içerisinde işlensin diye dizinin her bir elemanının kopyası alınırdı.) SIKLIKLA çağrılan fonksiyonlardaki kapasitesi büyük diziler böyle bir soruna sebep olurdu.

23 //Dizilerin Fonksiyonlara Argüman Olarak Aktarılması
#include <iostream>//cout ve endl #include <iomanip> //setw using namespace std; void DiziyiDegistir(int [],int);//Prototip int main() { const int DIZI_BOYUTU=5; int a[DIZI_BOYUTU]={0,1,2,3,4};//Diziye İlk Değer Ata cout<<"Fonksiyona Referansla Gonderilmeden Once Dizinin Icerigi:\n"; //Orijinal Dizi Elemanlarını Ekrana Yazdır for(int i=0;i<DIZI_BOYUTU;i++) cout<<setw(3)<<a[i]; cout<<endl; //Diziyi Fonksiyona Referansla Aktar DiziyiDegistir(a,DIZI_BOYUTU); cout<<"Fonksiyon Icinde Degistirilmis Dizinin Icerigi:\n"; //Fonksiyon İçinde Değiştirilmiş Dizi Elemanlarını Ekrana Yazdır for(int j=0;j<DIZI_BOYUTU;j++) cout<<setw(3)<<a[j]; return 0; } //Fonksiyon Tanımı void DiziyiDegistir(int b[],int dizininBoyutu) //Her Bir Dizi Elemanını 2 ile Çarp for(int k=0;k<dizininBoyutu;k++) b[k]*= 2;

24

25 “const” ın Dizilerde Fonksiyon Parametresi Olarak Kullanılması
Dizinin deklarasyonu anında başına const anahtar kelimesi yazılır. Böylelikle fonksiyonu çağıran, çağrılan fonksiyon içinde dizi elemanlarının modifiye edilmesinin önüne geçer. Dizi elemanlarının değeri fonksiyon gövdesi içinde sabittir ve değiştirilemez. Bu özellik sayesinde programcı değerlendirilen bilginin kazara değiştirilmesini engellemiş olur.

26 //const Dizilerin Kullanımı
#include <iostream>//cout ve endl using namespace std; void DiziyiDegistir(const int [],int);//Prototip int main() { int a[]={10, 20, 30 }; DiziyiDegistir(a,3); cout<<a[0]<<' '<<a[1]<<' '<<a[2]<<'\n'; return 0; } void DiziyiDegistir(const int b[],int boyut) b[0]/=2;//Hata b[1]/=2; b[2]/=2;

27 !!! Dikkat !!! Dizilerin fonksiyon parametresi olarak referansla gönderildiğini ve dolayısıyla fonksiyon içinde değiştirilebilecegini unutursak beklemediğimiz sonuçlarla karşılaşırız. Bunun önüne geçebilmek için const ı kullanabiliriz.

28 Dizi İçinde Lineer Arama Yapma (Linear Search)
Dizi içinde herhangi bir aranan değerin var olup olmadığı ya da var ise eğer hangi indis değerine sahip olduğu bilinmek istenebilir. Lineer Arama (Linear Search) Dizinin her bir elemanı aranan değer ile karşılaştırılır. Aranan değerin dizinin ilk elemanı olması ihtimali, son elemanı olması ihtimali ile aynıdır. Aranan değerin dizi içerisinde olmadığını garanti edebilmek için söz konusu değer dizinin tüm elemanları ile karşılaştırılmalıdır. Halihazırda sıralı olmayan küçük dizilerde arama yaparken kullanılabilen bir metoddur. (Sıralı dizilerde İkili Arama (Binary Search) algoritması kullanılır.)

29 //Dizi İçinde Lineer Arama Yapma
#include <iostream>//cout, cin ve endl using namespace std; int LineerArama(const int [],int,int );//Prototip int main() { const int DIZI_BOYUTU=100; int a[DIZI_BOYUTU]; int arananDeger;//Dizi İçinde Aranacak Tamsayı int indis;//Aranan Değer Dizinin Kaçıncı Elemanı? for(int i=0;i<DIZI_BOYUTU;i++) a[i]=2*i; cout<<"Aranacak Tamsayiyi Gir: "; cin>>arananDeger; indis=LineerArama(a,arananDeger,DIZI_BOYUTU); if(indis!=-1) cout<<"Aranan Degerin Dizideki Indisi: "<<indis<<endl; else cout<<"Aranan Deger Bulunamadi..."<<endl; return 0; } //Aranan Değeri Dizinin Bütün Elemanları İle Kıyasla. //Buldugun An İndisi Geri Döndür. //Bulamazsan Geriye -1 İndis Değerini Döndür. int LineerArama(const int dizi[],int deger,int dizininBoyutu) for(int j=0;j<dizininBoyutu;j++) if(dizi[j]==deger)//Aradığını Bulduysan return j;//İndisi Geri Döndür return -1;//Aradığını Bulamadıysan Geriye -1 Döndür

30

31 Çok Boyutlu Diziler (Multidimensional Arrays)
Örneğin 2 boyutlu dizileri ele alalım. (Matrisler) İçinde bilgi saklanan bir tablo gibi düşünülebilir. Satırlar (rows) ve sütunlar (columns) vardır. Dizinin elemanlarına iki indisle ulaşılır. ([ x ][ y ]) Genellikle m tane satıra ve n tane sütuna sahip bir dizi “m-by-n array” diye adlandırılır. Bu tür diziler 2 den fazla boyuta da sahip olabilirler.

32 3 satır ve 4 sütuna sahip 2 boyutlu bir dizi

33 İki Boyutlu Bir Diziyi Deklare Etme ve İlk Değer Atama
int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; b[ 0 ][ 0 ]=1 ve b[ 0 ][ 1 ]=2 b[ 1 ][ 0 ]=3 ve b[ 1 ][ 1 ]=4 int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } }; b[ 0 ][ 0 ]=1 ve b[ 0 ][ 1 ]=0 (ima ile)

34 Çok Boyutlu Dizileri Fonksiyon Parametresi Olarak Kullanma
Tek boyutlu dizilerde olduğu gibi ilk boyutun büyüklüğü belirtilmez. Takip eden boyutların büyüklüğü ise belirtilmelidir. Derleyici ancak bu yolla ikinci satıra geçmek için kaç eleman atlayacağını bilir. Örneğin : void DiziyiYazdir(const int a[][3],int boyut); Bu fonksiyon 2. satıra geçebilmek icin ilk satırın 3 elemanını atlamak zorundadır.

35 Çok Boyutlu Dizilerde Bilgi Manipülasyonu
Genelde iç içe for döngüleri kullanılır. (Dıştaki for satırlarda gezinirken içteki for sütunları dolaşır.) Örnek: Sadece bir satırın elemanlarını modifiye etmek için: for(int sutun=0;sutun<4;sutun++) a[2][sutun]=0; Dizinin tüm elemanlarını modifiye etmek için (İç içe 2 for): toplam=0; for(satir=0;satir<3;satir++) for(sutun=0;sutun<4;sutun++) toplam+=a[satir][sutun];

36 Bir Dizinin En Küçük ve En Büyük Elemanını Bulma
#include <iostream>//cout ve endl #include <cstdlib> //rand() ve srand(seed) #include <ctime> //time(0) using namespace std; void KucuguBuyuguBul(const int [],int,int&,int&);//Prototip int main() { srand(time(0)); int enKucuk,//Dizinin En Küçük Elemanı enBuyuk;//Dizinin En Büyük Elemanı const int DIZI_BOYUTU=10; int a[DIZI_BOYUTU]; cout<<"Dizinin Icerigi:\n"; for(int i=0;i<DIZI_BOYUTU;i++) //Dizinin i. Elemanına 1 ile 6 Arasında Rastgele Bir Sayı Ata a[i]=rand()%6+1; cout<<a[i]<<' '; } cout<<endl; KucuguBuyuguBul(a,DIZI_BOYUTU,enKucuk,enBuyuk); cout<<"Dizinin En Kucuk Elemani: "<<enKucuk<<endl; cout<<"Dizinin En Buyuk Elemani: "<<enBuyuk<<endl; return 0; //Kendisine Argüman Olarak Aldığı Dizinin En Küçük ve En Büyük //Elemanını Bulan Fonksiyonun Tanımı //void Bir Fonksiyon Sayesinde Geriye Referansla Birden Fazla //Değerin Döndürüldüğüne Dikkat Ediniz!!!!) void KucuguBuyuguBul(const int b[],int dizininBoyutu,int &minimum,int &maksimum) minimum=b[0]; //Dizinin En Küçük Elemanının İlk Eleman Olduğunu Kabul Et maksimum=b[0];//Dizinin En Büyük Elemanının İlk Eleman Olduğunu Kabul Et for(int i=1;i<dizininBoyutu;i++)//i’nin 1 den Başladığına Dikkat Ediniz!!!! if(b[i]<minimum) minimum=b[i]; if(b[i]>maksimum) maksimum=b[i];

37 Bir Dizinin En Küçük ve En Büyük Elemanını Bulma

38 Seçme Sıralama (Selection Sort) Algoritması
Bu algoritma birinci elemandan başlayarak son elemana kadar, sıralanmamış DİZİYİ parça parça sıralar. Önce dizideki en küçük eleman bulunur ve dizinin ilk elemanı ile yeri değiştirilir (swap). Sonraki aşamada dizinin sıralanmamış olan parçası içindeki en küçük eleman bulunur ve ikinci elemanla yeri değiştirilir. Bu işlem N defa tekrarlandığında N elemanlı bir dizi sıralanmış olur. İkinci bir dizi kullanmadan, orijinal dizi üzerindeki manipülasyonlarla sıralama yerinde sıralama (in place sort) olarak adlandırılır.

39 //Seçme Sıralama (Selection Sort) Algoritması İle
//Bir Diziyi Küçükten Büyüğe Sıralama (Ascending) #include <iostream>//cout ve endl #include <cstdlib> //rand() ve srand(seed) #include <ctime> //time(0) using namespace std; void DiziyiSirala(int [],int);//Prototip int main() { srand(time(0)); const int DIZI_BOYUTU=10; int a[DIZI_BOYUTU]; cout<<"Siralanmamis Dizinin Icerigi:\n"; for(int i=0;i<DIZI_BOYUTU;i++) a[i]=rand()%999+1; cout<<a[i]<<' '; } cout<<endl; DiziyiSirala(a,DIZI_BOYUTU); cout<<"Siralanmis Dizinin Icerigi:\n"; return 0; //Seçme Sıralama Algoritması İle Diziyi Sıralayan Fonksiyonun Tanımı void DiziyiSirala(int b[],int dizininBoyutu) int minimumunIndisi; int geciciDegisken; for(int i=0;i<(dizininBoyutu-1);i++)//Kaçıncı En Küçük Eleman Aranıyor? minimumunIndisi=i; for(int j=i+1;j<dizininBoyutu;j++)//Hangi Aralıkta Aranıyor? if(b[j]<b[minimumunIndisi]) minimumunIndisi=j; if(i!=minimumunIndisi) //Swap geciciDegisken=b[i]; b[i]=b[minimumunIndisi]; b[minimumunIndisi]=geciciDegisken;

40

41 Bir Sayının Basamaklarına Ayrılması Suretiyle Manipüle Edilmesi
#include <iostream>//cout ve endl #include <cstdlib> //rand() ve srand(seed) #include <ctime> //time(0) using namespace std; int main() { srand(time(0)); int toplam=0; int basamak; int rastgeleSayi=rand()%9999+1; cout<<"1 ile Arasi Rastgele Sayi: "<<rastgeleSayi <<endl; while(rastgeleSayi>0)//while(rastgeleSayi!=0) basamak=rastgeleSayi%10; toplam+=basamak; rastgeleSayi/=10; } cout<<"Rastgele Uretilen Sayinin Basamaklarinin Toplami: " <<toplam<<endl;


"Nesneye Yönelik Programlama" indir ppt

Benzer bir sunumlar


Google Reklamları