Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
   
Konu: C# - Diziler (Arrays) {33}
Hera
*
avatar
Yüzbaşı
Durum: Çevrimdışı
Seviye Puanı: 10
Yaşam Puanı: 239 / 239
Deneyim: 58 / 100
Rep Sayısı: 44
Mesaj Sayısı: 133
Üyelik Tarihi: 13.04.2019
     
Yorum: #1
C# - Diziler (Arrays) {33}
19.06.2019 16:13
Örneğin, 8 elemanlı ve tam sayı elemanlardan oluşan bir dizinin bellekteki görüntüsü aşağıdaki gibidir;

(fotoğrafı paintten yapayım dedim yamuk yumuk oldu :P)

Bir dizinin elemanlarına [ ] (index operatörü) ile ulaşılır. Dikkat ettiyseniz 8 elemanlı bir dizinin son elemanına 7 indeksi ile ulaşılıyor. Bunun sebebi indeksin 0'dan başlamasıdır. Yani bir dizinin il elemanına DiziAdi[0] şeklinde erişilir.

C ve C++ dilleri dizilerin isimlerini, ilk elemanın bellekteki adresi olarak tayin eder. Yani, yukarıdaki şema üzerinden düşünecek olursak 25 tam sayısının tutulduğu bellek gözeneğinin adresi 'dizi'dir. Yani aynı şekilde bu dillerdeki diğer bir veri yapısı olan göstericiler sayesinde bu 'dizi' adresine istenildiği kadar sayı eklenip sitenilek bellek bölgesine erişim sağlamak mümkündür. Örneğin, p göstericisi 8 elemanlı bir dizinin başlangıç adresini gösteriyor olsun. Dizinin 3. elemanının adresine p+2 şeklinde erişebilir. Aynı şekilde dizinni bir elemanı olmayan p+50 adresine de erişmek mümkündür. Ancak burada bir sorun var; bellekteki p+50 adresi bizim dizi için ayırdığımız bir bölge olmamasına rağmen buraya istediğimiz gibi müdahale edebiliyoruz. Bunun önüne geçmek için C# dilinde diziler ayrı bir tür olarak tasarlanmıştır. Bütün diziler System.Array dediğimiz sınıftan türetilmiştir. Dizinin sınırlarını aşan bir indeks kullandığımıda derleme hatası almayız ancak CLR çalışma zamanında 'dizi sınırlarının aşılması' ile ilgili hata verir.
Dizi Tanımlama

C# dilinde bütün diziler System.Array sınıfından türetilir. Yani biz bir dizi tanımladığımızda aslında Array sınıfı türünden bir nesne tanımlamış oluyoruz. Diziler ayrı bir sınıf türü olduğu için C ve C++ dilllerinde olmayan bir takım özelliklere sahiptir. Örneğin bütün dizlerde Array sınıfa ait bir takım metotları ve özellikleri kullanabiliriz. Bu metotlar ve özellikleri ileride detaylı olarak anlatacağım.

Bir dizinin oluştuırulması iki şekilde yapılabilir, birincisi bildirim ve tanımlamanın aynı starıda yapılması;
int[] dizi = new int[25];

İkincisi ise bildirim ve tanımlamanın ayrı satırda yapılmasıdır.
int[] dizi;
dizi = new int[25];


Yukarıdaki her iki kullanım da aynıdır. Dizilerin herhangi bir elemanına ulaşmak için [ ] operatörü kullanılır. Örneğin, dizinin ilk elemanını başka bir değişkene aşağıdaki gibi atayabiliriz;
int i = dizi[0];

Aynı şekilde 8 elemanlı bir dizinin son elemanına aşağıdaki şekilde erişebiliriz;
int i = dizi[7];

Verdiğim örneklerde görüldüğü gibi dizilerin tanımlanması new anahtar sözcüğü ile yapılmıştır. Bu da dizinin her elemanına temel veri türleri için varsayılan değer, ilk değer olarak verileceğini göstermektedir. Hatırlarsanız temel veri türlerini anlatırken new anahtar sözcüğü ile tanımlanan değişkenlere varsayılan bir ilk değer atandığını söylemiştik. Bu ilk değer referans türleri için null, nümerik tipler için 0, bool türü içinde false'tur. Bunu görmek için aşağıdaki programı yazıp derleyin.
Kod:
using system;
class Cyberizm_WhileDongusu
{
    static void Main()
    {
        int[] dizi1= new int[10];
        bool[] dizi2 = new bool[10];
        string [] dizi3 = new string[10];
        for(int i = 0; i < 10; ++i)
        {
            Console.Write("{0, 5}", dizi1[i])
            Console.Write("{0, 6}", dizi2[i])
            Console.Write("{0, 5}", dizi3[i])
        }
    }
}


Yukarıdaki programda bir for döngüsü yardımıyla dizinin tüm elemanlarına ulaşıp tek tek ekrana yazdırdık. Ekran çıktısının düzgün formatta olması açısından yazı formatlama tekniğini kullandım. Programı derleyip çalıştırdığınızda durumu fark edeceksiniz.
ÖNEMLİ BİR DURUM Nickli Kullanıcıdan Alıntı:null değerlerin herhangi bir ekran çıktısı olmadığı için dizi3 dizisinin elemanlarını ekranda göremiyoruz.


C ve C++ programlama dillerinde de olduğu gibi dizileri aşağıdaki gibi tanımlayabiliriz.
string[] dizi1 = { "Bir", "İki", "Üç"}
int[] dizi2 = { 1, 2, 3}
float[] dizi3 = { 1f, 2f, 3f }

Yukarıdaki şekillerde tanımlanan dizilerin boyutu 3 olarak tayin edilir.
Dizi tanımlamalarıyla ilgili diğer dikkat çekici durum ise karakter dizileridir. C ve C++ dillerinde karakter dizileri aşağıdaki gibi tanımlanabilir;
char s[] = "dizi";
Ancak C# dilinde bu şekilde karakter dizileri tanımlanamamaktadır!

Dizilerin boyutu C ve C++ dillerinde derleme sırasında bilinmek zorundadır. Çünkü derleycinin dizi için bellekte ne kadarlık bir alan tahsis edeceği dizinin boyutundan anlaşılmaktadır. Bu yüzden C ve C++ dillerinde dinamik bellek tahsisi için çeşitli mekanizmalar bulunmaktadır. Ancak C#dilinde diziler referans tipi olduğu için dizilerin boyutunu çalışma zamanında belirleyebiliriz. Örneğin, aşağıdaki programda int türünden bir dizinin boyutu çalışma zamanında dinamik olarak belirleniyor.
Kod:
using system;
class Cyberizm_WhileDongusu
{
    static void Main()
    {
        Console.Write("Dinamik dizinin boyutu : ");
        int val = Convert.ToInt32(Console.ReadLine());
        int[] dizi = new int[val];
        for (int i = 0; i < val; i++)
            Console.WriteLine(dizi[i]);
    }
}

Yukarıdaki programı çalıştırdığımızda girdiğimiz değer kadar dinamik bir alan tahsiz edilip dizinni kullanımına sunuluyor.

Bir dizinin boyutu bir kez belirlendikten sonra artık değiştirilemez. Yani dizinin boyutunu dinamik olarka değiştirmemiz mümkün değildir. Ancak boyutu dinamik olarka değişebilen çeşitli koleksiyon tabanlı dizi sınıfları mevcuttur. ArrayList sınıfı tipik olarak bunlara bir örnektir. Boyutu dinamik olarak değişken dizileri ilerleyen konularımda detaylı olarak anlatacağım şimdi vakti değil Kaccanzi

Birden fazla dizinin tanımlanması ise aşağıdaki şekilde yapılır;
int[] dizi1= new int[10], dizi2 = new int[10];

Birden fazla dizi bildirim ise;

int[] dizi1, dizi2;

Şeklinde yapılabilir. dizi1 ve dizi2'nin int türünden bir dizi olduğunu bildiriyor. Bu bildirimden sonra her iki dizi için ayrı ayrı bellekte alan tahsisatı (allocation) yapılır.
Alinti
Rep Verenler: Dessy , KingSkrupellos
Dessy
*
avatar
Yarbay
Durum: Çevrimdışı
Seviye Puanı: 23
Yaşam Puanı: 253 / 550
Deneyim: 0 / 100
Rep Sayısı: 120
Mesaj Sayısı: 634
Üyelik Tarihi: 20.11.2015
     
Yorum: #2
RE: C# - Diziler (Arrays) {33}
19.06.2019 16:34
Teşekkürler, Emeğine Sağlık Smile

Sosyal Medya: Youtube - İnstagram
Alinti
KingSkrupellos
*
avatar
Hacktivist
Durum: Çevrimdışı
Seviye Puanı: 56
Yaşam Puanı: 1,386 / 1,386
Deneyim: 47 / 100
Rep Sayısı: 2876
Mesaj Sayısı: 6513
Üyelik Tarihi: 21.08.2013
     
Yorum: #3
RE: C# - Diziler (Arrays) {33}
21.06.2019 03:04
Teşekkürler, Emeğine Sağlık +REP Smile

# Cyberizm Digital Security Technological Turkish Moslem Army #
# İnsanda bir organ vardır. Eğer o sağlıklı ise bütün vücut sağlıklı olur;
eğer o bozulursa bütün vücut bozulur. Dikkat edin! O, kalptir.
[ Hz.Muhammed S.A.V ] #


Alinti



1 Ziyaretçi