Ana içeriğe atla

Algoritma 1.Bölüm


Algoritma Kavramı 

Bu bölümde temel olarak algoritma kavramını işleyeceğiz. Algoritmanın ne olduğunu, tarihçesini, algoritma ile ilgili kavramları işleyeceğiz. Böylece  algoritmanın ne olduğu ve ne olmadığı kafamızda iyice belirginleşecek ve algoritmaları nerede kullanacağımızı kavrayacağız.

Algoritma

Algoritma, 800'lü yıllarda yaşamış olan Acem matematikçi Muhammad İbn Musa al-Khwarizmi'nin yaptığı çalışmalarda ortaya konmuştur. 12. yüzyılda bu çalışmalar latince'ye çevrilirken çalışmaların sahibi olan al-Khwarizmi'nin adından ötürü yaptığı bu çalışmalara algorithm olarak çevrilmiştir. Bu kelime Türkçe'ye ise algoritma olarak girmiştir. Tarihçesinden de görüleceği üzere algoritma, bilgisayar dünyasına girmeden önce, matematik alanında ki problemlerin çözümü için kullanılmaktaydı. Daha sonra bilgisayarların geliştirilmesiyle bu alandaki problemlerin çözümünde kullanılmaya başlandı.

Problem Çözmek

Problem çözmede iki temel yöntem vardır.
Deneme, yanılma yöntemi
Algoritma geliştirmek
Problemi çözmek için çözü yolu(algoritma) geliştirmenin temel adımları şöyledir.

1.Problemi Tanımlamak

Algoritmanın amacı belirli bir problemi çözmektir. Bu nedenle algoritma geliştirmenin esas öğesi problemdir. Problemi ne kadar iyi anlarsak, algoritmayı geliştirmemiz o kadar kolay olur. Eğer problemi iyi anlamazsak algoritma geliştirme aşamasında ciddi sıkıntılar yaşar, tekrar tekrar problemi tanımlama aşamasına geri döneriz. Daha da kötüsü problemi yanlış anlarsak bizi beklemeyen bir sonuca götüren bir algoritma yazma ihtimalimiz söz konusu olacaktır.

2.Girdi ve Çıktıları Belirlemek : 

Problemi iyi tanımlamak için başlangıç ve bitiş noktalarını çok net belirtmemiz gerekir. Bizim bulacağımız şey, problemin çözüm yoludur. Ama problem çözüldüğünde ortaya çıkacak şeyi problem içerisindeki parametreleri bilmeliyiz ki algoritmamızı geliştirelim. Bunun için algoritmanın girdilerini ve çıktılarını iyice kavramalıyız.

3.Çözüm Yolları(algoritma) Geliştirmek

Bir problemin çözümü için çoğunlukla birden fazla seçeneğimiz olur. İçinde bulunduğumuz duruma göre bazen zaman sıkışıklığından ilk bulduğumuz çözüm yolunu (algoritma) bulmaya çalışmalıyız. Bunun içinde bulabileceğimiz kadar çok çözüm yolu geliştirip, bunların içinden en uygununu tercih etmeliyiz. Çözüm yolları geliştirirken, her bir çözüm yolu için çözümü adımlara ayrıştırıp, daha sonrada bu adımları uygun şekilde birbirleriyle ilişkilendirmeliyiz.

4.Çözümün Sınanması ve İyileştirilmesi

Algoritmayı geliştirdikten sonra henüz kodlamadan kağıt üzerinde nasıl çalışacağını  sınamalıyız. Bunu yaptığımızda eğer bir algoritmada bir eksiklik  ya da hata çıkarsa, bunu düzeltmeli ve tekrar sınamalıyız. Sınama sırasında eğer bellek yada işlemci kullanımıyla ilgili bir iyileştirme fırsatı yakaladıysak, gerekli iyileştirmeleri de yaprak gerekli algoritmamızı olgunlaştırmalıyız.
       Aslında algoritma geliştirmek için gerekli adımlar 4 numaralı maddede biter. Ancak biz bilgisayar programları için algoritmalar geliştirdiğimiz için bu ve sonraki maddeleri ekliyorum.

5.Algoritma Kodlanması

Geliştirilen algoritma belirli bir programlama dilinde kodlanır. Böylece kağıt üzerinde ki çözümümüz bilgisayar üzerinde çalışabilecek hale gelir. Algoritmayı kodlarken kullanılan programlama dili ve platformun özelliklerini göz önünde bulundurursak kodun doğruluğu ve performanslı oluşu sağlanır.

6.Kodun Sınanması ve İyileştirilmesi

Yazılan kodda algoritmada olduğu gibi sınanır. Tabii bu sefer sınama bilgisayar üzerinden kod çalıştırılarak gerçekleştirilir. Bu sınama sırasında ortaya çıkan hatalar ve performans sıkıntıları giderilerek program iyileştirilir.

Yazılım Geliştirme Süreci

Algoritmalar, matematik biliminden bilgisayar bilimine miras yoluyla geçmiş problem çözme yöntemleridir. Geliştirilen tüm yazılımlar, ya müşterinin bir problemini çözmektir ya da mevcut bir ihtiyacı karşılar. Her iki durum içinde geliştirilen yazılım bir gerçek yaşam problemini çözdüğünü söyleyebiliriz.
       Peki, bir yazılımı geliştirmek için neler yapmak gerekir.
Bir yazılımı geliştirmek temel olarak şu adımları gerektirir.

1.Analiz

Analiz aşaması, müşteri gereksinimlerinin belirlendiği, bu gereksinimlerin çözümlendiği ve çerçevelendiği aşamadır. Bu aşamada yazılımın ne yapacağı, hangi ihtiyacı karşılayacağı, hangi problemi çözeceği belirlenir.

2.Tasarım

Analizle belirlenen bir yazılımın en uygun şekilde nasıl gerçekleştirebileceğinin belirlenmesidir. Müşterinin gereksinimlerine ve koşullara bakılarak hangi programlama dili, teknoloji, mimari, araç vb. kullanılarak, çözümün planı, modeli, mimarisi tasarlanır.

3.Geliştirme

Bir önceki aşamada belirlenmiş olan tasarım, artık hayata geçirilmeye, yazılım geliştirmeye başlanır. Kodlama bu aşamada yapılır. Bu aşamada, kodlamayla birlikte veritabanı geliştirme, arayüz tasarımı, çeşitli konfigrasyonlar ve dökümantasyonlar da yapılmaktadır.

4.Hatalardan Arındırma :

Gelişme sırasında ortaya çıkan arayüz, kod veritabanı, döküman gibi ürünlerin , istenilen şeye uygun olup olmadığı test edilir. Eğer yazılım çeşitli yerlerine hatalar bulunursa bu hatalar düzeltilerek yeniden test edilir. Böylece yazılım hatalardan mümkün olduğunca arındırılana kadar bu işlem devam eder.

5.Devreye Alma ve Bakım :

Bu aşamada, hatalarından arındırılmış yazılım müşteri yerine kurulur. Müşteriye gerekli eğitim verilir ve bir süre yazılımı kullanmasında destek olur.

Programlama Süreci

Bir yazılım geliştirme içerisindeki  temel işlemleri madde madde sıralarsak, kodlamanın (programlamanın) bunun içerisindeki yerini daha iyi anlayabiliriz.
  • Müşteri gereksinimlerini belirlemek
  • Çözümün mimarisini geliştirmek
  • Detaylı yazılım tasarımı yapmak
  • Veritabanı tasarımı yapmak
  • Veritabanı nesnelerini geliştirmek
  • Programlama yapmak
  • Test yapmak
  • Koddaki hatayı ayıklamak
  • Dökümantasyon yapmak
Yazılım geliştirmeyle, program yazmak birbirine çok yakın kavramlardır. Genellikle de birbirlerinin yerine kullanılır. Ancak programlama yapmak yerine," kod yazmak" ifadesini kullanarak bu ikisini birbirinden daha net ayırmamız mümkündür.

Bir kişi programlama yaptığını söylediğinde , genellikle kastettiği şey kod yazdığıdır. Büyük bir yazılımın geliştirme sürecinde onlarca insan çalışabilmektedir. Büyük yazılım projelerinde yer alan roller şöyledir;
  • Proje yöneticisi
  • Sistem analizi
  • Test uzmanı
  • Programcı
  • Veritabanı uzmanı
  • Arayüz tasarımcısı
  • Teknik dökümantasyon
Bu rollere bakarak konuştuğumuzda, programlama yapan kişi net bir şekilde diğerlerinden ayrıdır ve yaptığı iş kod yazmaktır. Kod yazma işleminin, yazılım geliştirme içindeki yerini de,  yukardaki listelere bakarak kafamızda netleştirebiliriz.
Yazılım geliştirme dediğimizde, bir yazılımın başlangıcından müşteriye teslimine kadar geçen süreçte yapılan işlemlerin tamamını kastederiz. Programlama dediğimizdeyse, bazen yazılım geliştirmeyi de kastetsek, aslında yazılımı oluşturan küçük parçalardan birini kodlamayı kastederiz.


Programlama Dilleri

Programlama dili, yazılımcının bir algoritmayı ifade etmek amacıyla, bir bilgisayara ne yapmasını istediğini anlatmasının yoludur. Programlama dilleri, yazılımcının bilgisayara hangi veri üzerinden işlem yapacağını, verinin nasıl depolanıp iletileceğini, hangi koşullarda hangi işlemlerin yapılacağını tam olarak anlatmasını sağlar.

Sizce Günümüze Kadar Geliştirilmiş Programlama Dillerinin Sayısı Nedir?

Wikipedia'daki alfabetik programlama dilleri listesini kaynak olarak kabul ettiğimizde 2500'ün üzerinde programlama dilinin mevcut olduğunu görebiliriz. Doğal olarak bu dillerin birçoğu günümüzde kullanılmıyor ve birçoğu da nadiren kullanım alanı buluyor. Ama yine de yüzlerle ifade edilen bir büyüklükten bahsediyoruz.

Programlama Dillerinin Tarihçesi

  • 1940 Öncesi : 
1837 yılında bir İngiliz profesörü olan Charles Babbage, çok amaçlı kullanım için geliştirdiği hesaplayıcısına bir sıralama/komut seti oluşturdu. Babbage ilk olarak 1837 yılında açıkladığı Analytical Engine Order Code çalışmalarını 1871 yılına kadar sürdürdü. Her ne kadar araç politik, ekonomik ve yasal sebeplerle yaygınlaşmasa da kayıtlara geçen ilk programlama dili olarak kabul edilmektedir. Daha sonraları, 1950'li yılların sonlarında, Howard Aiken Analytical Engine Order Code'u baz alarak CPC Coding Schema'yı geliştirdi ve 1949'da Robert Seeber CPC Coding Schema temellerinden yola çıkarak Seeber Coding Schema'yı açıkladı.
  • 1940 'lı Yıllar :
ENIAC Coding System, ilk elektronik dijital bilgisayardan olan Electronic Numerical Integrator and Computer(ENIAC) için 1943 yılında geliştirilmiştir. John Von Neumann, John Mauchly, J. Presper Eckert ve Herman Goldstine'in başını çektiği ekip tarafından geliştirilen dilin üzerine 1946 yılında Eniac Short Code, 1947 yılında Kathleen Booth tarafından ARC Assembly, 1948'de Haskell Curry Tarafından Curry Natation System, 1949 yılında John Mauchly ve William F. Schmitt tarafından Brief Code ve yine 1949 yılında Betty Holberton tarafından C-10 dilleri geliştirilmiştir.

1943 - Plankalkül (Konrad Zuse)
1943 - ENIAC coding system
1949 - C-10
  • 1950'li ve 1960'lı Yıllar :
Bu yıllar modern programlama dillerinin temelleri atıldığı yıllardır.
1951 - Regional Assembly Language
1952 - Autocode
1954 - FORTRAN (FORmula TRANslator)
1958 - LISP (LISt Processor)
1958 -ALGOL (ALGOrithmic Language)
1959 - COBOL (COmmon Business Oriented Language)
1962 -APL ( A Programming Language)
1962 - Simula
1964 -BASIC ( Beginner's All-purpose Symbolic Instruction Code)
1964 -PL/I ( Programming Language One)

  • 1970'li Yıllar:
Bu yıllarda programlama dilleri olgunlaşmaya, çeşitlenmeye başladığı ve yapısal programlama dillerinin geliştirildiği yıllardır.
1970 - Pascal
1972 - C
1972 - Smalltalk
1972 - Prolog
1973 - ML
1978 - SQL

  • 1980'li Yıllar :
1980'li yıllar daha geniş sistemler için ölçeklenebilir uygulamalar geliştirilebilecek dillerin doğduğu yıllardır. Bu yıllar nesne yönelimli programlamanın çokça konuşulduğu yıllardı.
1983 - Ada
1983 - C++
1985 - Eiffel
1987 - Perl
1989 - FL (Function Level)

  • 1990'lı Yıllar :
İnternetin yaygınlaşmasıyla birlikte, internetle çok ciddi anlamda bütünleşen Java dilinin geliştirildiği ve yaygınlaştığı yıllar oldu 1990'lar.
1990 - Haskell
1990 - Python
1991 - Java
1993 - Ruby
1995 - PHP
1995 - Delphi
2000 - C#

Programlamayla İlişkili Kavramlar

Bu başlık altında kaynak kod, kod düzenleyici, derleyici, yorumlayıcı kavramlarını görerek, programlamayla ilişkisine değineceğiz. Kavramları iyice anlayabilmek için hepsinin bir arada öğrenilmesi gerekmektedir.

Kaynak Kod

Bir programlama diliyle yazılmış metinlere kaynak kod(source code) denir. Kaynak kod dosyalarının uzantıları kullanıla programlama diline göre değişir. Bir kaynak kod dosyasını Notepad++ veya Wordpad gibi herhangi bir meyin düzenleyici programla açabiliriz. 
Kaynak kodlar bilgisayar üzerinde direkt olarak çalıştırılamazlar.

Kod Düzenleyici

Herhangi bir programlama dilinde program yazmak için, Notepad++ bile kullanılabilir. Ancak geliştirdiğimiz kodla ilgili ipuçları vermesi, hatalarımızı bularak bize göstermesi, hatta bazı hatalarımızı otomatik olarak düzeltmesi nedeniyle, ilgili programlama diline özel yapılmış kod düzenleyicileri kullanırız.

Amaç Program

Kaynak kodlar, insan tarafından anlaşılabilen ve insan tarafından oluşturulan program dosyalarıdır. Bu dosyaların bilgisayar tarafından anlaşılabilmesi için özel bir işlemden geçmesi ve sonrasında bilgisayarın anlayacağı makine diline çevrilmesi gerekir. İşte makine diline çevrilmiş ve bilgisayar üzerinde çalıştırabilir olan bu programa amaç program denir.

Derleyici

Herhangi bir programlama diliyle yazılmış olan kaynak kodu, makine diline yani amaç programa dönüştüren özel programlara derleyici(compiler) adı verilir. Derleyicilerin kaynak kodu amaç programa dönüştürmeleri işlemine de derleme(compile) denilmektedir.

Yorumlayıcı

Kaynak kodunu satır satır, komut komut derleyerek makine diline çeviren ve çalıştıran programlara yorumlayıcı(intepreter) adı verilmektedir. Yorumlayıcının amacı; programcının yazdığı programı satır satır işleterek, çalışmasını izlemesini ve varsa hatalarını bularak düzeltmesini sağlamaktadır.

Sonuç olarak yazılım geliştirme sürecinde ihtiyacımız  olan bilgi alanlarını şöylece tanımlayabiliriz.
  • Programlama dili : Yazılım geliştireceksek, en azından bir programlama diline hakim olmamız gerekir.
  • Yazılım geliştirme arabirimi : IDE (Integrated Development Environment) olarak da bilinen yazılım geliştirme arabirimi, kod düzenleyici, arayüz tasarlayıcı, kod derleyici ve yorumlayıcı bir arada barındıran ve yazılım geliştiricilere hayatı kolaylaştıran bir araçtır. Eğer yazılım geliştireceksek en hızlı şekilde en iyi kodu yazmamızı sağlayacak bir yazılım geliştirme arabirimi bilgisine sahip olmamız gerekmektedir.
  • Platform : Yukarıda bahsi geçen iyi konuda bilgi sahibiysek, yazılım geliştireceğimiz platformu iyice kavramalı, bu platformları temel olarak masaüstü işletim sistemleri, internet ve mobil olarak düşünülebilir. Yani VB.NET ile kodlamayı biliyor olabiliriz ancak Web uygulaması geliştiriyorsanız response, request gibi nesneleri de biliyor olmalıyız.
  • Teknoloji : Geliştirdiğimiz yazılımın üzerinde çalıştığı teknolojilere hakim olmamız gerekir. Örneğin; XML dosyaları işleyerek sipariş alacak bir yazılım geliştireceksek, XML teknolojisini bilmeliyiz. Eğer bir mail alma/yollama programı yazacaksak, SMTP protokolünü bilmeliyiz.
  • En iyi Pratikler( Best Practices) : Belirli bir teknolojide bir çözüm üretmek istiyorsak, öncelikle bu işi birileri yapmış mı diye bakmakta fayda vardır. Eğer yaptğımız işi daha önceden yapanlar olduysa, onların bunu nasıl çözdüğünü öğrenerek bu şekilde yapmak en doğrusu olacaktır. İşte bu daha önceki pratiklerin en iyilerini bulup bunlardan faydalanmalıyız.
  • İş Bilmek( Know-How) : Yazılım geliştireceği alana özel bilgilere know-how denir. Yazılımı geliştireceğimiz işi bilmeden o işi doğr ve kaliteli program yazmamız mümkün değildir.
  • Algoritma : Algoritma, geliştirilen yazılım içerisideki karmaşık bir problemin çözümünü bulmamızı sağlar. Yapılacak işin en iyi nasıl çözüleceğini bulmak için algoritmalardan faydalanırız.


1. Bölümün Sonu
kaynak  : Algorima "Kadir Çamoğlu"

Yorumlar

Bu blogdaki popüler yayınlar

Sensörler ve Transdüserler Vize çalışma notları

Sensör ve Transdüserler            Isı - Işık - Ses - Manyetik alan - Basınç 5 sensör çeşidi vardır. Sensivity ( hassasiyet) Linearity = Doğrusallık , Nonlinearity = Doğrusal olmayan  Accuary  = Sensörün isabetlilik oranı ne kadar yüksekse fiyatı o kadar artar. Hysteris = Artan ve azalan değerler arasında sensörün göstermiş olduğu tepki, farklılık. Saturation = -40 , +100 C ölçen sensör 101 C , 102 C sapmaz ama 110 C de sapma göstermeye başlar. Repeatability = Tekrarlanabilirlik. Sensörün en önemli özelliğidir. Sensörün o noktada her zaman aynı değer göstermesidir. Dead Band = Ölü bant. Sensör hiç bir şekilde tepki vermez. Resolution = Çözünürlük.                sensivity ile farkı;                - Hassasiyet 30,1 çıktısını verebilme özelliği. Çözünürlük ise dış tepkiye ne kadar yakın oluğudur.

Alternatif Akım(AC) Devre Analizi ders notları

AC devre analizi ders notları Saykıl; Alternatörün bir tam tur dönmesiyle meydana gelen dalga şeklidir.Sinüs dalgasında bir saykıl gerçekleştikten sonra sinyal kendini tekrarlamaya başlar.

Microsoft word'de joker karakter kullanımı

Örneğin, yıldız işareti (*) joker karakterini kullanarak bir karakter dizisini arayabilirsiniz ("s*d" "sat" ve "saadet"i bulur). Düzen menüsünden Bul'u veya Değiştir'i tıklatın.   Joker karakterlerini kullan onay kutusunu göremiyorsanız, Diğer'i tıklatın.   Joker karakterlerini kullan onay kutusunu seçin.   Aranan kutusuna bir joker karakter girin. Aşağıdakilerden birini yapın:   Listeden bir joker karakteri seçmek için, Özel'i tıklatın, bir joker karakterini tıklatın ve sonra Aranan iletişim kutusuna ek metni yazın.   Joker karakteri doğrudan Aranan kutusuna yazın.   Öğeyi değiştirmek istiyorsanız, yerine koymak istediğiniz öğeyi Yerine konan kutusuna yazın.   Sonrakini Bul, Değiştir veya Tümünü Değiştir düğmesini tıklatın.   İşlem halindeki bir aramayı iptal etmek için ESC tuşuna basın.   Notlar    Joker karakterleri kullan onay kutusu seçili ise, Word yalnızca belirttiğiniz tam metni bulur. (Büyük/Küçük harf duyarlı ve