bilgiz.org

C# İle biLGİsayar programlama temelleri (C# Programlama Kitabı) Svetlin Nakov & Co




Sayfa13/31
Tarih02.07.2017
Büyüklüğü3.36 Mb.

Indir 3.36 Mb.
1   ...   9   10   11   12   13   14   15   16   ...   31

7.3 Dizi Bildirimi ve Bellek Tahsisi
C# dilinde dizilerin uzunluğu sabittir, yaratılmaları sırasında ayarlanmıştır ve toplam eleman sayısını belirler. Bir dizinin uzunluğu ayarlandıktan sonra artık bunu değiştiremezsiniz.
7.3.1 Dizi Bildirimi
C# dilinde bir diziyi şu şekilde bildiririz:

int[] myArray;


Bu örnekte, myArray değişkeni tamsayı türünde (int[]) olan dizinin ismidir. Tamsayı dizisi bildirdik anlamına gelir. [] gösterimi ile değişkenin tek bir elemanı değil, bir eleman dizisini gösterdiğini bildiriyoruz.
Dizi türünde bir değişken bildirdiğinizde, bu bir referans türüdür ve bir değere sahip olmaz (null işaret eder). Bunun nedeni elemanlar için belleğin henüz tahsis edilmemiş olmasıdır.
Aşağıdaki şekil bildirilmiş bir dizi değişkeninin, dizinin elemanları için bellek henüz tahsis edilmemişken nasıl göründüğünü gösteriyor:


Programın yürütme yığınında myArray ismindeki değişken oluşturuluyor ve değer olarak null atanıyor (hiçbir değer tutmuyor anlamına gelir).

7.3.2 Dizi Oluşturma – "new" İşleci
C# dilinde bellek ayırmak için kullanılan anahtar sözcük new yardımıyla bir dizi oluşturulur:


int[] myArray = new int[6];


Bu örnekte, int türünde 6 eleman uzunluğunda bir dizi ayırıyoruz. Dinamik bellekte (yığın) 6 tamsayılık bir alanın tahsis edildiği ve bunların hepsinin 0 değeri ile başlatıldığı anlamına gelir.

Şekil gösteriyor ki, dizi için yapılan bellek tahsisi sonrasında myArray değişkeni dinamik bellekte değerlerin saklandığı bir adrese işaret etmektedir. C# dilinde bir dizinin elemanları her zaman dinamik bellekte (aynı zamanda yığın denir) depolanır.
Bir dizi için bellek tahsisi sırasında parantez içinde dizinin uzunluğunu tanımlamak için toplam eleman sayısını (negatif olmayan bir tamsayı) belirleriz. Elemanlarının türü new anahtar sözcüğünden sonra yazılır, böylece bellekte tahsis edilecek elemanların ne türde olacaklarını gösteririz.
7.3.3 Dizinin Başlatılması ve Varsayılan Değerler
Verilen bir dizinin herhangi bir elemanını kullanmaya başlamadan önce, başlatılması veya varsayılan değere sahip olması gereklidir. Bazı programlama dillerinde varsayılan değerler yoktur ve o zaman, başlatılmayan bir elemana erişmeye çalışırsanız, bu hataya neden olabilir. C# dilinde dizilerin elemanları da dahil olmak üzere tüm değişkenlerin varsayılan bir başlangıç ​​değeri vardır. Bu değer sayısal türler için 0 ve temel-olmayan türler için 0 eşdeğeridir (örneğin, referans türü için null ve bool türü için false).
Tabii ki başlangıç ​​değerlerini açıkça ayarlayabilirsiniz. Bunu farklı şekillerde yapabilirsiniz. İşte bunlardan biri:

int[] myArray = { 1, 2, 3, 4, 5, 6 };


Bu durumda dizinin elemanlarını bildirim zamanında oluşturuyoruz ve başlatıyoruz. Aşağıdaki şekil üzerinde dizinin değerleri bildirim anında başlatıldığı zaman, bellekte nasıl tahsis edildiği görülmektedir.

Bu sözdizimi ile new işleci yerine kıvırcık parantezleri kullanabilirsiniz. Parantez arasında dizinin başlangıç ​​değerleri virgülle ayrılarak listelenir. Onların sayısı dizinin uzunluğunu belirler.
7.3.4 Dizi Bildirimi ve Başlatılması – Örnek
Bir dizinin nasıl bildirileceğine ve başlatılacağına bir örnek daha verelim:

string[] daysOfWeek =

{ "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday", "Sunday" };




Bu durumda string türünde yedi elemandan oluşan bir dizi tahsis ediyoruz. string türü bir referans türüdür (object) ve değerleri dinamik bellekte saklanır. daysOfWeek değişkeni yığıt bellekte tahsis edilir ve dinamik belleğin dizinin elemanları içeren bir bölümüne işaret etmektedir. Bu yedi elemanın tümünün türü olan string dinamik belleğin gerçek değerin saklandığı farklı bir bölümüne işaret eder.
Şekilde dizinin bellekte nasıl tahsis edildiğini görüyoruz:

7.3.5 Dizi Sınırları

Dizilerin varsayılan olarak sıfır-tabanlıdır, yani bu elemanların numaralandırmasının 0 ile başladığı anlamına gelir. Birinci eleman 0 endeksine sahiptir, ikinci 1, vb. N elemanlı bir dizinin son elemanı N–1 endeksine sahiptir.
7.4 Dizi Elemanlarına Erişim
Dizi elemanlarına doğrudan doğruya endekslerini kullanarak erişiriz. Her bir eleman, dizinin adını takiben elemanın endeksi (ardışık sayı) köşeli parantez içine yerleştirilerek erişilebilir. Hem okuma ve hem yazma için verilen bir dizinin elemanlarına erişebilirsiniz, yani bu elemanlara değişkenlermiş gibi davranılabilir anlamına gelir.
Bir dizinin elemanına ulaşmak için bir örnek aşağıda verilmiştir:

myArray[index] = 100;


Yukarıdaki örnekte index endeksli pozisyonda yer alan elemana 100 değerini atıyoruz.
Aşağıdaki örnekte sayılardan oluşan bir dizi tahsis ediyoruz ve sonra bazı elemanlarını değiştiriyoruz:

int[] myArray = new int[6];

myArray[1] = 1;

myArray[5] = 5;



Değişiklik yapıldıktan sonra bu dizi bellekte aşağıda gösterildiği gibi tahsis edilir:

Gördüğümüz gibi, değerleri açıkça belirlenenler dışında bütün elemanlar dizi için bellek tahsis edildiği zaman 0 ilk değeri ile başlatılmıştır.
Bir döngü deyimi kullanarak dizi boyunca yineleme yapabilirsiniz. Bu tür yinelemelerin en yaygın şekli for-döngüsü kullanmaktır:


int[] arr = new int[5];

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

{

arr[i] = i;



}

7.4.1 Dizinin Sınırlarını Aşmak
.NET Framework her elemana erişim girişiminde endeksin geçerli aralıkta mı yoksa dizinin sınırları dışında mı olduğuna dair otomatik denetim yapar. Geçersiz (mevcut olmayan) bir elemana erişmeye çalıştığınızda, System.IndexOutOfRangeException istisnası atılır. Otomatik denetim gerçekten dizilerle çalışırken geliştiricilerin hataları bulmasına yardımcı olur. Tabii ki, istisnalar performansı etkiler. Ancak "Ayrılmamış belleğe erişim", "Sınır dışında" gibi hatalardan kaçınmak için bu bedeli gözardı edebiliriz.
Dizinin sınırları dışında bir elemana erişmeye çalışan bir örnek aşağıda verilmiştir:

IndexOutOfRangeExample.cs

class IndexOutOfRangeExample

{

static void Main()



{

int[] myArray = { 1, 2, 3, 4, 5, 6 };

Console.WriteLine(myArray[6]);

}

}




Yukarıdaki örnekte altı tamsayı içeren bir dizi tahsis ediyoruz. İlk endeks 0 ve son endeks 5 değerine sahiptir. Endeksi 6 olan bir elemanı konsolda yazdırmaya çalışıyoruz, ancak böyle bir eleman olmadığı için bu bir istisnaya yol açar:


7.4.2 Diziyi Tersine Çevirmek – Örnek
Bir sonraki örnekte dizinin elemanlara erişeceğiz ve endekslerini kullanarak onların yerlerini değiştireceğiz. Görevimiz ters sırayla elemanları yazdırmaktır. İkinci bir yardımcı dizi kullanarak dizinin elemanlarını ters çevireceğiz. Birinci dizinin tüm elemanları ters sırayla ikinci dizide tutulacaktır. Unutmayın ki her iki dizinin uzunluğu aynı olacaktır, ve ilk tahsisten sonra değişmeden kalacaktır.

ArrayReverseExample.cs

class ArrayReverseExample

{

static void Main()



{

int[] array = { 1, 2, 3, 4, 5 };

// Get array size

int length = array.Length;

// Declare and create the reversed array

int[] reversed = new int[length];


// Initialize the reversed array

for (int index = 0; index < length; index++)

{

reversed[length - index - 1] = array[index];



}
// Print the reversed array

for (int index = 0; index < length; index++)

{

Console.Write(reversed[index] + " ");



}

}

}



// Output: 5 4 3 2 1


Örnek şu şekilde çalışır: başlangıçta int türünde tek boyutlu bir dizi tahsis ediyoruz ve 1’den başlayarak 5’e kadar ardışık sayılar ile ilk değer atıyoruz. Bundan sonra length değişkeninde dizinin uzunluğunu tutuyoruz. Not ediniz ki, dizinin toplam eleman sayısını döndürecek olan Length özelliğini kullanıyoruz.  C# dilinde her dizi length özelliğine sahiptir.
Bundan sonra aynı length uzunluğundaki bir reversed dizisini bildiriyoruz. Bu dizide orijinal dizinin tüm elemanları tutulacak, ancak ters sırayla olacak.
Elemanları tersine çevirmek için bir for-döngüsü kullanıyoruz. Her tekrarda index değişkenini bir artırıyoruz ve array dizisinin ardışık tüm elemanlarına eriştiğimizden emin oluyoruz. Döngü koşulu dizinin uçtan uca yineleneceğini garanti eder.
array üzerinden yineleme yapıldığında ne olacağını takip edelim: İlk yinelemede index 0 değerine sahiptir. array[index] kullanarak dizinin ilk elemanına erişiyoruz ve sırasıyla reversed[length – index – 1] ile yeni reversed dizisinin son elemanına erişiyoruz. Değerleri yeni diziye atıyoruz. Böylece, array dizisinin ilk elemanının değerini reversed dizisinin son elemanına tahsis ediyoruz. Her yinelemede index bir artırılıyor. Bu şekilde, array dizisinin sırayla bir sonraki elemanına ve reversed dizisinin sırayla bir önceki elemanına erişiyoruz.
Sonuç olarak diziyi ters çeviriyoruz ve yazdırıyoruz. Örnekte, dizi boyunca ardışık yinelemeleri gösterdik, bu, aynı zamanda farklı döngü yapıları (örneğin, while ve foreach) ile de yapılabilir.
7.5 Konsoldan Diziyi Okutma
Konsoldan dizi değerlerini nasıl okutabiliriz, görelim. Konsoldan okutma için bir for-loop ve .NET Framework araçlarını kullanacağız.
Başlangıçta, Console.ReadLine() kullanarak konsoldan bir satır okutacağız ve sonra int.Parse() kullanarak bu satırı bir tamsayıya ayrıştıracağız ve n değişkenine bu değeri atayacağız. Daha sonra dizinin uzunluğu olarak n sayısını kullanacağız.

int n = int.Parse(Console.ReadLine());

int[] array = new int[n];




Yine dizi boyunca yineleme yapmak için bir döngü kullanıyoruz. Her tekrarda geçerli eleman olarak konsoldan okuduğumuz değeri ayarlıyoruz. Döngü, n defa devam edecektir ki, bu tüm dizi boyunca yineleme anlamına gelir ve bu yüzden dizinin her elemanı için bir değer okumuş oluruz:

for (int i = 0; i < n; i++)

{

array[i] = int.Parse(Console.ReadLine());



}


7.5.1 Simetrik Diziler – Örnek
İlk ve son elemanları eşitse ve aynı zamanda ikinci elemanı ile sondan bir önceki elemanı eşitse ve bunun gibi devam eden bir dizi simetriktir. Şekil üzerinde simetrik diziler için birkaç örnek gösterilmiştir:


Bir sonraki örnekte bir dizinin simetrik olup olmadığını kontrol edeceğiz:

Console.Write("Enter a positive integer: ");

int n = int.Parse(Console.ReadLine());

int[] array = new int[n];
Console.WriteLine("Enter the values of the array:");
for (int i = 0; i < n; i++)

{

array[i] = int.Parse(Console.ReadLine());



}
bool symmetric = true;

for (int i = 0; i < array.Length / 2; i++)

{

if (array[i] != array[n - i - 1])



{

symmetric = false;

break;

}

}


Console.WriteLine("Is symmetric? {0}", symmetric);


Bir diziyi başlatıyoruz ve konsoldan elemanlarını okutuyoruz. Simetrik olup olmadığını kontrol etmek için dizinin yarısı boyunca yineleme yapmamız gerekiyor. Dizinin orta elemanı array.Length / 2 endeksine sahiptir. Uzunluğu tek sayı ise bu indeks tam da ortadaki elemanı gösterir, ancak bir çift sayı ise bu endeks ortanın hemen sağındaki elemanı gösterir (ortadaki eleman iki eleman arasında kalmaktadır). Böylece döngü 0 ile array.Length / 2 (dahil değil) arasında çalışmalıdır.
Bir dizinin simetrik olup olmadığını kontrol etmek için, bir bool değişkenini kullanıyoruz ve ilk olarak dizi simetrik olduğu varsayılmaktadır. Dizi üzerinden yineleme sırasında ilk eleman ile son elemanı, ikinci eleman ile sondan bir önceki elemanı, vb. karşılaştırıyoruz. Bir noktada elemanlar eşit değilse, o zaman dizinin simetrik olmadığı anlamına gelecek şekilde bool değişkenine false atıyoruz.
Sonunda konsolda bool değişkeninin değerini yazdırıyoruz.

7.6 Konsol Üzerine Diziyi Yazdırmak
Çoğu kez, verilen bir diziyle çalışmamızı bitirdikten sonra, dizi elemanlarını konsolda yazdırmak zorunda kalırız.
Konsolda bir dizinin elemanlarını yazdırmak dizi elemanlarını başlatmaya benzerdir, yani

dizi boyunca yineleme yapmak için bir döngü kullanılır. Yazdırmak için katı kurallar yoktur, ancak genellikle uygun biçimlendirme çeşitleri kullanılır.
Sık sık yapılan bir hata da, diziyi bir sayı gibi yazdırmak girişimidir:

string[] array = { "one", "two", "three", "four" };

Console.WriteLine(array);





Ne yazık ki bu kod dizinin elemanlarını yazdırmaz, sadece türünü yazdırır. Bu kod çalıştırıldıktan sonra, çıktı olarak sonucu aşağıdaki gibidir:

Bir for-döngüsü kullanılarak, dizinin elemanlarını elle yazdırırız:

string[] array = { "one", "two", "three", "four" };
for (int index = 0; index < array.Length; index++)

{

// Print each element on a separate line



Console.WriteLine("Element[{0}] = {1}", index, array[index]);

}



Bir for-döngüsü kullanarak dizi üzerinde yineleme yapıyoruz, bu yineleme array.Length defa tekrarlayacaktır ve Console.WriteLine() kullanarak geçerli elemanı biçimlendirilmiş bir dize olarak yazdırıyoruz. Sonuç aşağıdaki gibidir:


Element[0] = one

Element[1] = two

Element[2] = three

Element[3] = four





7.7 Dizinin Elemanları Üzerinden Yineleme
Gördüğümüz gibi, bir dizinin elemanları üzerinden yineleme diziler ile çalışırken en çok kullanılan tekniklerden biridir. Bir döngü kullanarak ardışık yineleme her elemana kendisinin endeksi aracılığıyla ulaşmamıza izin verir, eleman değerini istediğimiz gibi değiştirmemiz mümkün olur. Farklı döngü yapıları ile bunu yapabilirsiniz, ancak en uygun döngü for-deyimidir. Bu tür yinelemenin nasıl çalıştığını detaylı olarak inceleyeceğiz.
7.7.1 For-Döngüsü ile Yineleme
Diziler ve endeks yapıları ile çalışırken, for-döngülerini kullanmak iyi bir uygulamadır. Aşağıdaki örnekte bir sayı dizisinin tüm elemanlarının değerlerini iki katına çıkaracağız ve onları yazdıracağız:

int[] array = new int[] { 1, 2, 3, 4, 5 };
Console.Write("Output: ");

for (int index = 0; index < array.Length; index++)

{

// Doubling the number



array[index] = 2 * array[index];

// Print the number

Console.Write(array[index] + " ");

}

// Output: 2 4 6 8 10




Dizinin geçerli endeksini bir for-döngüsü kullanarak takip ediyoruz ve gerektiği gibi elemanlarına erişiyoruz. Tüm elemanlar üzerinden ardışık yineleme zorunda değilsiniz, yani algoritmanın gerektirdiği şekilde dizin elemanları boyunca yineleme yapabilirsiniz. Örneğin tüm elemanlar üzerinden değil, bunlardan bazılarını döngü içinde yineleyebilirsiniz:

int[] array = new int[] { 1, 2, 3, 4, 5 };
Console.Write("Output: ");

for (int index = 0; index < array.Length; index += 2)

{

array[index] = array[index] * array[index];



Console.Write(array[index] + " ");

}

// Output: 1 9 25




Bu örnekte sadece çift endeksli pozisyonlarda bulunan elemanları yineliyoruz ve değerlerinin karesini alıyoruz.
Bazen bir dizi üzerinden ters sırada yineleme yapmak isteyebilirsiniz. Benzer şekilde yapılır, ancak bu sefer döngü son elemanın endeksi ile başlamalıdır ve endeks 0 (dahil olmak üzere) değerine gelene kadar her adımda azalmalıdır. Bir örnek aşağıda verilmiştir:

int[] array = new int[] { 1, 2, 3, 4, 5 };
Console.Write("Reversed: ");

for (int index = array.Length - 1; index >= 0; index--)

{

Console.Write(array[index] + " ");



}

// Reversed: 5 4 3 2 1




Bu örnekte tersten diziyi yineliyoruz ve konsolda her elemanı yazdırıyoruz.

7.7.2 "foreach" Döngüsü ile Yineleme
Dizi elemanlarının yinelenmesi için en çok kullanılan yapılardan biri de foreach döngüsüdür. C# dilinde foreach döngü yapısı aşağıdaki gibidir:

foreach (var item in collection)

{

// Process the value here



}


Bu programlama yapısında var yinelenen elemanların türüdür. collection dizinin kendisidir (yada herhangi bir başka eleman topluluğu) ve item her adımdaki geçerli dizi elemanıdır.
Genel olarak foreach döngü yapısı for-döngüsü gibi aynı özelliklere sahiptir. Temel fark yinelemenin tüm elemanlar üzerinden daima yapılmış olmasıdır – başından sonuna kadar.  Mevcut endekse erişemeyiz, sadece topluluğun kendisi tarafından tanımlanan bir şekilde topluluk üzerinden yineleme yapabiliriz. Diziler için yinelemenin sırası birinci elemandan başlayarak ardışık olarak sonuncuya kadardır. Foreach-döngülerinde döngü değişkeni salt-okunurdur, bu nedenle döngü gövdesi içinden mevcut döngü elemanını değiştiremeyiz.
Elemanları değiştirmemizin gerekli olmadığı, sadece onları okumamızın gerektiği durumlar için foreach-döngü deyimi kullanılır.

7.7.2.1 "foreach" Döngüsü ile Yineleme – Örnek
Bir sonraki örnekte dizi boyunca yinelemek için foreach döngüsünü nasıl kullanacağınızı öğreneceksiniz:

string[] capitals =

{ "Sofia", "Washington", "London", "Paris" };


foreach (string capital in capitals)

{

Console.WriteLine(capital);



}


Her elemanı bir dizeden oluşan capitals dizisini bildirdikten sonra, foreach döngüsünü kullanarak dizi boyunca yineleme yapıyoruz ve konsolda elemanlarını yazdırıyoruz. Her adımdaki mevcut eleman capital değişkeninde saklanıyor. Kod çalıştırıldığında çıktı olarak sonucu aşağıdaki gibidir:

Sofia

Washington

London

Paris




7.8 Çokboyutlu Diziler
Tek-boyutlu diziler matematikte vektör olarak da bilinmektedir. Çoğu zaman birden fazla boyutta dizilere gerek duyarız. Örneğin standart satranç tahtasını kolayca 8 x 8 büyüklüğünde olan (yatay yönde 8 hücre ve dikey yönde 8 hücre içeren) iki boyutlu bir dizi olarak temsil edebiliriz.
7.8.1 Çokboyutlu Dizi Nedir? Matris Nedir?
C# dilinde her geçerli tür bir dizinin elemanları için kullanılabilir. Yani, daha sonra tartışacağımız gibi dizilerden oluşan bir dizi oluşturabiliriz.
int[] kullanarak tamsayılardan oluşan tek-boyutlu bir diziyi bildiririz, ve iki-boyutlu bir diziyi bildirmek için int[,] kullanırız. Bunu aşağıdaki örnek göstermektedir:

int[,] twoDimensionalArray;


İki boyutu olduğu için bu diziler iki-boyutlu olarak adlandırılır. Aynı zamanda matris (matematiksel terimi) olarak da bilinir. Birden fazla boyutu olan diziler genel olarak çok-boyutlu olarak adlandırılır.
Bir boyut daha ekleyerek, bu şekilde üç-boyutlu diziler bildirebilirsiniz:

int[,,] threeDimensionalArray;



Teorik olarak bir dizinin boyutları için sınır yoktur, ancak pratikte ikiden fazla boyutlu dizileri kullanmayız, bu nedenle iki-boyutlu diziler üzerinde odaklanacağız.

1   ...   9   10   11   12   13   14   15   16   ...   31






    Ana sayfa


C# İle biLGİsayar programlama temelleri (C# Programlama Kitabı) Svetlin Nakov & Co

Indir 3.36 Mb.