ETM :
DZLER VE METOTLAR
Bolum :
Diziler ve Koleksiyonlara
Giri
Konu :
Dizi Nedir? Neden htiyac
Duyariz?
Diziler ayni tipte deerlerin bir arada tainmasini salayan referans tipli
programlama oeleridir.
Diyelim ki 30 orencinin notlarini tutmak istiyorsun. Tip olarak byte iini gorecektir
(0 - 255 araliinda deer tutabilir). Bu programlama gorevini yerine getirebilmek icin
byte tipinde 30 tane deikene ihtiyac olur. Ancak bu kullanim, takip etmesi oldukca guc
durumlara yol acabilir. Bunun yerine byte tipinde 30 elemanli bir dizi oluturmak ve
orencilerin notlarini bu dizide tutmak daha etkin bir cozumdur.
Ayrica program icerisinde 30 kiinin notunu bir yerden baka bir yere taimak da
daha kolay olacaktir.
Dizi tanimlanirken ona bir isim verilir. Ancak diziye atilan her bir eleman icin ayri
ayri deiken ismi verilmesine gerek yoktur.
Diziler, elemanlarina ismiyle deil indeks siralariyla eriim sunar.
Diziye atilan her bir eleman otomatik olarak 0'dan balayip 1'er 1'er artan bir
indeksleme sistemi ile kaydedilir. Daha sonra dizi elemanlarina erimek istediinde
indeksler ile eriebilirsin.
Ornein orencileri sinif listesindeki siralarina gore diziye atip bu siraya bakarak
istediin nota eriebilirsin.
Diziler referans tiplidirler. Dolayisiyla diziye atilan veriler bellein heap bolgesinde
tutulurken, diziye eriim icin oluturulan deiken bellein stack bolgesinde
tutulur.
Not : Heap ve Stack, yazdiin .NET uygulamalarinda kullanilan deikenlerin ve
tanimlanan nesnelerin gecici bellek (RAM) uzerinde saklandii alanlardan ikisidir ve en
temel olanlaridir. Bu bolgeler .NET framework tarafindan otomatik olarak yonetilirler.
Gelitirici bu bolgelere dorudan mudahele etmez. Kullanilan veri tipleri, onceden tanimli
kurallara gore bellein ilgili alaninda saklanirlar.
Stack, daha kucuk bir alana sahiptir. Burada nispeten basit tipli verilerin saklanmasi
amaclanir. Deer tipli deikenler, bellein stack bolgesinde tutulur. (int, double,
DateTime vb.)
Bellein heap bolgesi, daha karmaik verilerin saklanmasi icin bulunmaktadir. Stack
bolgesine gore bellekte daha buyuk miktarda yer kaplar. Referans tipli deikenler,
bellein heap bolgesinde tutulurlar.(string, object, Console vb.)
2 / 36
ETM :
DZLER VE METOTLAR
Bolum :
Diziler ve Koleksiyonlara
Giri
Konu :
Dizileri Kullanmak
3 / 36
Dizi Deikenleri Tanimlamak
Dizi tanimlama soz dizimi, deiken tanimlama soz dizimi ile benzerdir. Bir diziyi
tanimlarken, dizi icerisinde hangi tipte deerler saklayacaini belirtmelisin. kisini ayiran
detay, dizide tipin sonuna koyulan koeli parantezlerdir.
Ornein sayilarim adinda int tipinde bir dizi tanimlamasi aaidaki gibi yapilir:
int[] sayilarim;
Burada tanimlanan tip, sadece onceden tanimli tiplerden birisi (int, double vb.)
olmak zorunda deildir. Temel sinif kutuphanesindeki herhangi bir tipte olabilecei gibi
kendi yazdiin tipte bir dizi de tanimlayabilirsin.
Dizi deikenlerine coul adlar verilirse, bir diziyi iaret ettii daha rahat
an lailabilir.
Dizi Ornekleri Oluturmak
cerisinde tutulacak elemanlarin tipi ne olursa olsun diziler, referans tiplidirler.
Yani dizi deikeni bellein stack bolgesinde, dizinin kendisi bellein heap
bolgesinde yer alir.
Dizilerin bellee cikarilmasi icin new anahtar kelimesi ile oluturulmalari gerekir.
Diziler oluturulurken, kac elemanli olduklari bilinmek zorundadir. Bellekte, bu
bilgiye gore yer acilir. Programin ilerleyen satirlarinda bu alana belirtilen
miktardan fazla eleman girilemez. Girilmeye caliildiinda boyut dinamik olarak
artmaz. Ortama hata firlatilir.
Yine dizilerin referans tipli olmasindan oturu, dizi uyeleri kendi tiplerinin varsayilan
deerlerini alirlar. Daha sonra bu deerler, ihtiyaclar dorultusunda deitirilir.
Oyleyse 10 elemanli bir bool dizisi oluturulduunda bu dizinin 10 elemaninin
deeri de otomatik olarak false (bool tipinin varsayilan deeri) eklinde belirlenir.
4 / 36
Bu ekilde 4 elamanli int tipli bir dizi oluturabilirsin.
sayilarim = new int[4];
Dizinin eleman sayisini sabit bir deer olarak vermek zorunda deilsin. Tek kural
var; o da dizi oluturulduunda kac elamanli olacai bilinmelidir. Bu yuzden, dizi ornei
farkli yollar kullanilarak oluturulabilir. Ornein dizinin eleman sayisi calima zamaninda
belirlenebilir:
...
Console.Write("Lutfen orenci sayinizi giriniz : ");
int boyut = int.Parse(Console.ReadLine());
sayilarim = new int[boyut];
Console.WriteLine("{0} elemanli diziniz oluturuldu...",boyut);
...
Dizilere Balangic Deerlerini Vermek
Bir dizi oluturulduunda dizinin ici, oluturulduu tipin varsayilan deerleriyle
doldurulur. Dizinin bu davranii deitirilebilir ve balangicta istenilen deerlerle
bellee cikarilabilir. Bunu gercekletirmek icin, dizi oluturulma soz diziminin
sonunda kume parantezleri kullanilir. Dizide belirtilen tipte ve eleman sayisi kadar
deeri, suslu parantezler icine, aralarinda virgul olacak ekilde yazman gerekir.
Ornek olarak sayilarim adli dizi, 4,9,7 ve 3 deeleri ile birlikte oluturulabilir.
sayilarim = new int[4] { 4,9,7,3};
Burada dizi boyutunun 4 elemanli olacai bildirildii icin suslu parantezler icerisine
4 elemandan az ya da fazla deer girilmesi durumunda derleme zamani hatasi
alinir. Birkac veri tipi icin bu soz diziminin ornek kullanilii oyledir:
string[] sehirler = new string[] { "Antalya","stanbul","Ankara" };
double[] oranlar = new double[3] { 0.32 , 0.45 , 0.56 };
char[] alfabe = new char[3] { 'a','b','c'};
Dizi oluturulurken eer elemanlarin ilk deerlerini veriyorsan, eleman sayisi
belirtmek zorunda deilsin. Derleyici, balangic deerlerindeki eleman adedine
bakarak dizinin eleman sayisini hesaplar.
string[] sehirler = new string[] { "Antalya","stanbul","Ankara" };
5 / 36
Dizi oluturulurken eer elemanlarini veriyorsan, new anahtar kelimesi ve veri tipi
kullanimi ihmal edilebilir. Derleyici, balangic deerlerinin adedine bakarak dizinin
eleman sayisini otomatik olarak hesaplar.
string[] sehirler = { "Antalya","stanbul","Ankara" };
Her Bir Dizi Elemanina Erimek
stenilen dizi elemanina erimek icin dizi uzerinden ilgili elemanin indeks sirasi
verilir. Ornein sayilarim adiyla oluturulup deerleri verilen dizinin son
elemanina erimeye calitiini duunelim. Burada dikkat edilmesi gereken nokta;
C#'da dizi mantiindaki hereyin indeks olarak 0 deeri ile balamasidir.
Tipki ekrana bir ey yazdirirken kullanilan yer tutucularda (placeholder) olduu
gibi ({0}). O yuzden aaidaki dizinin elemanlari ve indeks siralari oyledir :
-
0. indeksli elemani 4
-
1.indeksli elemani 9
-
2.indeksli elemani 7
-
3.indeksli elemani ise 3
int[] sayilarim = new int[4] { 4,9,7,3};
int sayi2 = sayilarim[1];
Console.WriteLine("Dizinin {0}. indeksli elemani : {1}",1,sayi2);
Dizi elemanlarinin deerleri tanimlandiktan sonra deitirilebilir. Dizinin ikinci
indeksli elemani olan 7 deerini aaidaki kod parcasinda gorulduu gibi 10 olarak
deitirebilirsin.
sayilarim[2] = 10;
// ya da
int baskaSayi = 10;
sayilarim[2] = baskaSayi;
Bir diziye deerleri verilmeden sadece eleman sayisi soylenerek (varsayilan
deerleri ile) oluturulduktan sonra dizi elemanlarini tek tek de verebilirsin.
int[] sayilarim = new int[4];
sayilarim[0] = 3;
sayilarim[1] = 5;
sayilarim[2] = 7;
sayilarim[3] = 9;
Dizinin elemanlarina eriimde 0'dan balayan indeksler kullanildii icin dizinin son
indeksi, eleman sayisi -1 olarak ele alinir. Eer yanlilikla uc elemanli bir dizinin ucuncu
indeksli elemanina erimeye caliirsan IndexOutOfRange hatasi ile karilarirsin.
6 / 36
int[] sayilarim = new int[4] { 4, 9, 7, 3 };
Console.WriteLine(sayilarim[4]); //HATA: Bu diziye eriim icin kullanilacak
index 0 ile 3 arasinda olmalidir.
Bir Dizinin Eleman Sayisini Elde Etmek
Bir dizinin eleman sayisini, dizi deikeni uzerinden cairacain Length ozellii ile
elde edebilirsin.
Console.WriteLine("sayilarim
dizisinin
eleman
sayisi
:
{0}",
sayilarim.Length);
Bir Dizi cerisindeki Butun Elemanlari Elde Etmek
Bir dizideki eleman sayisi dizinin Length ozellii ile elde edilebildiine gore, for
dongusu kullanilarak dizinin 0'nci indeksi ile eleman sayisi -1'nci indeksi arasindaki
butun deerler elde edilebilir.
int[] sayilarim = new int[4] { 3,5,7,9 };
for (int i = 0; i < sayilarim.Length; i++)
{
Console.WriteLine("{0}.eleman = {1}",i + 1,sayilarim[i]);
}
Yukaridaki dongude ekrana her bir elemanin dizideki sirasi (indeks + 1) ve deeri
yazdirilmaktadir.
Dongu deikeni once sifir deerini alir.
Ekrana mevcut elemanin sira numarasi olarak 1'i yazdirir (0 + 1).
Yanina dizideki sifirinci indeksli elemanin deeri olan 3'u yazdirir.
Burada dikkat edilmesi gereken noktalardan biri; dongu deikeninin balangic
deeri olarak 1'le deil 0'la balamasidir.
Dier nokta ise dongunun mantiksal koul deyiminin, dizinin boyutu olan 4 icin
calitirilmamasidir. Bu durum, koul deyiminin i <= sayilarim.Length yerine i <
sayilarim.Length olarak yazilmasindan kaynaklanir.
Dongu bu ekilde dort deer icin de caliir ve dizideki butun elemanlarin deerleri
elde edilmi olur.
Not : Ayrica indeks deikenini kendin tanimlayarak while dongusu yardimiyla, dizi
icerisindeki butun elemanlara ulaman mumkundur.
Dizi Elemanlarini foreach Dongusu ile Elde Etmek
C#, dizilerin icerisinde donup deerlerini elde etmek icin bir yol daha onerir:
foreach dongusu.
7 / 36
foreach (int gecici in sayilarim)
{
Console.WriteLine(gecici);
}
foreach dongusunde tanimlanan dongu deikeni otomatik olarak dizideki her
elemani sirayla elde eder.
Dongunun ilk iterasyonunda (ilk turunda) bellee cikarilan deikenin tipi, dizinin
elemanlari ile ayni tipinde olmalidir.
foreach, arka tarafta kendi algoritmasi ile her iterasyonda dizinin bir elemanini
okuyup bellekteki gececi deikene atar. Ardindan dongu blou icerisinde
deikenin o anki deeri okunur.
foreach, dizideki deerleri okuma iini 0. indeksten balayip eleman sayisi -
1'nci indekse kadar sirayla yapar. for dongusunde duunulmesi gereken ayrintilar
foreach'de olmadii icin dizinin butun elemanlarini okumada tercih edilebilir.
Yine de bir dizinin elemanlari elde edilmek istendiinde for dongusunun daha
kullanili olduu alanlar vardir.
foreach deyimi her zaman butun diziyi doner. Eer sadece dizinin belli bir bolumu
elde edilmek isteniyorsa (mesela yarisi) ya da belli deerler atlanmak isteniyorsa
(Mesela her 3 elemandan biri) bunu for kullanarak yapmak cok daha kolaydir.
foreach deyimi her zaman dizinin 0.indeksinden eleman sayisi - 1.'nci
indeksine doru caliir. Dolayisiyla eer dizinin deerleri tersten okunmak
istenirse for dongusunu kullanmak gerekir.
Eer dongu blou icerisinde sadece dizideki elemanin deeri deil indeks sayisi da
istenirse, bu destei salamak icin for dongusu kullanilmak durumundadir.
foreach dongusu ile bu destei salamak icin ekstra bir indeks deikeni
oluturulup her turda arttirim ilemleri yapilabilir.
Eer dizi elemanlarinin deerleri bir dongu icerisinde guncellenmek istenirse, for
dongusu kullanilmak zorundadir. Cunku foreach deyimindeki dongu deikeni,
dizideki her bir elemanin sadece okunabilir kopyasini elde eder. Bu yuzden de dizi
elemanlarinin deeri foreach dongusu icerisinde deitirilemez.
Foreach dongusu, sadece ileri yonlu ve yalniz okunabilir bir oteleme
hareketine izin verdiinden, cou durumda for dongusune gore daha
performansli caliir.
Ornek Uygulama
Aaida ornek bir uygulama bulunmaktadir. Oncelikle kullanicidan kac orenci icin
not girecei bilgisi alinir. Alinan bu bilgi ile bir dizi oluturulur. Dizinin dinamik oluan
eleman sayisi kadar kullanicidan deer alinir. Kullanicidan alinan deerler, dizinin
elemanlari olarak sirayla kaydedilir. Ardindan dizinin boyutu ve elemanlari toplu olarak
kullaniciya gosterilir:
...
//Kullanicidan oluturulacak dizinin eleman sayisi alinir...
Console.Write("Lutfen orenci sayinizi giriniz : ");
8 / 36
byte elemanSayisi = byte.Parse(Console.ReadLine());
byte[] notlar = new byte[elemanSayisi];
//Kullanicidan alinip dongu icerisinde diziye girilen deerleri tutacak //olan
deiken tanimlanir.
byte alinanEleman;
//Dongu icerisinde kullanicidan sirayla notlar alinip bir deiken //araciliiyla diziye
verilir.
for (byte i = 0; i < notlar.Length; i++)
{
Console.Write("Lutfen {0}. orencinin notunu girip ENTER'a basiniz :
",i + 1);
alinanEleman = byte.Parse(Console.ReadLine());
notlar[i] = alinanEleman;
}
Console.WriteLine("Veri girii tamamlandi. Devam etmek icin
ENTER'a basiniz...");
Console.ReadLine();
//Kullanicidan girileri aldiktan sonra verileri gormek isteyip //istemedii sorulur.
etiket:
Console.Write("Girilen notlari gormek ister misiniz? [E] [H] : ");
string devamMi = Console.ReadLine().ToLower();
//Kullanici eer [E] yazarsa, ona orenci sayisini ve notlarini gosterilir.
//Kullanici eer [H] yazarsa, program sonlandirilir.
//Kullanici eer [E] ve [H] diinda bir deer girerse, tercihi tekrar //sorulur...
switch (devamMi)
{
case "e":
Console.WriteLine("\n{0} orencinin notlari sirasiyla
aaidadir:\n",notlar.Length);
foreach (byte gecici in notlar)
{
Console.Write(gecici + " ");
}
break;
case "h":
break;
default:
goto etiket;
}
9 / 36
ETM :
DZLER VE METOTLAR
Bolum :
Diziler ve Koleksiyonlara
Giri
Konu :
Koleksiyonlara Giri
10 / 36
Add New Comment