C# Diziler

C# Diziler, Şimdiye kadar program içinde tanımladığımız değişken sayısı birkaç değişkeni geçmedi. Ancak çoğu zaman bu böyle olmaz. Bazı programlarda 200-300 değişkene kadar ihtiyaç duyabiliriz. Bunların hepsinin teker teker tanımlanması oldukça zahmetlidir. İşte bu yüzden programlama dillerinde dizi diye bir kavram vardır. Aslında bir dizi, birbiriyle ilişkili değişkenlerin oluşturduğu bir gruptan başka bir şey değildir. Diyelim ki sayi1 ve sayi2 adlı iki değişken tanımladık. Bunların adları birbirine benzemesine rağmen birbiriyle hiçbir ilişkisi yoktur. Yani bir döngü içinde sayiX yazarak bu değişkenlere erişemeyiz. Halbuki dizilerde bu mümkündür.
Dizi Tanımlama ve Değerlere Erişim

int[] dizi=new int[10];

Veya

int[] dizi;
dizi=new int[10];

Yukarıdaki iki kodda da int türünden 10 elemanlı dizi adında bir dizi tanımlandı ve dizinin her bir elemanına int türünün varsayılan değeri atandı. Varsayılan değerler, sayısal türler için 0, object türü için NULL (yokluk), string türü için “”, char için ‘ ‘ (boşluk) ve bool için false değerleridir.

ÖNEMLİ
Bütün dizilerin birinci elemanı 0. endeksidir. dizi dizisinin birinci elemanına dizi[0], 10. elemanına dizi[9] yazarak erişebilir ve bu dizi elemanlarını bir değişkenmiş gibi kullanabiliriz.

int[] dizi=new int[20];
dizi[5]=30; //6. Sıradaki eleman
Console.Write(dizi[5]);

Dizilere başlangıç değerleri de atanabilir. Atama için { } işaretçileri kullanılır.

string[] dizi1={"Bir","İki","Üç"};
int[] dizi2={2,-4,6};
float[] dizi3={2f,1.2f,7f};

HATIRLATMA
Bir dizi elemanına erişirken üst dizi indeksinden dafa yukarıda bir değer verilirse program hata verir. Örneğin yukarıdaki 3 boyutlu dizi de dizi1[4] yazıldığında program taşma hatası verir.

int a=Convert.ToInt32(Console.ReadLine());
int[] dizi=new int[a+5];
dizi[5]=30;
Console.Write(dizi[5]);

Yukarıda da görüldüğü gibi bir dizinin boyutu sabit olabileceği gibi değişkende olabilir. Ancak önemli olan bir dizinin boyutu girildikten sonra dizi boyutu tekrar değiştirilemez.

int[] d1=new int[10] , d2=new int[20];
int[] dizi1, dizi2;

Burada dikkat edilmesi gereken new operatörü ile türetilmeyen dizilere erişilemez. Yukarıdaki örnekte dizi1 ve dizi2 ögelerine henüz erişilemez.

Dizilere sistemstik erişim Foreach döngüsü

int[] dizi={3,2,6,7};
foreach(int eleman in dizi)
	Console.WriteLine(eleman);

ÖNEMLİ

Foreach döngüsü sadece dizi elemanlarını okuma için kullanılır. Dizi elemanları üzerinde düzenleme işlemlerine izin verilmez. Bu tür engelleme ReadOnly (Sadece okunabilir) olarak bilir.

Çok boyutlu diziler

Çok boyutlu diziler kısaca her bir elemanı bir dizi şeklinde olan dizilerdir, matris dizileri (düzenli diziler) ve düzensiz diziler olmak üzere ikiye ayrılır.

Matris diziler

Her bir dizi elemanının eşit sayıda dizi içerdiği dizilerdir.

İki boyutlu matris diziler

3X2 boyutunda iki boyutlu bir matris dizi aşağıdaki gibi tanımlanabilir:

int[,] dizi=new int[3,2];

veya

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

İkinci dizinin elemanları indekslerine göre aşağıdaki gibidir.
dizi[0,0]→1
dizi[0,1]→2
dizi[1,0]→3
dizi[1,1]→4
dizi[2,0]→5
dizi[2,1]→6
Bu diziyi matris olarak aşağıdaki gibi gösterebiliriz:

C# diziler

C# diziler

İki boyutlu bir dizinin sistematik görünümü yandaki gibidir.
İkiden fazla boyutlu matris diziler

 

 

Üç boyutlu bir dizi:

int[ , , ] dizi=new int[3 , 2 , 2];

veya

int[,,] dizi= {{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}};

foreach döngüsüyle iç içe döngü kurmaya gerek kalmadan her çeşit boyutlu matris dizinin elemanlarına ulaşılabilir.
Eğer dizilerin elemanlarını değiştirmemiz gerekiyorsa iç içe for döngüsü kurmamız gerekir.

int[,,] dizi={{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}};
 for(int i=0;i<3;i++)
    for(int j=0;j<2;j++)
       for(int k=0;k<2;k++)
          dizi[i,j,k]=20;

Dizinin tüm elemanlarının değeri 20 ile değiştirildi.

Dizi Methotları

Diziler üzerinde işlevsel olarak kullanılabilecek birçok methot vardır. Tüm dizi fonksiyonlarına Microsoft Msdn üzerinden erişebilirsiniz. Sık kullanılan dizi fonksiyonlarından başlıcaları;

GetLength()

Bir dizideki eleman sayısını int türünden veren methottur.

int[] dizi={1,4,7,9};
Console.Write(dizi.GetLength(0));// 4

Çok boyutlu dizilerde herbir dizi elemanın değerinin indek numarası belirtilmelidir.

int[,] dizi={{2,4,2},{7,10,4},{7,12,6},{2,1,12}};
byte a=dizi.GetLength(1);
Console.WriteLine(a);

Dizi kopyalama

Daha önceden de belirtildiği gibi bir dizinin boyutu belirlendikten sonra boyutu değiştirilemez. Bu sebeple bir dizi daha büyük bir diziye dönüştürülmek istenirse mevcut dizi daha büyük boyutlu bir diziye kopyalanır.

int[] dizi1={1,2,3,4};
int[] dizi2=new int[10];
dizi1.CopyTo(dizi2,3);

Burada dizi1’in 3. Elemanından itibaren dizi2’ye kopyalama işlemi gerçekleşir.
İstenirse dizi sınıf (Array) kullanılarak bir dizinin sadece belirli bir bölümü kopyalanabilir.

int[] dizi1={1,2,3,4};
int[] dizi2=new int[10];
Array.Copy(dizi1,dizi2,3);

Bu örnekte dizi1’in 3. Elemanından itibaren dizi2’ye kopyalama işlemi gerçekleşir.

int[] dizi1={1,2,3,4,5,6,7};
int[] dizi2=new int[10];
Array.Copy(dizi1,2,dizi2,7,3);

Burada dizi1’in 2. indeksinden itibaren 3 eleman, dizi2’ye 7. indeksten itibaren kopyalanıyor.

Array.IndexOf(); 

Dizi içinde harf ya da kelime aramamıza yarar. Eğer harf ya da kelimeyi bulursa bulduğu ilk indexi gönderir.Bulamazsa geriye -1 gönderir.

Array.IndexOf(dizi1, 2);

2 ifadesini dizi1 dizisinde arar. Bulduğu ilk indexi gönderir.

Array.IndexOf(sayilar, 2, 3);

Bu methot ise 3.elemandan itibaren arama yapar.

Array.Reverse();

Dizinin elemanlarını ters çevirir. Ancak sadecetek boyutlu diziler için kullanılabilir.

Array.Reverse(dizi);
Array.Sort();

Dizinin elemanlarını küçükten büyüğe doğru olacak şekilde sıralar.

Array.Sort(dizi);
Array.Clear();

Bu kod dizi dizisinin 1. indeksinden itibaren 3 indeksini sıfırlar (varsayılan değere döndürür).

Array.Clear(dizi, 1, 3);

C# diziler – ÖRNEK – 1
int dizi[] = { 5,6,7,8,78,45,0,30}; şekilde verilen bir tamsayı dizisinin elemanlarının toplamını bulap ekrana yazan C# programını yazınız.

C# diziler – ÖRNEK – 2
Verilen bir string dizisini, ters sırada (sondan başa doğru) listeleyen C# programını yazınız.

C# diziler – ÖRNEK – 3
Tanımlanan sayılar dizisi içerisindeki çift sayıları ekrana yazdıran C# konsol uygulamasını yazınız.

C# diziler – ÖRNEK – 4
Tanımlanan sayılar dizisi içerisindeki sayıların negafit, pozitif ve işaretsiz olma durumlarını yanına yazdıran C# konsol uygulamasını yazınız.

C# diziler – ÖRNEK – 5
10 elemanlı bir veri grubunda bulunan pozitif,sıfır ve negatif değerlerin sayısını bulup yazan programın C# konsol uygulamasını yazınız.

C# diziler – ÖRNEK – 6
Kullanıcıdan alınan metin içindeki sesli harf sayısını bulan C# console uygulamasını yazınız.

C# diziler – ÖDEV – 1
Sayısal loto uygulamasını C# programı kullanarak yapınız. Bu uygulama da 1 ile 49 arasındaki sayılardan rastgele olacak şekilde 7 adet sayı üretilsin ancak bu sayıların hiçbiri birbiri ile aynı olmasın. Bu senaryoyu gerçekleştirecek C#programını yazınız.

C# diziler – ÖDEV – 2
Kullanıcı tarafından doldurulan 10 boyutlu bir dizideki en büyük ve en küçük değeri dizi fonksiyonlarını kullanmadan bulan ve bunları ekrana yazan C# console uygulamasını yazınız.

C# diziler – ÖDEV – 3
Kullanıcıdan alınan bilgiye göre rastgele şifre üretecek olan programın C# konsole kodunu giriniz. (Örneğin kullanıcı 5 girecek buna uygun olarak rastgele olacak şekilde 5 karakterlik şifre oluşturulacak. Maksimum karakter sayısı 10 olacak ve kullanıcı 10 üzerinde bir değer verirse uyarı verilerek uygun değer girilene kadar kullanıcıdan değer alınacak.)

C# diziler – ÖRNEK – 1 ÇÖZÜMÜ

int[] dizi = { 5, 6, 7, 8, 78, 45, 0, 30 };
int toplam = 0;
for (int i = 0; i < dizi.Length; ++i)
    toplam += dizi[i];
Console.WriteLine(toplam);

C# diziler – ÖRNEK – 2 ÇÖZÜMÜ

string[] strDizi = { "Kadir", "Kürşat", "Ali", "Ayşe" };
int son = strDizi.Length - 1;
for (int i = son; i >= 0; --i)
{
    Console.WriteLine(strDizi[i]);
}

C# diziler – ÖRNEK – 3 ÇÖZÜMÜ

int[] sayilar={ 4,5,-15,22,-34,3,0,7,43};
int toplam = 0;
foreach (int sayi in sayilar)
{
    if (sayi % 2 == 0)
        Console.WriteLine(sayi);}

C# diziler – ÖRNEK – 4 ÇÖZÜMÜ

int[] sayilar = { 4, 5, -15, 22, -34, 3, 0, 7, 43, 100 };
int toplam = 0;
foreach (int sayi in sayilar)
{
    if (sayi > 0)
        Console.WriteLine(sayi + " Pozitif");
    else if (sayi < 0)
        Console.WriteLine(sayi + " Negatif");
    else
        Console.WriteLine(sayi + " İşaretsiz");
}

C# diziler – ÖRNEK – 5 ÇÖZÜMÜ

int[] sayilar = { 10, -3, 5, 0, 33, -2, -60, 0, -20, -10 };

int sifirSay=0, pozitifSay=0,negatifSay = 0;
for (int x = 0; x < sayilar.Count(); x++)
{
    if (sayilar[x] < 0) negatifSay++; else if (sayilar[x] > 0)
        pozitifSay++; 
    else
        sifirSay++;  
}
Console.WriteLine("Sıfırların Sayısı : " + sifirSay);
Console.WriteLine("Negatiflerin Sayısı : " + negatifSay);
Console.WriteLine("Pozitiflerin Sayısı : " + pozitifSay);

C# diziler – ÖRNEK – 6 ÇÖZÜMÜ

char[] harfler={'a','e','ı','i','o','ö','u','ü'};
string metin;
int sayac = 0;
Console.WriteLine("Metin giriniz : ");
metin = Console.ReadLine();
for (int i = 0; i < harfler.Length; i++)
{
    for (int j = 0; j < metin.Length; j++)
    {
        if (metin[j] == harfler[i])
        {
            sayac++;
        }
    }
}
Console.WriteLine(sayac);

Böylece diziler konusununda sonuna gelmiş olduk.
Dilerseniz bir önceki konumuz olan C# Döngüler konusunu inceleyebilirsiniz.
Bir sonraki dersimiz olan C# Fonksiyon ve Metot konusuna geçebilirsiniz…