Bölüm 1.4: Akış Diyagramları

Java ile Nesne Yönelimli Programlama
Algoritma ve akış diyagramıTemel sembollerÇizim kurallarıSıralı akış Koşullu akışTekrarlı akışDöngü sembolüAlt programDiyagramdan Java'ya
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Kavram

Algoritma ile akış diyagramı arasındaki ilişkiyi açıklamak; akış diyagramının neden ve nerede kullanıldığını söylemek.

Semboller

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.

Kontrol yapıları

Sıralı, koşullu ve tekrarlı akışı ayırt etmek; her biri için akış diyagramı çizmek.

İzleme

Bir diyagramı verilen girdiyle adım adım izleyip çıktıyı bulmak; sınır hatalarını ve sonsuz döngüleri fark etmek.

Diyagramdan Java'ya

Her sembolün Java karşılığını bilmek: nextInt(), atama, if/else, while, for, println.

Tasarım

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.
Benzetme: Yemek tarifi bir algoritmadır; aynı tarifin kutular ve oklarla çizilmiş hâli akış diyagramıdır. Program yazmadan önce çözümü kâğıt üzerinde planlamanın en kolay yoludur.
BaşlaÇaydanlığa su koySu kaynadı mı?BekleÇayı demleBitirHE

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.
problemalgoritmaakış diyagramıJava programıçalıştır, sınayanlış sonuç: algoritmaya geri dön
Tipik çalışma sırası: problem → algoritma (adımlar) → akış diyagramı → Java programı → çalıştırıp sınama.

Semboller ve Kurallar

Temel Öğeler (Semboller)

BaşlaBaşlangıç / Bitiş

Oval. Algoritmanın başladığı ve bittiği yer.

Oku xGiriş / Çıkış

Paralelkenar. Klavyeden veri okuma (girdi).

x = x + 1İşlem

Dikdörtgen. Hesaplama, işlem, atama.

x > 0 ?Karar

Eşkenar dörtgen. Evet/Hayır sorusu, iki çıkış.

i = 1; i ≤ 5; i++Döngü

Altıgen. Belirli sayıda tekrar.

Yaz xYazdır

Dalgalı alt kenar. Sonucu ekrana / kâğıda yazma.

ABağlantı noktası

Küçük çember. Çizgilerin birleştiği nokta.

Akış çizgisi

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ığı

SembolDiyagramdaki yazıJava karşılığı
Başla / BitirBaşla … Bitirpublic static void main(String[] args) { … }
GirişOku sayıint sayi = giris.nextInt();
İşlemsonuç = sayı1 + sayı2int sonuc = sayi1 + sayi2;
Kararsonuç = 0 ?if (sonuc == 0) { … } else { … }
Karar + geri oksayaç ≤ 10 ?while (sayac <= 10) { … }
Döngüi = 1; i ≤ 10; i++for (int i = 1; i <= 10; i++) { … }
YazdırYaz sonuçSystem.out.println(sonuc);
Diyagramdaki işlem kutusunda = 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

ortalama()Alt program

İki yanı çizgili dikdörtgen. Ayrıca çizilmiş bir adım dizisini çağırır. Java: metot çağrısı.

BSayfa dışı bağlantı

Ucu aşağı bakan beşgen. Diyagram başka sayfada sürer; iki uçta aynı harf yazılır.

notlarVeri deposu

Silindir. Dosyaya ya da veri tabanına kaydetme ve oradan okuma.

Oku xElle giriş

Üst kenarı eğik dörtgen. Bazı kaynaklar klavyeden girişi bununla çizer.

açıklamaAçıklama

Açık köşeli parantez. Akışa katılmayan not. Java: // yorumu.

i = 1Hazırlık

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?

Adımlar
  1. İşlemler adım adım belirlenir: girdiler, yapılacak hesaplar, çıktılar.
  2. Adımlar mantıklı bir sırayla yerleştirilir.
  3. Tüm işlemler akış çizgileri ile birbirine bağlanır.
  4. Koşullu ifadelerle karar noktaları belirlenir.
Çizim kuralları
  • 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ı

BaşlaBitir

Problem: dikdörtgenin alanını bulmak. Önce iskelet: bir Başla ve bir Bitir.

BaşlaOku a, bBitir

Girdiler belirlenir: kenar uzunlukları a ve b klavyeden okunur (paralelkenar).

BaşlaOku a, balan = a × bBitir

İşlem eklenir: alan = a × b hesaplanır ve alan değişkenine atanır (dikdörtgen).

BaşlaOku a, balan = a × bYaz alanBitir

Çıktı eklenir: hesaplanan alan ekrana yazılır (Yazdır).

BaşlaOku a, balan = a × bYaz alanBitir

Semboller mantıklı sırayla akış çizgileri ile bağlanır. Bu problemde karar noktası yok: akış sıralıdır.

BaşlaOku a, balan = a × bYaz alanBitira = 4, b = 3alan = 12ekranda: 12

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ı

Sıralı akışAdım 1Adım 2Adım 3

İşlem adımları sırayla, birer kez gerçekleşir.

Koşullu akışkoşul ?PQEH

Koşula bağlı olarak farklı işlem adımlarına yönelinir.

Tekrarlı akışkoşul ?gövdeEH

Koşul sağlandığı sürece bazı adımlar tekrarlanır.

Yapısal programlama teoremi (Böhm ve Jacopini, 1966): her algoritma yalnızca bu üç yapı (sıra, seçim, tekrar) iç içe kullanılarak yazılabilir. Java'da karşılıkları: art arda deyimler, if/else, while/for.

Kontrol Yapıları

Yapısal ve Yapısal Olmayan Diyagram

Yapısal

BaşlaAK ?BCDBitirEH

Yapısal olmayan

BaşlaAK ?BCL ?DBitirEHEH
  • 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 goto ile yazılırdı. Java'da goto ayrılmış bir sözcüktür ama kullanılamaz.
  • break ve continue sı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.

BaşlaOku a, bc = a + bYaz cBitir
Basit

Sade ve anlaşılır bir akışı temsil eder; dallanma ve tekrar yoktur.

Kolay bakım

Hata ayıklamak ve kodu anlamak kolaydır: adımlar yazıldığı sırayla izlenir.

Sıra önemlidir

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.

Geri dönüş yok

Her adım tam olarak bir kez çalışır; önceki bir adıma geri dönülmez, hiçbir adım atlanmaz.

Yanlış sıra örneği: 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

  1. Başla
  2. İlk sayıyı oku (sayı1)
  3. İkinci sayıyı oku (sayı2)
  4. İki sayıyı topla, sonuç'a ata
  5. Sonuç'u ekrana yaz
  6. Bitir

Her algoritma adımı diyagramda bir sembole karşılık gelir.

BaşlaOku sayı1Oku sayı2sonuç = sayı1 + sayı2Yaz sonuçBitir

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();
    }
}
BaşlaOku sayı1Oku sayı2sonuç = sayı1 + sayı2Yaz sonuçBitir

Program main'den başlar (Başla). Klavyeden okumak için bir Scanner oluşturulur.

BaşlaOku sayı1Oku sayı2sonuç = sayı1 + sayı2Yaz sonuçBitir

Mesaj yazılır, kullanıcı 7 girer: nextInt() değeri sayi1'e atar.

BaşlaOku sayı1Oku sayı2sonuç = sayı1 + sayı2Yaz sonuçBitir

Kullanıcı 5 girer: sayi2 = 5.

BaşlaOku sayı1Oku sayı2sonuç = sayı1 + sayı2Yaz sonuçBitir

İşlem kutusu: sonuc = 7 + 5 = 12.

BaşlaOku sayı1Oku sayı2sonuç = sayı1 + sayı2Yaz sonuçBitir

Yazdır kutusu: println sonucu ekrana yazar.

BaşlaOku sayı1Oku sayı2sonuç = sayı1 + sayı2Yaz sonuçBitir

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ış
}
K: koşul ?PQsonraki adımEvetHayır

Koşullu Akış

Örnek: Sayı Tek mi Çift mi?

Problem: verilen sayının tek mi çift mi olduğunu ekrana yazmak.

  1. Başla
  2. Sayıyı oku
  3. Sayı mod 2'yi al, sonuç'a ata
  4. Sonuç 0 ise 5'e git, değilse 6'ya git
  5. Ekrana "çift" yaz, 7'ye git
  6. Ekrana "tek" yaz
  7. Bitir
mod: bölümden kalan. 7 mod 2 = 1, 8 mod 2 = 0. Çift sayının 2'ye bölümünden kalan 0'dır. Java'da sayi % 2.
BaşlaOku sayısonuç = sayı mod 2sonuç = 0 ?Yaz çiftYaz tekBitirEH

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şlaOku sayısonuç = sayı mod 2sonuç = 0 ?Yaz çiftYaz tekBitirEH

Başla: Scanner oluşturulur.

BaşlaOku sayısonuç = sayı mod 2sonuç = 0 ?Yaz çiftYaz tekBitirEH

Kullanıcı 7 girer: sayi = 7.

BaşlaOku sayısonuç = sayı mod 2sonuç = 0 ?Yaz çiftYaz tekBitirEH

sonuc = 7 % 2 = 1 (7 = 3 × 2 + 1).

BaşlaOku sayısonuç = sayı mod 2sonuç = 0 ?Yaz çiftYaz tekBitirEH

Karar: 1 == 0 yanlış → Hayır (H) yolu, else bloğu.

BaşlaOku sayısonuç = sayı mod 2sonuç = 0 ?Yaz çiftYaz tekBitirEH

"tek" yazılır. if bloğundaki 10. satır atlandı.

BaşlaOku sayısonuç = sayı mod 2sonuç = 0 ?Yaz çiftYaz tekBitirEH

İ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

BaşlaOku sayısayı > 0 ?Yaz pozitifsayı < 0 ?Yaz negatifYaz sıfırBitirEHEH

Üç 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");
}
girdiizlenen yolçıktı
51. karar Epozitif
−21. karar H, 2. karar Enegatif
01. karar H, 2. karar Hsı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");
}
BaşlaOku sayısayı > 0 ?Yaz pozitifsayı < 0 ?Yaz negatifYaz sıfırBitirEHEHgirdi: −4

1. çalıştırma: kullanıcı −4 girer, sayi = −4.

BaşlaOku sayısayı > 0 ?Yaz pozitifsayı < 0 ?Yaz negatifYaz sıfırBitirEHEH−4 > 0 → yanlış

1. karar: -4 > 0 yanlış → Hayır çıkışı.

BaşlaOku sayısayı > 0 ?Yaz pozitifsayı < 0 ?Yaz negatifYaz sıfırBitirEHEH−4 < 0 → doğru

Hayır çıkışı 2. karara gider: -4 < 0 doğru → Evet.

BaşlaOku sayısayı > 0 ?Yaz pozitifsayı < 0 ?Yaz negatifYaz sıfırBitirEHEHçıktı: negatif

negatif yazılır; else kolu atlanır, akış Bitir'e gider.

BaşlaOku sayısayı > 0 ?Yaz pozitifsayı < 0 ?Yaz negatifYaz sıfırBitirEHEHgirdi: 0

2. çalıştırma: bu kez kullanıcı 0 girer (çıktı paneli yeni çalıştırmayı gösterir).

BaşlaOku sayısayı > 0 ?Yaz pozitifsayı < 0 ?Yaz negatifYaz sıfırBitirEHEH0 > 0 → yanlış

0 > 0 yanlış: 0 pozitif değildir.

BaşlaOku sayısayı > 0 ?Yaz pozitifsayı < 0 ?Yaz negatifYaz sıfırBitirEHEH0 < 0 → yanlış

0 < 0 da yanlış → ikinci kararın Hayır çıkışı.

BaşlaOku sayısayı > 0 ?Yaz pozitifsayı < 0 ?Yaz negatifYaz sıfırBitirEHEHçıktı: sıfır

İ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ş ≥ 18 ?ehliyet ?Yaz sürebilirYaz süremezyaş ≥ 18 VEehliyet ?Yaz sürebilirYaz süremezEEHHEH=
yaşehliyetyaş ≥ 18 VE ehliyetyaş ≥ 18 VEYA ehliyet
20varEvet → sürebilirEvet
20yokHayır → süremezEvet
16varHayır → süremezEvet
16yokHayır → süremezHayı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şula bağlı döngü

Koşul sağlandığı sürece tekrar eder. Kaç kez döneceği önceden bilinmeyebilir (ör. kullanıcı 0 girene kadar oku). Java: while.

i=1..1010 kezBelirli sayıda tekrar

Tekrar sayısı baştan bellidir (ör. 1'den 10'a kadar). Java: for.

?∞Sonsuz döngü

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

  1. Başla
  2. Sayaç = 1
  3. Sayaç ≤ 10 ise 4'e git, değilse 7'ye git
  4. Sayaç'ı yaz
  5. Sayaç'ı 1 artır
  6. 3'e git
  7. Bitir
6. adımdaki "3'e git", diyagramda karar kutusunun üstüne dönen geri oktur. Bu ok döngüyü oluşturur; karar kutusu döngüden çıkış kapısıdır.
Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

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;
        }
    }
}
Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

sayac = 1: döngü değişkenine başlangıç değeri verilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 1 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

1 yazılır, sayac 2 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 2 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

2 yazılır, sayac 3 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 3 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

3 yazılır, sayac 4 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 4 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

4 yazılır, sayac 5 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 5 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

5 yazılır, sayac 6 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 6 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

6 yazılır, sayac 7 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 7 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

7 yazılır, sayac 8 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 8 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

8 yazılır, sayac 9 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 9 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

9 yazılır, sayac 10 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 10 <= 10 doğru → Evet, döngü gövdesine girilir.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

10 yazılır, sayac 11 olur; geri okla koşula dönülür.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

Koşul: 11 <= 10 yanlış → Hayır, döngüden çıkılır.

Başlasayaç = 1sayaç ≤ 10 ?Yaz sayaçsayaç += 1BitirEH

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şulGövde kaç kez?Çıktı1'den 10'a yazar mı?
sayac < 1091 2 3 4 5 6 7 8 9Hayır: 10 eksik
sayac <= 10101 2 3 4 5 6 7 8 9 10Evet
sayac < 11101 2 3 4 5 6 7 8 9 10Evet (aynı anlam)
sayac <= 11111 2 … 10 11Hayır: 11 fazla
Bu hataya bir eksik / bir fazla hatası (off-by-one error) denir. Önlemek için koşul son değerle sınanır: sayaç = 10 iken koşul doğru mu? "1'den 10'a kadar" 10'u da kapsadığı için koşul 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.

  1. Başla
  2. Döngü: 1'den 10'a kadar
  3. Döngü değişkenini yaz
  4. Döngü sonu
  5. 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.

Başlai = 1; i ≤ 10; i++Yaz iiBitirtekrarbitti

Tekrarlı Akış

Döngü İçinde Karar: Sayaç ve Biriktirici

Başlagecen = 0toplam = 0k = 1; k ≤ 5; k++Oku nottoplam += notnot ≥ 50 ?gecen += 1kYaz gecen, toplam / 5BitirEHtekrarbitti
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);
Girdi 45 70 50 30 88 → Çıktı 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: 5 yazılsaydı tam sayı bölmesi 56 verirdi.
  • Üçüncü kalıp bayrak: boolean bir değişken, bir olayın olup olmadığını tutar (bulundu = true).

Tekrarlı Akış

Bekçi Değerli Döngü

Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEH
  • 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 = 0 durumu ayrıca sınanır: hiç sayı girilmezse toplam / adet sıfıra bölme olur (tam sayıda ArithmeticException, double'da NaN).

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");
}
Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEHtoplam = 0, adet = 0

Biriktirici ve sayaç sıfırlanır.

Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEHsayı = 12

Önce okuma: ilk sayı döngüden önce okunur. Girdi: 12 7 5 0.

Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEH12 ≠ 0 → E

Koşul: 12 ≠ 0 doğru → Evet, gövdeye girilir.

Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEHtoplam = 12, adet = 1, sayı = 7

toplam = 12, adet = 1; gövdenin sonunda sıradaki sayı okunur: 7.

Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEH7 ≠ 0 → toplam = 19, adet = 2

Geri okla karara dönülür: 7 ≠ 0. toplam = 19, adet = 2; okunan 5.

Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEH5 ≠ 0 → toplam = 24, adet = 3

5 ≠ 0: toplam = 24, adet = 3; okunan 0, yani bekçi.

Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEH0 ≠ 0 → H

0 ≠ 0 yanlış → Hayır: döngüden çıkılır. 0 toplama hiç katılmadı.

Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEH3 > 0 → E

Döngü sonrası denetim: adet = 3 > 0 → Evet.

Başlatoplam = 0adet = 0Oku sayısayı ≠ 0 ?toplam += sayıadet += 1Oku sayıadet > 0 ?Yaz toplam/ adetYaz"Sayı yok"BitirEHEH24 / 3 = 8.0

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ış

Başlabulunan = 0i = 1i ≤ 5 ?Oku xx < 0 ?i += 1bulunan = iYaz bulunanBitirEHEHbreak
  • 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);
Başlabulunan = 0i = 1i ≤ 5 ?Oku xx < 0 ?i += 1bulunan = iYaz bulunanBitirEHEHbreakbulunan = 0, i = 1

bulunan = 0 (henüz bulunamadı), i = 1. Girdi: 4 9 −2 6 1.

Başlabulunan = 0i = 1i ≤ 5 ?Oku xx < 0 ?i += 1bulunan = iYaz bulunanBitirEHEHbreak1 ≤ 5 → E

1 ≤ 5 → Evet, gövdeye girilir.

Başlabulunan = 0i = 1i ≤ 5 ?Oku xx < 0 ?i += 1bulunan = iYaz bulunanBitirEHEHbreakx = 4: 4 < 0 → H

x = 4; 4 < 0 yanlış → Hayır.

Başlabulunan = 0i = 1i ≤ 5 ?Oku xx < 0 ?i += 1bulunan = iYaz bulunanBitirEHEHbreaki = 2: 2 ≤ 5 → E

i = 2; geri okla karara dönülür: 2 ≤ 5 → Evet.

Başlabulunan = 0i = 1i ≤ 5 ?Oku xx < 0 ?i += 1bulunan = iYaz bulunanBitirEHEHbreakx = 9: H; i = 3: E

x = 9 yine negatif değil; i = 3, 3 ≤ 5 → Evet.

Başlabulunan = 0i = 1i ≤ 5 ?Oku xx < 0 ?i += 1bulunan = iYaz bulunanBitirEHEHbreakx = −2: −2 < 0 → E

x = −2; −2 < 0 doğru → Evet kolu.

Başlabulunan = 0i = 1i ≤ 5 ?Oku xx < 0 ?i += 1bulunan = iYaz bulunanBitirEHEHbreakbulunan = 3

bulunan = 3. break: i += 1 ve koşul atlanır, döngü hemen biter; 6 ve 1 hiç okunmaz.

Başlabulunan = 0i = 1i ≤ 5 ?Oku xx < 0 ?i += 1bulunan = iYaz bulunanBitirEHEHbreakSıra: 3

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();
}
Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibittii = 1

Dış döngü başlar: i = 1; 1 ≤ 2 doğru.

Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibittij = 1

İç döngü başlar: j = 1.

Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibitti1 × 1 = 1

1 × 1 = 1 yazılır.

Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibittij = 2: 1 × 2 = 2

Döngü sonu j: tekrar okuyla iç döngüye dönülür. j = 2, 2 yazılır.

Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibittij = 3: 1 × 3 = 3

j = 3, 3 yazılır.

Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibittij = 4: 4 ≤ 3 → bitti

j = 4: 4 ≤ 3 yanlış, iç döngü biter (bitti oku). println alt satıra geçer.

Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibittii = 2, j = 1: 2

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.

Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibittij = 2, 3: 4 ve 6

j = 2 ve 3: 4 ve 6 yazılır.

Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibittiiç döngü bitti

İç döngü yine biter, alt satıra geçilir.

Başlai = 1; i ≤ 2; i++j = 1; j ≤ 3; j++Yaz i × jjAlt satıra geçiBitirtekrartekrarbittibittii = 3: 3 ≤ 2 → bitti

i = 3: dış döngü biter. İç gövde 2 × 3 = 6 kez, println 2 kez çalıştı.

Alt Program

Alt Program Sembolü ve Metot

BaşlaOku vize, finort = ortalama(vize, fin)ort ≥ 50 ?Yaz ort, "geçti"Yaz ort, "kaldı"Bitirortalama(vize, fin)ort = vize × 0,4+ fin × 0,6Dön ortEH
  • 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). final Java'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ı");
}
BaşlaOku vize, finort = ortalama(vize, fin)ort ≥ 50 ?Yaz ort, "geçti"Yaz ort, "kaldı"Bitirortalama(vize, fin)ort = vize × 0,4+ fin × 0,6Dön ortEHmain başlar

Program main'den başlar (Başla).

BaşlaOku vize, finort = ortalama(vize, fin)ort ≥ 50 ?Yaz ort, "geçti"Yaz ort, "kaldı"Bitirortalama(vize, fin)ort = vize × 0,4+ fin × 0,6Dön ortEHvize = 40, fin = 70

Kullanıcı aynı satıra 40 ve 70 girer.

BaşlaOku vize, finort = ortalama(vize, fin)ort ≥ 50 ?Yaz ort, "geçti"Yaz ort, "kaldı"Bitirortalama(vize, fin)ort = vize × 0,4+ fin × 0,6Dön ortEHortalama(40, 70) çağrılır

Alt program kutusu: ortalama çağrılır; 40 ve 70 parametrelere kopyalanır.

BaşlaOku vize, finort = ortalama(vize, fin)ort ≥ 50 ?Yaz ort, "geçti"Yaz ort, "kaldı"Bitirortalama(vize, fin)ort = vize × 0,4+ fin × 0,6Dön ortEHort = 16 + 42 = 58.0

Alt programın kendi diyagramı çalışır: 16 + 42 = 58.0. Bu ort, main'deki ort'tan ayrı bir yerel değişkendir.

BaşlaOku vize, finort = ortalama(vize, fin)ort ≥ 50 ?Yaz ort, "geçti"Yaz ort, "kaldı"Bitirortalama(vize, fin)ort = vize × 0,4+ fin × 0,6Dön ortEHDön 58.0

Dön: değer çağırana verilir; ortalama'nın çerçevesi yığından kalkar.

BaşlaOku vize, finort = ortalama(vize, fin)ort ≥ 50 ?Yaz ort, "geçti"Yaz ort, "kaldı"Bitirortalama(vize, fin)ort = vize × 0,4+ fin × 0,6Dön ortEH58.0 ≥ 50 → E

Akış çağrının sonrasından sürer: 58.0 ≥ 50 doğru → Evet.

BaşlaOku vize, finort = ortalama(vize, fin)ort ≥ 50 ?Yaz ort, "geçti"Yaz ort, "kaldı"Bitirortalama(vize, fin)ort = vize × 0,4+ fin × 0,6Dön ortEH58.0 geçti

Evet kolu yazdırır.

BaşlaOku vize, finort = ortalama(vize, fin)ort ≥ 50 ?Yaz ort, "geçti"Yaz ort, "kaldı"Bitirortalama(vize, fin)ort = vize × 0,4+ fin × 0,6Dön ortEHBitir

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

BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEH

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);
i123456
toplam136101515 (çı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);
BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEHn = 4

Mesaj yazılır, kullanıcı 4 girer: n = 4.

BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEHtoplam = 0, i = 1

Başlangıç değerleri: biriktirici toplam = 0, sayaç i = 1.

BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEH1 ≤ 4 → E

Koşul: 1 ≤ 4 doğru → Evet, gövdeye girilir.

BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEHtoplam = 0 + 1 = 1, i = 2

toplam = 0 + 1 = 1, i = 2; geri okla karara dönülür.

BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEH2 ≤ 4 → toplam = 3, i = 3

2 ≤ 4 doğru: toplam = 1 + 2 = 3, i = 3.

BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEH3 ≤ 4 → toplam = 6, i = 4

3 ≤ 4 doğru: toplam = 3 + 3 = 6, i = 4.

BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEH4 ≤ 4 → toplam = 10, i = 5

4 ≤ 4 doğru: toplam = 6 + 4 = 10, i = 5.

BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEH5 ≤ 4 → H

Koşul: 5 ≤ 4 yanlış → Hayır çıkışı, döngüden çıkılır.

BaşlaOku ntoplam = 0i = 1i ≤ n ?toplam += ii += 1Yaz toplamBitirEHçıktı: Toplam: 10

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

sayı = 472toplam = 0sayı > 0 ?toplam += sayı mod 10sayı = sayı / 10Yaz toplamEH
Adımsayı mod 10toplamsayısayı > 0 ?
başlangıç–0472E
1. tur2247E
2. tur794E
3. tur4130H → 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ı / 10 tam sayı bölmesidir: 47 / 10 = 4. Basamaklar sağdan sola alınır.
  • Tablo hataları erken gösterir: sayı = sayı / 10 kutusu 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ı

GirdiNeden seçildi?Beklenen
51. kararın Evet yolupozitif
−22. kararın Evet yolunegatif
0iki kararın Hayır yolusıfır
1 ve −1sınırın hemen iki yanıpozitif, negatif

1'den n'e toplam diyagramı

nNeden seçildi?Beklenen
0gövde hiç çalışmazToplam: 0
1tek turToplam: 1
4olağan durumToplam: 10
−3geçersiz girdiToplam: 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ı > 0 için 0 ve 1; not ≥ 50 iç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österimTek/çift örneğiGüç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 okuyabilirBelirsiz olabilir
Akış diyagramıOku → İşlem → Karar → Yaz çift / Yaz tekAkışı görsel gösterir, dallanma ve döngü kolay görülürBüyük problemlerde hantal
Sözde kodOKU sayı; EĞER sayı mod 2 = 0 İSE YAZ "çift" DEĞİLSE YAZ "tek"Hızlı yazılır, koda yakınStandart bir söz dizimi yok
Javaif (sayi % 2 == 0) … else …Bilgisayar çalıştırabilirSöz dizimi kurallarına uymak gerekir
Yazılım mühendisliğinde akış diyagramının modern karşılığı UML etkinlik diyagramıdır (activity diagram): aynı fikir; başlangıç dolu daire, karar eşkenar dörtgen, etkinlikler yuvarlatılmış kutular.

Uygulama

Akış Diyagramı Çizim Araçları

AraçNe yapar?Not
Kâğıt ve kalemEn hızlı taslak; sınavda tek seçenekDüzeltmesi zahmetli
draw.io (diagrams.net)Tarayıcıda çalışan ücretsiz çizim aracı; hazır akış diyagramı sembolleriÇizer, çalıştırmaz
Microsoft VisioTicari diyagram programı; standart sembol kütüphaneleriÜcretli
FlowgorithmDiyagramı çalıştırır, değişkenleri izler; Java dâhil birçok dile kod üretirÜcretsiz, eğitim amaçlı
MermaidMetinden diyagram çizer; GitHub ve birçok Markdown aracı doğrudan gösterirKodla 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

KonuHatırlanacaklar
Akış diyagramıalgoritmanın sembol ve oklarla çizimi; dilden bağımsız plan
Sembolleroval 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ı
Kurallartek 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ıplarsayaç, 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

Karar kutusunda tek çıkışKarar sembolünden iki ok çıkmalı ve ikisi de E/H diye etiketlenmeli; aksi hâlde "hayır" durumunda ne olacağı belirsiz kalır.
Yanlış sembolKlavyeden okuma için dikdörtgen, hesaplama için paralelkenar kullanmak. Girdi = paralelkenar, işlem = dikdörtgen.
Karşılaştırmada = kullanmakif (sonuc = 0) derlenmez: error: incompatible types: int cannot be converted to boolean. Doğrusu sonuc == 0.
Başlangıç değerini unutmakDiyagramda "sayaç = 1" kutusu yoksa Java da şikâyet eder: error: variable sayac might not have been initialized.
Güncellemeyi unutmak"sayaç += 1" kutusu yoksa koşul hep doğru kalır: sonsuz döngü. Derleyici bu hatayı yakalamaz.
Sınır hatası"1'den 10'a kadar" için sayac < 10 yazmak 10'u atlar. Koşul son değerle sınanmalıdır.
Döngü başlığına noktalı virgülwhile (sayac <= 10); derlenir ama gövdesi boş bir döngü olur; sayaç artmadığı için program takılır.
Geri oku yanlış yere bağlamakGeri ok "sayaç = 1" kutusunun üstüne dönerse sayaç her turda 1'e sıfırlanır: yine sonsuz döngü. Ok karar kutusuna dönmelidir.

Özet

Örnek Problemler

  1. "Kullanıcıdan yaşını al", "yaş ≥ 18 mi?", "vergi = fiyat × 0,2" ve "Sonucu ekrana yaz" adımları hangi sembollerle çizilir?
  2. 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?
  3. Tek/çift diyagramına −3 girilirse ne yazılır? (Java'da -3 % 2 kaçtır?)
  4. 1'den 10'a diyagramında koşul sayaç < 10 olsaydı kaç sayı yazılırdı? Karar kutusu kaç kez sınanırdı?
  5. sayı = 1 iken "sayı < 100 ise sayı = sayı × 2" döngüsü kaç kez döner ve sayı kaç olur?
Cevapları göster
  1. Paralelkenar (giriş) · eşkenar dörtgen (karar) · dikdörtgen (işlem) · Yazdır (ya da çıkış paralelkenarı).
  2. Toplam = 1 + 2 + 3 + 4 = 10; i = 5 olduğunda 5 ≤ 4 yanlış olur ve döngüden çıkılır.
  3. -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ı.
  4. 1, 2, …, 9: 9 sayı. Koşul 10 kez sınanır (sayaç = 1…10); 10'da yanlış olur.
  5. 1 → 2 → 4 → 8 → 16 → 32 → 64 → 128: 7 kez döner, sayı = 128.

Özet

Alıştırmalar

  1. Kenarları klavyeden okunan dikdörtgenin alanını ve çevresini yazan akış diyagramını çizin (sıralı).
  2. Girilen üç sayıdan en büyüğünü bulan diyagramı çizin. 3, 9, 5 için izleyin.
  3. 1'den n'e kadar çift sayıların toplamını bulan diyagramı çizin. n = 10 için sonuç?
  4. n! (faktöriyel) hesaplayan diyagramı çizin ve Java'ya çevirin. n = 5 için sonuç?
  5. Kullanıcı 0 girene kadar sayı okuyup toplamı yazan diyagramı çizin. Girdi: 4 7 2 0.
  6. 0–100 arası notu harf notuna (≥ 85 A, ≥ 70 B, ≥ 50 C, değilse F) çeviren diyagramı çizin.
Cevaplar / ipuçları
  1. Başla → Oku a, b → alan = a × b → çevre = 2 × (a + b) → Yaz alan, çevre → Bitir. Karar yok.
  2. eb = a; b > eb ise eb = b; c > eb ise eb = c; Yaz eb. İki tek yönlü karar. 3, 9, 5 → 9.
  3. toplam = 0, i = 2; i ≤ n iken toplam += i, i += 2. n = 10 → 2 + 4 + 6 + 8 + 10 = 30.
  4. f = 1 (0 değil!); i = 1'den n'e: f = f × i. for (int i = 1; i <= n; i++) f *= i; → 120.
  5. Önce bir sayı oku; sayı ≠ 0 iken toplam += sayı ve yeni sayı oku. 4 + 7 + 2 = 13. Tekrar sayısı önceden bilinmez: while.
  6. Üç 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.

Son

Bölüm 1.4: Akış Diyagramları
Sonraki bölüm: Bölüm 2.1: Programlama · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.