• Sonuç bulunamadı

Algoritma ve Programlama I

N/A
N/A
Protected

Academic year: 2022

Share "Algoritma ve Programlama I"

Copied!
8
0
0

Yükleniyor.... (view fulltext now)

Tam metin

(1)

SAKARYA ÜNİVERSİTESİ

Algoritma ve Programlama  I 

Hafta 1 

  

Yrd. Doç. Dr. Cemil ÖZ   

   

 

   

Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan  bu ders içeriğinin bütün hakları saklıdır.  İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri mekanik, elektronik,  fotokopi,  manyetik  kayıt  veya  başka  şekillerde  çoğaltılamaz,  basılamaz  ve  dağıtılamaz.  Her  hakkı  saklıdır  ©  2008  Sakarya 

(2)

Algoritma Kavramı ve Özellikleri   1. Algoritma Kavramı  

• Algoritma, bir problem sınıfının sistemli çözümü için; sıralanmış, belirsizlik taşımayan, işlenebilir,  sonlu, işlem adımları kümesidir. 

• Algoritma,    sayıları  kolay  ve  doğru  tanımlama  sanattır.  Bir  işlem  dizisinin  sonucunu  elde  etmek  için, çok iyi tanımlanmış, sonlu sayıdaki işlem cümlelerinin bütünüdür. 

• Bilgisayar  programlamasının  temel  adımı  olan  bilgisayarın  işleyişine  uygun  çözüm  modelini  kurmada bu güne kadar uygulanan yaklaşım çözüm algoritması kurma yöntemidir.  

• Algoritma  yaklaşımı,  9.  yüzyılda  yaşamış  Türk‐İslam  matematikçi  ve  astronomu    Harzemli  Mehmet’in  ikinci  derece  denklemin  kolayca  çözümü  için  geliştirdiği  çözüm  yönteminin  genelleştirilmiş şeklidir ve algoritma sözcüğü onun adından türemiştir. 

• Bilgisayarlar  düşünemez.  Bu  sebeple  bilgisayarların  istenen  amaçlara  uygun  biçimde  kullanılabilmesi için programlanması gerekmektedir.  

• Programlama, bir işlemin bilgisayarın anlayabileceği bir biçime dönüştürülmesi işlemidir.  

• Bir  programın  amaca  uygun  olarak  çalışabilmesi  için,  belirli  aşamaları  yerine  getirmek  gerekmektedir; 

1. ANALİZ: Problem analiz edilir ve çözümlenir. 

2. TASARIM:  Yapılan  çözümlemeye  göre  algoritma  tasarımı/akış  diyagramı  oluşturulur. 

Doğruluğunun mantıksal sınaması yapılır. 

3. KODLAMA: Oluşturulan algoritma/akış diyagramı bir programlama dili ile yazılır (kodlanır).  

4. DERLEME: Program derlenir ve çalıştırılır. Yazım hataları varsa düzeltilir. 

5. TEST:  Program  istenilen  sonuçları  üretmiyor  ise  1.  adıma  dönülür  ve  problem  çözümlenmesi ve algoritma/akış diyagramı gözden geçirilir ve revize edilir.  

6. DOKÜMANTASYON: Programın dokümantasyonu oluşturulur. 

• Problem  analizi  ve  çözümlemesi,  problemin  tanımlanması,  problemin  giriş  bilgileri  ve  sonuca  ulaşmak için bu bilgiler üzerinde yapılması gereken işlemlerin ayrıntılı olarak belirlenmesidir. 

• Algoritma, bir problemin çözümü için yapılması gereken işlemlerin gereken sırada, adım, adım ve  basit deyimlerle yazılmış halidir.  

• Akış diyagramı, algoritmaların özel geometrik şekiller ile gösterilmesidir. 

• Algoritmaların  ifade  edilmesinde  akış  diyagramlarının  yanı  sıra,  konuşma  dili  ile  programlama dili arasında, sözde kod (pseudo‐code) adı verilen bir araç kullanılır. Sözde  kod, programlar gibi derlenmez ve işlenmez. 

• Her programcı kendi sözde kodunu geliştirebilir . Fakat kişisel sözde kodlar başkaları tarafından  anlaşılabilir bir biçimde açık olmalıdır. 

• Derleme, bir programlama dili ile yazılan kodların işletilebilmesi için makine diline çevrilmesidir. 

• Makine dili, bir bilgisayarın anlayabileceği tek dildir. Makine dili ile yazılan programlar yalnızca 0  ve 1’ lerden oluşur. Bu dille program yazabilmek için CPU’nun iç yapısını bilmek gerekir. Makine  dilinde  programlama  çok  karmaşık  olduğundan  makine  dili  kodları  simgesel  (assembly)  dili  ile  ifade edilir. 

• Simgesel (assembly) dillerde,0 ve 1’ ler yerine bazı sözcükler ve simgeler kullanılır. 

 

(3)

 

• Bellek,  üzerine bilgilerin yazılıp silinebileceği hücrelerden oluşur.  Her hücrenin sayısal bir adresi  vardır.  Bu  hücrelere  çoğu  kez  sözcük  (word)  adı  verilir.  Programlarda  yapılan  işlemler  bellek  hücrelerinde saklanan veriler üzerinde yapılır. 

• Örnek: 

1. 100 ile 101 numaralı hücrelerdeki bilgileri topla, sonucu 102 numaralı hücreye yaz. 

2. 100, 101 ve 102 numaralı hücrelerdeki bilgileri kağıda yaz. 

3. Dur. 

Daha  uzun  ve  karmaşık  problemlerde  hangi  bilginin  hangi  hücrede  bulunduğunun  çetelesinin  tutulmasının programcıya büyük bir yük getireceği açıktır.  

Bu nedenle bütün programlama dillerinde hücrelerin sembolik adresleri olan değişken kullanılır.  

Değişken aynı zamanda o adreste bulunan bilginin adıdır. 

Yukarında verilen işlem değişkenler ve aritmetik işaretler kullanılarak aşağıdaki şekilde yazılabilir; 

1. Z=X+Y. 

2. X,Y,Z ‘yi yaz. 

3. Dur. 

 

Değişken kullanımı program yazımını kolaylaştırır. İki program karşılaştırılırsa X, Y, Z’ nin sırası ile  100, 101, 102 numaralı hücrelerdeki bilgileri temsil ettiği görülebilir. Fakat programcı açısından X  bilgisinin belleğin hangi adresinde yerleştirildiğinin bilinmesi gerekmez.  

 

1.1. Algoritmanın özellikleri   

• Algoritma  kurduktan  sonra  bir  programlama  dilinde  yazılması  o  dilin  deyim  yapılarını,  kurallarını  ve  kullanılacak  derleyiciyi  bilmeyi  gerektirir.  Bu  beceri  birkaç aylık  bir  çalışma  sonunda elde edilebilir.  

• Algoritmanın kurulması bir çözümleme işidir. Programcının belirli bir konudaki bilgisine ve  algoritma  kurma  deneyimine  bağlıdır.  Bu  nedenle  algoritma  kurma  becerisinin  kazanılması çok daha uzun bir çalışma ve zaman gerektirir. 

• Algoritma kurma becerisi bir programa dilini kullanmaktaki rahatlık ve ustalıkla da doğru  orantılıdır. 

 

(4)

• Kullanılan programlama dili algoritmayı biçimsel açıdan etkiler.  

• Bir  algoritmanın  sahip  olması  gereken  bazı  özellikler  vardır.  Bunların  bir  kısmı  aşağıda  verilmiştir ve bunlar daha da artırılabilir; 

 

o Bilgisayarlar düşünemez. Bu yüzden algoritmanın her adımı anlaşılır, basit ve kesin  bir  biçimde  ifade  edilmiş  olmalıdır.  Yorum  gerektirmemeli  ve  belirsiz  ifadelere  sahip olmamalıdır. 

o Algoritma  etkin  olmalıdır.  Algoritmada  gereksiz  tekrarlar  bulunmamalıdır. 

Algoritmalar yapısal ve modüler olmalı ve yazılan bir algoritma daha sonra ihtiyaç  duyulduğunda başka algoritmalar tarafından da kullanılabilmelidir.      

o Algoritmanın sonlu sayıda yürütülebilir adımı olmalıdır.  

o Algoritmanın girdi ve çıktısı olmalıdır.  

   

1.2. Örnek algoritmalar   

Örnek alg.1;  

 

Problem: klavyeden okunan sayı sıfırdan büyük ise karesini alıp sonucu ekrana yazan, sayı sıfırdan  küçük ise yürütmeyi sonlandıran bir algoritmanın tasarlanması.   

 

Tasarım: kıyaslama gerektiğinden algoritmada if‐then (eğer‐ise) yapısı kullanılacak.  

 

Algoritma sözde kodlar ile ifade edildiğinde aşağıdaki şekilde yazılabilir; 

 

Adım 1: Oku (a)      /* sayıyı a değişkenine oku */ 

Adım 2: Eğer a<0 ise Adım 6’ya git  /* a<0 ise programı durdurmak için Adım 6’ ya git */ 

Adım 3: b=a*a     /* a’nın karesini al ve b değişkenine ata */ 

Adım 4: Yaz (b)      /* hesaplanan sonucu (b) ekrana yaz */ 

Adım 5: Adım 1’ e git    /* yeni sayıyı okumak için Adım 1’ e git */ 

Adım 6: Dur        /* programı sonlandır */ 

   

Örnek alg.2;  

 

Problem:  klavyeden  okunan  iki  farklı  sayıdan  büyük  olanı  belirleyen  ve  ekrana  yazan  bir  algoritmanın tasarlanması.   

 

Tasarım:  iki  sayı  arasında  kıyaslama  ve  seçim  gerektiğinden  algoritmada  if‐then‐else  (eğer‐ise‐

değilse) yapısı kullanılacak.  

 

Algoritma sözde kodlar ile ifade edildiğinde aşağıdaki şekilde yazılabilir; 

 

Adım 1: Oku (a)      /* birinci sayıyı a değişkenine oku */ 

Adım 2: Oku (b)      /* ikinci sayıyı b değişkenine oku */ 

Adım 3: Eğer a<b ise        eb = b  /* a<b ise, büyük olan b’ yi eb değişkenine ata */ 

          değilse  eb = a  /* a<b değilse, büyük olan a’ yı eb değişkenine ata */ 

Adım 4: Yaz (eb)      /* büyük olan sonucu (eb) ekrana yaz */ 

Adım 5: Dur        /* programı sonlandır */ 

   

(5)

Örnek alg.3;  

 

Problem:  klavyeden  okunan  bir  reel  sayının  karekökünü  bulup  sonucu  ekrana  yazan  bir   algoritmanın tasarlanması.   

 

Tasarım: öncelikle problemin çözümünün matematiksel olarak ifade edilmesi gerekmektedir; 

a,  karekökü  bulunmak  istenen  sayı  olun,  x  değeri  a’nın  tahmini  karekökü  ve  b  değeri  ise    a’nın  gerçek karekökü ile tahmin edilen karekökü arasındaki fark olsun. Bu durumda a aşağıdaki şekilde  ifade edilebilir; 

 

a = (x+b)2 ⇒ a = x2+2xb+b2    

Küçük olması beklene b2 değeri ihmal edilirse, b değeri yaklaşık olarak hesaplanabilir; 

 

b ≅ (a‐x2)/2x   

hesaplanan b değeri kullanılarak a’nın kareköküne daha yakın yeni bir tahmin yapılabilir; 

 

xi+1 = xi + b  /* burada xi önceki tahmin, xi+1 ise kareköke yakın yeni tahmin değeridir */ 

 

Bu şekilde a’nın karekökü girerek yakınsayan bir iterasyon (tekrarlama) ile bulunabilir. 

 

a’nın  karekökünü  yakınsayarak  bulan  bu  iteratif  (mutlak  hata  |b|,  ε  hata  değerinden  küçük  eşit  olana kadar işlem tekrar edilecek) algoritma sözde kodlar ile ifade edildiğinde aşağıdaki şekilde  yazılabilir (ifade kolaylığı için xi yerine x ve xi+1 yerine y kullanılarak); 

   

A1: Oku (a)        /* karekökü bulunacak sayıyı a değişkenine oku */ 

A2: Oku (x)        /* ilk tahmini karekökü x değişkenine oku */ 

A3: Oku (ε)        /* kabul edilebilir hata değerini ε değişkenine oku  */ 

A4: b=(a‐x2)/2x              /* fark (hata) değeri olan b’ yi hesapla */ 

A5: y=x+a        /* daha yakın yeni karekök değerini (y) hesapla */ 

A6: Eğer |b|≤ε ise A9’a git    /* |b|≤ε ise iterasyonu durdurmak için A9’e git */ 

A7: x=y        /* y yeni karekök değerini x değişkenine ata */ 

A8: A4’e git        /* işlemi yeni x  tahmini ile tekrarlamak için A4’e git */ 

A9: Yaz (y)        /* en son hesaplanan karekök değerini (y) ekrana yaz */ 

A10: Dur        /* programı sonlandır */ 

   

Bu algoritmada işlemlerin bir çevrimin içinde tekrarlandığı ve istenilen hassasiyete ulaşıldığında  çevrimin  dışına  çıkılarak  işlemin  tamamlandığı  görülmektedir.  Bilgisayar  da  program  işletilirken  bir değişkene yeni bir değer verildiğinde eski taşıdığı değerin kaybolacağı not edilmelidir.  

 

Aşağıda  bu  algoritmanın  nasıl  çalıştığı,  işlemlerin  her  tekrarında  (çevrimin  her  adımında)  değişkenlerin aldığı değerler  bir çizelgede verilerek açıklanmıştır.a, x ve ε değerlerinin sırası ile  31.8, 5.0 ve 0.005 olarak okunduğu kabul edilsin. 

           

(6)

Çevrim adım no     a     x        ε      b      y 

    31.8    5.0    0.005     

1    31.8    5.0    0.005     0.68    5.68 

2    31.8    5.68    0.005    ‐0.04    5.64 

3    31.8    5.64    0.005    ‐0.0001  5.64 

 

Çizelgeden de görüleceği gibi üçüncü çevrim adımında |b| değeri ε değeri olan 0.005’ den küçük  olduğu  için  yeni  karekök  değeri  hesaplanmaz  en  son  hesaplanan  karekök  değeri  y=5.64  olarak  kalır ve işlem sonlandırılır.  

 

Örnek alg.4;  

 

Problem: klavyeden okunan bir dizi harfin alfabetik sıraya konulmasını sağlayan ve sonucu ekrana  yazan bir  algoritmanın tasarlanması.   

 

Tasarım: öncelikle problemin çözümünün mantıksal olarak ifade edilmesi gerekmektedir; 

Harflerin  oluşturduğu  diziye  h  adı  verilsin  ve  dizinin  n  adet  harften  oluştuğu  kabul  edilsin. 

Örneğin n=5 için h dizisi aşağıdaki şekilde olabilir; 

 

B  A  E  C  D   

Dizinin elemanları birbirinden indis kullanılarak (hi şeklinde) ayırt edilecektir. Örneğin yukarıdaki  dizide  h3  E  harfini  ifade  etmektedir.  Sıralama  harfleri  ikişer  ikişer  ele  alıp  karşılaştırarak  ve  gerekirse  yerlerini  değiştirerek  yapılacaktır  ve  bu  işlem  dizi  başına  dönülerek  harfler  alfabetik  sıraya getirilene kadar devam ettirilecektir. Örneğin yukarıdaki dizi ele alınır ise, ilk adımda A ile  B’ nin yerleri değiştirilecek ikinci adımda B ile E oldukları yerlerde kalacak, üçüncü adımda C ile E,  dördüncü adımda D ile E yer değiştirecektir. Dizi sonuna geldiğinde E yerini bulmuş olacaktır. Bu  işlem dizi başına dönülerek harfler alfabetik sıraya getirilene kadar çevrim devam ettirilecektir.  

 

Bu  işlemi  gerçekleştirmek  için  sözde  kod  ile  yazılan  aşağıdaki  algoritmada  alfabetik  sırada  önce  olan harfin, sonrakinden daha küçük olduğu kabul edilmiştir.        

 

A1: Oku (n)        /* dizi eleman sayısını ata */ 

A2: Oku (h dizisi)      /* h dizisinin n elemanını oku */   

A3: k=n        /* k’ ya n değerini ver */ 

A4: k=k‐1           /* k’ yı bir eksilterek çevrim sayısını belirle */ 

A5: Eğer k=0 ise A14’e git    /* k=0 a ulaştı ise A14’ e git (çevrimi atla) */ 

A6: i=0         /* dizi indis değerini sıfırla */ 

A7: i=i+1        /* dizi indis değerini bir artır */ 

A8: Eğer i>k ise A4’e git    /* indis değeri çevrim değerinden büyükse A4’e git */ 

      /* her çevrimde bir harf yerini yerleştiği için */  

/* karşılaştırma indisi çevrim değerini aşmıyor,*/ 

/* yani yerini sağ tarafta yerine yerleşmiş */  

/* karakterler tekrar kontrol edilmiyor */ 

A9: Eğer hi<hi+1 ise A7’ye git    /* karşılaştırılan harflerin alfabetik sıralaması      doğru ise yer değiştirmeyi atla */ 

A10: b=hi        /* geçici değişken b’ ye hi değerini ver */ 

A11: hi=hi+1        /* hi’ ye hi+1 değerini ver */ 

A12: hi+1=b        /* hi+1’ e geçici b değişkenindeki eski hi değerini ver */ 

A13: A7’ ye git       /* kıyaslamayı bir sağa kaydırmak için */ 

A14: Yaz (h dizisi)      /* h dizisinin elemanlarını ekrana yaz */ 

A15: Dur        /* programı sonlandır */ 

(7)

 

Algoritmanın  değişkenlerinin  algoritmanın  çalışması  sırasında  alacakları  değerler  aşağıdaki  çizelgede  gösterilmiştir.  Başlangıçta  belirsiz  olan  değişkenlerin  her  adım  sonunda  aldıkları  değerler bu çizelgede incelenebilir. Görüleceği gibi algoritmanın bazı adımları sadece bir kez bazı  adımları ise birçok kez işlem görmektedir. 

   

İşlem adımı   Algoritma adımı   n   h1   h2   h3   h4   h5   k   i   b 

   1    A1        5 

   2    A2        5   B    A    E    C   D            3    A3        5   B    A    E    C   D   5       4    A4        5   B    A    E    C   D   4     5    A5        5   B    A    E    C   D   4     6    A6        5   B    A    E    C   D   4   0        7    A7        5   B    A    E    C   D   4   1        8    A8        5   B    A    E    C   D   4   1        9    A9        5   B    A    E    C   D   4   1 

10    A10        5   B    A    E    C   D   4   1   B       11    A11        5   A    A    E    C   D   4   1   B    12    A12        5   A    B    E    C   D   4   1   B    13    A13        5   A    B    E    C   D   4   1   B    14    A7        5   A    B    E    C   D   4   2   B    15    A8        5   A    B    E    C   D   4   2   B    16    A9        5   A    B    E    C   D   4   2   B    17    A7        5   A    B    E    C   D   4   3   B    18    A8        5   A    B    E    C   D   4   3   B    19    A9        5   A    B    E    C   D   4   3   B    20    A10        5   A    B    E    C   D   4   3   E    21    A11        5   A    B    C    C   D   4   3   E    22    A12        5   A    B    C    E   D   4   3   E    23    A13        5   A    B    C    E   D   4   3   E    24    A7        5   A    B    C    E   D   4   4   E    25    A8        5   A    B    C    E   D   4   4   E    26    A9        5   A    B    C    E   D   4   4   E    27    A10        5   A    B    C    E   D   4   4   E    28    A11        5   A    B    C    D   D   4   4   E    29    A12        5   A    B    C    D   E   4   4   E    30    A13        5   A    B    C    D   E   4   4   E    31    A7        5   A    B    C    D   E   4   5   E    32    A8        5   A    B    C    D   E   4   5   E    33    A4        5   A    B    C    D   E   3   5   E    34    A5        5   A    B    C    D   E   3   5   E    35    A6        5   A    B    C    D   E   3   0   E    36    A7        5   A    B    C    D   E   3   1   E    37    A8        5   A    B    C    D   E   3   1   E    38    A9        5   A    B    C    D   E   3   1   E    39    A7        5   A    B    C    D   E   3   2   E    40    A8        5   A    B    C    D   E   3   2   E    41    A9        5   A    B    C    D   E   3   2   E    42    A7        5   A    B    C    D   E   3   3   E    43    A8        5   A    B    C    D   E   3   3   E    44    A9        5   A    B    C    D   E   3   3   E 

(8)

  45    A7        5   A    B    C    D   E   3   4   E    46    A8        5   A    B    C    D   E   3   4   E    47    A4        5   A    B    C    D   E   2   4   E    48    A5        5   A    B    C    D   E   2   4   E    49    A6        5   A    B    C    D   E   2   0   E    50    A7        5   A    B    C    D   E   2   1   E    51    A8        5   A    B    C    D   E   2   1   E    52    A9        5   A    B    C    D   E   2   1   E    53    A7        5   A    B    C    D   E   2   2   E  54    A8        5   A    B    C    D   E   2   2   E    55    A9        5   A    B    C    D   E   2   2   E    56    A7        5   A    B    C    D   E   2   3   E  57    A8        5   A    B    C    D   E   2   3   E  58    A4        5   A    B    C    D   E   1   3   E  59    A5        5   A    B    C    D   E   1   3   E  60    A6        5   A    B    C    D   E   1   0   E  61    A7        5   A    B    C    D   E   1   1   E  62    A8        5   A    B    C    D   E   1   1   E  63    A9        5   A    B    C    D   E   1   1   E  64    A7        5   A    B    C    D   E   1   2   E  65    A8        5   A    B    C    D   E   1   2   E  66    A4        5   A    B    C    D   E   0   2   E  67    A14        5   A    B    C    D   E   0   2   E  68    A15        5   A    B    C    D   E   0   2   E   

 

Çizelgede verilen başlangıç örnek dizisi için algoritma, dizi kısmen kolay olduğu için, 29. adımda  alfabetik sıralamayı tamamlamıştır. Fakat algoritma daha karmaşık ve uzun dizileri de değişiklik  yapmadan çözebilmesi için bütün kontrolü tamamlayana kadar işleme devam eder. 

 

Referanslar

Benzer Belgeler

Örnek: 1’ den 10’ a kadar olan tamsayıları ekrana yazacak C programını yazalım.4. while(koşul)koşul sağlandığı sürece döngü

İki sayıyı çarpıp sonucu ekrana yazdıran algoritmayı metinsel ve sözde kod kullanarak hazırlamak.. Bir öğrencinin matematik dersinden aldığı iki notun

Bu tez çalışmasında gerçek zamanlı sistemlerin WCET analizine yardımcı olmak için için Ada programlama dilinde bir kıyaslama uygulama kümesi geliştirilmesi

Tüm bu bulgular incelendiğinde hem Scratch ile yapılan programlama öğretimi etkinliklerinin hem de programlama aracı kullanılmayan ortamda geleneksel yöntemlerle

Hacimsel kullanım oranı dikkate alındığında üç farklı palet yükleme oranına sahip problem grubunun çözüm değerleri arasında istatistiksel olarak anlamlı bir

• Kullandığımız yazılımların tamamı «kod» adı verilen bilgisayarın anlayacağı dilde yazılmış özel komutlardan oluşur. • Bu kodlar programcılar

• Yüksek seviyeli dillerde yazılan programları makine diline çeviren çevirici programlara Derleyici (Compiler) denir. • Yüksek seviyeli diller programcılara günlük

(d) Tüm döngü yapıları önce döngüye giriş koşulunu kontrol ederek döngüyü