Diziler

Elemanları aynı türden olan ve bellekte ardışıl bir biçimde bulunan veri yapılarına dizi (array) denir. Diziler sayesinde aynı türden çok sayıda değişkeni tek hamlede yaratabiliriz ve bütün elemanlara bir döngü yardımıyla erişebiliriz.

C#’ta diziler bir sınıf gibi organize edilmiştir. Yani dizi aslında bir sınıftır, dizi elemanları dizi nesnesinin içerisindedir, ayrıca dizinin uzunluğuda burda tutulmaktadır.

C#’ta T türü için T[ ] biçiminde bir T türünden dizi türüde vardır. T türü ile T[ ] türleri farklıdır. T türü ister değer türlerine ilişkin olsun, ister referans türlerine ilişkin olsun T[ ] türü her zamann referans türlerine ilişkindir. Yani:

 

Biz b bildirimi ile dizi nesnesini yaratmadık. Yalnızca bu nesnenin adresini tutabilcek bir referans yarattık. Dizi nesnelerinin kendisi new operatörüyle yaratılır. new operatörünün genel biçimi şöyledir:

new <tür><[uzunluk]>

Örneğin:

new operatörü, belirtilen uzunlukta ve belirtilen türde bir dizi nesnesi yaratır.

Dizinin her elemanı bağımsız bir değişken gibi kullanılabilir. Dizi elemanlarına erişmek için köşeli parantez operatörü kullanılır. Operatörün genel biçimi şöyledir: a[ifade]

Köşeli parantez içerisindeki ifade tamsayı olmalıdır. Dizinin ilk elemanı sıfırıncı indisli elemandır. Bu durumda son eleman n-1 ‘inci indeksli elemandır.

Bir dizinin pozitif veya negatif bakımdan sınırları dışına erişildiğinde (yani olmayan bir elemana erişilmek istendiğinde) kontrol derleme aşamasında yapılmaz. Derleme başarılı olarak gerçekleştirilir. Fakat program çalışırken akış erişim noktasına geldiğinde exception oluşarak program çöker.


 

Dizi uzunluklarına Length property ile erişilebilir. Length property’si int türünden ve readonly’dir. Aynı türden 2 dizi referansı birbirine atanabilir. Bu durumda farklı dizi referansları aynı diziyi gösterir duruma gelir.

 

 

Dizileri metodlara parametre olarak geçirebiliriz. Bu durumda metodun parametresi bir dizi referansı olur, metod da bir dizi referansıyla çağrılır. Örneğin:

Örneğin int bir dizinin en büyük elemanına geri dönen GetMAx diye bir metod kullanılır.

Bir metodun geri dönüş değeri bir dizi referansı olabilir. Örneğin:

Burada metodun geri dönüş değeri int[ ] türündendir.

Anlamsız olsada sıfır uzunlukta bir dizi yaratmak geçerlidir.
new operatörüyle bir dizi tahsis ederken, köşeli parantezlerden sonra küme parantezleri açılarak hemen tahsis edilmiş dizinin elemanlarına değer verilebilir.Fakat bu durumda verilen ilk değerlerin tam olarak köşeli parantez içerisindeki uzunluklar ile aynı olması gerekir.

Normal olarak new operatörüyle tahsisat yapılırken, köşeli parantez içerisindeki uzunluk ifadesi sabit ifadesi olmak zorunda değildir. Fakat eğer küme parantezleriyle aynı zamanda ilk değer verilecekse, bu durumda köşeli parantez içerisindeki ifadenin sabit ifadesi olması gerekir.

Eğer new operatöründe dizi elemanlarına küme parantezleriyle ilk değer veriliyorsa köşeli parantezler içerisinde dizi uzunluğu belirtilmeyebilir. Bu durumda derleyici küme parantezleri içerisindeki ilk değerleri sayar, dizinin o uzunlukta yaratılmış olduğunu kabul eder. Fakat yinede pek çok programcı gerekmediği halde köşeli parantezler içerisinde uzunluğu yine belirtmektedir. Çünkü böylelikle diziye yanlışlıkla fazla ya da eksik değer vermek engel değildir ve aynı zamanda kodu inceleyen kişiler verilen ilk değerlerin sayısını hemen görebilirler. Fakat C#’ta küme parantezleri içerisinde verilen ilk değerlerin sabit ifadesi olması gerekmez.

Ayrıca bir kolaylık olsun diye dizi referanslarına doğrudan küme parantezleri içerisinde ilk değer verme mümkün hale getirilmiştir.

Burada yine derleyici tarafından derleme işlemi yapılır ve bu ilk değerler dizi elemanlarına yerleştirilir ve bu işelmin aşağıdaki işlemden hiçbir farkı yoktur.

Böyle doğrudan küme parantezlerine ilk değer vermek ancak bildirim sırasında yapılabilir, daha sonra yapılamaz.
Bir dizi nesnesi new operatörüyle tahsis edildiğinde dizi elemanları new operatörü tarafından sıfırlanır. Eğer dizi bir referans dizisi ise her elemanında null bulunur.

Referans Dizileri
Sınıflar türünden diziler yaratılabilir. Bu durumda dizinin her elemanı bir referans olur. Biz şimdi yalnızca 5 tane sample referansı tahsis etmiş olduk. Fakat bu referansların gösterdiği yerlerdeki nesneleri henüz yaratmadık. Aynı işlemi şöylede yapabilirdik.

İki tırnak ifadeleri string referansı anlamına geldiğine göre aşağıdaki işlem tamamen geçerlidir.

Çok Boyutlu Diziler
Çok boyutlu dizi kavramı aslında bilgisayar tarafından yapay bir kavramdır. Bilgisayar belleği çok boyutlu değildir. Dolayısıyla çok boyutlu diziler aslında derleyici tarafından tek boyutlu olarak saklanır. Pratikte 2 boyutlu dizilerle daha sık karşılaşılır. 2 boyutlu dizilere matris denir.
n boyutlu bir dizi referansı oluşturabilmek için köşeli parantez içerisine n-1 tane virgül atomu yerleştirmek gerekir. Örneğin:

Çok boyutlu dizi türleride tamamen farklı türlerdir. Örneğin yukarıda “a” referansı int [ , ] türünden, b referansı int [ , , ] türündendir. Çok boyutlu diziler new operatörüyle her boyut belirtilerek yaratılır. Örneğin:

Burada 3 satır, 2 sütunlu bir matris yaratılmıştır. Çok boyutlu dizi elemanlarına yine köşeli parantez operatörüyle ve her boyutun indeksi belirtilerek erişilir. Örneğin:

Çok boyutlu dizilerede new operatörüyle tahsisat sırasında ilk değer verilebilir. Fakat her boyutun ayrıca küme parantezine alınması gerekir. Örneğin:

Benzer biçimde ilk değer verilirken yine uzunluk belirtilmeyebilir. Fakat verilen ilk değerlerin tutarlı olması gerekir. Yani küme parantezleri içerisinde eşit sayıda eleman bulunmalıdır. Örneğin:

Benzer biçimde eğer çok boyutlu dizi referansına ilk değer veriliyorsa bu durumda new operatörü kullanılmayabilir.

3 boyutlu bir diziye new operatörüyle şöyle bir değer verilebilir.

Çok boyutlu bir dizide Length property’si dizideki toplam elemanların sayısını verir. Fakat her boyutun ayrıca uzunluğuda elde edilebilir. Bunun için GetLength metodu kullanılır. Örneğin; a.GetLength(1) ifadesiyle birinci indeksli boyutun (yani aslında ikinci boyutun) uzunluğu elde edilir. ayrıca Rank isimli readonly property, dizideki boyut sayısını vermektedir.

Dizi Dizileri

Her elemanı bir dizi referansı olan dizilere dizi dizileri (Jagged array) denir. Dizi dizileri birden fazla köşeli parantezle bildirilir. İlk köşeli parantez bildirimin dizi olduğunu belirtir. Diğer köşeli parantezler dizi dizisinde saklanan dizilerin türlerine ilişkindir. Örneğin:

Burada a bir dizi dizisi referansıdır. Yani a her elemanı int [ ] türünden olan bir dizi dizisidir. Dizi dizileri yine new operatörüyle uzunluk belirtilerek yaratılır. Örneğin:

Burada her biri int [ ] türünden olan elemanlara sahip 5 elemanlı bir dizi dizisi yaratılmıştır. Şimdi biz bu dizinin her elemanı için ayrıca dizi tahsis etmeliyiz.

Bir dizi dizisinin her elemanı farklı uzunlukta bir diziyi tutabilir. Örneğin:

Dizi dizilerinde belli bir elemana a[i][k] ifadesiyle erişilir. Örneğin:

Burada a’nın türü int[ ][ ] ‘dir. a[i] ise int[ ] türündendir. a[i][k], int türdendir.
Çok boyutlu dizilerle dizi dizileri benzer amaçlarla kullanılabilir. Örneğin her iki türde matrissel bir sistemi ifade etmek için kullanılabilir.

Görüldüğü gibi çok boyutlu diziler toplamda daha az yer kaplamaktadır. Fakat dizi dizilerinde dizinin her elemanı farklı uzunluktaki dizileri gösterebilmektedir. Örneğin; öğrenci sayıları farklı 5 sınıftaki öğrencilerin isimlerini tutacak olsak dizi dizisi daha anlamlıdır.

Fakat bir satranç tahtası çok boyutlu diziyle daha iyi temsil edilebilir.

Dizi dizileriyle çok boyutlu diziler bir arada bildirilebilir. Örneğin; tek boyutlu bir dizi dizisinin her elemanı 2 boyutlu bir dizi olabilir.

Burada a’nın türü int[ ][ , ] şeklindedir.
Çok boyutlu bir dizi dizisi olabilir ve bu dizi dizisinin her elemanı tek boyutlu ya da çok boyutlu dizi olabilir.

Burada a 2 boyutlu bir dizi dizisidir. Bunun her elemanı tek boyutlu bir diziyi göstermektedir. Örneğin:

Burada a, 2 boyutlu bir dizi dizisidir. a’nın her elemanı yine 2 boyutlu bir dizi gösterir.

Burada a, 2 boyutlu bir dizi dizisidir. a’nın her elemanı yine 2 boyutlu bir dizi dizisini tutmaktadır. Onunda her elemanı 2 boyutlu bir diziyi tutar. Tabi pratikte böylesi karışık durumlarla karşılaşılmaz.

Leave a Reply

Site Footer