Merhaba, programlama öğrenmeye 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 tabi 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.

flow-chart-visual-programming-home-screen

Programı rar dosyasından çı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. Her defasında bununla uğraşmamak için exe dosyasına sağ tıklatıp Özellikler > Uyumluluk > Bu programı yönetici olarak çalıştır kutucuğunu işaretleyebilirsiniz. Programımızın ana ekranı yukarıda.

Ü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. Ortadaki çalışma alanına taşıdıktan sonra çift tıklarsanız uygulama boyunca kullanacağınız  değişkenler oluşturabilirsiniz.

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 değil mi o" gibi sorular aklınıza geliyorsa Temel Veri Tipleri başlıklı makaleyi inceleyebilirsiniz.

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 takibi 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.

Olası en basit ve sade örneği yapalım; 2 sabit değişkeni toplayıp dışardan girdiğimiz 3.değişken ile çarpalım. Değişkenlerimiz num1, num2, num3, result olsun. start çalışma alanına sürükledikten sonra çift tıklayarak bunları virgül ile Yerel değişkenler metin kutusuna girelim. Daha sonra 2 adet Action sürükleyerek num1 ve num2 sabit değişkenlerin atamalarını 10 ve 5 olarak yapalım. Daha sonra bir Input sürükleyerek Mesaj alanına "3.sayıyı girin" yazıp Değişken Adı alanına num3 yazalım. Böylelikle algoritmamız çalışırken gireceğimiz sayı dinamik olarak num3 değişkenine atanacak. Sonra yine 2 adet Action sürükleyip ilkinde toplama ikincisinde çarpma işlemleri yapıp 1 adet Output sürükleyerek Mesaj alanına "Sonuç:" yazıp Değişken Adı olarak result yazalım. Son olarak bir end sürükleyip tümünü sırasıyla bağlayalım. Sonuçta aşağıdakine yakın bir ekran elde etmiş olmalıyız. Bu örneğin hazırladığım gurkantuna.com.fpp dosyasını programın Samples dizinininde bulabilirsiniz. Çift tıkladığınızda direk çalışacaktır.

flow-chart-visual-programming-sample

Ö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. Çarpmanın değişme özelliği olduğu için 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 tuşuna basarsanız ya da mesela "merhaba" girerseniz program hata fırlatacak ve kullanıcı bu hatayı kabak gibi görecektir. Dahası değişkenleriniz, fonksiyonlarınız, mesela veri tabanı alanlarınız; 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 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üşürü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 "Don't know" GOTO A1;/
        |-- A6.  sum=1;/
        |-- A7.  IF num=0 GOTO A11;/
        |-- A8.  IF num > 0 sum=sum*num;/
        |-- A9.  num=num-1;//assign to num variable by decrease current value
        |-- 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ı goto kullanmadan yazdığım; yukarıdaki algoritmanın mesela C# kodu 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("Unknown"); continue;
            }
            
            if(ulong.TryParse(r, out var num)) {
                ulong sum = 1;

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

Flow Chart Visual Programming İndir

Fundementals of Alghorithms

Towards a visual programming environment for software development

Visual programming labs for introducing computer science