Clear        


                
                    // Arrays (Diziler)

using _12_Arrays.Demos;

namespace _12_Arrays
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // array'ler içerisinde hiç eleman olmayan, bir veya daha fazla eleman olan bir kolleksiyon olarak değerlendirilebilir
            // array'lerin oluşturuldukları eleman sayıları sabittir, değiştirilemez,
            // array'ler referans tiptir



            #region One-Dimensional Arrays (Tek Boyutlu Diziler)
            string[] ogrenciler = new string[3]; // hafızada bir ogrenciler adında array tipinde ([]) değişken tanımladık, bir de new'leme işlemi üzerinden 3 elemanlı bir dizi oluşturduk,
                                                 // ogrenciler değişkeni artık bu 3 elemanlı diziyi göstermektedir (refere etmektedir),
                                                 // refere edilen bu dizinin eleman sayısı her zaman 3 olacaktır, değiştirilemez

            ogrenciler[0] = "Çağıl"; // [0]: dizinin elemanlarına ulaşmak için 0'dan başlayarak her bir eleman için otomatik birer birer artan değer verilir (index),
                                     // C#'ta bütün kolleksiyon yapılarının index'i 0'dan başlar, dizinin ilk elemanına Çağıl değerini atadık
            ogrenciler[1] = "Leo"; // dizinin ikinci elemanına Leo değerini atadık
            ogrenciler[2] = "Angel"; // dizinin üçüncü elemanına Angel değerini atadık

            Console.WriteLine(ogrenciler[1]); // konsola Leo yazdıracaktır, 0 index'i üzerinden Çağıl, 2 index'i üzerinden de Angel yazdırılabilir

            //Console.WriteLine(ogrenciler[3]); // index out of bounds exception (hata) fırlatacaktır çünkü dizide bu index'te bir eleman bulunmamaktadır, hata vermemesi için comment'e aldık,
                                                // bu hata bir Run Time Error'dır (çalışma zamanı hatası) çünkü uygulama çalıştıktan sonra bu hata ortaya çıkar

            //for (int i = 0; i < 3; i++)
            for (int i = 0; i < ogrenciler.Length; i++) // bir üst satırdaki döngüde olduğu gibi dizinin eleman sayısını 3 yazmak yerine dizinin eleman sayısına dizinin Length özelliği ile ulaşmak doğrudur
                                                        // for döngüsü genelde index'li kolleksiyonlarda her bir elemana index üzerinden ulaşmak için daha çok tercih edilir
            {
                Console.WriteLine(ogrenciler[i]); // her bir öğrenciyi sırasıyla döngü üzerinden konsola yazdırır
            }

            // bir dizideki son index = dizinin eleman sayısı - 1



            int[] sayilar; // int dizisi tipinde sayilar değişkenini tanımladık (declaration)
            sayilar = new int[4]; // sayilar değişkeninin refere ettiği diziyi 4 elemanlı olarak oluşturduk (initialization)
            sayilar[0] = 11;
            sayilar[1] = 22;
            sayilar[2] = 33;
            sayilar[3] = 11; // dizilerde farklı index'lerdeki elemanlar aynı değeri taşıyabilir

            //for (int i = 0; i < sayilar.Length; i++)
            for (int i = 0; i <= sayilar.Length - 1; i++) // döngünün bitme koşulu (i <= sayilar.Length - 1) istenirse bir üst satırdaki yerine bu satırdaki gibi de yazılabilir, bu kullanım pek tercih edilmez
            {
                Console.WriteLine($"{i + 1}. sayı: {sayilar[i]}");
            }



            //decimal[] ondalikSayilar = new decimal[5] // diziler new'lenirken elemanları süslü parantez içerisinde doldurulabilir
            decimal[] ondalikSayilar = new decimal[] // burada elemanlar new'lenirken doldurulduğundan dizinin eleman sayısını yazmak zorunlu değildir
            {
                9.9M,
                8.8M,
                7.7M,
                6.6M,
                5.5M
            };

            for (int i = 0; i < ondalikSayilar.Length; i++)
            {
                Console.WriteLine(ondalikSayilar[i]);
            }



            char[] karakterler = { 'Ç', 'A', 'Ğ', 'I', 'L' }; // diziler new yazılmadan da elemanları doldurulacak şekilde oluşturulabilir,
                                                              // burada arka planda yine new'leme işlemi yapılmaktadır

            for (int karakterIndex = 0; karakterIndex < karakterler.Length; karakterIndex++)
            {
                Console.Write(karakterler[karakterIndex]);
            }
            Console.WriteLine(); // aşağıdaki kodların çalışmaya bir alt satırdan devam etmesi için



            // bir dizideki sayısal elemanların toplamı
            double[] numbers = new double[9]
            {
                10.1,
                20.2,
                30.3,
                40.4,
                50.5,
                60.6,
                70.7,
                80.8,
                90.9
            };

            // 1. yöntem:
            double sum = 0;
            for (int i = 0; i < numbers.Length; i++)
            {
                sum += numbers[i];
            }
            Console.WriteLine("Sum is " + sum);

            // 2. yöntem:
            Console.WriteLine("Sum is: " + numbers.Sum()); // kolleksiyonların çoğunda ki diziler de buna dahil tanımlı olan Sum methodu üzerinden o kolleksiyonun elemanları toplanabilir
            #endregion



            #region Multi-Dimensional Arrays (Çok Boyutlu Diziler)
            // 2 Boyutlu Diziler

            // bölgeler ve şehirler:
            /*
            Marmara     İstanbul
            İç Anadolu  Ankara
            Ege         İzmir
            */
            string[,] bolgelerVeSehirler = new string[3, 2] // bir yukarıdaki tabloya bakıldığında 3 satır, 2 sütun sayısını gösterir
            {
                { "Marmara", "İstanbul" }, // eleman index'leri: Marmara: 0, 0; İstanbul: 0, 1
                { "İç Anadolu", "Ankara" }, // İç Anadolu: 1, 0; Ankara: 1, 1
                { "Ege", "İzmir" } // Ege: 2, 0; İzmir: 2, 1
            };

            // İç Anadolu - Ankara satırını yazdıralım
            Console.WriteLine(bolgelerVeSehirler[1, 0] + " - " + bolgelerVeSehirler[1, 1]);

            // tüm bölge ve şehirleri satır satır yazdıralım
            for (int satirIndex = 0; satirIndex <= bolgelerVeSehirler.GetUpperBound(0); satirIndex++) // GetUpperBounds(0) en son satır index'ini yani 2'yi döner, methoddaki 0 parametresi 1. boyut parametresidir
            {
                for (int sutunIndex = 0; sutunIndex <= bolgelerVeSehirler.GetUpperBound(1); sutunIndex++) // GetUpperBounds(1) en son sütun index'ini yani 1'i döner, methoddaki 1 parametresi 2. boyut parametresidir
                {
                    Console.Write(bolgelerVeSehirler[satirIndex, sutunIndex] + " ");
                }
                Console.WriteLine();
            }
            #endregion



            #region Demos
            KullaniciGirisi.Calistir();
            EnBuyukVeKucukSayiBulma.Calistir();
            #endregion
        }
    }
}