Ders 4: Diziler (Arrays)

Transkript

Ders 4: Diziler (Arrays)
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

Benzer belgeler