Konu Anlatımı
Diziler ve Koleksiyonlarla Çalışma
Bir sınıfın notlarını, bir laboratuvarun sıcaklık kayıtlarını ya da bir ağdaki cihaz adreslerini saklamak için her seferinde ayrı bir değişken tanımlamak pratik değildir. Aynı tipteki bu değerleri tek bir yapıda toplamanın yolu dizidir. Dizi, sıralı ve ardışık bellek hücrelerinden oluşur; bu nedenle elemanlara sıra numarasıyla, yani indeksle doğrudan erişilir. Diziler ve koleksiyonlar, veri toplama ve işleme algoritmalarının temel taşlarıdır.
Bu derste ne öğreneceğiz?
Bu konuda önce dizinin nasıl tanımlandığını ve indeksleme kuralını öğreneceğiz. Ardından dizi elemanlarını foreach ve for döngüleriyle gezip toplam, ortalama, en büyük ve en küçük değerleri hesaplayacağız. Sıralama ve arama işlemlerini karşılaştırmalı olarak inceleyeceğiz. List koleksiyonunun diziden farkını ve eleman ekleme silme işlemlerini öğreneceğiz. Son olarak iki diziyi paralel kullanarak kayıtları eşleştirmeyi ve ağırlıklı istatistik hesaplamayı uygulayacağız.
1. Ön bilgi: veri tipi ve bellek düzeni
Dizi tanımlanırken elemanların veri tipi açıkça belirtilir. Beş tane tamsayı tutulacaksa beş elemanlı bir tamsayı dizisi, on tane metin tutulacaksa on elemanlı bir metin dizisi yazılır. Dizinin eleman sayısı tanım anında sabitlenir; sonradan büyütülmek isteniyorsa liste kullanılmalıdır. Diziler referans tipidir; tanımladığınız nesne bellekte ardışık olarak durur ve bu düzen bellekten hızlı erişim sağlar.
Dizi adı bir nesne yönelimli sınıf örneğidir ve kullanıldığında nesnenin adı yazılır. Dizi oluşturulduktan sonra indeks sıfırdan başlar. Beş elemanlı bir dizinin geçerli indeksleri 0, 1, 2, 3 ve 4'tür; 5 numaralı indeks geçersizdir ve çalışma zamanında hata üretir. Bu kural öğrencilerin en sık karşılaştığı hata kaynağıdır.
2. Dizi tanımlama ve elemana erişim
C# dilinde dizi tanımlanırken köşeli parantez kullanılır: int[] notlar = new int[5]; ifadesi beş elemanlı bir tamsayı dizisi oluşturur. Alternatif olarak değerler tanım anında da verilebilir: int[] notlar = new int[] { 45, 62, 78, 51, 88 };. Elemana erişirken dizi adı ve indeks köşeli parantez içinde yazılır: notlar[2] = 78; satırı dizinin üçüncü elemanına 78 değerini atar.
Bir dizinin uzunluğu Length özelliğiyle öğrenilir. Bu özellik döngü kurarken çok kullanılır, çünkü dizinin eleman sayısı değişirse döngünün sınırını elle güncellemek gerekmez. Dizi elemanlarının hepsini ekrana yazdırmak için döngü kurma kalıbı kullanılır; her iki yazım da aynı sonucu verir ancan kod uzunluğu açısından foreach daha kısadır.
3. foreach ile gezme ve istatistik hesabı
foreach döngüsü bir koleksiyonun elemanlarını sırayla gezmek için tasarlanmıştır ve dizilerde en sık kullanılan yazımdır. Döngü gövdesinde elemanın değeri geçici bir değişkende tutulur; indeksleme gerekmediği sürece döngü değişkeni yazılmaz. Bu yazım, dizinin indeks sırasına bağlı olmadığı her durumda tercih edilir.
Dizi elemanlarının toplamı, ortalaması, en büyük ve en küçük değeri bu döngüyle bulunur. Toplam için biriktirici bir değişken tutulur ve her adımda üzerine elemanın değeri eklenir. Ortalama, toplamın eleman sayısına bölünmesiyle elde edilir. Sekiz notluk bir dizi için notlar 45, 62, 78, 51, 88, 34, 67 ve 92 ise toplam 517 bulunur ve ortalama 517 / 8 = 64,63 çıkar.
4. Tamsayı bölmesi tuzağı
C# dilinde iki tam sayıyı böldüğünüzde sonuç da tam sayıdır; kesirli kısım atılır. Döngü kurma ya da istatistik hesabı içinde bu kurala dikkat edilmelidir, çünkü yanlışlıkla tam sayı bölmesi yapıldığında sonuç sessizce küçük çıkar ve program hata vermez. Örneğin 10 / 3 yazıldığında ekrana 3 çıkar; kesirli sonuç istediğinizde 10 / 3 = 3,33 değerini kullanmalısınız.
Ortalama hesabında doğru çözüm, toplamı double bir değişkende tutmaktır. Çünkü toplam değişkeni de tam sayı tipindeyse bölme işlemi yine tam sayı bölmesi olur. Bu nedenle ortalama gerektiren her hesapta ilk bölme yapılmadan önce en az bir değere ondalık noktası ya da ondalık sayı tipi atanmalıdır. Bu kural sınavlarda sık sorulan bir ayrıntıdır.
5. Sıralama ve arama
Dizi sıralandığında arama işlemi çok kolaylaşır. Sıralı bir dizide arama, ortadan başlayarak elemanları atlayarak yapılabilir; bu yönteme ikili arama denir ve n elemanlı dizide en fazla n / 2 adımda sonuç bulunur. Sırasız dizide ise her eleman tek tek kontrol edilir ve n elemanlı dizide en fazla n adım gerekir.
Sıralamanın maliyeti de eleman sayısıyla ilişkilidir. Bir elemanın yerine oturması için diğer tüm elemanlarla karşılaştırılması gerektiğinden n elemanlı bir dizide en kötü durumda n × (n − 1) / 2 karşılaştırma yapılır. Bu nedenle küçük veri kümelerinde sıralama pratikte anında tamamlanırken, çok büyük listelerde sıralama yerine önceden sıralanmış bir veri kaynağı kullanmak daha akıcıdır.
6. List koleksiyonu ve diziden farkı
Dizinin eleman sayısı tanım anında sabittir; bu nedenle uzunluğu değişmeyecek veriler için dizi uygundur. Eleman sayısının çalışma sırasında değişmesi gerekiyorsa List koleksiyonu kullanılır. List koleksiyonuna Add ile eleman eklenir, Remove ile eleman silinir, Count özelliğiyle eleman sayısı okunur ve Contains ile bir elemanın varlığı denetlenir.
List koleksiyonunun önemli bir kolaylığı Add ve Remove işlemlerinde geçici değişken tanımlamaya gerek olmamasıdır. Dizi silme işleminde kaydırılan indeks hesaplanmalı ve geriye kalan elemanlar tek tek taşınmalıdır. List bu işlemi kendisi yapar; bu nedenle eleman sayısı değişken olan uygulamalarda List tercih edilir.
7. Paralel dizilerle kayıt eşleştirme
Birbiriyle ilişkili iki grup veriyi tutmak için iki ayrı dizi kullanılır: biri öğrenci no, diğeri not değerlerini tutar. Her iki dizinin uzunluğu eşit olduğu için aynı indeksteki elemanlar aynı kayda aittir. Örneğin öğrenci numaraları 1001, 1002 ve 1003 olan üç öğrencinin notları sırasıyla 78, 86 ve 92 ise toplam 256 / 3 = 85,33 ortalamayla sınıf ortalaması bulunur.
Paralel diziler kullanışlıdır ama hataya açıktır: bir diziye eleman eklenip diğerine eklenmezse eşleşme bozulur. Bu nedenle ikinci bir dizi yerine her iki alanı bir arada tutan List kullanımı daha güvenlidir. İki sınıfın ortak ortalaması bulunurken ağırlık dikkate alınmalıdır: 256 + 140 = 396 toplam not ve 5 öğrenci için 396 / 5 = 79,2 ortak ortalama çıkar; sınıf ortalamalarının aritmetik ortalamasını almak yanlış sonuç verir.
Basit örnek
45, 62, 78, 51, 88, 34, 67 ve 92 değerlerinden oluşan sekiz elemanlı bir not dizisinde toplamı, ortalamayı, en büyük ve en küçük değeri bulunuz. Toplam için biriktirici kullanılır ve her eleman eklenir: 45 + 62 + 78 + 51 + 88 + 34 + 67 + 92 = 517 bulunur. Ortalama 517 / 8 = 64,63 olur. En büyük değer 92 ve en küçük değer 34'tür; en büyük değer 7. indekste, en küçük değer 5. indekste yer alır.
İleri örnek
Üç sınıfın notlarını tek bir dizide birleştirip sınıf bazında ortalama hesaplayınız. Sınıf A için 78, 86 ve 92; sınıf B için 55 ve 85; sınıf C için 74, 69 ve 81 değerleri verilmiştir. Sınıf A toplamı 256 ve sınıf B toplamı 140 olduğundan bu iki sınıfın ortak ortalaması 396 / 5 = 79,2 çıkar. Üç sınıfın birlikte ortalaması için sınıf ortalamalarının ortalamasını almak yerine toplamları toplayıp toplam öğrenci sayısına bölmek gerekir.
Adım adım çözülmüş örnek
Soru: 64, 25, 78 ve 12 değerlerinden oluşan dört elemanlı bir diziyi küçükten büyüğe sıralayınız ve 25 değerinin sıralanmış dizideki indeksini bulunuz.
Adım 1: Dizi karşılaştırılabilir biçimde yazılır: 64, 25, 78, 12. Adım 2: En küçük eleman aranır ve ilk konuma taşınır; 12 bulunur. Adım 3: Kalan üç eleman kendi aralarında sıralanır: 25, 64, 78. Adım 4: Sıralanmış dizi 12, 25, 64, 78 olarak yazılır. Adım 5: 25 değerinin indeksi bulunur; sıralama sıfırdan başladığı için indeks 1'dir. Cevap: sıralanmış dizi 12, 25, 64, 78 ve 25 değerinin indeksi 1.
Kavram karşılaştırma tablosu
| Özellik | Dizi | List koleksiyonu |
|---|
| Eleman sayısı | Tanım anında sabitlenir | Çalışma sırasında değişebilir |
| Uzunluk bilgisi | Length özelliği | Count özelliği |
| Eleman ekleme | Geçici dizi gerekir | Add yöntemi |
| Eleman silme | Kaydırma işlemi gerekir | Remove yöntemi |
| Varlık denetimi | Döngüyle aranır | Contains yöntemi |
| Erişim hızı | İndeksle doğrudan ve hızlı | İndeksle doğrudan |
| Geçerlilik kuralı | İndeks sıfırdan başlar | İndeks sıfırdan başlar |
| Geçerli arama yöntemi | Döngü kurma ile sıralama | Sıralama sonrası arama |
Sık Yapılan Hatalar
- Tamsayı bölmesini fark etmemek: iki tam sayı bölündüğünde sonuç tam sayıdır. 10 / 3 yazıldığında ekrana 3 çıkar; ortalamada mutlaka ondalık tip kullanılmalıdır.
- Uzunlukta son indeksi kullanmak: Beş elemanlı bir dizinin son geçerli indeksi 4'tür. Dizi uzunluğu kadar dönmek geçersiz indekse çıkar ve program hata verir.
- Dizi sabit uzunlukta olacağını unutmak: Eleman sayısı çalışma sırasında değişecekse dizi yerine List kullanılmalıdır; diziye ekleme yapılamaz.
- Paralel dizileri farklı büyütmek: Biri 4 diğeri 3 elemanlı iki dizi eşleştirildiğinde sonraki kayıtlar kayar. Kayıt alanları birlikte tutulmalıdır.
- Sınıf ortalamalarını ağırlıksız ortalamak: Farklı öğrenci sayıları olan sınıfların ortalamaları doğrudan toplanıp bölünürse sonuç hatalı olur; toplamlar üzerinden hesaplanmalıdır.
- Sıralamadan arama yapmayı beklemek: Sırasız bir dizide ikili arama yapılamaz; önce sıralama gerekir.
Özet
Dizi, aynı veri tipindeki elemanları sıralı ve ardışık bellek hücrelerinde tutan bir yapıdır; elemanlarına sıfırdan başlayan indeksle erişilir. Dizi elemanları foreach veya for döngüsüyle gezilerek toplam, ortalama, en büyük ve en küçük değerler bulunabilir. Ortalamada tamsayı bölmesi tuzağına dikkat edilir: iki tam sayı bölündüğünde sonuç tam sayıdır, bu yüzden toplam ondalık tipte tutulmalıdır. Dizi sıralandığında ikili arama ile eleman bulma adımları yarıya iner. Eleman sayısı çalışma sırasında değişecekse List koleksiyonu kullanılır; Add, Remove, Count ve Contains yöntemleriyle yönetilir. İlişkili iki veri grubu tutulacaksa paralel diziler yerine alanları birlikte taşıan tek bir liste kullanılması eşleşme hatasını önler. Birden çok grubun ortak ortalaması, toplamların toplanıp toplam eleman sayısına bölünmesiyle bulunur.
Kendini dene
Şu soruları cevaplayarak konuyu pekiştir: (1) 10 elemanlı bir dizide en geçerli indeks kaçtır, kaçıncı elemana erişilir? (2) 78, 64 ve 59 notlarının ortalamasını C# yazımıyla hesaplayınız ve hangi tipi kullandığınızı gerekçelendiriniz. (3) 5 elemanlı bir diziyi küçükten büyüğe sıralayınız ve sıralamada en fazla kaç karşılaştırma yapılabileceğini bulunuz. Cevapları defterine yazarken her hesabın ara adımını gösterin; puana göre değerlendirmede veri yapısının seçimi, döngü yazımı, hesabın doğruluğu ve yorum ayrı ayrı değerlendirilir.