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

Post on 02-Jan-2016

37 Views

Category:

Documents

7 Downloads

Preview:

Click to see full reader

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

BM-104

Nesneye Yönelik Programlama

Bahar 2013

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

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)

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.

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

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

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.

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

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ı

İ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

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

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?

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;

Bir Dizinin Elemanlarını Toplayan Program

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

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

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.

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.

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

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.

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

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

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

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

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

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

İ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

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

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

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

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

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ı

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

top related