Bölüm 1.4: Akış Diyagramları
Giriş
Öğrenme Çıktıları
Algoritma ile akış diyagramı arasındaki ilişkiyi açıklamak; akış diyagramının neden ve nerede kullanıldığını söylemek.
Başla/Bitir, Giriş/Çıkış, İşlem, Karar, Döngü, Yazdır, bağlantı noktası ve alt program sembollerini tanımak ve doğru yerde kullanmak.
Sıralı, koşullu ve tekrarlı akışı ayırt etmek; her biri için akış diyagramı çizmek.
Bir diyagramı verilen girdiyle adım adım izleyip çıktıyı bulmak; sınır hatalarını ve sonsuz döngüleri fark etmek.
Her sembolün Java karşılığını bilmek: nextInt(), atama, if/else, while, for, println.
Basit bir problemi (toplam, tek/çift, sayma) önce diyagramla planlayıp sonra programa dönüştürmek.
Akış Diyagramı
Akış Diyagramları (Flowcharts)
- Algoritma (Algorithm): bir problemi çözmek veya belirli bir görevi yerine getirmek için adım adım talimatlar içeren plan.
- Akış diyagramı (Flowchart): algoritmanın adımlarını, adımlar arasındaki bağlantıları ve kontrol mekanizmalarını görsel olarak gösterir.
- Her adım bir sembolle, adımların sırası oklarla (akış çizgileri) çizilir.
Akış Diyagramı
Faydaları ve Sınırlılıkları
Faydaları
- Karmaşık süreçleri basitleştirir: çözümün tamamı tek bakışta görülür.
- Hataları ve iyileştirme noktalarını kod yazmadan önce belirlemeye yardımcı olur.
- Süreçleri belgelemede ve raporlamada kullanılır.
- Programlama dilinden bağımsızdır; ekip içinde ortak bir dil sağlar.
Sınırlılıkları
- Büyük programlarda diyagram çok büyür ve okunması zorlaşır.
- Algoritma değiştiğinde diyagramın yeniden çizilmesi gerekir.
- Ayrıntı arttıkça sembol sayısı artar; bu durumda sözde kod (pseudocode) daha pratiktir.
Semboller ve Kurallar
Temel Öğeler (Semboller)
Oval. Algoritmanın başladığı ve bittiği yer.
Paralelkenar. Klavyeden veri okuma (girdi).
Dikdörtgen. Hesaplama, işlem, atama.
Eşkenar dörtgen. Evet/Hayır sorusu, iki çıkış.
Altıgen. Belirli sayıda tekrar.
Dalgalı alt kenar. Sonucu ekrana / kâğıda yazma.
Küçük çember. Çizgilerin birleştiği nokta.
Ok. Adımların sırası; okun yönünde ilerlenir.
Semboller ISO 5807 standardına dayanır. Bazı kaynaklar giriş ve çıkışın ikisi için de paralelkenar kullanır; ekrana yazma için "Yazdır" sembolü de yaygındır.
Semboller ve Kurallar
Her Sembolün Java Karşılığı
| Sembol | Diyagramdaki yazı | Java karşılığı |
|---|---|---|
| Başla / Bitir | Başla … Bitir | public static void main(String[] args) { … } |
| Giriş | Oku sayı | int sayi = giris.nextInt(); |
| İşlem | sonuç = sayı1 + sayı2 | int sonuc = sayi1 + sayi2; |
| Karar | sonuç = 0 ? | if (sonuc == 0) { … } else { … } |
| Karar + geri ok | sayaç ≤ 10 ? | while (sayac <= 10) { … } |
| Döngü | i = 1; i ≤ 10; i++ | for (int i = 1; i <= 10; i++) { … } |
| Yazdır | Yaz sonuç | System.out.println(sonuc); |
= atama, karar kutusunda = karşılaştırmadır. Java'da atama =, karşılaştırma == ile yazılır. Diyagramdaki "mod" Java'da % işlecidir.Semboller ve Kurallar
Diğer Semboller
İki yanı çizgili dikdörtgen. Ayrıca çizilmiş bir adım dizisini çağırır. Java: metot çağrısı.
Ucu aşağı bakan beşgen. Diyagram başka sayfada sürer; iki uçta aynı harf yazılır.
Silindir. Dosyaya ya da veri tabanına kaydetme ve oradan okuma.
Üst kenarı eğik dörtgen. Bazı kaynaklar klavyeden girişi bununla çizer.
Açık köşeli parantez. Akışa katılmayan not. Java: // yorumu.
Altıgen. ISO 5807'deki adı hazırlıktır; döngünün başlangıç ayarı için kullanılır.
Temel semboller çoğu diyagram için yeterlidir. Ek semboller uzun diyagramları bölmeye (alt program, sayfa dışı bağlantı) ve verinin nereye yazıldığını göstermeye yarar.
Semboller ve Kurallar
Akış Diyagramı Nasıl Oluşturulur?
- İşlemler adım adım belirlenir: girdiler, yapılacak hesaplar, çıktılar.
- Adımlar mantıklı bir sırayla yerleştirilir.
- Tüm işlemler akış çizgileri ile birbirine bağlanır.
- Koşullu ifadelerle karar noktaları belirlenir.
- Tek bir Başla ve en az bir Bitir bulunur.
- Akış yukarıdan aşağıya, soldan sağa okunur.
- Her sembolün bir çıkışı vardır; yalnızca Karar sembolünün iki çıkışı (E/H) olur.
- Karar çıkışları mutlaka Evet/Hayır diye etiketlenir.
- Çizgiler kesişmemeli; gerekirse bağlantı noktası kullanılır.
- Kutulara kısa ve açık ifadeler yazılır.
Semboller ve Kurallar
Adım Adım Çizim: Dikdörtgenin Alanı
Problem: dikdörtgenin alanını bulmak. Önce iskelet: bir Başla ve bir Bitir.
Girdiler belirlenir: kenar uzunlukları a ve b klavyeden okunur (paralelkenar).
İşlem eklenir: alan = a × b hesaplanır ve alan değişkenine atanır (dikdörtgen).
Çıktı eklenir: hesaplanan alan ekrana yazılır (Yazdır).
Semboller mantıklı sırayla akış çizgileri ile bağlanır. Bu problemde karar noktası yok: akış sıralıdır.
Sınama: a = 4, b = 3 girilirse alan = 12 hesaplanır ve ekranda 12 görülür. Diyagram doğru çalışıyor.
Kontrol Yapıları
Kontrol Mekanizmaları
İşlem adımları sırayla, birer kez gerçekleşir.
Koşula bağlı olarak farklı işlem adımlarına yönelinir.
Koşul sağlandığı sürece bazı adımlar tekrarlanır.
if/else, while/for.Kontrol Yapıları
Yapısal ve Yapısal Olmayan Diyagram
Yapısal
Yapısal olmayan
- Yapısal diyagramda her kontrol yapısının tek girişi ve tek çıkışı vardır (kesikli çerçeve). Yapılar ya art arda dizilir ya da birbirinin içine yerleştirilir.
- Yapısal olmayan diyagramda oklar istenen yere atlar: L kararının Evet oku öteki kolun ortasına (C) girer, Hayır oku geriye, A'ya döner. Böyle “spagetti” akış izlemeyi ve hata ayıklamayı zorlaştırır.
- Eski dillerde bu atlamalar
gotoile yazılırdı. Java'dagotoayrılmış bir sözcüktür ama kullanılamaz. breakvecontinuesınırlı atlamalardır: yalnızca bulundukları döngüyü bitirir ya da sonraki tura geçer.- Böhm–Jacopini teoremi gereği her diyagram, gerekirse bir bayrak değişkeniyle, yapısal biçime dönüştürülebilir.
Sıralı Akış
Sıralı Akış (Sequential Flow)
Yapılacak işlerin (komutların) art arda, mantıksal bir sıra ile dizilmesidir. Akış yukarıdan aşağıya ilerler.
Sade ve anlaşılır bir akışı temsil eder; dallanma ve tekrar yoktur.
Hata ayıklamak ve kodu anlamak kolaydır: adımlar yazıldığı sırayla izlenir.
Bir adım öncekinin sonucunu kullanıyorsa yer değiştiremez. Birbirinden bağımsız adımların (ör. iki ayrı okuma) sırası ise değiştirilebilir.
Her adım tam olarak bir kez çalışır; önceki bir adıma geri dönülmez, hiçbir adım atlanmaz.
sonuç = sayı1 + sayı2 adımı sayılar okunmadan önce yazılırsa, toplama henüz bilinmeyen değerlerle yapılmaya çalışılır. Java'da değişkenler tanımlanmış ama değer almamışsa derleyici bunu yakalar: variable sayi1 might not have been initialized.Sıralı Akış
Örnek: İki Sayının Toplamı
Problem: klavyeden girilen iki sayının toplamını ekrana yazmak.
Algoritma
- Başla
- İlk sayıyı oku (sayı1)
- İkinci sayıyı oku (sayı2)
- İki sayıyı topla, sonuç'a ata
- Sonuç'u ekrana yaz
- Bitir
Her algoritma adımı diyagramda bir sembole karşılık gelir.
Sıralı Akış · Adım adım kod izleme
Diyagramdan Java'ya: Toplam Programı
import java.util.Scanner; public class IkiSayiToplami { public static void main(String[] args) { Scanner giris = new Scanner(System.in); System.out.print("İlk sayı: "); int sayi1 = giris.nextInt(); System.out.print("İkinci sayı: "); int sayi2 = giris.nextInt(); int sonuc = sayi1 + sayi2; System.out.println("Sonuç: " + sonuc); giris.close(); } }
Program main'den başlar (Başla). Klavyeden okumak için bir Scanner oluşturulur.
Mesaj yazılır, kullanıcı 7 girer: nextInt() değeri sayi1'e atar.
Kullanıcı 5 girer: sayi2 = 5.
İşlem kutusu: sonuc = 7 + 5 = 12.
Yazdır kutusu: println sonucu ekrana yazar.
Scanner kapatılır, main biter (Bitir). Her satır tam bir kez çalıştı.
Koşullu Akış
Koşullu Akış (Conditional Flow)
İki (veya daha çok) ihtimalden birinin seçildiği akış türüdür.
- Karar noktası (K): bir koşul sorusu bulunur; cevabı Evet ya da Hayır'dır.
- Evet'e göre akış (P): cevap evet ise P işlemi yönünde ilerlenir.
- Hayır'a göre akış (Q): cevap hayır ise Q işlemi yönünde ilerlenir.
- Esneklik (koşullara göre farklı davranış), karar verme yetisi (koşula bağlı işlem) ve kod kontrolü (durumu denetleyip ona göre işlem) sağlar.
if (K) { P; // koşul doğru } else { Q; // koşul yanlış }
Koşullu Akış
Örnek: Sayı Tek mi Çift mi?
Problem: verilen sayının tek mi çift mi olduğunu ekrana yazmak.
- Başla
- Sayıyı oku
- Sayı mod 2'yi al, sonuç'a ata
- Sonuç 0 ise 5'e git, değilse 6'ya git
- Ekrana "çift" yaz, 7'ye git
- Ekrana "tek" yaz
- Bitir
sayi % 2.Koşullu Akış · Adım adım kod izleme
Diyagramdan Java'ya: Tek mi Çift mi?
import java.util.Scanner; public class TekMiCiftMi { public static void main(String[] args) { Scanner giris = new Scanner(System.in); System.out.print("Sayı: "); int sayi = giris.nextInt(); int sonuc = sayi % 2; if (sonuc == 0) { System.out.println("çift"); } else { System.out.println("tek"); } giris.close(); } }
Başla: Scanner oluşturulur.
Kullanıcı 7 girer: sayi = 7.
sonuc = 7 % 2 = 1 (7 = 3 × 2 + 1).
Karar: 1 == 0 yanlış → Hayır (H) yolu, else bloğu.
"tek" yazılır. if bloğundaki 10. satır atlandı.
İki yol Bitir'de birleşir. 8 girilseydi sonuc = 0 olur, E yolundan "çift" yazılırdı.
Koşullu Akış
İç İçe Karar: Pozitif, Negatif, Sıfır
Üç ihtimal varsa iki karar kutusu art arda bağlanır: ilk sorunun Hayır çıkışı ikinci soruya gider.
int sayi = giris.nextInt(); if (sayi > 0) { System.out.println("pozitif"); } else if (sayi < 0) { System.out.println("negatif"); } else { System.out.println("sıfır"); }
| girdi | izlenen yol | çıktı |
|---|---|---|
| 5 | 1. karar E | pozitif |
| −2 | 1. karar H, 2. karar E | negatif |
| 0 | 1. karar H, 2. karar H | sıfır |
Tek yönlü karar (yalnız Evet kolu): Java'da else'siz if.
Koşullu Akış · Adım adım kod izleme
İç İçe Karar: Kod İzleme
Scanner giris = new Scanner(System.in); int sayi = giris.nextInt(); if (sayi > 0) { System.out.println("pozitif"); } else if (sayi < 0) { System.out.println("negatif"); } else { System.out.println("sıfır"); }
1. çalıştırma: kullanıcı −4 girer, sayi = −4.
1. karar: -4 > 0 yanlış → Hayır çıkışı.
Hayır çıkışı 2. karara gider: -4 < 0 doğru → Evet.
negatif yazılır; else kolu atlanır, akış Bitir'e gider.
2. çalıştırma: bu kez kullanıcı 0 girer (çıktı paneli yeni çalıştırmayı gösterir).
0 > 0 yanlış: 0 pozitif değildir.
0 < 0 da yanlış → ikinci kararın Hayır çıkışı.
İki koşul da yanlış: son else çalışır, sıfır yazılır. Üç koldan her seferinde yalnız biri çalışır.
Koşullu Akış
Birleşik Koşullar: VE, VEYA
| yaş | ehliyet | yaş ≥ 18 VE ehliyet | yaş ≥ 18 VEYA ehliyet |
|---|---|---|---|
| 20 | var | Evet → sürebilir | Evet |
| 20 | yok | Hayır → süremez | Evet |
| 16 | var | Hayır → süremez | Evet |
| 16 | yok | Hayır → süremez | Hayır |
- VE: iki koşul da doğruysa Evet. İki kararla çizilirse ilk kararın Hayır çıkışı doğrudan “süremez”e gider; ikinci karar hiç sorulmaz.
- VEYA: biri doğruysa yeter. İki kararla çizilirse ilk kararın Evet çıkışı doğrudan sonuca gider.
- Java:
if (yas >= 18 && ehliyet),||. Java da ikinci koşula yalnızca gerekirse bakar.
Tekrarlı Akış
Tekrarlı Akış (Döngü, Loop)
İşlemlerin birden çok kez tekrar ettiği akış türüdür. Diyagramda geriye doğru giden bir ok, karar kutusuna döner.
Koşul sağlandığı sürece tekrar eder. Kaç kez döneceği önceden bilinmeyebilir (ör. kullanıcı 0 girene kadar oku). Java: while.
Tekrar sayısı baştan bellidir (ör. 1'den 10'a kadar). Java: for.
Koşul hep sağlandığı için işlemler durmadan tekrarlanır. Çoğunlukla bir hatadır; sunucu gibi sürekli çalışan programlarda bilinçli kullanılır.
- Verimli: aynı işlem, kod tekrar tekrar yazılmadan istenen sayıda yapılır.
- Dinamik: tekrar sayısı girdiye göre değişebilir; program değişen koşullara uyum sağlar.
- Kod tekrarını önler: 1000 sayıyı yazdırmak için 1000 satır değil, 3–4 satır yeterlidir.
Tekrarlı Akış
Örnek: 1'den 10'a Kadar Sayıları Yazdırma
Algoritma
- Başla
- Sayaç = 1
- Sayaç ≤ 10 ise 4'e git, değilse 7'ye git
- Sayaç'ı yaz
- Sayaç'ı 1 artır
- 3'e git
- Bitir
Tekrarlı Akış · Adım adım kod izleme
Diyagramdan Java'ya: while Döngüsü
public class BirdenOna { public static void main(String[] args) { int sayac = 1; while (sayac <= 10) { System.out.print(sayac + " "); sayac += 1; } } }
sayac = 1: döngü değişkenine başlangıç değeri verilir.
Koşul: 1 <= 10 doğru → Evet, döngü gövdesine girilir.
1 yazılır, sayac 2 olur; geri okla koşula dönülür.
Koşul: 2 <= 10 doğru → Evet, döngü gövdesine girilir.
2 yazılır, sayac 3 olur; geri okla koşula dönülür.
Koşul: 3 <= 10 doğru → Evet, döngü gövdesine girilir.
3 yazılır, sayac 4 olur; geri okla koşula dönülür.
Koşul: 4 <= 10 doğru → Evet, döngü gövdesine girilir.
4 yazılır, sayac 5 olur; geri okla koşula dönülür.
Koşul: 5 <= 10 doğru → Evet, döngü gövdesine girilir.
5 yazılır, sayac 6 olur; geri okla koşula dönülür.
Koşul: 6 <= 10 doğru → Evet, döngü gövdesine girilir.
6 yazılır, sayac 7 olur; geri okla koşula dönülür.
Koşul: 7 <= 10 doğru → Evet, döngü gövdesine girilir.
7 yazılır, sayac 8 olur; geri okla koşula dönülür.
Koşul: 8 <= 10 doğru → Evet, döngü gövdesine girilir.
8 yazılır, sayac 9 olur; geri okla koşula dönülür.
Koşul: 9 <= 10 doğru → Evet, döngü gövdesine girilir.
9 yazılır, sayac 10 olur; geri okla koşula dönülür.
Koşul: 10 <= 10 doğru → Evet, döngü gövdesine girilir.
10 yazılır, sayac 11 olur; geri okla koşula dönülür.
Koşul: 11 <= 10 yanlış → Hayır, döngüden çıkılır.
Bitir. Gövde 10 kez, koşul 11 kez çalıştı.
Tekrarlı Akış
Sınır Koşulu: < mı, ≤ mü?
Döngü koşulundaki tek bir karakter, tekrar sayısını değiştirir. Sayaç 1'den başlıyor ve her turda 1 artıyor:
| Koşul | Gövde kaç kez? | Çıktı | 1'den 10'a yazar mı? |
|---|---|---|---|
sayac < 10 | 9 | 1 2 3 4 5 6 7 8 9 | Hayır: 10 eksik |
sayac <= 10 | 10 | 1 2 3 4 5 6 7 8 9 10 | Evet |
sayac < 11 | 10 | 1 2 3 4 5 6 7 8 9 10 | Evet (aynı anlam) |
sayac <= 11 | 11 | 1 2 … 10 11 | Hayır: 11 fazla |
sayac ≤ 10 olmalıdır.Tekrarlı Akış
Döngüye Özel Akış (Döngü Sembolü)
Aynı problem: 1'den 10'a kadar sayıları yazdırma.
- Başla
- Döngü: 1'den 10'a kadar
- Döngü değişkenini yaz
- Döngü sonu
- Bitir
Altıgen sembol döngünün üç parçasını tek kutuda toplar:
- başlangıç:
i = 1(bir kez) - koşul:
i ≤ 10(her turdan önce) - güncelleme:
i++, yani i'yi 1 artır (her turdan sonra)
"i" yazılı küçük çember döngü sonudur: akış oradan altıgene döner, döngü bitince Bitir'e geçer.
Tekrarlı Akış
Döngü İçinde Karar: Sayaç ve Biriktirici
int gecen = 0, toplam = 0; for (int k = 1; k <= 5; k++) { int not = giris.nextInt(); toplam += not; if (not >= 50) { gecen++; } } System.out.println(gecen + " geçti, ortalama " + toplam / 5.0);
3 geçti, ortalama 56.6- Sayaç (
gecen): koşul sağlandığında 1 artar. Biriktirici (toplam): her turda değer eklenir. - Karar döngünün içindedir: her turda yeni okunan notla yeniden sınanır. Hayır kolu sayacı atlayıp döngü sonuna gider.
- 50 sınırda:
>=olduğu için 50 alan geçer;>yazılsaydı sonuç 2 olurdu. toplam / 5.0:5yazılsaydı tam sayı bölmesi 56 verirdi.- Üçüncü kalıp bayrak:
booleanbir değişken, bir olayın olup olmadığını tutar (bulundu = true).
Tekrarlı Akış
Bekçi Değerli Döngü
- Bekçi değer (sentinel value): girdinin bittiğini bildiren, veri olarak sayılmayan özel değer (0, −1, “son”).
- Kaç değer geleceği önceden bilinmez: döngü koşula bağlıdır, Java'da
while. - Önce okuma: ilk değer döngüden önce okunur, sıradaki değer gövdenin sonunda okunur. Böylece bekçi gelince koşul hemen sınanır ve bekçi toplama katılmaz.
- Bekçi, gerçek veride olamayacak bir değer seçilir: notlar için −1 uygundur, 0 değildir (0 alan öğrenci olabilir).
- Döngüden sonra
adet = 0durumu ayrıca sınanır: hiç sayı girilmezsetoplam / adetsıfıra bölme olur (tam sayıdaArithmeticException,double'daNaN).
Tekrarlı Akış · Adım adım kod izleme
Bekçi Değer: Kod İzleme
int toplam = 0, adet = 0; int sayi = giris.nextInt(); while (sayi != 0) { toplam += sayi; adet++; sayi = giris.nextInt(); } if (adet > 0) { System.out.println("Ortalama: " + (double) toplam / adet); } else { System.out.println("Sayı yok"); }
Biriktirici ve sayaç sıfırlanır.
Önce okuma: ilk sayı döngüden önce okunur. Girdi: 12 7 5 0.
Koşul: 12 ≠ 0 doğru → Evet, gövdeye girilir.
toplam = 12, adet = 1; gövdenin sonunda sıradaki sayı okunur: 7.
Geri okla karara dönülür: 7 ≠ 0. toplam = 19, adet = 2; okunan 5.
5 ≠ 0: toplam = 24, adet = 3; okunan 0, yani bekçi.
0 ≠ 0 yanlış → Hayır: döngüden çıkılır. 0 toplama hiç katılmadı.
Döngü sonrası denetim: adet = 3 > 0 → Evet.
24 / 3 = 8.0 yazılır. İlk sayı olarak 0 girilseydi Hayır kolundan Sayı yok yazılırdı.
Tekrarlı Akış
Döngüden Erken Çıkış
- Aramada aranan bulununca kalan turlara gerek yoktur: döngünün içindeki ikinci bir karar akışı döngünün dışına çıkarır.
- Diyagramda döngünün iki çıkışı vardır: koşul yanlışlaşınca (bulunamadı) ve aranan bulununca. İki yol Yaz bulunan kutusunda birleşir.
- Java'da ikinci çıkış
break'tir; yalnızca içinde bulunduğu döngüyü bitirir. bulunan = 0“bulunamadı” demektir; sıra 1'den başladığı için gerçek bir sırayla karışmaz.- Tek çıkışlı, yapısal karşılığı bir bayrakla yazılır:
int bulunan = 0; boolean bulundu = false; for (int i = 1; i <= 5 && !bulundu; i++) { int x = giris.nextInt(); if (x < 0) { bulunan = i; bulundu = true; } }
Tekrarlı Akış · Adım adım kod izleme
Erken Çıkış: Kod İzleme
int bulunan = 0; for (int i = 1; i <= 5; i++) { int x = giris.nextInt(); if (x < 0) { bulunan = i; break; } } System.out.println("Sıra: " + bulunan);
bulunan = 0 (henüz bulunamadı), i = 1. Girdi: 4 9 −2 6 1.
1 ≤ 5 → Evet, gövdeye girilir.
x = 4; 4 < 0 yanlış → Hayır.
i = 2; geri okla karara dönülür: 2 ≤ 5 → Evet.
x = 9 yine negatif değil; i = 3, 3 ≤ 5 → Evet.
x = −2; −2 < 0 doğru → Evet kolu.
bulunan = 3. break: i += 1 ve koşul atlanır, döngü hemen biter; 6 ve 1 hiç okunmaz.
Sonuç yazılır. Negatif sayı hiç girilmeseydi döngü i = 6'da Hayır'dan çıkar, Sıra: 0 yazılırdı.
Tekrarlı Akış · Adım adım kod izleme
İç İçe Döngü: Kod İzleme
for (int i = 1; i <= 2; i++) { for (int j = 1; j <= 3; j++) { System.out.print(i * j + " "); } System.out.println(); }
Dış döngü başlar: i = 1; 1 ≤ 2 doğru.
İç döngü başlar: j = 1.
1 × 1 = 1 yazılır.
Döngü sonu j: tekrar okuyla iç döngüye dönülür. j = 2, 2 yazılır.
j = 3, 3 yazılır.
j = 4: 4 ≤ 3 yanlış, iç döngü biter (bitti oku). println alt satıra geçer.
Döngü sonu i: dış döngüye dönülür, i = 2. İç döngü yeniden j = 1'den başlar: 2 yazılır.
j = 2 ve 3: 4 ve 6 yazılır.
İç döngü yine biter, alt satıra geçilir.
i = 3: dış döngü biter. İç gövde 2 × 3 = 6 kez, println 2 kez çalıştı.
Alt Program
Alt Program Sembolü ve Metot
- Uzun bir diyagram anlamlı parçalara bölünür: bir parça ayrı bir diyagram olarak çizilir, ana diyagramda alt program sembolüyle çağrılır.
- Alt programın Başla kutusunda adı ve girdileri (parametreleri), sonunda Dön kutusu bulunur.
- Çağrıda akış alt programa geçer; Dön'e gelince sonuç çağırana verilir ve akış çağrının hemen sonrasından sürer (kesikli oklar).
- Java karşılığı metottur:
static double ortalama(int vize, int fin), çağrısıortalama(vize, fin).finalJava'da anahtar sözcük olduğu için değişkenin adıfin. - Kazanç: aynı adımlar yeniden çizilmez, her parça ayrı sınanır, ana diyagram kısa kalır.
Alt Program · Adım adım kod izleme
Alt Program Çağrısı: Kod İzleme
static double ortalama(int vize, int fin) { double ort = vize * 0.4 + fin * 0.6; return ort; } public static void main(String[] args) { Scanner giris = new Scanner(System.in); int vize = giris.nextInt(); int fin = giris.nextInt(); double ort = ortalama(vize, fin); if (ort >= 50) System.out.println(ort + " geçti"); else System.out.println(ort + " kaldı"); }
Program main'den başlar (Başla).
Kullanıcı aynı satıra 40 ve 70 girer.
Alt program kutusu: ortalama çağrılır; 40 ve 70 parametrelere kopyalanır.
Alt programın kendi diyagramı çalışır: 16 + 42 = 58.0. Bu ort, main'deki ort'tan ayrı bir yerel değişkendir.
Dön: değer çağırana verilir; ortalama'nın çerçevesi yığından kalkar.
Akış çağrının sonrasından sürer: 58.0 ≥ 50 doğru → Evet.
Evet kolu yazdırır.
Bitir. Aynı alt program başka girdilerle yeniden çağrılabilir: 45 ve 30 için 36.0 kaldı.
Uygulama
Uygulama: 1'den n'e Kadar Toplam
Sıralı (okuma, başlangıç değerleri), tekrarlı (toplama) ve yine sıralı (yazdırma) akış bir arada. toplam değişkeni bir biriktiricidir (accumulator): 0'dan başlar, her turda büyür.
System.out.print("n: ");
int n = giris.nextInt();
int toplam = 0;
int i = 1;
while (i <= n) {
toplam += i;
i += 1;
}
System.out.println("Toplam: " + toplam);| i | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| toplam | 1 | 3 | 6 | 10 | 15 | 15 (çıkış) |
n = 5 için çıktı: Toplam: 15 (1 + 2 + 3 + 4 + 5).
Uygulama · Adım adım kod izleme
1'den n'e Toplam: Kod İzleme
System.out.print("n: ");
int n = giris.nextInt();
int toplam = 0;
int i = 1;
while (i <= n) {
toplam += i;
i += 1;
}
System.out.println("Toplam: " + toplam);Mesaj yazılır, kullanıcı 4 girer: n = 4.
Başlangıç değerleri: biriktirici toplam = 0, sayaç i = 1.
Koşul: 1 ≤ 4 doğru → Evet, gövdeye girilir.
toplam = 0 + 1 = 1, i = 2; geri okla karara dönülür.
2 ≤ 4 doğru: toplam = 1 + 2 = 3, i = 3.
3 ≤ 4 doğru: toplam = 3 + 3 = 6, i = 4.
4 ≤ 4 doğru: toplam = 6 + 4 = 10, i = 5.
Koşul: 5 ≤ 4 yanlış → Hayır çıkışı, döngüden çıkılır.
Sonuç yazılır: 1 + 2 + 3 + 4 = 10. Gövde 4 kez, koşul 5 kez çalıştı.
Uygulama
Masa Başı Kontrol: İzleme Tablosu
| Adım | sayı mod 10 | toplam | sayı | sayı > 0 ? |
|---|---|---|---|---|
| başlangıç | – | 0 | 472 | E |
| 1. tur | 2 | 2 | 47 | E |
| 2. tur | 7 | 9 | 4 | E |
| 3. tur | 4 | 13 | 0 | H → Yaz 13 |
- Masa başı kontrol (desk check): diyagram ya da kod bilgisayarsız, kâğıt üzerinde bir girdiyle izlenir.
- İzleme tablosu: her değişkene bir sütun, her tura bir satır. Koşul sütunu döngünün kaç kez döndüğünü gösterir: 3 tur, 4 sınama.
sayı / 10tam sayı bölmesidir: 47 / 10 = 4. Basamaklar sağdan sola alınır.- Tablo hataları erken gösterir:
sayı = sayı / 10kutusu unutulsa sütun hep 472 kalır, yani sonsuz döngü.
int sayi = 472, toplam = 0; while (sayi > 0) { toplam += sayi % 10; sayi /= 10; } System.out.println(toplam);
Uygulama
Diyagramı Sınamak: Test Durumları
Pozitif / negatif / sıfır diyagramı
| Girdi | Neden seçildi? | Beklenen |
|---|---|---|
| 5 | 1. kararın Evet yolu | pozitif |
| −2 | 2. kararın Evet yolu | negatif |
| 0 | iki kararın Hayır yolu | sıfır |
| 1 ve −1 | sınırın hemen iki yanı | pozitif, negatif |
1'den n'e toplam diyagramı
| n | Neden seçildi? | Beklenen |
|---|---|---|
| 0 | gövde hiç çalışmaz | Toplam: 0 |
| 1 | tek tur | Toplam: 1 |
| 4 | olağan durum | Toplam: 10 |
| −3 | geçersiz girdi | Toplam: 0 (istenen bu mu?) |
- Tek girdiyle denemek yetmez: her karar kutusunun her çıkışı en az bir kez çalışmalıdır (yol kapsama).
- Sınır değerleri, koşulun sonucunun değiştiği noktanın hemen iki yanıdır:
sayı > 0için 0 ve 1;not ≥ 50için 49 ve 50. Bir eksik / bir fazla hataları burada ortaya çıkar. - Döngüler için üç durum: hiç dönmeyen, bir kez dönen, çok kez dönen girdi.
- Beklenen çıktı denemeden önce elle bulunur, sonra gerçek çıktıyla karşılaştırılır. Fark varsa hata ya diyagramda ya kodda ya da beklentidedir.
Uygulama
Algoritmayı Göstermenin Yolları
| Gösterim | Tek/çift örneği | Güçlü yanı | Zayıf yanı |
|---|---|---|---|
| Doğal dil | "Sayıyı oku; 2'ye bölümünden kalan 0 ise çift, değilse tek yaz." | Herkes okuyabilir | Belirsiz olabilir |
| Akış diyagramı | Oku → İşlem → Karar → Yaz çift / Yaz tek | Akışı görsel gösterir, dallanma ve döngü kolay görülür | Büyük problemlerde hantal |
| Sözde kod | OKU sayı; EĞER sayı mod 2 = 0 İSE YAZ "çift" DEĞİLSE YAZ "tek" | Hızlı yazılır, koda yakın | Standart bir söz dizimi yok |
| Java | if (sayi % 2 == 0) … else … | Bilgisayar çalıştırabilir | Söz dizimi kurallarına uymak gerekir |
Uygulama
Akış Diyagramı Çizim Araçları
| Araç | Ne yapar? | Not |
|---|---|---|
| Kâğıt ve kalem | En hızlı taslak; sınavda tek seçenek | Düzeltmesi zahmetli |
| draw.io (diagrams.net) | Tarayıcıda çalışan ücretsiz çizim aracı; hazır akış diyagramı sembolleri | Çizer, çalıştırmaz |
| Microsoft Visio | Ticari diyagram programı; standart sembol kütüphaneleri | Ücretli |
| Flowgorithm | Diyagramı çalıştırır, değişkenleri izler; Java dâhil birçok dile kod üretir | Ücretsiz, eğitim amaçlı |
| Mermaid | Metinden diyagram çizer; GitHub ve birçok Markdown aracı doğrudan gösterir | Kodla birlikte saklanır |
Mermaid ile tek/çift diyagramı
flowchart TD
A([Başla]) --> B[/Oku sayı/]
B --> C{sayı mod 2 = 0 ?}
C -- Evet --> D[Yaz çift]
C -- Hayır --> E[Yaz tek]
D --> F([Bitir])
E --> F([ ])Başla/Bitir,[/ /]giriş,{ }karar,[ ]işlem;-->akış çizgisi,-- Evet -->etiketli çıkış.TD: yukarıdan aşağıya (top-down) yerleşim; kutuların yerini araç kendisi belirler.- Çizim aracı ne olursa olsun kurallar aynıdır: tek Başla, etiketli karar çıkışları, kesişmeyen oklar.
Özet
Özet
| Konu | Hatırlanacaklar |
|---|---|
| Akış diyagramı | algoritmanın sembol ve oklarla çizimi; dilden bağımsız plan |
| Semboller | oval Başla/Bitir · paralelkenar giriş · dikdörtgen işlem · eşkenar dörtgen karar · altıgen döngü · dalgalı kutu yazdır · çember bağlantı |
| Kurallar | tek Başla; yukarıdan aşağı; karar kutusunun iki etiketli çıkışı (E/H); kesişmeyen çizgiler |
| Sıralı akış | adımlar art arda, her biri bir kez; bağımlı adımların sırası önemli |
| Koşullu akış | K sorusu → Evet: P, Hayır: Q; Java if/else; iç içe kararlarla üç ve daha çok yol |
| Tekrarlı akış | geri ok + karar; başlangıç, koşul, güncelleme; Java while, for, do-while |
| Kalıplar | sayaç, biriktirici, bayrak; bekçi değerli döngü; erken çıkış (break); alt program = metot |
| Tuzaklar | < / ≤ sınır hatası; güncellemeyi unutmak → sonsuz döngü |
Özet
Sık Yapılan Hatalar
if (sonuc = 0) derlenmez: error: incompatible types: int cannot be converted to boolean. Doğrusu sonuc == 0.error: variable sayac might not have been initialized.sayac < 10 yazmak 10'u atlar. Koşul son değerle sınanmalıdır.while (sayac <= 10); derlenir ama gövdesi boş bir döngü olur; sayaç artmadığı için program takılır.Özet
Örnek Problemler
- "Kullanıcıdan yaşını al", "yaş ≥ 18 mi?", "vergi = fiyat × 0,2" ve "Sonucu ekrana yaz" adımları hangi sembollerle çizilir?
- Diyagram: toplam = 0, i = 1; i ≤ 4 iken toplam += i ve i += 1; sonra Yaz toplam. Çıktı nedir? Döngüden çıkışta i kaçtır?
- Tek/çift diyagramına −3 girilirse ne yazılır? (Java'da
-3 % 2kaçtır?) - 1'den 10'a diyagramında koşul
sayaç < 10olsaydı kaç sayı yazılırdı? Karar kutusu kaç kez sınanırdı? - sayı = 1 iken "sayı < 100 ise sayı = sayı × 2" döngüsü kaç kez döner ve sayı kaç olur?
Cevapları göster
- Paralelkenar (giriş) · eşkenar dörtgen (karar) · dikdörtgen (işlem) · Yazdır (ya da çıkış paralelkenarı).
- Toplam = 1 + 2 + 3 + 4 = 10; i = 5 olduğunda
5 ≤ 4yanlış olur ve döngüden çıkılır. -3 % 2= −1 (Java'da kalan, bölünenin işaretini alır). −1 ≠ 0 → Hayır yolu → tek yazılır. Doğru sonuç, çünkü koşul "= 0" diye kurulmuştur; "= 1" diye kurulsaydı negatif tek sayılar çift sanılırdı.- 1, 2, …, 9: 9 sayı. Koşul 10 kez sınanır (sayaç = 1…10); 10'da yanlış olur.
- 1 → 2 → 4 → 8 → 16 → 32 → 64 → 128: 7 kez döner, sayı = 128.
Özet
Alıştırmalar
- Kenarları klavyeden okunan dikdörtgenin alanını ve çevresini yazan akış diyagramını çizin (sıralı).
- Girilen üç sayıdan en büyüğünü bulan diyagramı çizin. 3, 9, 5 için izleyin.
- 1'den n'e kadar çift sayıların toplamını bulan diyagramı çizin. n = 10 için sonuç?
- n! (faktöriyel) hesaplayan diyagramı çizin ve Java'ya çevirin. n = 5 için sonuç?
- Kullanıcı 0 girene kadar sayı okuyup toplamı yazan diyagramı çizin. Girdi: 4 7 2 0.
- 0–100 arası notu harf notuna (≥ 85 A, ≥ 70 B, ≥ 50 C, değilse F) çeviren diyagramı çizin.
Cevaplar / ipuçları
- Başla → Oku a, b → alan = a × b → çevre = 2 × (a + b) → Yaz alan, çevre → Bitir. Karar yok.
- eb = a; b > eb ise eb = b; c > eb ise eb = c; Yaz eb. İki tek yönlü karar. 3, 9, 5 → 9.
- toplam = 0, i = 2; i ≤ n iken toplam += i, i += 2. n = 10 → 2 + 4 + 6 + 8 + 10 = 30.
- f = 1 (0 değil!); i = 1'den n'e: f = f × i.
for (int i = 1; i <= n; i++) f *= i;→ 120. - Önce bir sayı oku; sayı ≠ 0 iken toplam += sayı ve yeni sayı oku. 4 + 7 + 2 = 13. Tekrar sayısı önceden bilinmez:
while. - Üç iç içe karar: not ≥ 85? → A; değilse not ≥ 70? → B; değilse not ≥ 50? → C; değilse F. Java:
if … else if … else.
Özet
Kaynaklar
- ISO 5807:1985, Information processing — Documentation symbols and conventions for data, program and system flowcharts.
- C. Böhm ve G. Jacopini, "Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules", Communications of the ACM 9(5), 1966.
- P. Deitel ve H. Deitel, Java: How to Program, 11. baskı, Pearson, 2017 (Bölüm 4–5: kontrol deyimleri ve etkinlik diyagramları).
- A. B. Downey ve C. Mayfield, Think Java, 2. baskı, O'Reilly, 2019.
- Oracle, The Java Tutorials: "Control Flow Statements" (docs.oracle.com/javase/tutorial).
- K. Sierra ve B. Bates, Head First Java, 3. baskı, O'Reilly, 2022.