Teori
Öğrenme hedefleri
Bu haftanın sonunda:
- 1 Basit bir algoritmayı standart sembollerle akış diyagramı ve Türkçe sözde kod olarak yazar; sıra, seçim ve tekrar yapılarını diyagramda gösterir.
- 2 Aynı algoritmayı diyagram, sözde kod ve Java olarak üç biçimde yan yana okur ve birinden diğerine çevirir.
- 3 Bir Java dosyasının zorunlu iskeletini (class, main, süslü parantez, noktalı virgül) açıklar; javac ile derleyip java ile çalıştırır.
- 4 JDK, JVM ve bytecode kavramlarını bir cümleyle söyler; derleme sürecini çizer.
- 5 Sözdizimi, çalışma zamanı ve mantık hatalarını bilerek bozulmuş bir programda bulup sınıflandırır.
- 6 Graphviz Online'da DOT koduyla küçük bir akış diyagramı çizer.
Derse Başlamadan Önce
- Kağıt ve kalem. Bu haftaki bulmacayı kağıtta çizeceğiz, çünkü telefon ekranında diyagram çizmeye çalışmak gerçekten işkencedir.
- Tarayıcınızda Java Playground açık olsun, çünkü geçen haftaki gibi sınıf ve
mainyazmadan kod çalıştıracağız. - Graphviz Online adresini bir kez açın. Sol tarafta hazır bir örnek kod, sağ tarafta onun çizimi görünür. Hiçbir şey yazmanıza gerek yok, yalnızca sayfanın açıldığını ve sağ tarafın kendiliğinden çizildiğini görmeniz yeter. Lab 2’de diyagramları bu araçla üretip PNG olarak indireceksiniz.
- Geçen haftanın nehir bulmacası kağıdı yanınızdaysa getirin; bugün onu diyagrama çevireceğiz.
Haftanın Bulmacası
Çizimlerin çoğunda üç tür kutu kendiliğinden ortaya çıkar: iş yapan (bakiyeyi düşür), soru soran (şifre doğru mu?) ve bir şey alan ya da gösteren (tutarı al, mesaj göster). Akış diyagramının standart sembolleri de işte bu üç ihtiyaçtan doğdu, bu yüzden birazdan göreceğiniz tabloda kendi kendinize bulduğunuz kutuları tanıyacaksınız.
DOT kaynağı
// ATM para çekme akışı (Hafta 2 bulmacasının çözümü)
digraph ATM {
charset="UTF-8";
rankdir=TB;
node [fontname="Helvetica", fontsize=11];
edge [fontname="Helvetica", fontsize=10];
basla [shape=ellipse, label="BAŞLA"];
kart [shape=parallelogram, label="Kartı ve şifreyi al"];
sifre [shape=diamond, label="Şifre doğru mu?"];
yanlis [shape=box, label="yanlış = yanlış + 1"];
ucMu [shape=diamond, label="yanlış = 3 mü?"];
yut [shape=box, label="Kartı yut"];
tutar [shape=parallelogram, label="Çekilecek tutarı al"];
limit [shape=diamond, label="tutar ≤ 5000 mi?\n(günlük limit)"];
bakiye [shape=diamond, label="bakiye ≥ tutar mı?"];
ver [shape=box, label="Parayı ver\nbakiye = bakiye - tutar"];
red [shape=parallelogram, label="Red mesajı göster"];
bitir [shape=ellipse, label="BİTİR"];
basla -> kart -> sifre;
sifre -> tutar [label="Evet"];
sifre -> yanlis [label="Hayır"];
yanlis -> ucMu;
ucMu -> yut [label="Evet"];
ucMu -> kart [label="Hayır"];
yut -> bitir;
tutar -> limit;
limit -> bakiye [label="Evet"];
limit -> red [label="Hayır"];
bakiye -> ver [label="Evet"];
bakiye -> red [label="Hayır"];
ver -> bitir;
red -> bitir;
} Çizimin altındaki DOT kaynağını açarsanız bu diyagramın yaklaşık 25 satırlık bir metinden üretildiğini görürsünüz. “Kopyala” deyip Graphviz Online’a yapıştırdığınızda aynı çizim kendi tarayıcınızda da belirir. Lab 2’de diyagramları işte böyle, kodla çizeceksiniz, çünkü kodu düzeltmek bir çizimi düzeltmekten çok daha kolaydır.
Ders Notları
Akış diyagramı sembolleri
Akış diyagramı (flowchart), bir algoritmanın adımlarını ve adımlar arasındaki geçişleri standart sembollerle gösteren çizimdir. Sembollerin standart olması önemli, çünkü dünyanın öbür ucundaki bir mühendis bile çiziminizdeki elması gördüğünde “burada bir karar var” der ve ayrıca açıklamaya gerek kalmaz.
| Sembol | Şekil | Anlamı | ATM’de |
|---|---|---|---|
| Başla / Bitir | Elips (oval) | Akışın tek giriş ve tek çıkış noktası | BAŞLA, BİTİR |
| İşlem | Dikdörtgen | Hesaplama, atama, bir şey yapma | bakiye = bakiye - tutar |
| Karar | Elmas (baklava) | Evet / Hayır sorusu; iki çıkış | “Şifre doğru mu?” |
| Girdi / Çıktı | Paralelkenar | Dışarıdan veri alma ya da gösterme | “Tutarı al”, “Red mesajı göster” |
| Veritabanı | Silindir | Kalıcı veri deposu (büyük uygulamalarda) | Bankanın hesap kayıtları |
| Ok | Çizgi ve ok ucu | Akış yönü; karardan çıkanlara “Evet” / “Hayır” yazılır | Her bağlantı |
DOT kaynağı
// Akış diyagramı sembolleri (küçük açıklama diyagramı)
digraph Semboller {
charset="UTF-8";
rankdir=TB;
node [fontname="Helvetica", fontsize=11];
edge [fontname="Helvetica", fontsize=10];
basla [shape=ellipse, label="Başla / Bitir\n(elips)"];
girdi [shape=parallelogram, label="Girdi / Çıktı\n(paralelkenar)"];
islem [shape=box, label="İşlem\n(dikdörtgen)"];
karar [shape=diamond, label="Karar\n(elmas)"];
db [shape=cylinder, label="Veritabanı\n(silindir)"];
bitir [shape=ellipse, label="Bitir"];
basla -> girdi [label="ok: akış yönü"];
girdi -> islem;
islem -> karar;
karar -> db [label="Evet"];
karar -> bitir [label="Hayır"];
db -> bitir;
} Çizim kuralları kısadır. Akış yukarıdan aşağı gider, diyagramda tek BAŞLA ve tek BİTİR olur, her karar elmasından iki ok çıkar ve ikisinin de etiketi vardır, oklar da mümkünse birbirini kesmez. Bunlara bir de şu kuralı ekleyin: diyagram, okuyan kişinin kodu görmeden ne olup bittiğini anlamasını sağlamalıdır. Eğer sağlamıyorsa kutularınız ya fazla kalabalık ya da fazla seyrek demektir.
Üç temel yapı: sıra, seçim, tekrar
1960’larda Böhm ve Jacopini’nin kanıtladığı bir sonuç var ve bu sonuç dersin geri kalanının omurgasını oluşturuyor: her program yalnızca üç yapıyla yazılabilir.
- Sıra (sequence): adımlar art arda gelir ve diyagramda düz bir ok zinciri olarak görünür.
- Seçim (selection): bir koşula göre iki yoldan biri seçilir; diyagramda elmasla, Java’da
if/elseile yazılır. - Tekrar (iteration): bir koşul sağlandığı sürece aynı adımlar yinelenir; diyagramda geriye dönen bir ok, Java’da
for/whileolarak karşınıza çıkar.
Geçen haftanın nehir bulmacası bu üçünün en basitiydi, çünkü içinde yalnızca sıra vardı: yedi hamle art arda geliyor ve hiçbir yerde karar vermek gerekmiyordu.
ATM’de ise üçü de vardı: kartı alıp şifreyi sormak sıra, şifrenin doğru olup olmadığına bakmak seçim, yanlışsa tekrar sormak ise tekrar yapısıdır ve diyagramda elmastan yukarıya dönen ok olarak görünür. Dönem boyunca yazacağınız her program bu üçünün iç içe geçmiş hali olacak, bu yüzden seçimi 4. haftada, tekrar yapısını da 6-7. haftalarda derinlemesine ele alacağız.
Üç örnek, her biri üç dilde
Şimdi aynı algoritmayı üç biçimde yan yana okuyacağız: diyagram göz için, sözde kod insan için, Java ise makine için yazılır. Üçü de aynı şeyi söyler, yalnızca dil değişir, yapı olduğu gibi kalır.
Sözde kodda şu Türkçe kelimeleri kullanacağız: BAŞLA, BİTİR, EĞER ... İSE, DEĞİLSE, TEKRARLA ... OLDUKÇA, YAZ. Sözde kod derlenmez ve resmî bir kural kitabı da yoktur, bu yüzden tek ölçütümüz okuyan kişinin her satırı tek bir anlamla anlayabilmesidir.
Örnek 1 · Çift mi tek mi? (seçim)
BAŞLA
sayi = 17
EĞER sayi'nin 2'ye bölümünden kalan 0 İSE
YAZ sayi, "çift"
DEĞİLSE
YAZ sayi, "tek"
BİTİR
int sayi = 17;
if (sayi % 2 == 0) {
System.out.println(sayi + " çift");
} else {
System.out.println(sayi + " tek");
}İpucu: Geçen haftanın üçüncü programı. sayi'yi 18 yapıp tekrar çalıştırın; diyagramda hangi oku izlediniz?
Üçünü üst üste koyduğunuzda eşleşme bire birdir: diyagramdaki elmas sözde kodda EĞER ... İSE, Java’da if (...) olur. “Evet” oku İSE’nin altındaki satıra, yani ilk süslü parantez bloğuna gider; “Hayır” oku ise DEĞİLSE’ye, yani else bloğuna karşılık gelir.
Örnek 2 · 1’den 10’a toplam (tekrar)
Önce tahmin edin: 1 + 2 + … + 10 kaç eder? Cevabı söylemeden önce diyagramı kağıt üzerinde elle izleyin, yani toplam ve i için iki sütun açın ve elmastan her geçişte o anki değerleri yazın. Bitirdiğinizde kaç kez “Evet” dediğinizi de sayın.
BAŞLA
toplam = 0
i = 1
TEKRARLA i ≤ 10 OLDUKÇA
toplam = toplam + i
i = i + 1
YAZ toplam
BİTİR
int toplam = 0;
for (int i = 1; i <= 10; i++) {
toplam = toplam + i;
}
System.out.println("Toplam: " + toplam);İpucu: Önce tahmin edin (55 mi?), sonra çalıştırın. 10'u 100 yapın: Gauss'un ilkokulda bulduğu sayı çıkmalı.
for satırı diyagramdaki üç kutuyu tek satıra sıkıştırır: int i = 1 başlangıç kutusu, i <= 10 elmas, i++ ise artırma kutusudur. Sözde kodda bunları ayrı ayrı yazmıştık, Java yalnızca kısaltıyor, yapı aynı. Bir de toplam = toplam + i satırına dikkat edin, çünkü bu matematikte saçma görünür ama programlamada son derece normaldir: önce sağ taraf hesaplanır, sonra sonuç sol taraftaki kutuya konur.
Örnek 3 · ATM’nin Java hali (iç içe seçim)
Bulmacanın diyagramı yukarıda duruyor, şimdi sözde kodunu yazalım. “Üç yanlışta kart yut” kısmı klavyeden girdi almayı gerektirir ve bu 3. haftanın konusu, bu yüzden bu hafta yanlış sayısını bir değişkende sabit tutuyoruz.
BAŞLA
bakiye = 3000, istek = 1200, yanlisSifre = 0, limit = 5000
EĞER yanlisSifre ≥ 3 İSE
YAZ "Kart yutuldu"
DEĞİLSE
EĞER istek > limit İSE
YAZ "Günlük limit aşıldı"
DEĞİLSE EĞER bakiye ≥ istek İSE
bakiye = bakiye - istek
YAZ "Para verildi, kalan:", bakiye
DEĞİLSE
YAZ "Yetersiz bakiye"
BİTİR
int bakiye = 3000;
int istek = 1200;
int yanlisSifre = 0;
int gunlukLimit = 5000;
if (yanlisSifre >= 3) {
System.out.println("Kart yutuldu.");
} else {
if (istek > gunlukLimit) {
System.out.println("Günlük limit aşıldı.");
} else if (bakiye >= istek) {
bakiye = bakiye - istek;
System.out.println("Para verildi. Kalan bakiye: " + bakiye);
} else {
System.out.println("Yetersiz bakiye.");
}
}İpucu: Dört değişkenle oynayın: istek = 6000 ne der? bakiye = 1000 ne der? yanlisSifre = 3 ne der? Her seferinde diyagramda hangi yolu izlediğinizi parmağınızla gösterin.
Burada dikkat etmeniz gereken şey, bir ifin else bloğunun içinde başka bir if olması. Diyagramda bu, bir elmasın “Hayır” okunun doğrudan başka bir elmasa gitmesi demektir. Kodda bu iç içeliği girinti, yani satır başındaki boşluk gösterir; Java girintiyi hiç umursamaz ama kodu okuyan insan umursar, bu yüzden siz de umursayın.
Sözde kod neden yazılır?
Sözde kod, diyagram ile Java arasındaki köprüdür. Diyagram büyüyüp 30 kutuya ulaştığında okunmaz hale gelir, Java ise noktalı virgül, parantez ve tip gibi ayrıntılarla düşünceyi boğar. Sözde kod tam ikisinin ortasında durur, çünkü yapı bellidir ama tören yoktur. Sınavda bir problem için önce sözde kod yazıp sonra Java’ya çevirenlerin, doğrudan Java’ya atlayanlardan daha az hata yaptığını her dönem görüyoruz. Bir de ekip işi var: sözde kodu Python yazan arkadaşınız da okur, Java yazan da, yani ortak bir dil olur.
Bir Java dosyasının anatomisi
Geçen hafta Playground’da System.out.println("Merhaba"); yazıp çalıştırdınız, ama Lab 1’de aynı satırın etrafına beş satır tören eklemek zorunda kaldınız. Şimdi o törenin ne olduğuna satır satır bakalım:
public class Merhaba {
public static void main(String[] args) {
String isim = "Ayşe";
System.out.println("Merhaba, " + isim + "!");
}
}İpucu: Bu iskelet Playground'da da derlenir ama kendiliğinden çalışmaz; çünkü Playground main'i çağırmaz. Görmek için en alta Merhaba.main(null); satırını ekleyin. Lab'da ise bu iskelet zorunlu: dosya adı Merhaba.java, javac Merhaba.java, java Merhaba.
public class Merhaba: Her Java dosyası bir sınıf tanımlar ve sınıfın adı dosyanın adıyla birebir aynı olmak zorundadır (Merhaba.java), ayrıca büyük harfle başlar. Şimdilik bunu “programın adı” diye düşünün, çünkü sınıfın gerçek anlamı 2. dönemin konusu.public static void main(String[] args): Programın kapısıdır, çünkü JVM programı çalıştırırken bu satırı arar ve buradan başlar. Beş kelimenin her birinin bir anlamı var ama bu dönem tek bir şey bilmeniz yeter: bu satır harfi harfine böyle yazılır.- Süslü parantezler
{ }: Bir bloğun nerede başlayıp nerede bittiğini söyler ve her açılan parantez mutlaka kapanır. Sınıfın bloğu,main’in bloğu veifin bloğu iç içe kutular gibi düşünülebilir. - Noktalı virgül
;: Her cümlenin (deyim) sonuna konur. Bloğu açan satırların (class,main,if,for) sonunda ise yoktur, çünkü onlar cümle değil, kapıdır. - Girinti: Her bloğun içi dört boşluk içeriden başlar. Java bunu umursamaz ama siz umursayın, çünkü hata avında girintisi bozuk bir kodda hatayı bulmak iki kat zordur.
Kaynak koddan çalışan programa
Lab 1’de önce javac Merhaba.java, sonra java Merhaba yazdınız. Peki bu iki komut arasında ne oldu?
- Kaynak kod (
Merhaba.java): sizin yazdığınız metindir; insan okur ama makine doğrudan okuyamaz. - javac (derleyici): kaynağı baştan sona okur ve kuralları kontrol eder. Bir noktalı virgül bile eksikse durur ve hangi satırda ne beklediğini söyler, her şey yolundaysa da bytecode üretir.
- Bytecode (
Merhaba.class): makineye yakın ama hiçbir gerçek makineye ait olmayan bir ara dildir, bu yüzden aynı.classdosyası Windows’ta, Mac’te ve telefonda çalışır. - JVM (
javakomutu): bytecode’u okuyup o bilgisayarın işlemcisine çeviren sanal makinedir ve “bir kez yaz, her yerde çalıştır” sözünün sebebi de budur.
Üç kısaltmayı tek paragrafta toparlayalım. JVM programı çalıştırır. JRE, JVM ile Java’nın hazır kütüphanelerinin toplamıdır ve yalnızca program çalıştırmak isteyen birine yeter. JDK ise JRE’ye javac ve diğer geliştirici araçlarını ekler; bize lazım olan ve Lab 1’de kurduğunuz şey de budur.
Üç hata türü
| Tür | Kim yakalar | Ne zaman | Belirti | Örnek |
|---|---|---|---|---|
| Sözdizimi (syntax) | javac | Derlerken; program hiç çalışmaz | Kırmızı mesaj, satır numarası | Eksik ;, system küçük harf, kapanmamış { |
| Çalışma zamanı (runtime) | JVM | Program çalışırken; o satırda çöker | Exception mesajı | Sıfıra bölme, olmayan dizi elemanı |
| Mantık (logic) | Siz | Hiçbir zaman; program çalışır, sonuç yanlıştır | Belirti yok | 7 / 2’nin 3 çıkması, > yerine >= |
İlk ikisi gürültülüdür, çünkü bilgisayar bağırır ve siz düzeltirsiniz. Üçüncüsü ise sessizdir ve tam da bu yüzden en tehlikelisidir. Geçen hafta anlattığımız Mars Climate Orbiter bunun örneğiydi: program çalıştı, ama uydu yandı. Mantık hatasını yakalamanın tek yolu önce tahmin edip sonra çalıştırmaktır, çünkü beklediğiniz çıktıyı bilmiyorsanız yanlış çıktıyı da fark edemezsiniz.
Büyük Resim: Kantin Sipariş Uygulaması
Bugün çizdiğimiz diyagramlar 6-12 kutuluktu, peki gerçek bir uygulama nasıl görünür? Kampüs kantini için web tabanlı bir sipariş uygulaması düşünelim: öğrenci telefondan menüyü açar, ürün seçer, öder ve bir sipariş numarası alır. Arkada ise ürünleri, stokları ve siparişleri tutan bir veritabanı çalışır.
DOT kaynağı
// Kantin sipariş uygulaması: üst düzey akış (bu dönem yazılmıyor, büyük resim)
digraph Kantin {
charset="UTF-8";
rankdir=TB;
node [fontname="Helvetica", fontsize=11];
edge [fontname="Helvetica", fontsize=10];
basla [shape=ellipse, label="BAŞLA"];
ac [shape=parallelogram, label="Kullanıcı sayfayı açar,\nmenü gösterilir"];
urunDB [shape=cylinder, label="Ürünler DB"];
sec [shape=parallelogram, label="Ürün ve adet seç"];
stok [shape=diamond, label="Stokta mı?"];
sepet [shape=box, label="Sepete ekle\ntoplam = toplam + fiyat × adet"];
baska [shape=diamond, label="Başka ürün var mı?"];
odeme [shape=diamond, label="Ödeme başarılı mı?"];
kaydet [shape=box, label="Siparişi kaydet"];
sipDB [shape=cylinder, label="Siparişler DB"];
goster [shape=parallelogram, label="Sipariş numarasını göster"];
bitir [shape=ellipse, label="BİTİR"];
basla -> ac;
urunDB -> ac [label="menü verisi", style=dashed];
ac -> sec -> stok;
stok -> sepet [label="Evet"];
stok -> sec [label="Hayır: \"tükendi\" mesajı"];
sepet -> baska;
baska -> sec [label="Evet"];
baska -> odeme [label="Hayır"];
odeme -> odeme [label="Hayır: tekrar dene"];
odeme -> kaydet [label="Evet"];
kaydet -> sipDB [style=dashed];
kaydet -> goster -> bitir;
} Bu diyagramda bugün öğrendiğiniz her şey var: sayfa açıp menü göstermek sıra, stokta mı ve ödeme başarılı mı soruları seçim, başka ürün varsa seçime dönmek ise tekrar yapısıdır. Yeni olan tek şey silindir, çünkü veri artık bir değişkende değil, programdan bağımsız yaşayan bir veritabanında duruyor.
Diyagramdaki “Stokta mı?” elmasının içine yakından bakalım, çünkü o tek elmas aslında kendi başına küçük bir akıştır. Buna alt akış denir ve sözde kodu şöyle yazılır:
ALT AKIŞ: stok kontrolü ve sepete ekleme
GİRDİ: urunKodu, adet
stok = Ürünler DB'den urunKodu'nun stoğunu oku
fiyat = Ürünler DB'den urunKodu'nun fiyatını oku
EĞER stok < adet İSE
YAZ "Bu üründen yeterli stok yok"
DEĞİLSE
stok = stok - adet
Ürünler DB'ye yeni stoğu yaz
sepete (urunKodu, adet) ekle
toplam = toplam + fiyat × adet
BİTİR
EĞER stok < adet İSE satırına bakın, bu bugün yazdığımız if (bakiye >= istek) ile aynı şey. Büyük uygulamada kutular büyür ama kutuların içindeki yapılar değişmez. Yemeksepeti’nin arkasındaki mühendis de aynı ifi yazıyor, yalnızca onun stok değişkeni bir veritabanından geliyor ve saniyede binlerce kez okunuyor.
Yapay Zeka Anı
Bu hafta yapay zekaya bir şey çizdiriyoruz. ChatGPT’ye (ya da Claude, Gemini) “Şu Java kodunun akış diyagramını Graphviz DOT dili olarak yaz” istemini veriyor ve altına Örnek 3’teki ATM kodunu yapıştırıyoruz. Gelen DOT kodunu Graphviz Online’a yapıştırıp çizdiriyoruz, sonra da sınıfça şunları kontrol ediyoruz:
- Diyagram kodu doğru anlatıyor mu?
else ifzinciri elmas zinciri olmuş mu, yoksa tek elmasa sıkıştırılmış mı? - Hangi düğüm eksik? Çoğu zaman “Kart yutuldu” dalı ya da BİTİR düğümü unutulur, bazen de her
printlniçin ayrı bir bitiş çizilir. - Karar oklarında Evet / Hayır etiketi var mı? Eğer yoksa diyagram iki anlamlıdır ve yapay zeka bunu “unutmuştur”.
- Semboller doğru mu? Yapay zeka mesaj gösterme işini sık sık dikdörtgene koyar, oysa paralelkenar olmalı.
Dersin mesajı şu: yapay zekanın çizimi genellikle “aşağı yukarı doğru”dur, oysa mühendislikte “aşağı yukarı” diye bir şey yoktur. Diyagramı okuyup eksiği bulabilen kişi çizdiren olmaktan çıkıp kontrol eden kişiye dönüşür ve piyasada aranan kişi de tam olarak odur.
Temel Kavramlar
- Akış diyagramı (flowchart): Algoritmanın standart sembollerle çizimi; elips başla/bitir, dikdörtgen işlem, elmas karar, paralelkenar girdi/çıktı, silindir veritabanı.
- Sözde kod (pseudocode): Programlama diline benzeyen ama derlenmeyen, insan için yazılmış adımlar;
BAŞLA,EĞER ... İSE,TEKRARLA ... OLDUKÇA,BİTİR. - Sıra, seçim, tekrar: Her programın kurulduğu üç yapı; düz ok, elmas, geriye dönen ok.
- DOT / Graphviz: Diyagramı metin olarak yazıp otomatik çizdiren dil ve araç;
a -> b;bir oktur. - class: Bir Java dosyasının tanımladığı sınıf; adı dosya adıyla aynı, büyük harfle başlar.
- main: Programın kapısı; JVM çalıştırmaya
public static void main(String[] args)satırından başlar. - Blok ve
{ }: Birlikte çalışan satır grubu; süslü parantezle sınırlanır, her açılan kapanır. - Derleyici (javac): Kaynak kodu baştan sona kontrol edip bytecode’a çeviren program; hata varsa çevirmez.
- Bytecode (.class): Hiçbir gerçek makineye ait olmayan ara dil; taşınabilirliğin sırrı.
- JVM, JRE, JDK: Çalıştıran sanal makine; JVM + kütüphaneler; hepsi +
javacve araçlar. - Sözdizimi hatası: Derleyicinin yakaladığı yazım hatası; program hiç çalışmaz.
- Çalışma zamanı hatası: Program çalışırken çökmesi; sıfıra bölme gibi.
- Mantık hatası: Program çalışır, sonuç yanlıştır; yalnızca tahminle yakalanır.
Sahadan Örnekler
- Margaret Hamilton, Apollo yazılımı. Geçen hafta 1201 alarmını anlattık. Hamilton’ın ekibi o kodu yazmadan önce her görevi akış şemalarıyla planlıyordu, yani öncelik sırası ve hangi koşulda hangi görevin bırakılacağı kağıt üzerinde elmaslarla çizilmişti. İniş anındaki o doğru karar, aslında o kağıtlardaki bir “Evet” okudur.
- Havayolu check-in. Havalimanında bir kioska yaklaştığınızda arkada tam da bugünkü gibi bir diyagram çalışır: rezervasyon bulundu mu, pasaport geçerli mi, bagaj 23 kg’ı aşıyor mu, koltuk seçildi mi. Her elmas her gün milyonlarca kez değerlendirilir ve biri yanlış çizilirse haberlerde çıkar.
- Sektörde isim değişti, mantık değişmedi. Yazılım şirketlerinde bugün “flowchart” yerine “sequence diagram”, “activity diagram” ya da “BPMN” duyarsınız. Semboller biraz farklı ve araçlar başka, ama elmas yine karar, ok yine akıştır. Bugün öğrendiğiniz okuma becerisi o diyagramlarda da aynen işe yarar.
Portfolyo
Konu dağıtımı ve ortak sözleşme yakında duyurulacak, bu yüzden KT1 (5. hafta) için henüz bir şey teslim etmiyorsunuz. Ama bu hafta yapabileceğiniz bir şey var: uygulamanız için düşündüğünüz konunun ana akışını kağıda çizin. Beş-sekiz kutu yeter, yani kullanıcı ne verir, program neye karar verir ve ne gösterir. Konu sonradan değişse bile çizim alışkanlığı kalır ve KT4’te bu çizimin büyümüş halini isteyeceğiz. Takvim: KT1 5. hafta, KT2 8. hafta, KT3 11. hafta, KT4 14. hafta (Ders Hakkında · Portfolyo).
Laboratuvara Hazırlık
Lab 2, A şubesi için 7 Ekim Çarşamba 13.15, B şubesi için 8 Ekim Perşembe 15.15 ve yürütücüsü Arş. Gör. Ömer Miraç Kökçam. Bu kez işin yarısı diyagram, çünkü koddan diyagram üretecek, diyagramdan kod üretecek ve üç hatalı dosyayı düzelteceksiniz.
Lab’a gelirken:
- Graphviz Online’ı denemiş gelin: bu sayfadaki ATM diyagramının DOT kaynağını kopyalayıp yapıştırın, sağda çizildiğini görün, bir düğümün etiketini değiştirin. PNG indirmeyi de deneyin: üstteki Format menüsünden
png-imageseçin, sağdaki görsele sağ tıklayıp “Resmi farklı kaydet” deyin. - Lab 1’i bitirmiş olun, son teslim 2 Ekim Cuma 23.59. Lab 2’nin ilk görevi Lab 1’deki
CarpimTablosu.java’nın diyagramını çizmek olduğu için dosya yoksa görev de yok. - Codespaces ya da yerel JDK’nız çalışır durumda olsun, çünkü Lab 2’de iki tam Java dosyası derleyeceksiniz.
- Ayrıntı ve görev listesi: Lab 2.
Tartışma Soruları
- ATM diyagramınızda “üç yanlışta kart yut” kuralı için geriye dönen bir ok çizdiniz. Bu ok olmasaydı diyagram ne anlatırdı? Sonsuz döngü bir diyagramda nasıl görünür?
- Sözde kod derlenmediğine göre “yanlış sözde kod” diye bir şey var mıdır? İki kişinin aynı sözde koddan farklı program yazması mümkün mü?
- Mantık hatasını hiçbir araç yakalamıyorsa, bir programın doğru çalıştığına nasıl ikna olursunuz? “Çalıştırdım, çıktı makul görünüyor” yeter mi?
- Yapay zekanın çizdiği diyagramda bir düğüm eksikti. Bunu fark etmek için neyi bilmeniz gerekti? O bilgiye sahip olmayan biri aynı diyagramı neden “doğru” kabul eder?
- Kantin uygulamasındaki “Stokta mı?” kararı ile ATM’deki “Bakiye yeter mi?” kararı aynı yapıysa, bir uygulamayı diğerinden “büyük” yapan nedir?
Haftanın Özeti
ATM para çekme akışını kağıda çizerek başladık ve çizimden kendiliğinden üç kutu türü çıktı, bunlar da akış diyagramının sembollerine dönüştü. Her programın sıra, seçim ve tekrar olmak üzere üç yapıdan kurulduğunu gördük; geçen haftanın nehir bulmacası yalnızca sıraydı, ATM ise üçünü de içeriyordu. Üç örneği diyagram, Türkçe sözde kod ve Java olarak yan yana okuduk ve elmasın if, geriye dönen okun ise for olduğunu gördük. Sonra Playground’da yazmadığımız töreni açtık, yani class, main, süslü parantez ve noktalı virgülü, ardından kaynak koddan javac ile bytecode’a, oradan JVM ile çıktıya giden yolu çizdik. Hata avının ilk turunda sözdizimi, çalışma zamanı ve mantık hatasını aynı programda bulduk ve en sinsisinin bağırmayan olduğunu öğrendik. Kantin sipariş uygulamasında büyük resmin de aynı üç yapıdan kurulduğunu gördük. Gelecek hafta klavyeden girdi almayı (Scanner), değişken tiplerini ve aritmetiği göreceğiz, ATM’deki “yanlış sayısı” da o zaman gerçekten sayılacak.
Bu haftanın araçları
- Java Playground
- Graphviz Online
- JDK 21
Ek kaynaklar
- Think Java 2, Bölüm 1: Computer Programming — Program nedir, derleme, üç hata türü; bu haftanın ikinci yarısının kitap karşılığı.
- Think Java 2, Bölüm 2: Variables and Operators — Değişkenler, atama, tam sayı bölmesi; hata avındaki mantık hatasının kaynağı burada.
- Graphviz Online — Kurulum yok: sola DOT kodu, sağda diyagram. Lab 2'de diyagramları bununla üreteceksiniz.
- Graphviz DOT dili dokümanı — DOT sözdiziminin resmî tanımı; shape, label ve ok kuralları için başvuru.
Etiketler:akış diyagramısözde kodGraphvizDOTJDKjavacmainhata türleri