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);
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 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="">7>
{
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
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
-
Listeleme işlemi
§
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.
-
Çı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.
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.
.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
.SetValue(Veri,
inisNo0,indisNo1,…):veriyi dizi boyutuna uygun olarak verilen indis
numarasına yazar
.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ü
Kaynak:Reha Gönüllü
Hiç yorum yok:
Yorum Gönder