bm-104 nesneye yönelik programlama bahar 201 3 ( 4 . sunu ) ( yrd . do ç . dr. deniz dal)

41
BM-104 Nesneye Yönelik Programlama Bahar 2013 (4. Sunu) (Yrd. Doç. Dr. Deniz Dal)

Upload: hadassah-floyd

Post on 02-Jan-2016

37 views

Category:

Documents


7 download

DESCRIPTION

BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 4 . Sunu ) ( Yrd . Do ç . Dr. Deniz Dal). Diziler (Arrays). Diziler (arrays), ayn ı veri tipine sahip birden fazla veriyi b ü nyelerinde saklayan veri yap ı lar ı d ı r . (Data Structures) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

BM-104

Nesneye Yönelik Programlama

Bahar 2013

(4. Sunu)

(Yrd. Doç. Dr. Deniz Dal)

Page 2: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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.

Page 3: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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.

Diziler (Arrays)

Page 4: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Diziler (Arrays)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.

Page 5: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 6: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 7: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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.

Page 8: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Döngü ile Dizi Elemanlarına İlk Değer Atama

1. Diziyi boyutu ve saklayacağı veri tipi ile deklare et.

2. 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.)

Page 9: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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ı

Page 10: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

İ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

Page 11: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 12: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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?

Page 13: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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;

Page 14: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 15: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 16: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Bir Dizinin Elemanlarını Toplayan Program

Dizi boyutu olarak 10 yerine 20 kullanılırsa toplam değişkeninin değeri ne olur?

Page 17: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 18: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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.)1. char string1[]="Hi";2. 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.

Page 19: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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.

Page 20: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 21: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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);//Prototipvoid DiziyiDegistir(int b[ ],int diziBoyutu){ }//Tanım

Page 22: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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.

Page 23: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Döngü yerine cout<<a; deyimini kullanarak da a dizisinin tüm elemanlarını ekrana yazdırabilir miyiz?

Page 24: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 25: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 26: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 27: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 28: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 29: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 30: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 31: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 32: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 33: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

İ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)• b[ 1 ][ 0 ]=3 ve b[ 1 ][ 1 ]=4

Page 34: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 35: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Örnek: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];

Page 36: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 37: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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

Page 38: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

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.

Seçme Sıralama (Selection Sort) Algoritması

Page 39: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 40: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)
Page 41: BM-104 Nesneye Yönelik  Programlama Bahar  201 3 ( 4 .  Sunu ) ( Yrd . Do ç . Dr.  Deniz  Dal)

Bir Sayının Basamaklarına Ayrılması Suretiyle Manipüle Edilmesi