Merhaba, programlama öğrenmeye yeni başlayan hemen herkes, tabiri caizse "kod yazmak için yanıp tutuşur".🤩Ancak kod yazma aslında bu işin son bacağıdır. Öncesinde algoritma⚙️ çeşitlerini inceleyerek kafanızda oturtmaya çalışmalısınız. Farklı algoritmalar ile çalışması gerektiğini kavrayan biri için sırada kod yazmaya geçmek gelebilir tabii ama benden öyle kolay kurtulamazsınız.🤪Önceki yazımda algoritmanın öneminden bahsetmiştim.

Bunu bir programlama diline bağımlı kalmadan anlayabilmeye yardımcı olacak en eski ve basit program; Flow Chart Visual Programming kullanımını sade bir şekilde göstermek istiyorum.

Programı buradan indirebilirsiniz. Rardan çıkardığınızda ister kurabilir, ister direk support dizini altındaki exe dosyasından çalıştırabilirsiniz. Yalnız içindeki örnekleri doğru görüntüleyebilmek için "Yönetici olarak çalıştır" demeyi unutmayın. Programımızın ana ekranı aşağıdaki gibi.

flow-chart-visual-programming-home-screen

Üst menüdeki bilindik ibareler dışında, sol taraftaki menüde diyagramı oluştururken asıl işimize yarayacak nesneler bulunmaktadır. Bu nesnelerin şekilleri birebir olmasa da büyük çoğunluğu algoritma sembollerinden alınmıştır. Programı kullandıkça algoritma görsellerine olan göz aşinalığınız da artacaktır.

flow-chart-visual-programming-start

Her algoritmanın bir başlangıç ve bitiş noktası olmak zorundadır. Yani tahmin ettiğiniz gibi başlangıç noktamız.

flow-chart-visual-programming-action

Action, algoritmadaki işlem sembolüdür. Yaptırmak istediğimiz aritmetik hesaplama işlemlerini gireceğimiz bölümdür. Aşağıdaki örnekte sum=1 ifadesi ile bu değişkene 1 sayısını atama işlemi yapılıyor. "Değişken nedir, atama da neyin nesi, matematikteki bildiğimiz eşittir o işte" gibi sorular aklınıza gelebilir. Bunlara şimdilik takılmayın, temel veri tipleri ve değişkenler dil öğrenmenin başlarındaki konulardır. Sonraki yazılarım bunlarla ilgili olacak.

flow-chart-visual-programming-input

Input, algoritmadaki veri giriş-çıkış sembolünün aynıdır.

flow-chart-visual-programming-output

Output, algoritmadaki yine veri giriş-çıkış sembolünün aynıdır. Aşağıdaki örnekte ekrana çıktı olarak faktöriyel sonucu basılmaktadır.

flow-chart-visual-programming-junction

Conditional Junction, algoritmadaki karar sembolüdür. Karşılaştırma işlemlerini gösterir. İşlem sembolünden farklı olarak, karar sembolünde çıkış çizgileri bulunur. Verdiğiniz şartın doğruluğu ya da yanlışlığına göre program akışına devam eder.

flow-chart-visual-programming-connection

Connection, algoritmadaki bağlantı sembolüdür. Aslında kullanımı zorunlu değildir ama oluşturduğumuz şemalarda görsel düzen açısından lazım olabilir. Bazen ekranı komple kaplayan öyle şemalar olur ki, varsın bağlantı sembolü de olmayıversin diyecek hale gelebilirsiniz. Kaldırdığınızda 90 ͦ lik açılar yerine çapraz oklar blokları takip edecektir. Birbirine bağlı olan 2 nesneden birini silmeye çalıştığınızda hata mesajı vermesi gerekir ama boş bir ekran geliyor. Bu ekran önce aradaki bağlantıyı(çizgiyi) sildikten sonra nesneyi silebileceğinizi bildirir.

flow-chart-visual-programming-function

Function, her ne kadar algoritmadaki döngü sembolüne benzese de içinde kullanıma hazır üs alma, logaritma, tarih ve metin işlemleri gibi hazır fonksiyonlar bulunur.

flow-chart-visual-programming-windows

Window, hazırlanan şemaya dışarıdan veri girişi yapılabilmesi için Textbox, Button gibi komponentler veya çeşitli görseller eklenebileceği gibi bunların çeşitli olaylarında gerçekleşmesini istediğiniz fonksiyonları tanımlamamızı sağlar.

flow-chart-visual-programming-end

Her algoritmanın bir bitiş noktası olmak zorundadır. Yine tahmin ettiğiniz gibi bitiş noktamız.

flow-chart-visual-programming-delay

Şemadaki akış normalde çok hızlı gerçekleşmektedir. Yani işlemcinizin hızına göre ilerler. Bunu gözle takip edebilmek imkansızdır. Gözle takipi kolaylaştırmak açısından, milisaniye cinsinden hızı ayarlayabilmek için böyle bir kolaylık düşünülmüş işte. Aslında birebir aynı olmasa da şimdilik debug gibi düşünülebilirsiniz.

Örneğin aşağıdaki faktöriyel hesaplamasında kullanıcının girdiği sayıya kadar ardışık çarpım yapılmaktadır. Bu küçük örneği, programdaki "Dosya > Örnekler > Faktöriyel Hesabı (Döngü)" adımından açabilirsiniz. Genelde faktoriyel soruları yinelemeli fonksiyonla istenir ama başlangıç için bu algoritma daha anlaşılırdır. Kullanıcının girdiği string tipindeki değer ardışık tam sayı şeklinde düşürülerek bir önceki sayı ile çarpılıyor. Tam tersi artırarak da yapılabilir, farketmez.

flow-chart-visual-programming-home-screen

Algoritma adımları ise şu şekilde ilerliyor. Kullanıcının girdiği değer num değişkenine atılıyor. Değer exit ise hiçbir işlem yapılmadan program sonlanıyor. Negatif bir sayı girilirse "Bilinmiyor" mesajı veriliyor. Bir nevi exception handling yapılmış. Yapılmış güzel ama alfanümerik girişler düşünülmemiş. Yani hiçbirşey girmeden enter'a basarsanız ya da mesela "merhaba" girerseniz program hata fırlatacak ve kullanıcı bu hatayı kabak gibi görecektir. Dahası değişkenlerinizin, fonksiyonlarınızın, mesela veri tabanı alanlarınızın; kısacası bütün nesneleri gerçek isimleriyle görecektir ve bu  'hatayı göstermek üzere yaptığınız hata' kabul edilemez bir yaklaşımdır.  İşte bir yerlerden duymuş olabileceğiniz Test Driven Development kavramının temelini bu ihtiyaç oluşturur. Biz programımıza dönelim. sum değişkenine 1 atanıyor. sum 0 ise direk bu 1 sonucu yazdırılıyor. Diğer pozitif sayılar için girilen tam sayı sum değeri ile çarpılarak yine sum değişkenine atılıyor ve num değeri 1 düşülüyor. Bu işlem num 0 olana kadar tekrarlanıyor. Sonuçta; çıkan sum sonucu yazılıyor.

        /
        |-- A1.  START 
        |-- A2.  PRINT "Enter integer or 'exit' to stop";
        |-- A3.  IF num='exit' r= 0;
        |-- A4.  IF r=0 
        |   `--  STOP;    
        |-- A5.  IF num < 0 PRINT "Unknown" GOTO A1;
        |-- A6.  sum=1; 
        |-- A7.  IF num=0 GOTO A11; 
        |-- A8.  IF num > 0 sum=sum*num;
        |-- A9.  num=num-1;//decrease the current value of num variable and assign it
        |-- A10. IF num > 0 GOTO A6;
        |-- A11. PRINT "Result: {sum}";
        |-- A12. OUT;
        |-- A13. GOTO A1;        

"Ama biz hep Türkçe gördük" derseniz :

        /
        |-- A1.  BAŞLA 
        |-- A2.  YAZDIR "Bir tam sayı ya da çıkış için 'exit' girin";
        |-- A3.  EĞER num='exit' İSE r= 0;
        |-- A4.  EĞER r=0 İSE
        |   `--  BİTİR;    
        |-- A5.  EĞER num < 0 İSE YAZDIR "Bilinmiyor" GİT A1;
        |-- A6.  sum=1; 
        |-- A7.  EĞER num=0 İSE GİT A11; 
        |-- A8.  EĞER num > 0 İSE sum=sum*num;
        |-- A9.  num=num-1;//mevcut değeri düşürerek num değişkenine ata
        |-- A10. EĞER num > 0 İSE GİT A6;
        |-- A11. YAZDIR "Sonuç: {sum}";
        |-- A12. çIKTI;
        |-- A13. GİT A1;        

Yukarıdaki algoritma iş görür görmesine ama bu goto anahtar kelimeler, bir sürü if-else kullanımı falan mazide kaldı. Aslında birebir algoritmanın aynını; label atayıp goto ile ona git gibi de yazılabilir ama orta seviye dillerde öyle bir kodu çözmek hem anlamsız hem işkencedir. Bu, ancak en düşük seviye diller için bir yere kadar makul olabilir. Merak ederseniz en bariz örneklerini 'spagetti kod' diye aratarak bulabilirsiniz. Kısacası, bunları kulanmdanan yazdığım; mesela C# kodunu aşağıda.

using System;        
namespace GurkanTuna.FactorialAlgorithm {
            
class Program {
    static void Main(string[] args) {                    
        while(true) {
            Console.Write("Enter integer or 'exit' to stop : ");
            var r = Console.ReadLine();
            
            if(r == "exit") Environment.Exit(-1);
            int _;

            if(int.TryParse(r, out _) && _ < 0) {
                Console.WriteLine("Don't know"); continue;
            }
            
            if(ulong.TryParse(r, out var num)) {
                ulong sum = 1;

                while(num > 0) {
                    sum *= num;
                    num -= 1;
                }                            
                Console.WriteLine($"Result : {sum}"); continue;
            }
            if(Console.ReadLine() == "exit") Environment.Exit(-1);
        }
    }
}}