Algoritmalar ve Sözde Kodlar

Algoritma Kavramına Giriş

Gerçek hayatta bir problemle karşılaştığınızda onu nasıl ele alıp çözersiniz? Diyelim ki eve misafiriniz geldiğinde veya canınız çektiğide çay demlemek istediniz (olmazsa olmaz). Bir problemi çözmeye girişmeden önce onu iyi tanımlamamız gerekir ki zaten gerçek hayatta bu gibi küçük işlerde bu işi farkında olmadan yaparız. Buradaki problemimiz "çay demlemek"tir ve bize gerekenler ise bir çaydanlık takımı, çay, su ve ısıtma yapabileceğimiz bir ocaktır. Gereksinimleri karşıladıktan sonra işe koyulmaya hazırız.

Öncelikle çaydanlığın altına su, demlik kısmına da çay koyuyoruz. Daha sonra bu ikisini üst üste koyup ocağa koyuyoruz. Ocağın altını yakıyoruz ve suyun kaynamasını bekliyoruz. Su kaynadıktan sonra da onun bir kısmını demliğe boşaltıyoruz. Daha sonra alta biraz daha su koyup yine ikisini birlikte ocakta hafif ateşte bekletiyoruz. Ocağın altını kapatıyoruz ve demlikteki çayın demlenmesini bekliyoruz. Demlendıkten sonra işlemimiz tamamlanıyor. Daha sonra çayımızı keyifle içiyoruz. Gördüğünüz gibi yaptığımız bütün işler aslında oldukça basittir. Fakat bu basit işleri bir araya getirip neyi başardığımızı görmemiz gerekiyor.

Öncelikle bütün bu işlemlerin "bekleme", "kaynama", "demlenme" vb. eylemlere dayandığını görmemiz gerekiyor. Her adımda bir eylem (action) gerçekleştiriyor ve bu eylemleri de belli bir sırayla (order) yapıyoruz. Örneğin çaydanlığın altına su koymadan ocağı açmak veya demliğe çay koymadan ona su boşaltmak anlamsız olacaktı. Çünkü her işin bir sırası var ve bir eylemi gerçekleştirmeden önce bir önceki eylemin bitmesini beklemeliyiz.

Şimdi bütün bunları neden anlatıyorum? Bilgisayar bilimlerinde yer alan pek çok kavram doğadan, toplumdan ve insan yaşamından etkilenilerek ortaya çıkarılmıştır. Bu basit gibi görünen problem ve çözümü, aslında bütün bilgisayar dünyasında ortaya çıkan problemler ve çözüm yöntemleriyle özdeşleşmektedir desem bana inanır mıydınız? Bilgisayar dünyasındaki pek çok problemin çözümü de tıpkı burada olduğu gibi belli eylemlere (actions) ve bu eylemlerin belli bir sırayla (order) gerçekleştirilmesine dayanmaktadır. İşte çözülecek bir problemin yapılacak eylemler ve bu eylemlerin hangi sırada yapılacağı cinsinden belirtilmesi yöntemine Algoritma (Algorithm) adı verilmektedir.

Algoritmanın Tarihi

Algoritma kelimesi, 780 – 850 yıllarında yaşamış bir Fars bilim insanı olan Ebû Ca’fer Muhammed bin Mûsâ el-Hârizmî veya kısaca Hârizmî‘ye dayanmaktadır. Hârizmî’nin adı Latince’ye ilk olarak Algoritmi olarak geçmiştir.[1] Kendisi cebirin ve daha pek çok matematiksel kavramın babası olarak bilindiği için, matematikteki pek çok kavram onun ismiyle özdeşleşmektedir. Algoritma kelimesinin çeşitli dönüşümlerden sonra İngilizce’de "algorithm" kelimesi haline gelmesi ise 17. yüzyıla dayanmaktadır.

Ebû Ca'fer Muhammed bin Mûsâ el-Hârizmî (Hârizmî)
Figür 1: Ebû Ca’fer Muhammed bin Mûsâ el-Hârizmî (Hârizmî)[2]

Algoritmaların Metinsel Olarak İfade Edilmesi

Algoritmanın bir yöntem olduğunu söyledik. Peki bu yöntemi nasıl kullanmamız gerekir? Algoritmaları ifade etmenin çeşitli yolları bulunmaktadır. Bunlar görsel veya düz metin şeklinde olabilmektedirler. Öncelikle size metinsel ifade ediş biçiminden bahsedeceğim. Bir algoritmayı sıralı bir liste şeklinde yazabiliriz. Bu en basit ifade ediş biçimidir. Şu şekilde örnek verirsem hemen anlayacaksınız:

  1. BAŞLA
  2. Kullanıcıdan e-posta adresi verisini al.
  3. Kullanıcıdan şifre verisini al.
  4. Kullanıcı "Giriş Yap" butonuna bastığında, öncelikle şifrenin 6 karakterden kısa olup olmadığını kontrol et.
  5. Eğer şifre 6 karakterden kısa ise 3. adıma git.
  6. Eğer şifre 6 karakterden uzun veya ona eşit ise, bu e-posta adresini ve şifreyi veri tabanındaki veriler ile karşılaştır.
  7. Eğer bilgiler eşleşiyorsa kullanıcı portalına git.
  8. Eğer bilgiler eşleşmiyorsa 2. adıma git.
  9. BİTİR

Bu şekilde belirttiğimizde ne kadar da basit görünüyor değil mi? Fakat böyle bir ifade ediş şekli genellikle hiçbir programcının işini görmez (belki projeyi yöneten kişilerin işini görebilir). Çünkü bu çok genel bir yapıdır. Yani işin içine girdiğimizde buradaki birkaç adımın aslında içerisinde birçok iş yükü barındırdığını görürüz. Örneğin kullanıcının yazdığı bilgileri veri tabanındaki bilgilerle karşılaştırmak için çeşitli sorgu komutlarını çalıştırmamız ve veri tabanından gelen cevapları dinlememiz gerekmektedir. Buradan da anlayacağınız gibi, algoritmaları bu şekilde ifade etmek en ilkel ve implementasyonu en zor olan yöntemdir.

Peki algoritmaları yine metinsel olarak, fakat programlama dillerine daha yakın bir biçimde ifade etmenin bir yolu var mıdır? Burada algoritmaları yazarken aslında onları programlama dillerinden bağımsız hale getirmeye çalışıyoruz. Çünkü o zaman algoritmayı tanımlamış olmayız. Onu sadece belli bir dilde "yazmış" oluruz.

C ve pek çok programlama dillinde karşımıza çıkan çeşitli karar ve döngü yapıları vardır. Bu yapıları ileriki C yazılarında ele alacağım. Fakat kısaca bahsetmem gerekirse; karar yapıları program akışının koşulun sonucuna göre nereye yönlendirileceğine karar veren yapılar iken, döngü yapıları belirli bir kod parçasının belirli (veya sonsuz) miktarda tekrar tekrar çalışmasını sağlayan yapılardır.

Karar ve döngü yapıları çeşitli anahtar kelimeler ile ifade edilirler. Örneğin C’de if karar yapısı ile, while, for döngüleri en bilindik yapılardandır. Bu anahtar kelimeler aslında C benzeri pek çok dilde karşımıza çıkar. Bu anahtar kelimeleri ve az önce gördüğümüz düz metinleri kullanarak, algoritmaları programlama dillerine daha yakın bir biçimde ifade edebiliriz. Yazılan bu kodlara Sözde Kod (Pseudocode) adı verilmektedir. Sözde kodlar tıpkı bir programlama dili yazarmış gibi ifade edilirler.

Şimdi size C benzeri yapılar ile yazılmış bir sözde kod örneğini göstererek işe başlayacağım:

"toplam" değişkenini 0'a eşitle
"sayac" değişkenini 0'a eşitle
WHILE "sayac" değişkeni 15'ten küçük veya ona eşitse
    Kullanıcıdan yeni bir not değeri alıp onu "not" değişkenine eşitle
    "not" değişkeni ile "toplam" değişkenini toplayıp yine "toplam" değişkenine yaz
Döngüden çıktığında "toplam" değişkenini 15 ile bölüp sonucu "ortalama" değişkenine yaz
"ortalama" değişkenini ekrana bas

Yukarıda yazmış olduğum sözde kod, 15 kişinin notlarının ortalamasını alıp çıkan değeri ekrana basmaya yarayan algoitmaya aittir. Gördüğünüz gibi algoritmanın bu şekilde yazımı, herhangi bir programlama dilinde onu yazmayı oldukça kolaylaştırmaktadır. Sözde kodların bir standardı yoktur. Genellikle TAB ile ayrılan kısımlar, bir döngü veya karar yapısının iç kısmında dönecek olayları belirtmektedir.

Az önce yazdığım biçim, C benzeri programlama dillerine benzemektedir. Örneğin ben bunu Basic benzeri programlama dillerine benzetmek istersem şu şekilde yazabilirim:

"toplam" değişkenini 0'a eşitle
"sayac" değişkenini 0'a eşitle
WHILE "sayac" değişkeni 15'ten küçük veya ona eşitse
    Kullanıcıdan yeni bir not değeri alıp onu "not" değişkenine eşitle
    "not" değişkeni ile "toplam" değişkenini toplayıp yine "toplam" değişkenine yaz
END WHILE
Döngüden çıktığında "toplam" değişkenini 15 ile bölüp sonucu "ortalama" değişkenine yaz
"ortalama" değişkenini ekrana bas

Kullandığım anahtar kelimelerin küçük veya büyük harf olması da bir şey ifade etmediği gibi, sadece okunabilirliği artırmaktadır. Bu yazdığım kodların içerisinde değişken isimlerine yer verilse de işlemler sözel olarak ifade edilmiştir. Biz bunları matematiksel olarak ifade ederek, sözde kodu oldukça kısaltabilir ve programcılar için daha anlaşılır hale getirebiliriz:

toplam ← 0
sayac ← 0
WHILE sayac <= 15
    not ← INPUT
    toplam ← toplam + not
ortalama ← toplam / 15
PRINT ortalama

Bu şekilde çok daha güzel oldu değil mi? C ifadelerinin sonuna noktalı virgül operatörü (;) geldiğini ve C bloklarının süslü parantezler ile belirtildiğini de göz önüne alırsak, sözde kodu şu şekilde yeniden düzenleyebiliriz:

toplam ← 0;
sayac ← 0;
WHILE (sayac <= 15) {
    not ← INPUT;
    toplam ← toplam + not;
    }
ortalama ← toplam / 15;
PRINT ortalama;

Bu şekilde kendinize nasıl kolay ve anlaşılır geliyorsa, kafanızdaki algoritmaları rahatça metine dökebilirsiniz.

Sözde Kod Stilleri

Sözde kodların belirli standartlarının olmadığını söylesek de genel kabul görmüş bazı stilleri bulunmaktadır. Fortran-stili, Pascal-stili, C-stili ve Basic-stili gibi çeşitli dillerle adlandırılan sözde kod stilleri bulunmaktadır. Bunların her birini ayrı ayrı anlatmak yerine tek bir görsel ile hepsinin arasındaki farkı görmeye çalışmanızı tavsiye ediyorum:

Çeşitli Sözde Kod Stilleri
Figür 2: Çeşitli Sözde Kod Stilleri[3]

Farklı akademik makalelerde farklı sözde kod stilleri ile karşılaşabilirsiniz. Bunlar bir bakışta kolay bir şekilde anlaşılabilecek stiller olduğundan her bir standardı ayrı ayrı ezberlemek ve anlamak zorunda değilsiniz. Sadece ortak bir projede çalışırken, ekipteki herkesin algoritmaları anlaması için bunun gibi genel kabul gören sözde kodları kullanabilirsiniz. Fakat kendi kafanıza göre bir biçimde de sözde kodlar yazabilirsiniz (az önce gösterdiğim gibi). Bu tamamen size ve sizin o anki durumunuza kalmış bir olaydır.

Algoritmaların Görsel Olarak İfade Edilmesi

Şimdi de algoritmaları görsel olarak ifade etmekten bahsedelim. Algoritmaların çeşitli eylemlere ve bu eylemlerin sıralarına dayandığını artık anladık. Az önce verdiğim birkaç örneği incelediğinizde, bu eylemlerin işlem, koşul, döngü gibi çeşitli yapıları belirttiğini de farketmişsinizdir.

Yani algoritmada gerçekleştirilen eylemler tek bir tipte değildir. Bazen bir işlem yaparsınız, bazen de bir şeye karar vermeye çalışırsınız. Daha ileri gidecek olursak; bazen kullanıcıdan girdi alıp kullanıcıya çıktı verirsiniz, bazen de çok daha karmaşık bir algoritmayı tek bir adımda kullanabilirsiniz.

İşte bu gibi çeşitli eylemleri içeren algoritmalar metinlerle ifade edildiğinde, hangi adımda ne çeşit bir eylemin gerçekleştiğini anlamak biraz zor olabilir. Bunları kolaylaştırmak ve evrensel bir hale getirmek için algoritmadaki bu adımları çeşitli sembollerle ifade etme ve bu sembolleri birbirine bağlayıp algoritmayı ifade etme gereksinimi duyulmuştur. İşte bunun için Akış Diyagramı (Flowchart) adı verilen bir diyagram kullanılır. Bir akış diyagramı; bir sistemi, bir süreci veya bir bilgisayar algoritmasını betimlemek için kullanılan diyagramdır.[4]

Örneğin az önce sözde kodunu yazdığımız ve 15 kişinin notlarının ortalamasını alıp çıkan değeri ekrana basan algoritmayı akış diyagramı ile şu şekilde ifade edebiliriz:

flowchart TD
    A([BAŞLA]) --> B[toplam = 0]
    B --> C[sayac = 0]
    C --> D{sayac < 15}
    D -->|Evet| F[\GİRDİ AL: not\]
    F --> X[toplam = toplam + not]
    X --> Y[sayac = sayac + 1]
    Y --> D
    D -->|Hayır| G[ortalama = toplam /15]
    G --> H[\ÇIKTI VER: ortalama\]
    H --> I([BİTİR])

Yukarıda yuvarlatılmış dikdörtgen ile gösterilen "BAŞLA" ve "BİTİR" adımları, algoritmanın başlangıcını ve sonunu belirtmeketedir. Dikdörtgenler aritmetiksel işlemleri, paralelkenarlar ise kullanıcıdan girdi almayı veya kullanıcıya çıktı vermeyi belirtmektedirler. Eşkenar dörtgen ise karar yapısındaki koşulu belirtmektedir. Bu koşulun doğru veya yanlış olmasına göre farklı yollardan algoritmaya devam edilebilir. Akış diyagramındaki oklar, algoritmanın o adımdan sonra hangi adıma gideceğine karar verirler.

İşte bu şekilde bir algoritmayı görsel bir biçimde ifade edebiliriz. Koşul ve döngü yapılarını açıklarken bunların ayrıntısına tekrar gireceğim. Fakat şimdilik her bir eylem tipi için farklı şekillerin kullanıldığını bilmeniz yeterlidir. Ayrıca koşul belirten eylemlerde (eşkenar dörtgen ile belirtilen) algoritmanın nasıl dallandığına dikkat edin. Çok yakında bunu C’de nasıl yazacağınızı da göstereceğim.

Bu bölümde algoritma kavramından ve tarihinden kısaca bahsettim. Ayrıca algoritmaların metinsel ve görsel olarak nasıl ifade edilebileceğinden, sözde kodlardan ve akış diyagramlarından bahsettim. Bu bölümde gördüğümüz bilgilerin tamamı neredeyse sözel bir yapıda olsa da ileride göreceğimiz pek çok şeyi çözmemizde bize oldukça fayda sağlayacaktır. İleriki derslerde yeri geldiğinde sözde kodları, yeri geldiğinde de akış dşyagramlarını sıklıkla kullanmayı planlıyorum.

Referanslar

  1. Hârizmî Vikipedia Sayfası
  2. Hârizmî İlüstrasyonu
  3. Programming (8) – Ivy Tech Community College
  4. What is a Flowchart
5 6 votes
Article Rating
Subscribe
Bildir
guest

5 Yorum
Eskiler
En Yeniler Beğenilenler
bet

Anlatım ve açıklama şekliniz çok açıklayıcı , fayda sağlayacak şekilde olmuş . Ellerinize sağlık. Daha fazlası için , iyi çalışmalar..

Zafer

Çok iyi elinize emeğinize sağlık

şevval necla er

Akış diyagramında yanlışlık var. sayaç değerini arttıracak bi ifade bulunmuyor bu yüzden ifade döngüden çıkmıyor.

ece

muhteşem bir anlatım, teşekkür ediyorum.