Ders 4: Diziler (Arrays( Arrays) barisgokce.com

Ders 4: Diziler (Arrays) Hazırlayan : Öğr. Grv. Barış GÖKÇE Đletişim : www.barisgokce.com Diziler Aynı tipteki bir veri gurubunun bir değişken için...
Author: Koray Yenal
3 downloads 0 Views 375KB Size
Ders 4: Diziler (Arrays)

Hazırlayan : Öğr. Grv. Barış GÖKÇE Đletişim : www.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

http://www.barisgokce.com

Diziler

3



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.

http://www.barisgokce.com

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";



4

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. http://www.barisgokce.com

Örnek

5

http://www.barisgokce.com

Örnek

6

http://www.barisgokce.com

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

http://www.barisgokce.com

Örnek

8

http://www.barisgokce.com

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

http://www.barisgokce.com

Ö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

http://www.barisgokce.com

Ö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

http://www.barisgokce.com

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

http://www.barisgokce.com

Örnek 

13

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…

http://www.barisgokce.com

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

http://www.barisgokce.com

.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

http://www.barisgokce.com

.Clear Diziyi Temizleme 

16

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 0 değerini elemanları temizlenirse alacaktır. Buna karşın String tipindeki elemanlar “” (boş yazı) değerini alır.

http://www.barisgokce.com

Ö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

http://www.barisgokce.com

Ç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

http://www.barisgokce.com

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

http://www.barisgokce.com

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}}};

20

mdizi[0,0,0] mdizi[0,0,1] mdizi[0,1,0] mdizi[0,1,1] mdizi[0,2,0] mdizi[0,2,1]

= = = = = =

1; 2; 3; 4; 5; 6;

mdizi[1,0,0] mdizi[1,0,1] mdizi[1,1,0] mdizi[1,1,1] mdizi[1,2,0] mdizi[1,2,1]

= = = = = =

1; 2; 3; 4; 5; 6; http://www.barisgokce.com

Düzensiz (Jagged) Diziler 

21

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.

http://www.barisgokce.com

int[][] dizi = new int[3][]; dizi[0] = new int[5]; dizi[1] = new int[4]; dizi[2] = new int[3];

dizi[3][]

22

0

2

8

4

1

1

1

8

6

7

2

2

4

9

3

http://www.barisgokce.com

Ö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

http://www.barisgokce.com



24

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.

http://www.barisgokce.com

Ö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]; 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()+ " "; } } 25

}

http://www.barisgokce.com

Dizi Đşlemleri 

Dizi işlemleri, programlarda çok sık kullanılan programlama öğelerindendir.  IndexOf()  LastIndexOf()  Sort()  Reverse()



26

Array sınıfı yardımıyla kullanılırlar.

http://www.barisgokce.com

IndexOf() - LastIndexOf() 





27

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.

http://www.barisgokce.com

Ö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()); } 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. 28

http://www.barisgokce.com

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

http://www.barisgokce.com

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() + " - "; } 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() + " - "; } } 30

http://www.barisgokce.com

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

http://www.barisgokce.com

Ö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

http://www.barisgokce.com

ArrayList Metodları ve Özellikleri Add()

Bir nesneyi ArrayList'in sonuna ekler.

BinarySearch()

Sıralanmış bir ArrayList içinde bir nesneyi Binary search algoritması kullanarak arar.

Clear()

ArrayList'in tüm elemanlarını siler. Sıfırlar.

Contains()

Herhangi bir nesnenin ArrayList'in elemanı olup olmadığını kontrol eder.

Insert()

Dizinin sonuna değilde istediğimiz bir yerine indeksini belirterek eklememizi sağlar.

Remove()

Herhangi bir elemanı diziden siler.

Reverse()

Diziyi ters çevirir.

Sort()

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

http://www.barisgokce.com

Örnek      

34

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.

http://www.barisgokce.com

Form Ekranı

2 1

3

35

4

http://www.barisgokce.com