Csharp Döngüler, İç içe Döngü Kullanımı

İç içe Döngülere geçmeden önce basit bir örnek yapalım; 

Örnek: 12 ay boyunca domatesin fiyatı değişmektedir, klavyeden her ay domatesin fiyatını alarak yıl sonu ortalama fiyatı bulunuz. 

using System;
 
namespace ForOrtalamaFiyat
{
    class Program
    {
        static void Main(string[] args)
        {
            double fiyat, toplam=0, ortalamafiyat;
            
            for (int i = 1; i <= 12; i++)
            {
                Console.Write("{0}.ay domates fiyatı:", i);
                fiyat= double.Parse(Console.ReadLine());
                toplam += fiyat;
            }
            ortalamafiyat = toplam / 12;
            Console.WriteLine("Ortalama Fiyat:{0}", ortalamafiyat);
        }
    }
}

Dikkat ederseniz döngümüz 1'den 12'ye kadar, yani bir yıldaki ay sayısı kadar dönüyor. Her dönüşte kullanıcıdan o ayki domates fiyatını soruyoruz. Kullanıcı fiyatı girdiğinde toplam değişkenine ilave ediyoruz. Döngü bittikten sonra toplam değişkeninde 12 ayın fiyatı birikmiş oluyor.  

Döngüden çıktığımızda toplamı 12'ye bölerek Ortalam Fiyatı buluyoruz ve ekrana yazdırıyoruz.




İç içe Döngüler (Nested Loops)

Csharp programlama dilinde bir döngünün içinde başka döngüler açmamız gerekebilir. Örneğin bir sınıfta 3 tane öğrencimiz olsun. Her biri 4 ders alsın. Tüm öğrencilerin notlarını klavyeden almak isteyelim. Bu durumda ilk döngü öğrenci sayısı kadar dönerken, ikinci döngü ders sayısı kadar dönecektir. 

Bu örnekten de anlayacağınız gibi İç içe döngülerde en içteki döngü tamamlandıktan sonra, bir dışındaki döngü bir artacaktır. Sonra tekrar içteki döngü çevrimini tamamlayacaktır.



using System;
 
namespace iciceForOgrenciDers
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int ogrenci = 1; ogrenci <= 3; ogrenci++)
            {
                for (int ders=1; ders<=4; ders++)
                {
                    Console.WriteLine("{0}.öğrencinin {1}.dersi", ogrenci, ders);
                }
 
            }
        }
    }
}

Aşağıdaki tabloya baktığınızda en i değeri 1 defa döndüğünde, içindeki tam bir dönüşünü tamamlayacaktır. bakarsanız i=1 iken j=1,2,3,4; sonra i=2 iken j=1,2,3,4; sonra i=3 iken j=1,2,3,4 değerlerini almaktadır.

i değeri j değeri
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
 
Şimdi aynı örneği biraz genişletelim. Öğrencilerin derslerden aldıkları notları klavyeden alıp, ortalamayı yazdıralım. Programda, her dersin notu girildikten sonra toplam değişkeninde toplayacağız, ders döngüsü bittikten sonra ise ortalamayı bulacağız.

Yalnız her öğrenciden diğerine geçişte yani ders döngüsü bittikten sonra toplam değişkeninin içini sıfırlıyoruz. Bu işlemi unutursak; toplam değişkeninde diğer öğrencilerin de notları birikecek ve ortalama yanlış çıkacaktır. 

using System;
 
namespace iciceForOgrenciDers
{
    class Program
    {
        static void Main(string[] args)
        {
            double not, toplam, ortalama;
            for (int ogrenci = 1; ogrenci <= 3; ogrenci++)
            {
                toplam = 0; ortalama=0;
                for (int ders=1; ders<=2; ders++)
                {
                    Console.Write("{0}.öğrencinin {1}.dersi :", ogrenci, ders);
                    not= double.Parse(Console.ReadLine());
                    toplam = toplam + not;
                }
                ortalama = toplam/2;
                Console.WriteLine("Toplam :{0}", toplam);
                Console.WriteLine("{0}.öğrencinin Ders Ortalaması:{1}",ogrenci,ortalama);
 
            }
          
        }
    }
}

Bu örneği bir adım daha ileri götürebiliriz. Öğrenci sayısını ve ders sayısını sabit değer olarak girdik, bu değerleri de değiştirebiliriz. Örneğin üniversite ortamını düşünün, her bir öğrenci farklı sayıda ders alabilir. Bazılarının alt sınıftan tekrar aldıkları varken, bazıları üst sınıftan dersler alabilir. Bu durumda örneğimizi aşağıdaki gibi daha esnek hale getirebiliriz.

using System;
 
namespace DonguIcIceOrtalamaBul
{
    class Program
    {
        static void Main(string[] args)
        {
            int ogrenciSayisi, dersSayisi;
            double dersNotu, ortalama, toplam;
         
           Console.Write("Öğrenci sayısını giriniz:");
            ogrenciSayisi = int.Parse(Console.ReadLine());
 
            for (int i=1; i<=ogrenciSayisi; i++)
            {
                Console.Write("Kaç dersiniz var:");
                dersSayisi = int.Parse(Console.ReadLine());
                toplam = 0; ortalama = 0;
 
                for(int j=1;j<=dersSayisi; j++)
                {
                    Console.Write("{0}.ders notunu giriniz:",j);
                    dersNotu = double.Parse(Console.ReadLine());
                    toplam += dersNotu;
                }
                ortalama = toplam / dersSayisi;
                Console.WriteLine("Ortalamanız:{0}", ortalama);
               
            }
 
 
        }
    }
}

Yukarıdaki kodların çalışan hali aşağıdaki gibidir.


Farklı örnekler yaparak, kendinizi geliştirebilirsiniz. İç içe döngüleri daha da artırabiliriz. Şu ana kadar maksimum iç içe üç döngü kullandım, fazlasını hiç kullanmadım. Sizin de ihtiyaç duyacağınız ağırlıklı olarak iç içe iki döngüdür.


İyi çalışmalar,
Oğuzhan TAŞ
Ocak 2015 Bookmark and Share