Derslerimizin ilk konularından biri olan değişkenlerin programlarımızın bazı değerleri hafızasında tutmak istediği zaman kullanıldığını biliyoruz. Farklı tiplerde String, int gibi sayı veya metin değerleriyle oluşturduğumuz değişkenlerin yanı sıra, kendi yarattığımız nesnelerin de değişkenler vasıtasıyla bellekte saklanabildiğine de önceki aylarda şahit olmuştuk. Ancak hazırladığımız uygulamalardaki verileri tek tek işlemek genel olarak uzun zaman alan ve bu verilerin sayısı arttığında kontrol etmesi güç bir görev. Bu yazımda temel programcılık öğelerinden biri olan diziler konusuna değinerek birçok değeri bir değişken içerisinde kullanabilmeye değineceğim.

Programlama dillerinde dizileri kullanmak bizi birçok satırda yazacağımız kod satırlarından ve birçok değişkenin yarattığı karışıklıktan kurtararırken, aynı işlemleri tek satır bir koda dönüştürerek daha basite indirgenmiş anlaşılır bir hale getirir. Örneğin 10 tane değişkenle işlem yapabilen bir uygulamayı yazmak çok zor değildir, ancak binlerce sayı kullanarak hesaplama yapmamız gerektiğinde bütün değerler için yeni bir isim bularak yeni değişkenler yaratmamız tamamen bir vakit kaybıdır. Dizilerin kullanımı bize zamandan kazanç sağlar ve daha sağlıklı kodlar üretmemize olanak tanır. Temelde sıralı olmayan elemanların bir araya gelmesiyle oluşan diziler, belirli bir sayıda veriyi bir değişkene bağlar ve bu değişken üzerinden döngü yapılarıyla bütün verilere çok hızlı bir biçimde arama, sıralama, değiştirme gibi işlemleri uygulamanıza imkân verir. Dizi tipindeki bir değişken içerisinde istediğimiz kadar veri tutmamız mümkündür, ancak burada önemli nokta bütün verilerin tiplerinin aynı olması gerektiğidir.

Diziler birçok değişkeni bünyesinde barındırırlar..

Dizilerin Kullanımı

Tanımlandıktan sonra bilgisayarınızın belleğine yazılan bu diziler, 0’dan başlayan indekslere (indis olarak da adlandırılır) sahiptir ve dizi içerisinde belirli bir sıradaki elemana erişim bu indeks ile gerçekleştirilir. Programlama diline göre farklılık gösteren başlangıç indeksinin 0 olması, örneğin 5. elemanı getirmek için indeksi 4 olan öğeyi çalıştıracağınız anlamına geldiği için dikkatli olmamızı gerektirir. Yeni bir dizi yaratma işlemi 2 adımda gerçekleşir. Primitif değişkenler yaratırken yaptığımız gibi diziyi tanımlarız ve bundan sonra bir nesne yaratırken kullandığımız “new” anahtar sözcüğü ile dizimizi oluşturabiliriz. Bu iki adımda değişkenlerden farklı olarak kare parantezler kullanarak yarattığımız şeyin bir dizi olduğunu belirtiyoruz. Örneğin 5 elemanı olan bir int dizisi yaratmak için:

int[] ornek = new int[5];

ifadesini kullanmamız yeterli. Böylece “ornek” isminde 5 adet sayıyı barındıran bir dizi değişkeni yaratmış oluyoruz. Dizimizin barındırdığı elemanlara erişmek için indeks sayıları kullanıldığından yukarıda bahsetmiştik. Değişken ismine bitişik yazdığımız kare parantezleri kullanarak bu indeks sayılarını belirtebilir ve istediğimiz elemana erişebiliriz. Örneğin yukarıda yarattığımız 5 elemanlı dizinin son elemanını değiştirmek için

ornek[4] = 100;

yazmamız yeterli. Eğer bu elemanı daha sonra bir işlem içerisinde kullanmak veya yazdırmak istiyorsak yine indeksini belirterek kullanmamız mümkün. Aşağıdaki kod ile aynı elemanımızı konsola yazdırabiliriz:

Console.WriteLine(ornek[4]);

Dizilerin kullanımında aklımızda bulundurmamız gereken en önemli husus ise, her dizinin yaratılırken boyunun belirlenmesi gerektiğidir. Hatırlarsanız “ornek” isimli dizimizi yaratırken kullandığımız new int[5] ifadesindeki 5 bu dizinin boyutunu belirler. Belirlediğimiz boyut kadar bilgisayarın belleğinde (RAM) yer ayrıldığı için dizileri oluştururken mutlaka boyutunu belirlememiz gerekir ve bu boyutu daha sonradan değiştirmemiz mümkün değildir. Varolan bir dizinin boyutunu değiştirmenin tek yolu yeni bir dizi oluşturup mevcut dizinin bütün elemanlarının bir döngü içerisinde yeni diziye aktarılmasıdır. Eğer dizi yapınızın boyutunun dinamik olarak artması önemli ise, daha farklı bir veri yapısı (ör: ArrayList) da kullanabilirsiniz.

İlk örneğimizin ekran görüntüsü..

Aslında değişkenlerin bir kümeyi oluşturduğu veri yapıları olan dizilerin bir diğer özellikleri ise boyutlarıdır. Yukarıda bahsettiğimiz tek bir indeks sayısı olan diziler gibi olanlar tek boyutlu, satır ve sütun olarak veri depolayabilenlere çift boyutlu diziler denir. Günümüzde bazı dillerde bulunan ikiden fazla boyut destekleyen çok boyutlu dizileri C# içerisinde oluşturmamız mümkündür ancak bunların kullanım alanları kısıtlıdır.

Tek Boyutlu Diziler

Daha önce nasıl oluşturabileceğimizi gördüğümüz bu diziler ile ilgili olarak asıl bilmemiz gereken, onların döngüler içerisinde kullanımıdır. Geçtiğimiz ay değindiğimiz for veya while döngüleri ile dizilere eleman atamak, mevcut elemanları görüntülemek veya değiştirmek gerçekten çok fazla kullanılan ve çok hızlı yapıldığı için bir nevi hayatımızı kolaylaştıran işlemlerdir. Dizinin eleman sayısı kadar çalışan döngüleri özellikle tek boyutlu dizilerde kullanmak zor değildir. Yapmamız gereken tek şey dizilerin boyutunu döndüren “Length”  özelliğini kullanarak geçtiğimiz ay öğrendiğimiz sayaç kullanılan döngüler oluşturmak. İsterseniz ilk örneğimizde 100 elemanlı double tipinde bir dizi yaratalım ve 1’den 100’e kadar olan sayıları bu diziye dolduralım. Elemanları görüntüledikten sonra bütün hepsini ikiye bölerek tekrar konsolda görüntüleyelim. Cümleleri takip ettiyseniz burada yaptığımız dört farklı işlem bulunmakta. Önce diziyi dolduruyor, ekranda gösteriyor, sonra ikiye bölüp en sonunda tekrar görüntülüyoruz. Bütün bu işlemlerin bir for döngüsü içerisinde yapıldığı ilk örneğimizi Örnek Kod 1 içerisinde (yazının altında) bulabilirsiniz.

C# çok boyutlu dizilere de destek veriyor..

Hazırladığımız döngüleri inceleyecek olursak, hepsinde bir “i” sayaç değişkenimiz bulunmakta ve bu değişken 0’dan başlayarak dizi boyutuna gelmeden durmaktadır. İşte dizilerin döngü ile etkileşime geçebilmesi bu değişken sayesinde gerçekleşiyor. Sayacı dizimizin indeks sayısı olarak kullanabiliyoruz ve sayaç her döngüde değiştiği için bizde sürekli dizimizin farklı bir elemanına varolan işlemi uygulamış oluyoruz. Örneğimizde dikkat edeceğimiz diğer bir nokta ise, bizim dizi elemanlarını eşitlemek istediğimiz sayı değerleri 1’den başlıyordu ancak biz sayacımızı yine de 0’dan başlattık. Dizilerin indeks sayısı 0 olduğundan ve döngü sayacını dizimizin indeksi olarak kullandığımızdan “i” değişkenini bu değerler ile tanımlamak zorunda kaldık.

İki boyutlu diziler tablo yapısındadır.

Çok Boyutlu Diziler

Dizilerin birçok farklı alanlardaki kullanımı, onun tek düze gidişatını bozmamızı gerektirebilir. Sakladığımız değerler ile ilişkili başka değerleri de bu verinin bulunduğu satırda bir tablo gibi tutmamızı gerektiren pek çok uygulama vardır. Örneğin matris işlemleri, birçok oyundaki veriler genelde iki boyutlu diziler ile çalışırlar. Excel gibi çizim tablolarından alışık olduğumuz satır ve sütun mantığı burada da geçerli olmakla beraber, bu dizileri kontrol edebilmek için boyut sayısı kadar iç içe döngüye de ihtiyaç duyarız. Çok boyutlu dizilerin C# içerisindeki söz diziminin mevcut diğer programlama dillerinden farklı olduğunu da söylemekte fayda var. Yine 2 adımda oluşturduğumuz dizilerimizi tanımlama sırasında yazdığımız köşeli parantezlerin içerisine virgül koyarak bir boyut daha artmasını sağlıyoruz. Yani buraya iki adet virgül koyarsanız diziniz üç boyutlu olacaktır. Bundan sonra oluşturma sırasında aynı şekilde boyut değerlerini, araya bu virgüller gelecek şekilde yazmanız yeterli.

double [,] ikiBoyutlu = new double[10,30];
int[, ,] ucBoyutlu = new int[3, 5, 8];

Şeklinde çok boyutlu dizilerinizi oluşturabilirsiniz. İsterseniz konuyu daha iyi anlayabilmek için Tablo 2 içerisinde verdiğimiz örneği inceleyelim. Bu uygulamamıza 10’a 30’luk iki boyutlu dizi oluşturarak başlıyoruz. Bu tanımlamadan sonra gördüğünüz iç içe for döngüleri aslında çok boyutlu dizinin bütün elemanlarına giden aynı döngüler. Sadece ilkinde bütün dizi elemanları doldurulurken ikinci döngüde bu elemanlar konsola yazdırılıyor.  İç içe döngülere dair bilmemiz gereken tek şey dışarıdaki döngünün satırlar, içerideki döngünün sütunları kontrol ettiği.

İkinci örneğimizin ekran görüntüsü..

Döngüler ile dışarıdan içeriye doğru tablo şeklindeki veri yapımızın bütün elemanlarını seçerken tek boyutlu dizilerden farklı olan diğer bir nokta da, Length özelliğinin bu tür dizilerde kullanımının çok tehlikeli olması!  Satırlar arasında ilerleyen dışarıdaki for döngüsü için sadece satır sayısı, sütunlar arasında gezen içerideki for döngüsü için sadece sütun sayısı önemlidir. Bir dizinin bütün elemanlarının sayısını döndüren “Length” özelliği ise satır ve sütun kavramlarını gözetmediğinden for döngülerinde indeks sayısının taşması sonucu birçok hatanın ortaya çıkmasına yol açabiliyor. Bunun çözümü ise örneğimizde görebileceğimiz gibi, dizilerin getLength(boyut) fonksiyonu ile istediğimiz boyutun uzunluğunu for döngümüzün içerisinde kullanmak. Fakat boyutların da 0’dan başlayan bir indeksi var ve bu yüzden satırlar için getLength(0), sütunlar için getLength(1)  yazarak kullandık.

Son Sözler

İkinci örneğimizin bir tablo gibi görünmesini ise içerideki for döngüsünden sonra bir satır atlayıp elemanları konsola yan yana yazdırarak sağladık. Özellikle çok boyutlu dizilerin kullanımına alışmak maalesef önceki eğitimlerimizin konularına göre daha zor. İç içe for döngülerinin yapısını anlamak özellikle ilk görüşte bunu başarmak gerçekten çok zor. Ancak uygulama geliştirirken gerçekten fazla kullanılan temel konular olduğu için dizilere hükmetmeye çalışmanızın ilerideki projelerimiz açısından çok faydalı olacağını düşünüyorum. Bu yüzden diziler ile ilgili örneklerimizi geliştirerek değişik uygulamalar tasarlamanızı tavsiye ederim.

p.s. Bu yazı Kasım 2008′de yayımlanmıştır.

Örnek Kod 1:


//Örnek 1

//double tipinde elemanlar içeren dizimizi oluşturuyoruz.
double[] ornek = new double[100];

//Dizimizi 1-100 arası sayılar ile dolduruyoruz.

for (int i = 0; i < ornek.Length; i++)

{

ornek[i] = i + 1;

}

//Bütün dizimizin elamanlarını ekranda gösteriyoruz.

for (int i = 0; i < ornek.Length; i++)

{

Console.WriteLine(ornek[i]);

}

//Bütün elemanları 2'ye bölüyoruz.

for (int i = 0; i < ornek.Length; i++)

{

ornek[i] = ornek[i] / 2;

}

//Elemanların son değerini tekrar ekranda görüntülüyoruz.

for (int i = 0; i < ornek.Length; i++)

{

Console.WriteLine(ornek[i]);

}

Örnek Kod 2:


//Örnek 2

double [,] ornek = new double[10,30];

for (int i = 0; i < ornek.GetLength(0); i++)

{

for (int k = 0; k < ornek.GetLength(1); k++)

{

ornek[i, k] = i;

}

}

for (int i = 0; i < ornek.GetLength(0); i++)

{

for (int k = 0; k < ornek.GetLength(1); k++)

{

Console.Write(ornek[i, k]);

}

Console.WriteLine("");

}

Related posts:

  1. C# Dersleri – 4: Döngü Yapilari
  2. C# Dersleri – 3: Program Kontrolleri
  3. C# Dersleri – 2: Programciliga Giris
  4. C# Dersleri – 1: .Net Framework
  5. Ajax Extender nesnelerinin kullanimi