Ders 4: Diziler (Arrays( Arrays) Hazırlayan : Öğr. Grv.. Barış GÖKÇE Đletişim im : www.barisgokce barisgokce.com
Diziler Aynı tipteki bir veri gurubunun bir değişken içinde saklanmasıdır. Veriler Hafızada 0 dan başlayarak sıra ile bulunur. C# dilinde dilinde diziler system.array tipindedir. 2
Diziler Bir örnek olarak, haftanın günleri bir boyutlu dizi olarak düşünülebilir. Đlk eleman (0. Eleman), Pazartesi, son eleman da (6. Eleman) Pazar günü olacaktır. Diğer bir örnek, bir ayda bulunan günler, iki boyutlu bir dizi olarak düşünülebilir. Yatayda haftanın günleri bulunurken, düşeyde hafta sayısı olabilir. Bir yıldaki günleri de üç boyutlu bir dizi olarak düşünülebilir. 1. boyut Haftanın günleri, 2. boyut hafta numarası. Üçüncü boyut da aylar olur. 3
Diziler C# da tek boyutlu bir dizi, normal bir değişken gibi tanımlanır, sadece değişken ifadesinden sonra köşeli parantez kullanılır. string[] gunler = new string[7]; gunler[0] = "Pazartesi"; gunler[1] = "Salı"; gunler[2] = "Çarşamba"; gunler[3] = "Perşembe"; gunler[4] = "Cuma"; gunler[5] = "Cumartesi"; gunler[6] = "Pazar"; Veriler dizilere yerleştirilirken 0 dan itibaren başlanarak yerleştirilir ve diziden veriler alınırken 0 dan başlanır. Değişken adının önündeki küme parantezinin içindeki sayılar değişkenin index numarasını verir. 4
Örnek 5
Örnek 6
Dizi değişken tanımlama şekilleri string[] gunler = "Pazartesi","Salı","Çarşama","Perşembe","Cuma","C.tesi","Pazar"; string[] gunler = new string[7]; gunler[0] = "Pazartesi"; gunler[1] = "Salı"; gunler[2] = "Çarşamba"; gunler[3] = "Perşembe"; gunler[4] = "Cuma"; gunler[5] = "Cumartesi"; gunler[6] = "Pazar"; 7
Örnek 8
For döngüsü yerine foreach kullan private void btngoster_click(object sender, EventArgs e) string[] gunler = new string[7]; gunler[0] = "Pazartesi"; gunler[1] = "Salı"; gunler[2] = "Çarşamba"; gunler[3] = "Perşembe"; gunler[4] = "Cuma"; gunler[5] = "Cumartesi"; gunler[6] = "Pazar"; foreach (string i in gunler) lsbgunler.items.add(i); 9
Örnek private void Form1_Load(object sender, EventArgs e) double[] sayilar = 0.15, 0.17, 0.1, 0.3, 0.22, 0.45, 0.54, 0.68, 0.72, 1.1, 3.1; int eleman = sayilar.length; MessageBox.Show("Sayılar dizinde toplam" + eleman.tostring() + " adet eleman vardır"); foreach (double i in sayilar) lsbgunler.items.add(i); 10
Örnek 1 ile 500 arasında rastgele 100 adet tamsayı üretip bir diziye dolduran bir program yazınız. Dizideki bu sayıların en büyük ve en küçük değerlerini bularak ekrana yazdırın. Ayrıca, ortalama değerini de hesaplayarak ekranda gösterin. 11
private void btngoster_click(object sender, EventArgs e) int max, min, ortalama,toplam; Random rastgelesayi = new Random(); int[] dizi = new int[100]; for (int i = 0; i < 100; i++) dizi[i] = rastgelesayi.next(500); max = dizi[0]; min = dizi[0]; toplam = 0; ortalama = 0; for (int i = 0; i < 100; i++) if (max < dizi[i]) max = dizi[i]; if (min > dizi[i]) min = dizi[i]; toplam += dizi[i]; lblmax.text = "Maksimum Sayı: " + max.tostring(); lblmin.text = "Minimum Sayı: " + min.tostring(); ortalama = toplam / 100; lblortalama.text = "100 adet Sayının ortalaması: " + ortalama.tostring(); 12
Örnek Bir önceki örnekte üretilen 100 adet random sayıyı, büyükten küçüğe yada küçükten büyüğe doğru sıralatın ve listbox a ekletin 13
Aşağıdaki kodları, bir önceki örneğin devamına ekleyelim int yedek; for (int i = 0; i < 100; i++) for (int j = 0; j < 100; j++) if (dizi[i] > dizi[j]) yedek = dizi[j]; dizi[j] = dizi[i]; dizi[i] = yedek; lsbsayilar.items.clear(); for (int i = 0; i < 100; i++) lsbsayilar.items.add(dizi[i]); 14
.Length Dizideki Eleman sayısı Belirtilen dizinin eleman sayısını integer (int) olarak verir. private void Form1_Load(object sender, EventArgs e) Random rastgelesayi = new Random(); int[] dizi = new int[50]; for (int i = 0; i < dizi.length; i++) dizi[i] = rastgelesayi.next(100); 15
.Clear Diziyi Temizleme Parametre olarak verilen dizinin, belirtilen indis aralığındaki tüm değerleri temizler. Temizleme işleminde atanan değer, dizi elemanlarının tiplerine göre değişir. Örneğin int tipinde tanımlı bir dizinin elemanları temizlenirse 0 değerini alacaktır. Buna karşın String tipindeki elemanlar (boş yazı) değerini alır. 16
Örnek int[] dizi = new int[50]; private void Form1_Load(object sender, EventArgs e) Random rastgelesayi = new Random(); int elemansayisi = dizi.length; int dizininboyutu = dizi.rank; MessageBox.Show("Dizinin Eleman sayisi: " + elemansayisi.tostring()); MessageBox.Show("Dizinin Boyutu: " + dizininboyutu.tostring()); for (int i = 0; i < dizi.length; i++) dizi[i] = rastgelesayi.next(500); // Burada Dizi doldu private void btndiziyibosalt_click(object sender, EventArgs e) Array.Clear(dizi, 0, dizi.length); // Dizi Burada Boşaltıldı Durma noktası ekle ve Dizinin içine Bak 17
Çok Boyutlu Diziler Birden fazla boyutu olan dizilere çok boyutlu diziler denir. Đki tip çok boyutlu dizi vardır. Matris diziler Düzensiz diziler (Jagged) 18
Matris Diziler Adından da anlaşılacağı gibi matris yapıda dizilerdir. Matris diziler 2 veya daha fazla boyutlu olabilirler. Örneğin 3x2 boyutlu bir matris dizisi aşağıdaki gibi tanımlanır. int [,] mdizi =1,2,3,4,5,6; mdizi[0,0] = 1; mdizi[0,1] = 2; mdizi[1,0] = 3; mdizi[1,1] = 4; mdizi[2,0] = 5; mdizi[2,1] = 6; 19
3 veya daha çok boyutlu diziler teoride dilin yapısına uygun olmasına rağmen gerçek hayatta çok fazla kullanılmazlar. 3 ve daha fazla boyutlu dizilerde işlem yapması daha zordur. Mesela 3 boyutlu bir dizi için iç içe 3 tane for döngüsü kullanmak gerekmektedir. Aşağıda 3 boyutlu bir matris dizi tanımlaması örnek olarak verilmiştir. int [,, ] mdizi =1,2,3,4,5,6, 1,2,3,4,5,6; mdizi[0,0,0] = 1; mdizi[0,0,1] = 2; mdizi[0,1,0] = 3; mdizi[0,1,1] = 4; mdizi[0,2,0] = 5; mdizi[0,2,1] = 6; 20 mdizi[1,0,0] = 1; mdizi[1,0,1] = 2; mdizi[1,1,0] = 3; mdizi[1,1,1] = 4; mdizi[1,2,0] = 5; mdizi[1,2,1] = 6;
Düzensiz (Jagged) Diziler Bir dizinin her bir elemanı ayrı bir dizi ise bir dizi içeriyorsa o zaman bu dizilere düzensiz diziler denir. Her bir satırdaki dizi farklı boyut olabileceği için matris dizisi formunda olması gerekmez. Bu sebeple bu dizilere düzensiz (jagged) yada çentikli dizi adı verilir. 21
int[][] dizi = new int[3][]; dizi[0] = new int[5]; dizi[1] = new int[4]; dizi[2] = new int[3]; dizi[3][] 0 1 2 8 4 1 3 1 8 6 7 2 2 4 9 22
Örnek. string [] [] dizi = new string [3] []; dizi[0] = new string [2]; dizi[1] = new string [3]; dizi[2] = new string [1]; dizi[1] [2] = çentikli"; 23
Buradan da anlaşılacağı gibi düzensiz dizilerin matris dizilerden farkı, sütun sayısının sabit olmamasıdır. Diziler konusunu bir defada anlamak elbette zordur. Özellikle düzensiz dizileri anlamak için çok fazla örnek yapmak gerekir. 24
Örnek private void Form1_Load(object sender, EventArgs e) int[][] dizi = new int[3][]; dizi[0] = new int[5]; dizi[1] = new int[3]; dizi[2] = new int[2]; 25 for (int i = 0; i < dizi.length; i++) for (int j = 0; j < dizi[i].length; j++) dizi[i][j] = 1*( i + j); foreach (int[] sayi in dizi) foreach (int deger in sayi) lblsonuc.text += deger.tostring()+ " ";
Dizi Đşlemleri Dizi işlemleri, programlarda çok sık kullanılan programlama öğelerindendir. IndexOf() LastIndexOf() Sort() Reverse() Array sınıfı yardımıyla kullanılırlar. 26
IndexOf() - LastIndexOf() IndexOf() : Aramayı baştan başlatır ve aranan elemanın kaçıncı sırada olduğunu değer olarak döndürür. LastIndexOf() : Aramayı sondan başlatarak aranan elemanın baştan kaçıncı sırada olduğunu değer olarak döndürür. Eğer aranan eleman bulunamazsa -1 değeri döndürülür. 27
Örnek private void Form1_Load(object sender, EventArgs e) int[] dizi = 1, 3, 5, 7, 9, 11, 1, 3, 5, 7, 9,11 ; MessageBox.Show(Array.IndexOf(dizi,1).ToString()); Sonuç : 0 dır. Arama sol baştan itibaren başlamıştır. Yer numarası ise baştan 0. sıradadır private void Form1_Load(object sender, EventArgs e) int[] dizi = 1, 3, 5, 7, 9, 11, 1, 3, 5, 7, 9,11 ; MessageBox.Show(Array.LastIndexOf(dizi,1).ToString()); 28 Sonuç : 6 dır. Arama sağdan sola yani sondan başa doğrudur. Ancak yer bildirimini baştan baştan itibaren başlamıştır yeri ise 0 dan itibaren 6. sıradadır.
Array.Sort() Dizinin elemanlarını küçükten büyüğe doğru sıralar. private void Form1_Load(object sender, EventArgs e) int[] dizi = 1, 3, 5, 7, 9, 11, 1, 3, 5, 7, 9,11 ; for (int i = 0; i < dizi.length; i++) lblsonuc1.text += dizi[i].tostring() + " - "; Array.Sort(dizi); // lblsonuc2 de dizinin sıralandığını görüyoruz for (int i = 0; i < dizi.length; i++) lblsonuc2.text += dizi[i].tostring() + " - "; 29
Array.Reverse() Dizinin eleman sırasını ters çevirir. private void Form1_Load(object sender, EventArgs e) int[] dizi = 1, 3, 5, 7, 9, 11, 1, 3, 5, 7, 9,11 ; for (int i = 0; i < dizi.length; i++) lblsonuc1.text += dizi[i].tostring() + " - "; 30 Array.Sort(dizi); Array.Reverse(dizi); // lblsonuc2 de dizinin ters sıralandığını görüyoruz for (int i = 0; i < dizi.length; i++) lblsonuc2.text += dizi[i].tostring() + " - ";
ArrayList Klasik dizilerle çalışırken karşılaşabileceğimiz temel sorunlar şunlardır. Dizilerin sınırları sabittir. int[] dizi = new int[60]; Dizilerin tüm elemanları aynı türden olmalıdır. Örn. Hepsi int Kullanmadığımız dizi elemanlarından dolayı bellek alanları gereksiz yere işgal edilmektedir. Örneğin sayısını bilemediğimiz bir dizinin eleman sayısını 500 olarak belirlediğimizi varsayalım. Çalışma zamanında dizimizin sadece 10 elamanını kullandığımız durumda diğer 490 elemanlık bellek alanı boş olarak kalır. Öte yandan dizimizde tutmak istediğimiz değişkenlerin sayısı 501 bir olduğu bir durumda "IndexOutOfRangeException" istisnai durumu ortaya çıkar ve program bu hatadan dolayı sonlanır. ArrayList sınırları dinamik olarak değişebilen diziler olarak tanımlanır. Bu veri yapısı.net sınıf kütüphanesinin System.Collections isim alanında bulunur. 31
Örnek private void Form1_Load(object sender, EventArgs e) ArrayList DiziListesi = new ArrayList(); // DiziListesi isimli ArrayList nesnesi oluşturuyoruz. // DiziListesi nesnemize sırası ile 5, 8, 1, 17 ve 20 değerlerini DiziListesi.Add(5);// Add metodu ile ekleyelim. DiziListesi.Add(8); DiziListesi.Add(1); DiziListesi.Add(17); DiziListesi.Add(20); foreach (object eleman in DiziListesi) // DiziListesi'in Sonuç 1'e yazdıryoruz: lblsonuc1.text += eleman.tostring() + " - "; DiziListesi.Remove(8);// DiziListesi dizimizden 8 ve 20 değerlerini çıkartalım: DiziListesi.Remove(20); DiziListesi.Add(66); // DiziListesi dizimize 66 ve 4 değerlerini ekliyoruz: DiziListesi.Add(4); foreach (object eleman in DiziListesi) // DiziListesi'in Sonuç 2'ye yazdıryoruz: lblsonuc2.text += eleman.tostring() + " - "; 32
ArrayList Metodları ve Özellikleri Add() BinarySearch() Clear() Contains() Insert() Remove() Reverse() Sort() Bir nesneyi ArrayList'in sonuna ekler. Sıralanmış bir ArrayList içinde bir nesneyi Binary search algoritması kullanarak arar. ArrayList'in tüm elemanlarını siler. Sıfırlar. Herhangi bir nesnenin ArrayList'in elemanı olup olmadığını kontrol eder. Dizinin sonuna değilde istediğimiz bir yerine indeksini belirterek eklememizi sağlar. Herhangi bir elemanı diziden siler. Diziyi ters çevirir. Diziyi sıralar. Diğer metodlar için lütfen aşağıdaki linki kullanın http://msdn.microsoft.com/enus/library/system.collections.arraylist_methods.aspx 33
Örnek Personel adlarını tutacak bir ArrayList tanımlayınız. Form a bir textbox ekleyerek adları girin. Girilen bu adlar bir ArrayList te tutulmalı. Listeyi ve Eleman sayısını Label a yazdırın Listeden adı textbox a girilen isimi silin. Listeyi harf sırasına göre sıralatın. Listeyi harf sırasına göre tersten sıralatın. 34
Form Ekranı 1 2 3 4 35