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 Bir 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]; C dilinde eleman sayısı dizi tanımlanırken verilmek zorunda idi (int sayilar[10]; şeklinde) ve sonradan değiştirilemiyordu.
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]); }
Ç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} };
Notlar C# dilinde new kullanımının faydası: int[] sayilar; Dizinin henüz sadece türü belli büyüklüğü belli değil sayilar = new int[10]; Şu anda 10 elemanlı olduğunu belirledik sayilar = new int[20]; Şimdi de 20 elemanlı olarak yeniden tanımladık foreach (C: for each, VB: For Each) döngüsü ile dizinin eleman sayısı kadar döngü adımı sağlanabilir: int[] sayilar = {4, 5, 6, 1, 2, 3, -2, -1, 0}; foreach (int i in sayilar) Console.WriteLine(i);
Ödevler 10 elemanlı bir dizinin elemanlarının aritmetik ortalaması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.
Ö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.