Algoritmaya Giriş #4 - Diziler
Algoritmaya Giriş serisinin ilk üç yazısında algoritmanın ne olduğuna değinmiş, girdi/çıktı işlemlerinin nasıl olduğunu anlatmış ve değişkenlerin ne olduğundan ve nasıl kullanıldığından bahsetmiştim. Ancak değişkenler konusunda bahsettiklerim dört temel değişken olan string, integer, real ve boolean ile sınırlıydı. Bu değişkenler tek bir değer tutuyor ve bu değer üzerinden işlem yapmamıza izin veriyorlardı. Ancak bunlara ek olarak bu türlerden birden fazla değer tutup bu değerlerin hepsi üzerinden işlem yapmamıza olanak tanıyan yapılar da yazılım dünyasında sıkça kullanılmakta. Bu yapıların en temeli ise diziler.
E doğal olarak bizim oluşturduğumuz bu diziye değerler atamamız gerekecek. Hemen kısaca bunun nasıl yapılacağına girmeden önce size dizilerin mantığını anlatmak istiyorum.
Yukarıdaki fotoğrafta gördüğünüz üzere blok menümüzde "Looping" alt başlığı altındaki "For" döngüsü bu alt başlık için işe yarayacaktır. Tabii ki bu döngüler özel bir sayaç değişkeniyle çalışır, o yüzden programın en başına (Main bloğunun hemen altına) yeni bir Integer değişkeni tanımlıyoruz ve adına "i" diyoruz. Bu isimlendirme bir yazılım standardıdır ve FORTRAN yazılım dilinin çıktığı yıllara dayanır.
Yukarıda For döngüsü için özellik menüsünü görüyorsunuz. Mouse'umla seçili bıraktığım kısım hangi değişkeni kullanacağı (burada i değişkenimiz kullanılacak). Altındaki "Start Value" ve "End Value", sırayla bu değişkenin hangi değerden başlayıp hangi değerde biteceği. Flowgorithm kurallarına göre dizinin son indisi kaç ise End Value o değer olmalı. Biz bütün dizi üzerinde gezineceğimiz için Start Value girdisine 0 yazdık. "Step By" ise i değerinde tek seferde ne kadar değişiklik olacağını ifade eder ve döngülerde genelde 1 değeri kullanılır. "Direction" başlığı altındaki tikler ise artış (Increasing) ve azalış (Decreasing) durumunu belirler, yani buradaki girdilere göre döngümüz sırayla 0, 1 ve 2 değerlerini kullanarak ilerleyecektir. Flowgorithm, bu bloğun bir döngü olduğunu belirtmek için kendinden çıkan ve yine kendine dönen bir ok kullanmış.
Bu döngü For bloğunda sırayla sağından (Next) çıkıp Output bloğuna girip ardından kendisine geri dönerek dizinin bütün elemanlarını ekrana yazdırdı. Sonra i = 2 olduğunda döngü kendine döndükten sonra aşağısından (Done) çıkıp programı sonlandırdı.
Diziler sayesinde aynı türden birden fazla değer tutup bu değerleri ihtiyacımız oldukça kullanabiliyoruz ve daha komplike yazılımlar ve algoritmalar yapabiliyoruz. Bu yazıda tabii ki Flowgorithm aracılığıyla dizilere temel bir giriş yapacağım.
Dizi Tanımlama
Flowgorithm'de dizi tanımlamak için öncelikle Flowgorithm'i açıyoruz. Ardından Main ve End arasındaki oka tıklayarak "Declare" bloğu ekliyoruz. Eklediğimiz Declare bloğuna çift tıklayarak aşağıdaki şekilde değişiklik yapıyoruz.
Yukarıda gördüğümüz blok menüsündeki "Array?" seçeneği bizim o değişkeni tek bir değişken veya bir dizi olarak tanımlamayı seçmemizi sağlar. "Array?" seçeneğini tikledikten sonra dizimizin boyutunu giriyoruz. Ben bu örnekte dizi boyutunu 3 olarak girdim. Ok dediğimizde karşımıza şöyle bir şey çıkacak.
E doğal olarak bizim oluşturduğumuz bu diziye değerler atamamız gerekecek. Hemen kısaca bunun nasıl yapılacağına girmeden önce size dizilerin mantığını anlatmak istiyorum.
Dizileri normal değişkenlerden ayıran şey aslında değişkenler bir belleğin adresinde tutulurken, diziler de birden fazla adresten oluşan bir bölge tutarlar. Donanım bazında aralarındaki fark budur. Bundan dolayı değişkenler ile diziler arasında tanımlama farkı da bulunmaktadır.
- Bir Integer değişkeni değeriyle tanımlamak için Integer val = 5 tarzı bir tanımlama yapabilirsiniz. Çünkü Integer tek başına değer bazlı bir değişkendir.
- Bir Integer dizisini tanımlamak için Integer arr[3] = [5,3,6] tarzı bir tanımlama yapmanız gerekecektir. Burada kaç adet bellek adresi kullanacağınızı ve bu adreslere sırayla hangi değerleri atayacağınızı tanımlarsınız. Buradaki arr değişkeni bu yüzden referans bazlı bir değişkendir.
Değişkenler ve diziler arasındaki temel farkı öğrendikten sonra sıra geldi Flowgorithm'de değer atamaya ve bu değeri yazdırmaya. Bu örnek için yukarıda verdiğim 5, 3 ve 6 değerlerini örnek olarak alıyorum.
Yukarıda gördüğümüz kaynak kodda "arr" isimli ve üç elemanlı bir Integer dizisi tanımladıktan sonra sırayla üç elemanına da değer atıyoruz. Bunu arr[elemanSayacı] = değer ve elemanSayacı = 0,1,2,... olacak şekilde yapıyoruz. Daha sonra bu değerleri yazdıracağımız zaman yine aynı şekilde arr[0], arr[1] ve arr[2] şeklinde ilerliyoruz ve yukarıdaki örneğe göre ekranımıza "[5,3,6]" şeklinde dizimizi yazdırıyoruz. Merak etmeyin, gerçek programlama dillerinde her bir dizi elemanını tek tek yukarıdaki gibi tanımlamak zorunda değilsiniz, sadece Flowgorithm bir yazılımın nasıl çalıştığını en temel haliyle göstermek için yapılmış bir yazılım :)
Peki neden arr[0]?
Tabii ki bu kodu incelediğinizde arr[1], arr[2] ve arr[3] diye gitmediğini, bunun yerine arr[0], arr[1] ve arr[2] diye gittiğini fark ettiniz. Bunun altında hafıza adreslenmesi yatar. Diziler gibi birden çok değer içeren yapılarda belli bir değere ulaşmak için başlangıç referansından belli bir sayıda hareket yapmak gerekir. Örneğin dizimizin üçüncü elemanı olan 6'ya ulaşmak için, dizinin başlangıç adresindeki değer olan 5'ten sonra iki adres ilerlemek gerekir (3 ve 6). Yani köşeli parantezler arasındaki sayı, başlangıç adresinden kaç sonraki adreste olduğuna işaret eder. Bir dizinin ilk elemanı başlangıç adresinde olduğu, dolayısıyla o elemana ulaşmak için başlangıç elemanından sonra hiçbir hareket yapmaya gerek duyulmadığı için bilgisayarlarda sayma işlemi 0'dan başlar.
Dizileri Sırayla Gezme
Bu açıkçası "Döngüler" konusunu ilgilendiren bir alt başlık, ancak ben bu yazıda bir aşinalık olması adına bundan da kısaca bahsedeceğim. Bunun için sondaki Output bloğumuzun üstüne sağ tıkla ve "Delete/Sil" tuşuna basarak bloğumuzu silebiliriz. Daha sonra arr[2] = 6 bloğuyla End bloğu arasındaki oka tıklayarak bir For bloğu ekleyeceğiz.
Yukarıdaki fotoğrafta gördüğünüz üzere blok menümüzde "Looping" alt başlığı altındaki "For" döngüsü bu alt başlık için işe yarayacaktır. Tabii ki bu döngüler özel bir sayaç değişkeniyle çalışır, o yüzden programın en başına (Main bloğunun hemen altına) yeni bir Integer değişkeni tanımlıyoruz ve adına "i" diyoruz. Bu isimlendirme bir yazılım standardıdır ve FORTRAN yazılım dilinin çıktığı yıllara dayanır.
Döngü bloğumuzu ekledikten ve i değişkenimizi tanımladıktan sonra For bloğumuzun üstüne çift tıklıyoruz ve karşımıza şu menü çıkıyor.
Yukarıda For döngüsü için özellik menüsünü görüyorsunuz. Mouse'umla seçili bıraktığım kısım hangi değişkeni kullanacağı (burada i değişkenimiz kullanılacak). Altındaki "Start Value" ve "End Value", sırayla bu değişkenin hangi değerden başlayıp hangi değerde biteceği. Flowgorithm kurallarına göre dizinin son indisi kaç ise End Value o değer olmalı. Biz bütün dizi üzerinde gezineceğimiz için Start Value girdisine 0 yazdık. "Step By" ise i değerinde tek seferde ne kadar değişiklik olacağını ifade eder ve döngülerde genelde 1 değeri kullanılır. "Direction" başlığı altındaki tikler ise artış (Increasing) ve azalış (Decreasing) durumunu belirler, yani buradaki girdilere göre döngümüz sırayla 0, 1 ve 2 değerlerini kullanarak ilerleyecektir. Flowgorithm, bu bloğun bir döngü olduğunu belirtmek için kendinden çıkan ve yine kendine dönen bir ok kullanmış.
Döngümüzde sırayla bütün değerleri yazdırmak için döngümüzdeki i değişkenini kullanacak şekilde bir Output bloğu ekleyip içine "arr[i]" yazdırıyoruz. Programımızı çalıştırdığımızda karşımıza şöyle bir şey çıkmalı:
Bu döngü For bloğunda sırayla sağından (Next) çıkıp Output bloğuna girip ardından kendisine geri dönerek dizinin bütün elemanlarını ekrana yazdırdı. Sonra i = 2 olduğunda döngü kendine döndükten sonra aşağısından (Done) çıkıp programı sonlandırdı.
Ancak gerçek programlama dillerinde her daim sabit boyutlu dizilerle çalışmıyoruz, o yüzden döngünün nerede biteceğini kestirmek biraz zor. Bu yüzden programlama dilleri içerisinde genelde dizinin veya dizi bazlı yapıların tuttuğu değer sayısını veren bazı fonksiyonlar veya özellikler vardır, örneğin JavaScript'te arr.length, C#'ta arr.Length(), Python'da len(arr) gibi ifadeler. Flowgorithm'de de Size(arr) yapısı var. Bu fonksiyonu Output bloğuna değer olarak girerseniz size "3" değerini verecektir. Ancak biz döngümüzün son değerine 2'yi girerek bütün elemanlarını yazdırmıştık, ki bu gerçek programlama dillerine uyarlandığı zaman i <= 2'ye karşılık gelir. 3 de 2'nin 1 eksiği olduğu için biz For menümüze alternatif olarak "Size(arr)-1" şeklinde bir ifade yazabiliriz.
Flowgorithm aracılığıyla diziler bu şekildeydi ve bu yazımızla Algoritmaya Giriş serimizin değişkenler konusunu noktaladık. Bir sonraki yazımda koşul yapıları konusuna geçiyorum ve yapacağınız programcıkları tekdüzelikten kurtarıyorum :)
Eğer bu seriyi faydalı bulduysan yeni yazılar geldiğinde haberdar olmak için buradan blogumu takibe alabilirsin.
Yorumlar
Yorum Gönder