PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği
Dizi (Array) Birbiri ile ilişkili verilerin bir sıra halinde kaydedilmesi ve işlenmesi gerektiği durumlarda diziler kullanılır. Dizi içindeki elemanların hepsi aynı veri tipindedir ve bellekte artarda saklanırlar. Diziye eleman ekleme ve dizideki elamanları okuma işlemleri genellikle döngüler kullanılarak yapılır.
Dizi Tanımlama C# dilinde dizi tanımı yapmak için veri türünden sonra [] kullanılır int[] sayilar; Dizinin eleman sayısını belirlemek veya değiştirmek için new komutu kullanılır: sayilar = new int[10]; Eleman sayısı dizi tanımlandığı anda da new komutu kullanılarak belirlenebilir: char[] isim = new char[15]; NOT: C dilinde eleman sayısı dizi tanımlanırken verilir ve sonradan değiştirilemez. Sözdizimi olarak farklılık ise dizi isminde sonra [] kullanılmasıdır: int sayilar[10];
Dizilerde İndis Kullanımı Dizilerin ilk elemanının indisi sıfırdır: Önceki slaytta tanımladığımız sayılar dizisinin son elemanı sayilar[9] olacağı için, eğer sayilar[10]’a değer atanırsa derleme sırasında hata vermez, fakat program çalışırken «IndexOutOfRangeException: Dizin, dizi sınırlarının dışındaydı» yazılı bir hata mesajı görüntülenir ve program sonlandırılır. Dizinin hangi elemanına değer atanacak ise köşeli parantez içinde o elemanın indis değeri yazılmalıdır: sayilar[5] = 1500; isim[3] = 'K'; sayilar dizisinin 6. elemanına 1500, isim dizisinin 4. elemanına da ‘K’ değerleri atanıyor.
1-10 arasındaki sayıların karesini bir diziye kopyalayan ve ekranda gösteren program static void Main(string[] args) { int i; int[] a = new int[10]; for (i = 1; i <= 10; i++) a[i-1] = i * i; Console.WriteLine(a[i-1]); } a dizisi daha küçük boyutta tanımlansa idi yada a[i-1] yerine a[i] kullanılsa idi program hatasız derlenir ama doğru çalışmazdı. Bu program dizi kullanmadan yapılabilir miydi? EVET
Girilen 10 tane tamsayıdan en büyüğünü bularak ekranda gösteren program static void Main(string[] args) { int[] sayilar = new int[10]; int i, enBuyuk; for (i = 0; i < 10; i++) { Console.Write((i + 1) + ". sayıyı giriniz : "); sayilar[i] = Convert.ToInt32(Console.ReadLine()); } enBuyuk = sayilar[0]; for (i = 1; i < 10; i++) if (sayilar[i] > enBuyuk) enBuyuk = sayilar[i]; Console.WriteLine("En büyük sayı = " + enBuyuk); Tek döngü ile yapılabilir miydi? EVET Dizi kullanmadan yapılabilir miydi? EVET (önceki derste yapmıştık) 1 <= i-1 i
Girilen 10 tane tamsayıyı girilme sırasının tersinde ekranda gösteren program static void Main(string[] args) { int[] sayilar = new int[10]; for (int i = 0; i < 10; i++) Console.Write((i + 1) + ". sayıyı giriniz : "); sayilar[i] = Convert.ToInt32(Console.ReadLine()); } for (int i = 9; i >= 0; i--) Console.WriteLine(sayilar[i]); Tek döngü ile yapılabilir miydi? HAYIR Dizi kullanmadan yapılabilir miydi?
toplam=toplam+dizi(i) 15 elemanlı bir sayı dizisine bilgi girişi yapılarak elemanların toplamını bulan program static void Main(string[] args) { int[] dizi = new int[15]; int toplam = 0; for (int i = 0; i < 15; i++) Console.Write((i + 1) + ". eleman: "); dizi[i] = Int32.Parse(Console.ReadLine()); toplam += dizi[i]; } Console.WriteLine("Toplam = " + toplam); AKIŞ ŞEMASI: Başla toplam Dur dizi(i) i,1,15,1 i toplam=toplam+dizi(i)
10 elemanlı iki dizinin eş indisli elemanlarının toplamını gösteren program static void Main(string[] args) { int[] dizi1 = new int[10], dizi2 = new int[10]; for (int i = 0; i < 10; i++) { Console.Write("İlk dizinin " + (i + 1) + ". elemanı : "); dizi1[i] = Convert.ToInt32(Console.ReadLine()); } Console.Write("İkinci dizinin " + (i + 1) + ". elemanı : "); dizi2[i] = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("İki dizinin elemanlarının toplamı : "); for (int i = 0; i < 10; i++) Console.WriteLine(dizi1[i] + dizi2[i]);
Dizilere ilk değer atama Dizi tanımlandığı anda ilk değerler atanabilir: int[] a = { 10, 25, 15, 40, 30 }; char[] b = { 'A', 'l', 't', 'a', 'n' }; Bu şekilde bir tanımlama yapıldığında dizinin boyutu verilen eleman sayısına eşit olacak şekilde belirlenir. Eğer dizi tanımlandıktan sonra elemanlar tek tek girilseydi (a[0] = 10; a[1] = 25; ...), öncesinde new ile boyut vermek gerekecekti.
10 elemanlı iki dizinin eş indisli elemanlarının toplamını gösteren program Daha önce yazdığımız programda kullanıcının 20 tane değer girmesi gerekiyordu. Bu programda ise değerler programcı tarafından veriliyor: static void Main(string[] args) { int[] dizi1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int[] dizi2 = { 2, 7, 9, 2, 3, -1, 5, 7, 4, 1 }; Console.WriteLine("İki dizinin elemanlarının toplamı : "); for (int i = 0; i < 10; i++) Console.WriteLine(dizi1[i] + dizi2[i]); }
foreach döngüsü foreach yalnızca dizilere uygulanabilen bir döngü yapısıdır. Kullanımı şu şekildedir: int[] dizi = { 3, 2, 6, 7 }; foreach (int eleman in dizi) Console.WriteLine(eleman); Yukarıdaki kod dizi adındaki dizinin bütün elemanlarını alt alta ekrana yazdırır. foreach döngüsüyle dizi elemanlarının değerini değiştiremeyiz, sadece ekrana yazdırmak gibi "read-only" işler yapabiliriz.
Çok Boyutlu Diziler [ ile ] arasında 1 virgül ile 2 boyutlu dizi, 2 virgül ile 3 boyutlu dizi, ... tanımlanabilir: int[,] matris = new int[3,3]; char[,] isimler = new char[2,5]; string[,] isimler2 = new string[2,2]; char[,,] isimler2 = new char[2,2,5]; 7 2 1 4 0 -1 5 9 -4 { {7, 2, 1}, {4, 0, -1}, {5, 9, -4} } { {'A', 'l', 't', 'a', 'n'}, {'A', 'l', 'i', ' ', ' '} } { { "Altan", "Ali" }, { "Ahmet", "Veli" } }; {{{'A', 'l', 't', 'a', 'n'}, {'A', 'l', 'i', ' ', ' '}}, {{'A', 'h', 'm', 'e', 't'}, {'V', 'e', 'l', 'i', ' '}}}
3x3 Kare Matris Toplama Programı static void Main(string[] args){ int[,] matris1 = new int[3, 3], matris2 = new int[3, 3]; for (int i = 1; i <= 3; i++) for (int j = 1; j <= 3; j++) { Console.Write("İlk matris " + i + ". satır " + j + ". sütun: "); matris1[i - 1, j - 1] = Convert.ToInt32(Console.ReadLine()); } Console.Write("İkinci matris " + i + ". satır " + j + ". sütun: "); matris2[i - 1, j - 1] = Convert.ToInt32(Console.ReadLine()); for (int i = 0; i <= 2; i++) { for (int j = 0; j <= 2; j++) Console.Write("{0,5}", matris1[i, j] + matris2[i, j]); Console.WriteLine(); Ekrana formatlı yazdırma hakkında bilgi için: hafta3-ödev2-AsalMükemmel.cs
Dizileri kapsayan dizi C dilinde iki boyutlu dizi [][] şeklinde tanımlanır. C# dilinde ise bu kullanım dizilerin dizisi (Jagged Array) anlamına gelir. İçerdiği her dizi aynı sayıda elemana sahip olmayabilir. int[][] numbers = { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
Diziler ile ilgili Yöntemler: GetLength GetLength yöntemi ile dizinin ilgili boyutundaki eleman sayısı elde edilebilir. Parametre olarak eleman sayısı hesaplanacak olan boyut verilir (ilk boyut sıfırdan başlar): int[,] dizi = {{2, 4, 2}, {7, 10, 4}}; Console.WriteLine(dizi.GetLength(0)); Console.WriteLine(dizi.GetLength(1)); Ekranda önce ilk boyuttaki eleman sayısı yani 2, sonra ikinci boyuttaki eleman sayısı yani 3 yazılır. NOT: Aslında tanımladığımız her dizi Array sınıfı türünden bir nesnedir. Sınıflardan 2 hafta sonra bahsedilecektir. Eğer dizimiz tek boyutlu ise GetLength() yöntemi yerine Length özelliği ile de boyutunu elde edebiliriz.
Diziler ile ilgili Yöntemler: CopyTo CopyTo yöntemi ile dizinin tüm elemanları başka bir diziye kopyalanabilir. Parametre olarak hangi diziye kopyalanacağı ve hangi indisinden başlanacağı verilir: int[] dizi1 = { 1, 2, 3, 4 }; int[] dizi2 = new int[10]; dizi1.CopyTo(dizi2, 3); foreach (int eleman in dizi2) Console.Write(eleman + ","); Ekran Çıktısı: 0,0,0,1,2,3,4,0,0,0,
Array Sınıfı: Copy Array sınıfının Copy yöntemi ile dizinin bazı elemanları başka bir diziye kopyalanabilir. İlk parametre hangi diziden, ikinci parametre hangi diziye, üçüncü parametre kaç eleman: int[] dizi1 = { 1, 2, 3, 4 }; int[] dizi2 = new int[10]; Array.Copy(dizi1, dizi2, 3); foreach (int eleman in dizi2) Console.Write(eleman + ","); Ekran Çıktısı: 1,2,3,0,0,0,0,0,0,0,
Array Sınıfı: Sort ve BinarySearch Dizideki elemanları sıralamak için Sort, sıralı dizide eleman aramak için BinarySearch yöntemleri kullanılabilir. String[] dizi = { "altan", "osman", "hasan", "zehra", "tolga", "ali" }; Array.Sort(dizi); Console.Write(Array.BinarySearch(dizi, "ali")); Yukarıdaki dizi sıralandığında «ali» en başta yer alacağı için BinarySearch bu elemanın dizideki yeri olarak «0» döndürür. Eğer sıralama yapılamadan BinarySearch ile arama yapılırsa «ali» bulunamaz ve «-1» döndürülür. NOT 1: Yalnızca tek boyutlu diziler Sort ile sıralanabilir ve BinarySearch ile aranabilir. NOT 2: Sıralama ve arama algoritmalarını 1 yıl sonra veri yapıları dersinde öğrenecek ve C dili yazacaksınız. Array sınıfındaki bu yöntemler algoritma ile programcıyı uğraştırmadan sıralama ve arama yapılmasını sağlar. https://tr.wikipedia.org/wiki/ikili_arama_algoritması
Ödevler 10 elemanlı bir dizinin elemanlarının aritmetik ortalamasını, varyansını ve standart sapmasını bulan programı yazınız. Matris Çarpımı programı yazınız. Matrislerin boyutlarını kullanıcı belirleyecek ve sonrasında değerleri girecektir. Matrislerin boyutları çarpma işlemine göre uygun olması için ilk matrisin sütun değeri ile ikinci matrisin satır değeri eşit girilmesi sağlanacaktır. Kullanıcının ENTER tuşuna basana kadar klavyeden girdiği her şeyi tersten (sondan başa doğru) gösteren programı yazınız. Varyans dizideki tüm elemanların ortalamadan uzaklıklarının karelerinin ortalamasıdır. Standart sapma varyansın kare köküdür.
Ödevler 4. 100 Adam ve 100 kapımız var. 1. adam 1’in katları olan kapılardan, 2. adam 2’nin katları olan kapılardan, ...., N. Adam N’in katları olan kapılardan, ... , 100. Adam 100’ün katları olan kapılardan geçerek kapıların konumlarını değiştiriyor. (Kapı açıksa kapatıyor, kapalıysa açıyor). En başta bütün kapıların kapalı olduğunu kabul edersek, 100. adam da geçtikten sonra hangi kapıların açık olduğunu bulan programı yazınız.
Ödevler 5. Romalı problemi: Roma’da Kral 21 kişinin öldürülmesine karar veriyor. Cellat fazla yorulmamak için öldürülecek olanları çember biçiminde diziyor. Herkesin eline bir balta veriyor. Öldürme kuralı olarak da 2. Kişi 3. Kişiyi öldürüyor. 5. Kişi 6. Kişiyi öldürüyor. Yani 2 kişi atlayıp 3. kişi öldürülüyor. Bu son iki kişi kalana kadar sürüyor. Son kalan iki kişi serbest bırakılacaktır. Serbest bırakılan kişilerin hangi numaralar olduğunu bulan programı yazınız.