C# Diziler Kavramı Geniş Anlatımlı - SOFTSAM

Breaking

About Software

23.08.2014

C# Diziler Kavramı Geniş Anlatımlı

Diziler
Diziler, bir değişken isminde çok sayıda değeri saklamak için kullanılan değişken tanımlama şeklidir.
Bazı durumlarda aynı türden çok sayıda değişkene ihtiyacımız olabilir. Örneğin dışarıdan girilen beş tane öğrencinin adını ve numarasını saklayarak daha sonra tekrar yazdıracak bir program düşünelim. Şu ana kadar öğrendiklerimizle bu işi aşağıdaki programdaki gibi yapabiliriz (Yazıp çalıştırın);

Aynı Programı dizi değişken kullanarak aşağıdaki gibi de yapabiliriz (Yazıp çalıştırın);

Görüldüğü gibi birinci örnekte her öğrenci için ayrı ayrı değişken tanımlanırken ikinci örnekte sadece beş elemanlı bir dizi değişken tanımlanarak programlama çok daha basit bir düzeye çekilmiştir.
Dizi tanımlama, tanımlandığı türde veri saklayabilecek ve arka arkaya sıralanmış belirli sayıdaki hafıza biriminin tek bir değişken ismi altında toplanmasını sağlar. Tıpkı tren vagonlarının dizilişi gibi. Kullanım sırasında tek bir isim altında toplanmış bu alanlardan kaçıncı sıradaki hafıza birimi kullanılacaksa, değişken isimden sonra köşeli parantez içerisinde sıra numarası belirtilerek kullanılır.(dizilerde sıra numarası sıfırdan başlar) ( Ad[0], Borc[5],…)
C#’ta dizi iki aşamada oluşturulur. Önce belirli bir türde dizi adı tanımlanır sonrada bu isme taşıyacağı eleman sayısı kadar tanımlandığı türden hafızada yer ayrılır.
Birinci olarak dizinin adı tanımlanır. Tanımlanan dizi adı aslında dizinin hafızadaki başlangıç adresini taşıyan bir referans değişkendir.
Dizi ismi aşağıdaki kalıba uygun olarak tanımlanır.
                TürAdı[] DegiskenAdı;   // Dizi değişken tanımlama kalıbıdır.

                Ör:
                               int [] Yas;                            // int türünde bir dizi için referans değişkeni tanımlar
                               string[] Ad;                        // string türünde bir dizi için referans değişkeni tanımlar
                               double[] Borc;                  // double türünde bir dizi için referans değişkeni tanımlar

Görüleceği gibi normal değişken tanımlamayla, dizi değişken tanıma arasında çokta büyük fark yok. Tek fark dizi değişken tanımlarken tür adından sonra (ayrıkta olabilir, bitişikte) içi boş bir köşeli parantez açılıp kapatılmıştır. Tanımlanan dizi değişkenleri için hafızada yer ayrılmadığı müddetçe herhangi bir işlemde kullanılmamalıdırlar.
İkinci adım olarak da tanımlanan dizi değişkene, dizide kaç tane eleman saklanacaksa, bilgisayar hafızasında o kadar yer ayrılır.
Bilgisayar hafızasında bir nesne veya değişken için dinamik olarak yer ayırma işlemi new operatörüyle gerçekleştirilir.
                Dizi değişkene yer ayırmak için new operatörünün kullanım kalıbı;
                DiziDeğişkenAdı = new Tür[elemanSayısı];
                Ör:
                int[] Yas;                             // Yas isimli bir dizi değişkeni tanımlandı
                string[] Ad;                        // Ad isimli bir dizi değişkeni tanımlandı
                double[] Borc;                  // Borc isimli bir dizi değişkeni tanımlandı
                Yas = new int[10];           // Yas dizi değişkeni için hafızada int türünde 10 tane yer ayrıldı
                Ad = new string[15];      // Ad dizi değişkeni için hafızada string türünde 15 tane yer ayrıldı
                Borc = new double[5]   // Borc dizi değişkeni için hafızada double türünde 5 tane yer ayrıldı
Yukarıdaki örneklerde ilk olarak dizi değişkenleri tanımlandı. Tanımlanan dizi değişkenleri için hafızada yer ayrılmadığı müddetçe bu dizi içerisinde herhangi bir veri saklama işlemi gerçekleştirilemeyeceğinden, ikinci adım olarak new operatörü ile bu değişkenler için hafızada kaç eleman saklanacaksa o kadar yer ayırma işlemi gerçekleştirilir. new operatörü ile yer ayırma işleminden sonra dizi değişkenine hafızada ardışık olarak ayrılan bu yerin başlangıç adresi yüklenmiş olur.
İki satırda gerçekleştirilen dizi tanımlama işlemi istenirse bu iki satır birleştirilerek tek bir satırda da gerçekleştirilebilir. Örneğin;
                int[] ogrNum;
                ogrNum = new int[5];
Yukarıdaki satırlar sonunda ogrNum isminde 5 elemanlı bir dizi tanımlanmış olur. Aynı işlem;
                int[] ogrNum = new int[5];
iki satırda yapılan işlemin aynısıdır.
Bir dizi tanımlama neticesinde bilgisayar hafızasında belirtilen türde istenen sayı kadar yan yana hücre tanımlanmış olur.
Ör:
                string[] Ad;
                Ad = new string[5];
Bu tanımlama neticesinde bilgisayar hafızasında aşağıdaki şekildeki gibi her biri string bir veriyi taşıyabilecek yan yana 5 tane yer ayrılır.






Ad[]



















Ad[0]
Ad[1]
Ad[2]
Ad[3]
Ad[4]






Dizi olarak tanımlanmış bir değişkenin, herhangi bir elemanına ulaşılmak istendiği zaman değişken isminden sonra köşeli parantez içerisinde ulaşılmak istenen elemanın numarası verilir ki buna indis numarası denir. Burada dikkat edilmesi gerek nokta C#’ta indis numarası sıfırdan başlar. Dolayısıyla 0. eleman dizinin ilk elemanıdır. Sonuncu elemanın indis numarası ise tanımlanırken verilen eleman sayısının bir eksiğidir.  Dolayısıyla yukarıdaki örneğe göre dizinin son elemanına ulaşmak için kullanılacak indis numarası 4’tür.
Ad[2] =”Ali”;
Yukarıdaki komut Ad dizi değişkeninin 2 indis numaralı hücresine “Ali” verisini yazacaktır.



Ad[]









Ali









Ad[0]
Ad[1]
Ad[2]
Ad[3]
Ad[4]





Ad[0] =”Veli”;




Ad[]







Veli

Ali









Ad[0]
Ad[1]
Ad[2]
Ad[3]
Ad[4]






Ad[3]= Ad[0] + Ad[2];



Ad[]







Veli

Ali
VeliAli








Ad[0]
Ad[1]
Ad[2]
Ad[3]
Ad[4]






Aşağıdaki örnekte haftanın günleri bir diziye aktarıldıktan sonra sırayla ekrana yazdırılmaktadır.

Aşağıdaki örnekte klavyeden 10 öğrencinin ad ve yaşları alındıktan sonra giriş sırasının tersi sırada ekrana listelenmektedir.

Başlangıç Değerleriyle Dizi Tanımlama
Yukarıdaki örneklerde belirli bir sayıda elemana sahip diziler tanımlandıktan sonra dizi elemanlarına teker teker ulaşılarak değer atanmaktadır. Eğer dizi elemanları önceden belirli ise dizi başlangıç değerleriyle de tanımlanabilir.
Örneğin yukarıdaki Günler dizisi;
string[] gunler = {“Pazartesi”,”Salı”,”Çarşamba”,”Perşembe”,”Cuma”,”Cumartesi”,”Pazar”};
Şeklinde de tanımlanabilir. Böyle bir kullanımda dizi değişken ismi tanımlandığında değişken için otomatik olarak hafızada parantez içindeki değer miktarı kadar yer ayrılır ve bu değerler sırasıyla dizi elemanlarına aktarılır. böyle bir kullanımla yukarıdaki program aşağıdaki şekilde olur.
        static void Main(string[] args)
        {
            int i;
            string[] gunler = {"Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"};
            for( i = 0;i<7 i="" o:p="">
            {
                Console.WriteLine("Haftanın {0}.  Günü : {1}", i+1,gunler[i]);
            }
            Console.ReadLine();
        }

Aşağıdaki örnekte başlangıç değerleriyle Ad dizisi tanımlanmakta ve daha sonra dışarıdan girilen bir isim bu dizi içerisinde aranmaktadır.

Soru : Yukarıdaki k  değişkeninin işlevi nedir?
Soru:
1-      Haftanın ilk günü pazartesi kabul edilerek, kullanıcıya haftanın kaçıncı günü olduğu sorulacak. Cevap 1-7 arası girilmeli. Cevaba göre günün adını ekrana yazdıran program.
2-      Bir dizi içinde 10 tane İngilizce kelime, diğer bir dizi içinde de bunların Türkçe karşılıkları olacak. İngilizceden Türkçeye, Türkçeden İngilizceye seçenekli bir menü hazırlanacak. Menüden yapılan seçime göre girilen kelimenin diğer dildeki karşılığı varsa karşılığı yoksa bulunamadı mesajı yazdırılacak.


Uygulama Sorusu
-          En fazla 50 kişinin İsim ve borç bilgilerinin tutulacağı kayıt, arama ve listeleme yapan bir program hazırlanacak
Bunun için;
-          Aşağıdaki resimdeki gibi bir menü sistemi oluşturulacak

-          Kayıt işlemi
o   Eğer kayıt sınırı dolmuşsa “Kayıt sınırına ulaşılmış. Kayıt Yapamazsınız” mesajını verip entere basınca Ana menüye dönecek
o   Aşağıda birinci şekilde ki gibi isim ve borcu bilgileri alınacak. Hemen üstte o ana kadar girilmiş kayıt sayısı verilecek. Veriler girildiğinde ikinci resimdeki gibi yeni kayıt girilip girilmeyeceği sorulacak. Eğer Girilecekse tekrar birinci resimdeki ekrana dönülüp yeni kayıt girişi yapılacak. Girilmeyecekse ana menüye dönülecek.


  
-          Ada Göre Arama işlemi
o   Şekildeki gibi bir ekrandan aranan isim girilecek

o   Aranan isim bulunmazsa kaydın bulunamadığına dair mesaj verecek. Bulunursa aşağıdaki gibi gösterecek ve aranan kaydın bu olup olmadığı sorulacak eğer bu değilse arama devam edecek ve bulunan diğer kayıt gösterilecek


o   Devam eden aramadada bulunamazsa yine kayıt bulunamadı mesajı verecek



-          Listeleme işlemi
o   Tüm liste, Borç Referansına Göre Liste ve ana menü seçeneklerinin bulunduğu bir menü çıkacak

§  Tüm liste : Bütün Kayıtlar listelenecek ve alttarafta toplam kayıt gösterilecek. Entere basınca Liste Menüsüne dönecek

§  Borç Referansına göre Liste: Referans Miktarı ve referanstan azmı yoksa çokmu olanların listeleneceği girilecek. Listeleme ona göre yapılacak. Altta yine Listelenen kayıt miktarı verilecek. Entere basınca liste menüsüne dönülecek.
§  Ana Menü : ana Menüye Dönecek


-          Çıkış : programdan çıkacak
Programı yazıp dosya olarak paylaşıma sunabilirsiniz.Programın tam çözümü için tıklayınız...

İki boyutlu diziler
Şuana kadar bahsettiğimiz diziler tek boyutlu olan dizilerdi. Tek boyutlu diziler yan yana sıralanmış hücrelerden oluşmaktaydı. İki boyutlu dizilerde birinci boyut satır, ikinci boyut ise sütun olarak isimlendirilir. Böylelikle iki boyutlu diziler satır ve sütunlardan oluşan bir tablo şeklinde düşünülebilir.
İki boyutlu diziler, m satır sayısı, n sütun sayısı olmak üzere aşağıdaki kalıba uygun olarak tanımlanır;
tip[,] değişkenAdı;
değişkenAdı = new tip[m,n];
yada
                tip[,] değişkenAdi = new tip[m,n]

Tanımlamada ve kullanımda iki boyutun köşeli parantez içerisinde bir birinden virgülle ayrıldığına dikkat edin.  Bu tanımlamayla belirtilen tipte m adet satırdan ve n adet sütundan oluşan bir tablo oluşturulmuş olur. Satır ve sütun indis numaralarının 0’dan başlandığı unutulmamalıdır. Yine iki boyutlu dizinin istenen elemanına dizi isminden sonra köşeli parantez içerisinde satır ve sütun indis numaraları verilerek ulaşılır.
int tbl[,] = new int[3,4];
Yukarıdaki tanımlamayla aşağıdaki gibi bir tablo oluşturulmuş olur.
tbl[0,0]
Tbl[0,1]
Tbl[0,2]
Tbl[0,3]
Tbl[1,0]
tbl[1,1]
Tbl[1,2]
Tbl[1,3]
Tbl[2,0]
Tbl[2,1]
Tbl[2,2]
Tbl[2,3]

tbl[0,1] = 4
tb[1,3]= 7
tb[2,0]= tbl[0,1] + tbl[1,3]
komutlarından sonra tablonun görünümü aşağıdaki gibi olacaktır.

4





7
11




İki boyutlu diziler de bir boyutlu diziler gibi başlangıç değeri verilerek tanımlanabilir;
int[,] t = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}}
Yukarıdaki komutla 5 satır ve 4 sütundan oluşan t iki boyutlu dizisi tanımlanmış olur. Dikkat edilirse yine tanımlama esnasında tipten sonraki köşeli parantez içerisinde eleman sayıları belirtilmemiş sadece içinde virgül olan bir köşeli parantez kullanılmıştır.
Yukarıdaki tanımlamaya göre;
t[2,0] değeri 9, t[4,3] değeri 20 olacaktır.
Çok daha fazla boyuta sahip olan dizilerde tanımlanabilir. Bu durumda dizi tip isminden sonraki köşeli parantez içerisinde her boyut birbirinden virgül ile ayrılır.
İnt[,,] cb = int[3,5,2];
Yukarıda 3 satırlı, 5 sütunlu ve 2 derinliği olan üç boyutlu bir dizi tanımlanmıştır.
Aşağıdaki örnekte ilk önce 5 müşterinin verileri alınmakta sonra da Ad veya soyada göre dizide arama yapılmaktadır. Ad, Soyad, Doğum yeri bilgileri string türünde iki boyutlu bir dizide saklanırken borç verisi decimal türde tek boyutlu bir dizide saklamaktadır.

Yukarıdaki program da 16-24 arasında 5 müşterinin bilgileri alınmakta. Ad, soyad, doğum yeri verileri iki boyutlu bir dizide saklanmaktadır. Dizinin sıfırancı Sütunu ad, birinci sütunu soyad ikinci sütunu ise doğum yeri verisini saklarken borç bilgileri borç dizisinde saklanmaktadır.
s değişkeni arama işleminin hangi sütünda yapılacağını tutacaktır. Hangi sütünda aranacağı yapılan menü seçimine göre34-37 satırları arasında belirlenmektedir.
41-44 satırları arasında dizide arama yapılmaktadır. Eğer aranan değer bulunursa kaçıncı sırada bulunduğu k değişkeninde saklanmaktadır.
45-57 arasında k değişkeni kontrol edilmektedir eğer -1 den farklı bir değere sahipse aranan kayıt bulunmuş ve dizinin k’nıncı sırasında bulunuyor demektir ve o sıradaki bilgiler ekrana yazılmaktadı.
 Soru:

1-      En fazla 50 öğrencinin not takibini yapacak kayıt, arama, listeleme menülerine sahip bir program yapılacaktır. Kayıt kısmında adı, soy adı, 1.not, 2. Not ve 3. Not bilgileri girilecektir. (Kayıt girilip girilemeyeceği kontrol edilecek), arama kısmında ada göre veya soyada göre arama yapılacak, bulunursa öğrencinin adı, soy adı, notları ve ortalaması görüntülenecek. Liste kısmında tüm öğrencilerin ad, soyad, notları ve ortalaması listelenecek. Burada eğer ortalama 45’in altındaysa o satır kırmızı görüntülenece. (iki boyutlu bir dizinin 0. Sütununda ad, 1. Sütununda soyad saklanacak, not bilgileride yine 2 boyutlu bir dizinin 3 sütununda saklanacak)
2-      Haftanın ilk günü pazartesi kabul edilerek, Gün, Ay, Yıl girildiğinde günün adı ve yılın kaçıncı günü olduğunu ekrana yazan programı yazınız.(sadece şuana kadar gördüğümüz komutlarla. Bunun için en azından o yılın ilk gününün hangi gün olduğunu bilmeniz gerekir. Dışarıdan isteyebilirsiniz)

Dizi değişkenlerin bazı özellikleri
Dizi değişkenler referans tipli değişkenlerdir. Dolayısıyla bu değişkenler hafızada new komutuyla ayrılar yerin başlangıç adresini tutarlar. Aynı türden referans tipli değişkenler birbirlerine atandığı zaman veriyi değil verinin bulunduğu adres bilgisini geçirirler.
Aşağıdaki örneği yazarak çalıştırın.

Yukarıdaki örnekte 12. Satırda ad isminde başlangıç değerleriyle bir dizi tanımlanmıştır. 13. Satırda yine aa isminde bir dizi referans değişkeni tanımlanmış ancak hiçbir yer ayrımı yapılmamıştır. 14. Satırda aa refeans değişkenine ad referans değişkeni atanmıştır. Artık bu atamadan sonra ad ve aa değişkenleri aynı hafıza bölgesini göstereceğinden, diziye bu iki değişken aracılığıyla da ulaşılabilir.
15 ve 16. satırlardaki sonuç, ayrı değişkenler kullanılmasına karşılık aynı değeri (“hasan”) görüntüleyeceklerdir.
17. satırda yapılan atama da geçerli bir atamadır.
Netice itibariyle bu örnekte iki ayrı değişkenle temsil edilen tek bir dizi mevcuttur.
Diziler System.Array sınıfından türetilirler. Dolayısıyla Array sınıfının birçok metod ve özellikleri dizi değişkenlerindede kullanılabilir. (Array sınıfı ileride incelenecektir)
.Length : Dizinin boyutu gözetilmeden toplam Eleman sayısını verir.
.Rank : Dizinin boyutunu verir.

Diziler üzerinde işlem yapan bir çok metot boyut numarasını parametre olarak alır. Boyut numaraları da aynen dizi indislerinde olduğu gibi sıfırdan başlar.  İfade alışkanlıkları nedeniyle çoğu zaman boyut numaraları yanlış ifade edilmektedir. Örneğin yukarıdaki örnekte ad dizisi bir boyutlu bir dizidir. O boyutun numarası da sıfırdır. notlar dizisi iki boyutlu bir dizidir. İlk boyut (biz genelde satır olarak ifade ediyoruz) numarası sıfır, ikinci boyutun (sütun) numarası da bir dir.
Benzer şekilde tanımlama esnasında boyutların alabileceği eleman sayılarını belirttiğimiz sayılarda boyut numaralarıyla karıştırılabilmektedir.
          
Yukarıdaki tanımlamalarda a dizisi bir boyutlu bir dizidir ve sıfr numaralı boyutun eleman sayısı 5 tir. B dizisi iki boyutlu bir dizidir, sıfır numaralı boyutun eleman sayısı 6, bir numaralı boyutun eleman sayısı 4 tür.
.GetLength(BoyunNo): Dizinin parantez içerisinde belirtilen boyutunun eleman sayısı

.GetUpperBound(BoyutNo): Dizinin parantez içerisinde belirtilen boyutunun alabileceği en büyük indis numarasını verir
               
.GetLowerBound(BoyutNo): Dizinin parantez içerisinde belirtilen boyutunun alabileceği en küçük indis numarasını verir

.GetValue(inisNo0,indisNo1,…): dizi boyutuna uygun olarak verilen indis numarasındaki veriyi verir.
.SetValue(Veri, inisNo0,indisNo1,…):veriyi dizi boyutuna uygun olarak verilen indis numarasına yazar
Aşağıdaki örneği  çalıştırarak inceleyin

.CopyTo( hedefDizi , başlangıçİndex ) : tek boyutlu dizilerde Dizinin tamamını hedef diziye başlangıçİndex numarasından itibaren kopyalar. Hedef dizide kopyalamanın başlangıç index numarasından sonra kaynak dizideki elemanların tamamını alabilecek kadar yer olması gerekir.

Yukarıdaki örnekte dd dizisi ad dizisine 2 index numarasından itibaren kopyalanır.(kaynak dd, hedef ad dizisidir).

Kaynak:Reha Gönüllü

Hiç yorum yok:

Yorum Gönder