C# Fibonacci Serisi

Arkadaşlar bu yazıda Fibonacci serisi ne olduğuna değineceğiz.

Fibonacci Nedir?

Fibonacci serisi dediğimiz şey aslında bir dizidir.Bu serinin özelliği şu; dizinin elemanları, ondan önceki iki elemanın toplamıdır.Yani;
0 1 1 2 3 5 8 ...(Bu şekilde sonsuza gider)
Yukarıdaki fibonacci serisi şu şekilde oluşturuldu;
0 1 (0+1) (1+1) (1+2) (2+3) (3+5) 8
Mesela, 2 sayısına bakalım; kendisinden önceki iki sayı; 1 ve 1, 1+1=2, yani kendisini verdi.Başka bir örnek olarak 5'e bakalım; kendisinden önceki iki sayı 2 ve 3, 2+3=5 yine kendisini verdi.Seri bu şekilde sonsuza kadar gider.
Ne işe yarar diye sorucak olursanız, fibonacci serisi şifreleme işlemleri için kullanılır.
Şimdi isterseniz fibonacci oluşturmadan bahsedelim;
Yukarıda da gördüğünüz gibi fibonacci serisinin başı 0 ve 1.Bizim yapmamız gereken bir döngü ile sürekli bir sonraki fibonacci sayısını bulmak.
Eğer birinci sayıya "a", ikinci sayıya "b" dersek, üçünü sayı "c = a + b;" olmalıdır.a = 0, b = 1, c = a + b, dersek; 3 adet fibonacci sayısını bulmuş oluruz.
Yani serimiz, 0(a) 1(b) 1(c) şeklinde olacaktır.
Şimdi yapacağımız işlem ise, değişkenleri sürekli kaydırarak bir sonraki fibonacci sayısını bulmaktır.Bunu da şu şekilde yapacağız;
a = b; //b'nin değerini a'ya attık
b = c; //c'nin değerini b'ye attık
c = a +b; //a ve b'nin toplamını c'ye attık
Şimdide istediğimiz kadar fibonacci sayısısı yazdıran bir program yazalım;


Yukarıdaki kodları açıklayalım; ilk olarak kullanıcıdan kaç adet fibonacci sayısı görüntülenmesini istediğini sorup, girilen değeri adet değişkenine attık.Daha sonra "a = 0" ve "b = 1" olarak fibonacci serimizin ilk 2 elemanını tanımladık."Console.Write(a +" "+ b + " ");" diyerek tanımladığımız ilk iki elemanımızı ekrana yazdırdık.Daha sonra for döngümüzün içinde her defasında kaydırma işlemimizi yaparak sayımızı ekrana yazdırdık.For döngümüzün sayacının 3'ten başlamasının sebebi ise ilk 2 elemanımızı zaten yazdırmış olmamızdır.
Programda birkaç deneme yapınız.Göreceksiniz ki 48 ve üstü bir sayı girdiğinizde sayılar negatif(-) sayı olmaya başlayacaktır.Bu Int tipi değişkenin kapasitesi ile ilgili bir durumdur.Eğer a,b ve c değişkenlerimizi tanımlarken türünü int değilde long olarak belirtirseniz sorun çözülecektir.Ama unutmayınki long değişkeninde bir sınırı vardır.
Fibonacci serisini formül ile anlatmak gerekirse;

Fibonacci hakkında anlatacaklarım bu kadar.Umarım yardımcı olabilmişimdir.İyi Günler..
Umut Coşkun

C#'ta Diziler

Arkadaşlar geçen 2 yazıda döngüleri incelemiştik, döngülerin daha kullanışlı olabilmesi ve bir anlam ifade etmeleri için dizilerle birlikte kullanılmaları çok önemlidir.Daha doğrusu dizi kullanmadan döngülerin bize katkısı pekte fazla olmayacaktır.İşte bu yüzden bu yazıda dizi(array) yapısını inceleyeceğiz.İsterseniz hemen başlayalım..

Dizi nedir? Yapısı nasıldır?

Diziler bize aynı tipteki verilerimizi tek değişken içinde barındırabilmemizi ve daha kolay kullanabilmemizi sağlayan bir yapıdır.
Yapısı aslında çok basittir, eğer verileri tuttuğumuz yere oda dersek; dizi, tek sıra halindeki odalardan oluşur.Mesela isimler[3] = "umut"; şeklinde bir ifade; "isimler" adındaki dizimizin 3 numaralı odasına "umut" verisini koydu.Başka bir örnek vermek gerekirse; string csharp = isimler[3]; burada da oluşturduğumuz csharp isimli değişkene isimler dizisinin 3 numaraları odasındaki veriyi aktardık.Buradaki 3 sayısına "index" denir, tabi ki bu sadece 3 için geçerli değil, "dizi[x]" gibi bir satırda x olan yerdeki rakama index denir.İlk olarak tek boyutlu dizileri ve sonra çok boyutlu dizileri inceleyeceğiz.Eğer tek boyutlu diziler için konuşmak gerekirse yapısı sadece yan yana dizmekten ibarettir.Anlaşılmasıda sanırım kolay.

Dizi nasıl tanımlanır? Değer nasıl atanır?

Dizi en basit yollarla aşağıdaki gibi tanımlanır;
< veri tipi >[] < değişken ismi > = new < veri tipi >[< dizi boyutu(eleman) >];
Mesela örnek olarak int tipinde ve boyutu 10 olan bir dizi atayalım;
int[] kelime = new int[10];
Kelime adında dizimizi tanımladık, en temel olarak böyle ama mesela dizi boyutunu tanımlarken elle bir sayı girmek yerine bir değişkeni kullanabilirsiniz, tabi sayısal bir değişken olmak şartıyla;
int boyut = 20; int ilgincBirDizi = new int[boyut];
Yukarıdaki örnekte boyut adlı değişkenimizi ilgincBirDizi adındaki dizimizin boyutunu tanımlarken kullandık, yani 20 yaptık.
İsterseniz dizinin elemanlarını tanımlama anında da verebilirsiniz.Mesela;
string[] isimler = new string("Aşık veysel","Namık Kemal","Fatih Sultan Mehmet");
Yukarıda isimler adında string tipinde bir dizi tanımlayıp içerisine 3 tane veri girdik, veri girerken aralarında virgül atmalısınız.Burada "Aşık Veysel" verisine erişmek için "isimler[0]" kullanmalıyız.Çünkü dizilerde elemanlar 1'den değil 0'dan başlar ve dizinin son rakamına değer atamanaz, yani dizi[15] diye bir diziniz varsa en fazla "dizi[0]" dan "dizi[14]"'e kadar veri atayabilirsiniz.Son odada ise verilerinizin harddiskteki adresleri(pointer) tutulur.
Mesela haftanın günlerini içeren bir dizi oluşturalım;
string[] gunler = new string[7];
gunler[0] = "Pazartesi";
gunler[1] = "Salı";
gunler[2] = "Çarşamba";
gunler[3] = "Perşembe";
gunler[4] = "Cuma";
gunler[5] = "Cumartesi";
gunler[6] = "Pazar";
İsterseniz yazdığımız gunler dizisini bir örnekte kullanalım, hatırlarsanız geçen yazıda for döngüsünü incelemiştik.Şimdide for döngüsünü ve dizileri kullanarak küçük bir program yazalım;


Şimdide nasıl olduğu hakkında konuşalım; ilk olarak gunler adında, string tipinde ve 7 elemanlı bir dizi oluşturduk.Daha sonra elemanlarına sıra ile Pazartesi'den Pazar'a günleri yazdık.For döngümüzü oluşturduk.Döngünün şart kısmındaki "gunler.Lenght" bize dizinin eleman sayısını verir.Eleman sayımız 7, döngü değişkeni 0'dan başlayacak,"i < gunler.Length" yaptık çünkü dizimizin son rakamına veri giremeyeceğimiz için bir rakam küçük olana kadar dönecektir, eğer "i <= gunler.Length" yapsaydık 7'yide almak isteyecek ve program hata verecekti.Döngünün işeyişi ise;
İlk olarak i değişkeninin değeri 0'dır.Console.WriteLine(gunler[i]); satırına geldiğinde dizimizin 0. elemanını ekrana yazacak.
Döngü bir kere dönecek i değişkeni bir artırılacak ve değeri 1 olacak, Console.WriteLine(gunler[i]); satırında 1. elemanı yazacak, bu şekilde 7 kere dönecek en sonunda i değişkeninin değeri 7 olduğunda döngü kontrol edecek; 7(i) sayısı 7(gunler.Length)'den küçük müdür? Hayır, döngü duracak.
Şimdide daha açıklayıcı birşeyler yapalım;


Yukarıdaki kodlar da, elemanların dizininin kaçıncı elemanı olduğunu göstererek yazar.
Sanırım tek boyutlu diziler için bu kadar anlatım yeter.İşte bununla ilgili birkaç kaynak;

İki boyutlu diziler

Tek boyutlu dizileri inceledik şimdi sıra geldi iki boyutlu dizilerimize.İki boyutlu dizi nedir? Hatırlarsanız dizilerin tek sıra halinde dizilmiş odacıklar olduğundan bahsetmiştim,iki boyutlu diziler ise; satır ve sütunlardan oluşur.Aslında bu yabancı birşey değil, bildiğimiz tablo yapısı.Mesela Microsoft Excel'i açtığınızda gördüğünüz sayfayı dizi olarak düşünürsek, her hücre dizinin bir odası diyebiliriz.İsimlendirme sistemi ise excel ile aynıdır.Mesela ilk hücrenin adı A1'dir çünkü "A" sütununda ve 1. satırdadır.İki boyutlu dizilerde de olay aynen böyledir.
Şimdi ise 3 satır ve 3 sütunlu bir dizi tanımlayalım, içlerini doldurup iç içe for döngüsü kullanarak ekrana yazdıralım;


Kodu bir inceleyelim; gördüğünüz gibi iki boyutlu dizi tanımlama; "string[,] dizi = new string[3,3]" şeklinde, yani; < veri tipi >[,] < dizi adı > = new < veri tipi >[satır boyutu,sütun boyutu], aslında tek boyutlu dizi tanımlamadan pekte farkı yok.
Daha sonra dizimizin içini isimlerle doldurduk, dizi[0,2] ifadesi "0. satırın 2. sütunu" anlamına veya dizi[2,1] ifadesi "2. satırın 1. sütunu" anlamına gelir.
Yani boyutlandırma dizi[x,y] dersek, x = satır sayısı, y = sütun sayısı'dır.
Gelelim döngümüze; kolay anlaşılsın diye 2 döngünün sayaç değişkenlerini x ve y yaptım.İlk olarak x döngüsü başlayacak, y döngüsüne gelecek, y döngüsü 3 kere dönecek.Daha sonra x döngüsü 2. kez dönecek sonra tekrar y döngüsü 3 kez dönecek ve bu şekilde x döngüsü 3. dönüşünü de tamamladığında, dizimizi yazdırdığımız satır toplamda 9 kere dönmüş olacak ve her döndüğünde, dizinin hangi hücresini yazdıracağımızı döngü sayaçları(x,y) ile belirlediğimiz için her seferinde 1 artarak gidecektir.Yani;
Satır 0, Sütun 0 //x döngüsünün ilk turu
Satır 0, Sütun 1
Satır 0, Sütun 2
Satır 1, Sütun 0 //x döngüsünün ikici turu
Satır 1, Sütun 1
Satır 1, Sütun 2
Satır 2, Sütun 0 //x döngüsünün son turu
Satır 2, Sütun 1
Satır 2, Sütun 2
Bu şekilde yazdırıldığında ekran çıktısı değişkenlerimizi tanımladığımız sıraya göre çıkmış oldu.Tabiki değişkenlerimizi bu sıra ile tanımlamış olmamızla bir alakası yok.Diğer bir deyişle;

  • Satır 0
    • Sütun 0
    • Sütun 1
    • Sütun 2
  • Satır 1
    • Sütun 0
    • Sütun 1
    • Sütun 2
  • Satır 2
    • Sütun 0
    • Sütun 1
    • Sütun 2
Aslında dizimizin yapısı şu şekildedir;

Burada x döngüsü satırları, y döngüsüde sütunları okuyor.Haliyle satır her atladığında 3 sütunda okunuyor.Toplamda y döngüsü 9 tane sütunun hepsini okumuş oluyor.
Bu konu ile ilgili birkaç kaynak;

Çok boyutlu diziler

Arkadaşlar 2 boyutlu dizinin yapısına bildiğimiz tablo gibi demiştik.Çok boyutlu diziler aynı şekilde fakat adı üstüne çok boyutlu.Yani, satır,sütun ve derinlik kısımlarından oluşur.Zeka küpünü bilirsiniz.Çok boyutlu dizilerin yapısıda aynen buna benzer;

Zeka küpünü çok boyutlu bir dizi kabul edersek, her karesine bir veri yazabiliriz.Tabi ki her karenin tüm kenarlarına.Sarı olarak gördüğünüz yer dizinin derinlik kısmıdır.Zeka küpü gibi 3,3,3 bir diziye.27 adet veri yazılabilir.Aşağıdaki resmi inceleyiniz.Sağ taraftaki çok boyutlu bir dizidir;

Gördüğünüz gibi dizi 3 parçaya ayrılmış.Hepsi birleşirildiğinde 3 birim derinliğinde bir dizi elde ederiz.Resimdeki çok boyutlu dizi şeklinin üzerindeki rakamlarda odaların adresleridir.Çok boyutlu bir diziyi tanımlama ve veri aktarma işlemleri aşağıdaki gibidir;
string[,,] dizi = new string[3,3,3];
dizi[0, 0, 0] = "Umut";
dizi[0, 0, 1] = "Umut";
dizi[0, 0, 2] = "Umut";
dizi[0, 1, 0] = "Umut";
dizi[0, 1, 1] = "Umut";
dizi[0, 1, 2] = "Umut";
dizi[0, 2, 0] = "Umut";
dizi[0, 2, 1] = "Umut";
dizi[0, 2, 2] = "Umut";
dizi[1, 0, 0] = "Umut";
dizi[1, 0, 1] = "Umut";
dizi[1, 0, 2] = "Umut";
dizi[1, 1, 0] = "Umut";
dizi[1, 1, 1] = "Umut";
dizi[1, 1, 2] = "Umut";
dizi[1, 2, 0] = "Umut";
dizi[1, 2, 1] = "Umut";
dizi[1, 2, 2] = "Umut";
dizi[2, 0, 0] = "Umut";
dizi[2, 0, 1] = "Umut";
dizi[2, 0, 2] = "Umut";
dizi[2, 1, 0] = "Umut";
dizi[2, 1, 1] = "Umut";
dizi[2, 1, 2] = "Umut";
dizi[2, 2, 0] = "Umut";
dizi[2, 2, 1] = "Umut";
dizi[2, 2, 2] = "Umut";
Bu dizimizi ekrana yazmak için satır(x), sütun(y), derinlik(z) için ayrı ayrı 3 tane for döngüsü kullanabiliriz.Aslında dizi mantığını kavradığınızda 500 boyutlu bile olsa hemen anlarsınız, bu yüzden eğer diziyi tam olarak sindirmediyseniz bu satırları boşuna okumayın, başa dönün tekrar edin :)


İşte bu kadar, dizilerimiz de burada sona eriyor :)Umarım anlatabilmişimdir.İyi Günler..
Umut Coşkun