410 likes | 657 Views
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)
E N D
BM-104 Nesneye Yönelik Programlama Bahar 2013 (4. Sunu) (Yrd. Doç. Dr. Deniz Dal)
Diziler (Arrays) • Diziler (arrays),aynıveritipinesahipbirdenfazlaveriyi bünyelerindesaklayanveri 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.
Diziler (Arrays) • C++’ta dizilerstatikveri yapılarıdır. Yani program işletilmedenöncedepolayacaklarıbilgimiktarıbelirlidirveişletilmeesnasındabumiktar hiçbirşekilde değiştirilemez. Dahasonrakiderslerimizde göreceğimizbazıveri yapılarının (örneğin list, queue ve stack) işletilmeesnasında (dinamik)kapasiteleri büyüyebilirveya küçülebilir.
Diziler (Arrays) • Birdizininelemanlarının hepsiaynıveritipinesahiptirvebellekteardışılolarak sıralanırlar. • Birdizininelemanlarınaindis (index)ileulaşılır. • İndis: • Belirlibirdizielemanınaulaşmakamacıylapozisyonnumarasıolarakkullanılır. • Köşeliparantezler“[ ]” içerisine yazılır. • Dizinin ilk elemanının indis değeridaima sıfırdır.!!!!!!! • Örneğin (a=5veb=6 değerleriiçin) • c[a+b]+=2; deyimi • c[11] dizielemanı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++’tadizilerinindisnumaralarısıfırdanbaşladığıiçin, c[7]ilebudizininyedincielemanıfarklışeyleriifadeeder. c[7] normaldedizininsekizincielemanıdır.
Dizilerin Deklare Edilmesi • Dizininboyutunuvedizielemanlarının veritipiniprogramcıbelirler. • Örnek: • int c[12]; deyimic adındaveiçinde 12 adet integersaklayanbirdizi tanımlar. • Birdizininboyutu sıfırdan büyük bir integer değere sahip olmalıdır.
Döngü ile Dizi Elemanlarına İlk Değer Atama • Diziyiboyutuvesaklayacağıveri tipi iledeklare et. • Herhangibir döngü yapısıkullanarak herbirdizielemanınabir ilk değerata. (Mesela, çok yaygın biruygulamaolarak, başlangıçta tüm dizielemanlarına sıfır değeriatanabilir.)
cout<<"Eleman"<<setw(13)<<"Deger"<< endl;//Varsayılan OlarakSağa Dayalı cout <<"Eleman"<<right<<setw(13)<<"Deger"<<endl;//Sağa Dayalı cout<<"Eleman"<<left<<setw(13)<<"Deger"<<endl;//SolaDayalı
İlk Değer Atama Listesi ile Dizi Oluşturma • Birdizi hem deklare edilebilirve hem de aynıanda ilk değeratamalistesi(initializer list) yardımıyladizielemanlarına ilk değerleriatanabilir. • Dizielemanlarıparantezleriçerisine (“{ }”) yazılan ilk değeratamalistesindeki değerlerleatanırlarvebuelemanlarbirbirlerindenvirgül ileayrılırlar. • Örnek: • int n[]={10, 20, 30, 40, 50}; • Dizininboyutubu tanımdayazılmadığıiçin derleyicibudizininboyutunu ilk değeratamalistesinineleman sayısınıtemelalarakbelirler. • Yukaridakideyim5 elemanlıbirdizi tanımlar. • Dizielemanlarının indis değerleri sırasıyla: 0, 1, 2, 3, 4 • Dizielemanlarının ilk değerleri sırasıyla: 10, 20, 30, 40, 50
İlk DeğerAtamaListesiileDiziOluşturma • Eğer ilk atama değerlistesindekieleman sayısıdizininboyutundanazisekalanelemanlara sıfır değeriatanır. • Örnek: • int n[10]={0}; • Dizinin ilk elemanının değeriolarak sıfır seçildiği açıkça bellidir. • Kalandokuzelemanın değeriolarakyine sıfır atanacağıdolaylıolarakbilinir. • Eğer ilk değeratamalistesindekieleman sayısıdizininboyutundanfazlaisederleyicihataverir.
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ğerbirdizininelemanlarıbir döngüiçerisinde değerlendiriliyorsa, diziyeulaşmamızısağlayanindis değeri hiçbirzaman sıfır değerinin altına düşmemelivedaimadizininsahipolduğu eleman sayısından küçük olmalıdır.
Karakter Dizileri Kullanarak String Manipülasyonu • Karakterdizilerikullanarakstringdepolayabilirvemanipüle edebiliriz. • stringlericharveri tipi ile tanımladığımızdizilerdedepolayabiliriz. • Örnek: (Aşağıdakiikikullanım birbirinedenktir.) • char string1[]="Hi"; • char string1[]={'H','i','\0'}; • Örnektekidizi, depolanmasıistenenkarakterlerivedizinin en son elamanıolarak da özelbirkarakterolanvenullkarakteri ('\0')diyeadlandırılan string sonlandırmakarakterini (string-termination character) muhafazaeder.
Karakter Dizileri Kullanarak String Manipülasyonu • cin>>kullanarakklavyedengirilenbirstringibirkarakterdizisininiçineatayabiliriz. • Örnek: cin >> string1; • Fakat“cin>>”iledizininkapasitesindenfazlakarakterinokunabileceğiunutulmamalıdır. Fazladangirilenbilgikaybolacaktır. • nullilesonlandırılmışbir stringitemsiledenbirkarakterdizisicout<<ileekranayazdırılabilir.
BirDiziyiBirFonksiyonunArgümanıOlarakKullanma • Birdiziyibirfonksiyonaargüman olarakiletmekiçin: • Dizinin adıparantezlerolmadankullanılır. • Meseladizimizşu şekildedeklare edilmişolsun. int a[24]; • Bu dizininargüman olarakkullanıldığıfonksiyonise: DiziyiDegistir(a,24); dizinin adıveboyutufonksiyonaargüman olarakiletilir. • Fonksiyondizidenistenenkadarelemanıişleyebilsindiyedizininboyutufonksiyonaikincibirargüman olarakverilir. • Fonksiyoniseşöyle tanımlanır: • voidDiziyiDegistir(int[],int);//Prototip • voidDiziyiDegistir(int b[],intdiziBoyutu){ }//Tanım
Bir Diziyi Bir Fonksiyonun Argümanı Olarak Kullanma • Dizilerfonksiyonargümanıolarakreferansla (call-by-reference)çağrılırlar. • Fonksiyon, dizininbaslangıçadresiniargüman olarakkullanır ve böylecebellektekiyeribilinmişolur. • Çağıran fonksiyon böylelikleçağırdığıfonksiyonaargüman olarakverilenbilgiyimanipuleedebilmehakkını da vermişolur. • Diziler değerile (call-by-value) fonksiyonlaraargüman olarakatansalardı eğer bubirperformanseksikliğineyol açardı. (Fonksiyoniçerisindeişlensindiye dizinin herbirelemanının kopyası alınırdı.)SIKLIKLAçağrılanfonksiyonlardakikapasitesi büyük diziler böylebirsorunasebepolurdu.
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) • Diziiçindeherhangibir aranan değerinvarolupolmadığıya da varise eğerhangi indis değerinesahipolduğu bilinmekistenebilir. • LineerArama(Linear Search) • Dizinin herbirelemanıaranandeğer ilekarşılaştırılır. • Aranandeğerindizinin ilk elemanıolmasıihtimali, son elemanıolmasıihtimaliileaynıdır. • Aranandeğerindizi içerisinde olmadığınıgarantiedebilmekiçin sözkonusudeğerdizinin tüm elemanlarıilekarşılaştırılmalıdır. • Halihazırda sıralıolmayan küçük dizilerdearamayaparkenkullanılabilenbirmetoddur. (Sıralı dizilerde İkili Arama (BinarySearch) algoritması kullanılır.)
Çok Boyutlu Diziler (Multidimensional Arrays) • Örneğin 2 boyutludizilerielealalım. (Matrisler) • İçindebilgisaklananbirtablogibi düşünülebilir. Satırlar (rows)vesütunlar (columns)vardır. • Dizininelemanlarınaikiindisleulaşılır. ([ x ][ y ]) • Genellikle m tane satırave n tane sütuna sahipbirdizi “m-by-n array” diyeadlandırılır. • Bu tür diziler 2 den fazlaboyuta da sahipolabilirler.
İkiBoyutluBirDiziyiDeklare Etmeveİlk DeğerAtama • int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; • b[ 0 ][ 0 ]=1veb[ 0 ][ 1 ]=2 • b[ 1 ][ 0 ]=3 veb[ 1 ][ 1 ]=4 • int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } }; • b[ 0 ][ 0 ]=1veb[ 0 ][ 1 ]=0 (imaile) • b[ 1 ][ 0 ]=3 veb[ 1 ][ 1 ]=4
Çok Boyutlu Dizileri Fonksiyon Parametresi Olarak Kullanma • Tekboyutludizilerdeolduğu gibi ilk boyutunbüyüklüğübelirtilmez. • Takipedenboyutların büyüklüğüisebelirtilmelidir. Derleyiciancakbuyollaikinci satırageçmekiçin kaçelemanatlayacağınıbilir. • Örneğin : • void DiziyiYazdir(constint a[][3],int boyut); • Bu fonksiyon 2. satırageçebilmekicin ilk satırın 3 elemanınıatlamakzorundadır.
Çok Boyutlu Dizilerde Bilgi Manipülasyonu • Genelde iç içefor döngüleri kullanılır. (Dıştaki forsatırlarda gezinirken içteki for sütunları dolaşır.) • Örnek: • Sadecebir satırın elemanlarınımodifiyeetmekiçin: • for(intsutun=0;sutun<4;sutun++) a[2][sutun]=0; • Örnek: • Dizinin tüm elemanlarınımodifiyeetmekiçin (İç içe 2 for): • toplam=0;for(satir=0;satir<3;satir++) for(sutun=0;sutun<4;sutun++) toplam+=a[satir][sutun];
Seçme Sıralama (SelectionSort)Algoritması Bu algoritmabirincielemandanbaşlayarak son elemanakadar, sıralanmamışDİZİYİparça parça sıralar. Öncedizideki en küçükelemanbulunurvedizinin ilk elemanıileyerideğiştirilir (swap). Sonrakiaşamadadizininsıralanmamışolanparçasıiçindeki en küçükelemanbulunurveikincielemanlayerideğiştirilir. Bu işlem N defatekrarlandığında N elemanlı bir dizi sıralanmışolur. İkinci bir dizi kullanmadan, orijinal dizi üzerindeki manipülasyonlarla sıralama yerinde sıralama (in placesort) olarak adlandırılır.
Bir Sayının Basamaklarına Ayrılması Suretiyle Manipüle Edilmesi