BÖLÜM 2: ALGORİTMALAR Algoritma bir problemin çözümünde (işlemin gerçekleşmesinde) izlenen adımlar dizisi olup, problemi çözmek için yürütülecek eylemlerin ve bu eylemlerin sırasını belirten bir talimattır, prosedürdür. M.S. 9. yüzyılda İranlı Musaoğlu Horzumlu Mehmet Alharezmi problemlerin çözümü için genel kurallar oluşturmuştur. Algoritma, Alharezmi'nin Latince okunuşu olup bu kişinin adından gelmektedir. Algoritmaların sağlaması gereken kriterler: 1. Girdi: Sıfır veya daha fazla değer dışarıdan girilmelidir. 2. Çıktı: En azından bir değer üretilmeli. 3. Açıklık: Her işlem (komut) açık olmalı ve farklı anlamlar içermemeli. 4. Sonluluk: Her türlü olasılık için algoritma sonlu adımda bitmeli. Bu özellik geçerli değilse program işletim sistemleri gibi sonsuza dek çalışır. 5. Etkinlik: Her komut kişinin kalem ve kâğıt ile yürütebileceği kadar basit olmalıdır. Algoritmaların yazım dili çok farklı olabilir. Günlük konuşma diline yakın bir dil olabileceği gibi daha simgesel de olabilir. Algoritmaların özel geometrik şekillerle gösterilmesi de akış diyagramı olarak tanımlanır. Akış diyagramları geleneksel olarak kullanılan bir yapı olup algoritmayı yazarken farklı anlamlar taşıyan değişik şekillerdeki kutulardan yararlanılır. Yine aynı amaç için programlama diline yakın bir pseudocode (sözde kod) da kendimize özgü olarak kullanılabilir. I. ALGORİTMALARDA KULLANILAN İŞLEM OPERATÖRLERİ 1. Matematiksel (aritmetik) işlemler: İşlem Matematik Bilgisayar dili Toplama a + b a + b Çıkarma a - b a - b Üs alma a b a ^ b, a**b, pow(a,b) Çarpma a. b a * b Bölme a b a / b Gerçel sayılar 3,14 3.14 Matematiksel işlemlerde öncelik sıraları Sıra İşlem Bilgisayar dili 1 Parantezler ((..)) 2 Üs alma a ^ b, a**b, pow(a,b) 3 Çarpma ve Bölme a * b ve a / b 4 Toplama ve Çıkarma a + b ve a - b 7
2. Karşılaştırma (karar) işlemleri: Karşılaştırma İşlemleri İşlem sembolü Anlamı = veya == Eşittir <> veya!= Eşit değildir > Büyüktür < Küçüktür >= veya => Büyük eşittir <= veya =< Küçük eşittir 3. Mantıksal (Lojik) işlemler: Mantıksal işlem karşılıkları Mantıksal işlem Bilgisayar dili Matematiksel sembol VE AND veya &&. VEYA OR veya + DEĞİL NOT veya! ' Mantıksal işlem sonuçları Sonuç Rakam olarak Bilgisayar dili Lambanın durumu Anahtarın durumu Gerilim durumu Doğru 1 True Yanıyor Kapalı Var Yanlış 0 False Yanmıyor Açık Yok Temel mantıksal işlem tabloları: VE (AND) doğruluk tablosu A B A AND B 0 0 0 0 1 0 1 0 0 1 1 1 VEYA (OR) doğruluk tablosu A B A OR B 0 0 0 0 1 1 1 0 1 1 1 1 DEĞİL (NOT) doğruluk tablosu A DEĞİL (NOT) A 0 1 1 0 8
Mantıksal işlemlerde öncelik sıraları Sıra İşlem Bilgisayar dili 1 Parantez içindeki işlemler ((..)) 2 DEĞİL NOT veya! 3 VE AND veya && 4 VEYA OR veya II. ALGORİTMALARDA KULLANILAN ÖZEL TERİMLER 1. Değişken (Variable) Programın her çalıştırılmasında farklı değerler alabilen (aktarılabilen) bilgi alanlarıdır. Değişken isimlerinde: 1. İngiliz alfabesinin A-Z arası büyük ve küçük 26 harfi kullanılabilir. 2. 0 9 arası rakamlar kullanılabilir. 3. Alt çizgi ( _ ) dışında özel karakter kullanılmaz. 4. Mutlaka bir harf ile başlamalıdır. Değişken adının yerini aldığı ifadeye çağrışım yapacak şekilde olması programın anlaşırlılığı açısından önemlidir. Örnek 1: Girilen iki sayının toplamını görüntüleyen algoritma. 2. Birinci sayıyı (A) gir 3. İkinci sayıyı (B) gir 4. C=A+B işlemini yap 5. Sonucu (C) yaz 6. Dur Örnek 1 için uygulama sonuçları: Girilen A sayısı Girilen B sayısı C=A+B Yazılan C sayısı 5 3 8 8 Örnek 2: Numarası, 1. Vize, 2. Vize ve Final notu girilen bir öğrencinin numarasıyla beraber başarı notunu hesaplayıp görüntüleyen algoritma. 2. Öğrencinin numarasını (No) gir 3. Öğrencinin 1. vize notunu (Vize1) gir 4. Öğrencinin 2. vize notunu (Vize2) gir 5. Öğrencinin final (Final) notunu gir 6. BN = 0.25*(Vize1+Vize2)+0.5*Final 7. Numara (No) ve ortalamayı (BN) yaz 8. Dur No 1. Vize 2. Vize Final BN Ekrana Yazılan 118 50 70 80 70 118 70 9
2. Aktarma Herhangi bir bilgi alanına bilgi yazma, veri yazma, herhangi bir ifadenin sonucunu başka bir değişkende gösterme gibi görevlerde aktarma işlemi kullanılır. Değişken = İfade (matematiksel, mantıksal veya alfa-sayısal) Aktarma operatörü Sağdaki ifadenin sonucunu soldaki değişkene aktarır. Bu durumda değişkenin eğer varsa bir önceki değeri (eski değer) kaybolur. Aktarma işlemi uygulama sonuçları: a b Eski c Yeni c Matematiksel ifadelerde (c=a+b) 3 7-10 1. Çalıştırma 5 7 10 12 2. Çalıştırma 20 33 12 53 3. Çalıştırma Mantıksal ifadelerde (c=a+b) 0 1-1 1. Çalıştırma 0 0 1 0 2. Çalıştırma 1 1 0 1 3. Çalıştırma Alfasayısal ifadelerde (c=a+b) Galata saray - Galatasaray 1. Çalıştırma Fener bahçe Galatasaray Fenerbahçe 2. Çalıştırma Denizli spor Fenerbahçe Denizlispor 3. Çalıştırma Matematiksel mantıkla yaklaşılırsa: toplam = toplam + 1 toplam - toplam = 1 0 = 1 şeklinde yanlış bir sonuç çıkar. Bilgisayar dilinde ise durum farklı olup, önce sağ taraftaki ifadedeki işlem gerçekleştirilir ve sonuç aktarma operatörünün (=) sol tarafındaki değişkene aktarılır. Örnek 3: Girilen üç sayının toplamını görüntüleyen algoritma. 2. T=0 3. Bir sayı (A) gir 4. T=T+A işlemini yap 5. Başka bir sayı (B) gir 6. T=T+B işlemini yap 7. Başka bir sayı (C) gir 8. T=T+C işlemini yap 9. Yaz (T) 10. Dur A B C Eski T Yeni T 3 - - 0 0+3=3-4 - 3 3+4=7 - - 5 7 7+5=12 10
3. Döngü (Loop) Programlarda bazı işlemlerin tekrar tekrar yapılması veya belirli aralıklardaki ardışık değerlerin kullanılması gerekebilir. Örneğin 1 ile 1000 arasındaki tek sayıları toplamak için T=1+3+5+7+ + 999 şeklinde uzun uzun yazmak yerine 1 den başlayıp 2 şer 2 şer artan bir döngü ile bu işlem kolayca yapılabilir. Döngü Değişkeni = Döngü değişkeni ± Adım Döngü değişkeninin (Sayaç) eski değerine adım değeri eklenir/çıkartılır ve bulunan yeni değer döngü değişkeninin yeni değeri olarak döngü değişkenine aktarılır. S = S + 5 (Beşer beşer artan sayaç) S = S 1 (Birer birer eksilen sayaç) Döngü oluşturma kuralları: 1. Döngü değişkenine başlangıç değeri verilir 2. Döngünün artma veya azalma miktarı belirlenir 3. Döngünün bitiş değeri belirlenir 4. Eğer döngü karar ifadesiyle oluşturulduysa, sayaç değişkeni döngü içinde adım miktarı kadar artırılmalı ve azaltılmalı Örnek 4: 1-5 arası sayıları ekrana yazdıran algoritma. 2. S=0 3. Eğer S>4 ise git 7 4. S=S+1 5. Yaz S 6. Git 3 7. Dur Eski S Yeni S Ekrana Yazılan 0 0+1=1 1 1 1+1=2 2 2 2+1=3 3 3 3+1=4 4 4 4+1=5 5 Aynı örneği aşağıdaki algoritma ile de çözebiliriz: 2. S=1 3. Yaz S 4. S=S+1 5. Eğer S <= 5 ise git 3 6. Dur 11
4. Ardışık Toplama Toplam değişkeni = Toplam değişkeni + Sayı Toplam değişkenine başlangıç değeri olarak 0 atanır Örnek 5: Dışarıdan girilen 10 adet sayının ortalamasını bulup görüntüleyen algoritma. 2. T = 0 3. S = 1 4. Eğer S > 10 ise git 9 5. Sayıyı (A) gir 6. T = T + A 7. S = S + 1 8. Git 4 9. Ort = T / 10 10. Yaz (Ort) 11. Dur 5. Ardışık Çarpma Çarpım değişkeni = Çarpım değişkeni * Sayı Çarpım değişkenine başlangıç değeri olarak 1 atanır Örnek 6: Dışarıdan girilen N sayısının faktöriyelini hesaplayıp görüntüleyen algoritma: 2. (N) sayısını gir 3. F = 1 4. S = 1 5. Eğer S > N ise git 9 6. F = F * S 7. S = S + 1 8. Git 5 9. Yaz (F) 10. Dur III. GENEL ÖRNEKLER Algoritmalarda kullanılan notasyon günlük konuşma diline yakın olabileceği gibi daha simgesel de olabilir. Aşağıda bu notasyonlara örnekler verilmiştir. Örnek 1: 1'den 100'e kadar olan sayıların toplamını veren algoritma. 1. Toplam T, sayılar da i diye çağırılsın. 2. Başlangıçta T'nin değeri 0 ve i'nin değeri 1 olsun. 3. i'nin değerini T'ye ekle. 4. i'nin değerini 1 arttır. 5. Eğer i'nin değeri 100'den büyük değil ise 3. adıma git. 6. T'nin değerini yaz. 7. Dur. 12
Aynı algoritmayı aşağıdaki gibi de yazabiliriz. 1. T=0 ve i=1 2. i'nin değerini T'ye ekle 3. i'yi 1 arttır 4. i<=100 ise 2. adıma git 5. T'nin değerini yaz 6. Dur veya aşağıdaki şekilde de yazılabilir ki bizim de benimseyeceğimiz teknik budur. 1. T=0 ve i=1 2. i<=100 olduğu sürece tekrarla 2.1. T = T + i 2.2. i = i + 1 3. T'nin değerini yaz 4. Dur Döngü Gösterimi: Tekrarlanan adımlar Adım x. Koşul sağlandığı sürece x.1... x.2... Tekrarlanan adımlar x.n... 2 Örnek 2: İkinci derecede ( ax bx c 0 ) bir denklemin köklerini veren programın algoritması. Girdi: a, b ve c katsayıları Çıktı: Denklemin kökleri 1. a, b ve c katsayılarını al. 2. Delta = b * b - 4 * a * c 3. Eğer Delta < 0 ise Git 8 4. x1 = (-b + sqrt(delta)) / (2 * a) 5. x2 = (-b - sqrt(delta)) / (2 * a) 6. Yaz (x1, x2) 7. Git 9 8. Yaz Gerçel kök yoktur 9. Dur Örnek 3: İki tamsayının çarpımını sadece toplama işlemi kullanarak gerçekleyen algoritma. Girdi: İki tamsayı Çıktı: Sayıların çarpımı 1. a ve b sayılarını oku 2. c = 0 3. b > 0 olduğu sürece tekrarla 3.1. c = c + a 3.2. b = b - 1 4. Yaz (c) 5. Dur 13
Örnek 4: Bir tamsayının faktöriyelini döngü tekniği kullanarak hesaplayan algoritma. Girdi : Bir tamsayı, Çıktı : Sayının faktoriyel İlgili formul: Faktoriyel(n)=1*2*...*n 1. N değerini oku 2. F = 1 3. N >1 olduğu sürece tekrarla 3.1. F = F * N 3.2. N = N - 1 4. Yaz (F) 5. Dur Örnek 5: İki tamsayının bölme işlemini sadece çıkarma işlemi kullanarak gerçekleştiren algoritma. Bölüm ve kalanın ne olduğu da bulunacak. Girdi: İki tamsayı Çıktı: Bölüm ve Kalan 1. a ve b değerlerini oku 2. m=0 3. a >= b olduğu sürece tekrarla 3.1. a = a - b 3.2. m = m + 1 4. Yaz kalan (a) ve bölüm (m) 5. Dur Örnek 6: 100 adet sayıyı okuyup, ortalamasını bulan algoritma 1. T=0, i=1 2. i<=100 olduğu sürece tekrarla 2.1 m değerini oku 2.2 T = T + m 2.3 i = i + 1 3. Ort = T / 100 4. Ortalama (Ort) yaz 5. Dur Örnek 7: Sınavdaki en büyük notu bulan algoritma. 1. En büyük = ilk sınav kağıdındaki not (ya da olabilecek en düşük değer kabul edilebilir). 2. Başka incelenecek sınav kağıdı olduğu sürece 2.1 Sınav kağıdındaki not > En büyük ise En büyük = Sınav kağıdındaki not 3. En büyük değerini yaz. 4. Dur. Algoritmanın yazımı daha simgesel olabilir. Ni, i. Öğrencinin notu olsun. 1. EB = N1 2. i = 2 3. İncelenecek sınav kağıdı var ise 3.1 Ni > EB => EB = Ni 3.2 i = i + 1 4. EB yi yaz. 5. Dur 14
Koşul Gösterimi: Adım x. Koşul doğru ise x.1... x.2... x.n... aksi halde x.1... x.2... x.n... işlenen adımlar işlenen adımlar Örnek 8: Yukarda gösterilen notasyona göre kök bulma örneğinde 3. Adımı ve sonrasını tekrar yazalım; 1. a, b ve c katsayılarını al. 2. Delta = b * b - 4 * a * c 3. Eğer Delta >= 0 ise 3.1. x1 = (-b + sqrt(delta)) / (2 * a) 3.2. x2 = (-b - sqrt(delta)) / (2 * a) 3.3. Yaz (x1, x2) aksi halde 3.1. Yaz Gerçel kök yoktur 4. Dur Sorular: 1. Girilen üç sayıdan en büyüğünü bulan algoritmayı yazınız. 2. Tamsayılarda üs alma işlemini gerçekleştiren algoritmayı yazınız ( a b ). 3. 1 100 arasında tutulan bir sayıyı tahmin eden algoritmayı yazınız. 4. Girilen N adet sayının; a) Toplamını, b) Tek olanlarının toplamını, c) Çift olanların toplamını d) En küçüğünü ve e) En büyüğünü bulan algoritmayı yazınız. IV. PSEUDOCODE ÖRNEKLERİ Örnek 1: İki sayı oku, toplamını bul, yazdır. oku A, B TOPLAM = A + B yazdır TOPLAM Örnek 2: İki sayı okuyunuz. İkisini karşılaştırarak hangisinin büyük, hangisinin küçük olduğunu veya eşit olup olmadıklarını bulup uygun açıklamalarla yazdırınız. oku A, B A < B ise yazdır A, <, B A = B ise yazdır A, =, B A > B ise yazdır A, >, B Örnek 3: Birden ona kadar sayıların toplamını bulup yazdırınız. TOPLAM = 0 SAYAC = 1 den 10 a kadar devam et TOPLAM = TOPLAM + SAYAC SAYAC = SAYAC + 1 Yazdır 1 den 10 a kadar olan sayıların toplamı =, TOPLAM 15
Örnek 4: Klavyeden girişi yapılacak on adet pozitif sayıyı okuyup bu sayıları ve sayıların aritmetik ortalamasını bulup ekrana yazdırınız. TOPLAM = 0 SAYAC = 1 den 10 a kadar devam oku SAYI EĞER SAYI > 0 İSE yazdır SAYI TOPLAM = TOPLAM + SAYI SAYAC = SAYAC + 1 ORTALAMA = TOPLAM / 10 yazdır Okunan on sayının ortalaması =, ORTALAMA Örnek 5: Klavyeden girişi yapılacak pozitif sayıları okuyup bu sayıları ve sayıların aritmetik ortalamasını bulup ekrana yazdıracak bir uygulama geliştiriniz. Kaç sayı okuyacağımızı bilmiyoruz. Sayıların bittiğini en sonda girilen 1 sayısı belirtecektir. TOPLAM = 0 SAYAC = 0 oku SAYI SAYI 1 den farklı olduğu müddetçe devam et yazdır SAYI SAYAC = SAYAC + 1 TOPLAM = TOPLAM + SAYI oku SAYI ORTALAMA = TOPLAM / SAYAC yazdır Okunan sayıların kaç tane olduğu =, SAYAC yazdır Okunan sayıların ortalaması =, ORTALAMA Sorular: Aşağıdaki soruların pseudocode çözümlerini yapınız 1. Klavyeden girilen 2 sayının yerini değiştiriniz. 2. Bilinmeyen sayıda tam sayı okuyup (Veri sonu işareti 100) a) Girilen sayıların adedi b) 1 den büyük veya eşit ve 10 dan küçük sayıların adedi c) 5 ile 15 arasındaki (dahil) sayıların adedi. 3. 1 ile 100 arasındaki tam sayıların tek ve çift olanların ayrı ayrı toplamlarını bulunuz. 4. Okunan bir tam sayının tek mi çift mi olduğunu bulunuz. 5. 1 ile 10 arasındaki tam sayıların çarpımını bulunuz. 6. Her seferinde 2 sayı okunacak: DIRENC ve AKIM. VOLTAJI bulup yazdırınız. Voltaj = direnç * akım. 7. Bir dolabın tamiri için bir pseudocode geliştiriniz. Varılacak sonuç / Çıktı: Tamir etme! veya tamir edilmiş dolap. Sorgulanacak konular: tamir etmeye değer mi? araç-gereç var mı? gerekli yedek parçalar var mı? 8. Onluk sayı sisteminde verilen bir sayının ikili sayı sistemdeki karşılığını bulacak bir pseudocode geliştiriniz 9. Üç haneli bir sayının birler, onlar ve yüzler hanelerindeki rakamları bulup yazdırınız. 16