25 Oca 2016

Nesne Tabanlı Programlamaya Giriş - Metotlar ve Kullanım Şekilleri

1-Değer Döndürmeyen Metotlar
Bu tarz metotlar void olarak tanımlanır. Çağıran kişiye hiçbir değer göndermez. Sadece scope'lar arasında belirtilen işlem gerçekleşir. Parametre alabilir ya da almaz. Kullanım kalıbı;
void MetotIsmi(veriTipi1 parametre1, veriTipi2 parametre2,...)
{
    ifade;
}


2-Değer Döndüren Metotlar
Bu metotlarda parametreli yada parametresiz olarak tanımlanabilir. Çağırana return komutu vasıtasıyla bir değer döndürür. O değer istenirse bir değişkene atanır, istenirse de işlemlerde kullanılır. Kullanım şekli;
veriTipi MetotIsmi(veriTipi1 parametre1, veriTipi2 parametre2,...)
            {
                return ifade;
            }
Burada return edilen ifade ile metodun veri tipi muhakkak aynı veri tipi olmalıdır. Return ifadesi metottan çıkış noktasıdır.

3-Recursive (Kendisini Çağıran) Metotlar
Bir metot diğer metotları çağırdığı gibi kendisini de çağırabilir. Bu tip metotlara recursive metotlar denir. Örnek:
public static int Faktoriyel(int sayi)
        {
            int sonuc = sayi;
            if(sayi != 1)
            {
                sonuc = sayi * Faktoriyel(sayi - 1);
            }
            return sonuc;
        }
Yukarıdaki metot faktoriyel hesabı yapıyor. sayi 1'den farklı ise sayi'yi kendinden 1 eksik olan Metot ile çarpıyor. Bu içerdeki metot da onu kendisinden 1 eksik için yapmaya devam ediyor. sayi 1'e kadar azalarak bu şekilde gidiyor ve en son 1 olduğunda sonuc döndürülüyor. Bu metotu çağıran ana program ise aşağıdaki gibidir;
static void Main(string[] args)
        {
            Console.WriteLine("Faktoriyeli alınacak sayıyı giriniz: ");
            int a = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(Faktoriyel(a));
            Console.ReadKey();            
        }
Sayı klavyeden girilir. Metoda parametre olarak gönderilerek faktoriyel hesabı yapılır ve ekrana yazdırılır. Klavyeden bir a sayısı girdiğimizde programın akışı Faktoriyel metoduna devredilir. O da bir sonraki Faktoriyel metoduna devreder. Böylece iç içe çağırma durumu yaşanır.
Recursive metotlar kodlanırken sonsuz döngüye girilmemesi için dikkatli olmak gerekir. 
Recursion sayısına dikkat etmek gerekir. C#'ta birbirini çağıran her metot stack dediğimiz programımızın akışını saklayan bir liste içinde saklanır. Stack, 1 megabayta kadar çıkabilir. Sınır aşılırsa StackOverflow hatası alınır. StackOverflow hatasından kaçmanın 2 yolu vardır;
1-Recursive metoduna limit koymak:
Recursive metoda bir parametre daha eklenir. Metot her çağrıldığında bu parametre bir arttırılarak yada eksiltilerek kontrol edilebilir.
2-GOTO kullanarak metodu Recursive yazmamak:
Eğer recursion sayısı 25.000-100.000 gibi sayıları geçecekse stackOverflow hatası almak normaldir. Bu durumlarda GOTO kullanılabilir.


Hiç yorum yok:

Yorum Gönder