Algo-I
2 Giriş

Akış Diyagramı, Sözde Kod ve Java Program Yapısı

Önce çiz, sonra yaz, sonra kır: bir ATM akışını kağıda çiziyor, aynı akışı sözde koda ve Java'ya çeviriyor, tam bir Java dosyasının iskeletini ve derleme sürecini görüyor, bilerek bozulmuş bir programda üç hata türünü avlıyoruz.

Teori
Cuma 2 Ekim · A 09.15 / B 13.15
Laboratuvar
A Çarşamba 7 Ekim 13.15 · B Perşembe 8 Ekim 15.15(teoriden bir hafta sonra) Lab içeriği ↓
Ders planı
Algoritmayı akış diyagramı ve sözde kodla ifade etme; bir Java programının anatomisi (class, main), derleme süreci (JDK, javac, bytecode) ve üç hata türü

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 main yazmadan 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.

ATM basla BAŞLA kart Kartı ve şifreyi al basla->kart sifre Şifre doğru mu? kart->sifre yanlis yanlış = yanlış + 1 sifre->yanlis Hayır tutar Çekilecek tutarı al sifre->tutar Evet ucMu yanlış = 3 mü? yanlis->ucMu ucMu->kart Hayır yut Kartı yut ucMu->yut Evet bitir BİTİR yut->bitir limit tutar ≤ 5000 mi? (günlük limit) tutar->limit bakiye bakiye ≥ tutar mı? limit->bakiye Evet red Red mesajı göster limit->red Hayır ver Parayı ver bakiye = bakiye - tutar bakiye->ver Evet bakiye->red Hayır ver->bitir red->bitir
ATM para çekme akışı: bulmacanın bir çözümü. Sizinki farklı olabilir; önemli olan her kararın iki çıkışının ve tek bir bitişin olması.
DOT kaynağı
Graphviz Online'da aç ↗ Kodu kopyalayıp Graphviz Online'a yapıştırın; kendi diyagramınızı deneyin.
// 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ŞekilAnlamıATM’de
Başla / BitirElips (oval)Akışın tek giriş ve tek çıkış noktasıBAŞLA, BİTİR
İşlemDikdörtgenHesaplama, atama, bir şey yapmabakiye = bakiye - tutar
KararElmas (baklava)Evet / Hayır sorusu; iki çıkış“Şifre doğru mu?”
Girdi / ÇıktıParalelkenarDışarıdan veri alma ya da gösterme“Tutarı al”, “Red mesajı göster”
VeritabanıSilindirKalıcı veri deposu (büyük uygulamalarda)Bankanın hesap kayıtları
OkÇizgi ve ok ucuAkış yönü; karardan çıkanlara “Evet” / “Hayır” yazılırHer bağlantı
Semboller basla Başla / Bitir (elips) girdi Girdi / Çıktı (paralelkenar) basla->girdi ok: akış yönü islem İşlem (dikdörtgen) girdi->islem karar Karar (elmas) islem->karar db Veritabanı (silindir) karar->db Evet bitir Bitir karar->bitir Hayır db->bitir
Altı sembol bir arada. Karardan çıkan her okun etiketi olmalı.
DOT kaynağı
Graphviz Online'da aç ↗ Kodu kopyalayıp Graphviz Online'a yapıştırın; kendi diyagramınızı deneyin.
// 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 / else ile 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 / while olarak 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.

Nehir basla BAŞLA (hepsi sol kıyıda) h1 1. Tavuğu karşıya götür basla->h1 h2 2. Yalnız dön h1->h2 h3 3. Tilkiyi karşıya götür h2->h3 h4 4. Tavuğu geri getir h3->h4 h5 5. Mısırı karşıya götür h4->h5 h6 6. Yalnız dön h5->h6 h7 7. Tavuğu karşıya götür h6->h7 bitir BİTİR (hepsi sağ kıyıda) h7->bitir
Geçen haftanın bulmacası, bu kez diyagram. Yalnızca sıra yapısı: tek yol, hiç elmas yok.

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)

CiftTek basla BAŞLA sayi sayi = 17 basla->sayi karar sayi % 2 == 0 mı? sayi->karar cift "17 çift" yaz karar->cift Evet tek "17 tek" yaz karar->tek Hayır bitir BİTİR cift->bitir tek->bitir
Bir elmas, iki çıkış, tek bitiş.
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
Örnek 1 · Çift mi tek mi? Java Playground'da dene ↗
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.

Toplam basla BAŞLA ilk toplam = 0 i = 1 basla->ilk karar i ≤ 10 mu? ilk->karar ekle toplam = toplam + i karar->ekle Evet yaz toplam'ı yaz karar->yaz Hayır artir i = i + 1 ekle->artir artir->karar bitir BİTİR yaz->bitir
Elmastan yukarıya dönen ok: tekrar yapısı. 'Hayır' çıkışı döngünün bittiği yer.
BAŞLA
  toplam = 0
  i = 1
  TEKRARLA i ≤ 10 OLDUKÇA
      toplam = toplam + i
      i = i + 1
  YAZ toplam
BİTİR
Örnek 2 · 1'den 10'a toplam Java Playground'da dene ↗
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
Örnek 3 · ATM Java Playground'da dene ↗
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:

Tam bir Java dosyası: Merhaba.java Java Playground'da dene ↗
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 ve ifin 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?

Derleme kaynak Kaynak kod Merhaba.java (siz yazarsınız) javac javac (derleyici) kaynak->javac hata Hata var mı? javac->hata mesaj Hata mesajı: hangi satır, ne bekliyor hata->mesaj Evet sinif Bytecode Merhaba.class hata->sinif Hayır mesaj->kaynak düzelt, tekrar dene jvm JVM (java komutu) sinif->jvm cikti Ekrandaki çıktı jvm->cikti
Kaynak koddan çalışan programa. Hata varsa javac hiç .class üretmez; mesajı okuyup kaynağa dönersiniz.
  • 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ı .class dosyası Windows’ta, Mac’te ve telefonda çalışır.
  • JVM (java komutu): 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ürKim yakalarNe zamanBelirtiÖrnek
Sözdizimi (syntax)javacDerlerken; program hiç çalışmazKırmızı mesaj, satır numarasıEksik ;, system küçük harf, kapanmamış {
Çalışma zamanı (runtime)JVMProgram çalışırken; o satırda çökerException mesajıSıfıra bölme, olmayan dizi elemanı
Mantık (logic)SizHiçbir zaman; program çalışır, sonuç yanlıştırBelirti yok7 / 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.

Kantin basla BAŞLA ac Kullanıcı sayfayı açar, menü gösterilir basla->ac sec Ürün ve adet seç ac->sec urunDB Ürünler DB urunDB->ac menü verisi stok Stokta mı? sec->stok stok->sec Hayır: "tükendi" mesajı sepet Sepete ekle toplam = toplam + fiyat × adet stok->sepet Evet baska Başka ürün var mı? sepet->baska baska->sec Evet odeme Ödeme başarılı mı? baska->odeme Hayır odeme->odeme Hayır: tekrar dene kaydet Siparişi kaydet odeme->kaydet Evet sipDB Siparişler DB kaydet->sipDB goster Sipariş numarasını göster kaydet->goster bitir BİTİR goster->bitir
Kantin sipariş uygulaması: üst düzey akış. Silindirler veritabanı; kesikli oklar veri okuma ve yazma.
DOT kaynağı
Graphviz Online'da aç ↗ Kodu kopyalayıp Graphviz Online'a yapıştırın; kendi diyagramınızı deneyin.
// 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 if zinciri 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 println iç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 + javac ve 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-image seç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ı

  1. 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?
  2. 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ü?
  3. 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?
  4. 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?
  5. 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

Etiketler:akış diyagramısözde kodGraphvizDOTJDKjavacmainhata türleri

Laboratuvar · Hafta 2

Lab 2 · Diyagramdan Koda, Koddan Diyagrama

Lab 1'deki kodun ve verilen bir programın akış diyagramını DOT ile çizip PNG olarak üretme; verilen iki diyagramdan tam Java dosyası yazma; üç hatalı dosyayı düzeltip hata türlerini sınıflandırma; kantin alt akışını diyagram ve sözde kodla yazma.

Yürüten
Arş. Gör. Ömer Miraç Kökçam
Laboratuvar sorumlu hocası
Tarihler (teoriden bir hafta sonra)
A Çarşamba 7 Ekim 13.15
B Perşembe 8 Ekim 15.15

Lab hedefleri

  • 1 Çalışan bir Java programından Graphviz DOT ile akış diyagramı üretir, Graphviz Online'da çizdirir ve PNG olarak indirir.
  • 2 Verilen bir akış diyagramını class/main iskeletli tam bir Java dosyasına çevirir, derler ve beklenen çıktıyı alır.
  • 3 Bilerek hatalı üç dosyada sözdizimi, çalışma zamanı ve mantık hatalarını bulur, düzeltir ve her birini türüyle raporlar.
  • 4 Bir alt akışı (stok kontrolü ve sepete ekleme) kod yazmadan diyagram ve sözde kodla ifade eder.

Ne zaman, nerede, kiminle

ŞubeTarihSaatYürütücü
A7 Ekim 2026 Çarşamba13.15Arş. Gör. Ömer Miraç Kökçam
B8 Ekim 2026 Perşembe15.15Arş. Gör. Ömer Miraç Kökçam

Bu lab 2. haftanın teorisini uyguluyor: akış diyagramı, sözde kod, tam Java dosyası ve üç hata türü. Sloganımız iki yönlü: koddan diyagram üret, diyagramdan kod üret. Kendi bilgisayarınız ya da Codespaces; ikisi de olur.

Adım 0 · Lab 1 eksikleri ve depo (5 dk)

  1. Lab 1’de geçmeyen testiniz varsa şimdi değil, lab bitince düzeltin; Lab 1’in son teslimi 2 Ekim Cuma 23.59’du, süre doldu. Bugün yalnızca CarpimTablosu.java dosyanıza ihtiyacınız var; yoksa Lab 1 sayfasındaki tarife göre 3 dakikada yazın.
  2. Yukarıdaki kabul bağlantısından Lab 2 deponuzu oluşturun.
  3. Ortamınızı açın: Yol A kendi bilgisayarınız (git clone https://github.com/FiratUniversity-FerhatUcarsLAB/algo1-lab02-KULLANICIADI.git), Yol B Codespaces (depo sayfasında Code → Codespaces → Create codespace on main). Terminalde javac -version 21 ya da üstü demeli.
  4. Ayrı bir sekmede Graphviz Online açık dursun.

Bütün dosyalar deponun kök dizinine; alt klasör açmayın, otomatik kontrol kökte arar.

Görev 1 · Koddan diyagrama (20 dk)

Elinizde çalışan kod var; ondan diyagram üreteceksiniz. Zor olan kısım çizmek değil, kodun her satırını bir sembole eşlemek: değişken tanımı dikdörtgen, for koşulu elmas, println paralelkenar.

Başlangıç için küçük bir DOT iskeleti. Kopyalayın, Graphviz Online’ın sol tarafına yapıştırın; sağda çizim belirince düğüm ekleyip genişletin.

Iskelet basla BAŞLA islem x = 5 basla->islem karar x > 3 mü? islem->karar cikti "büyük" yaz karar->cikti Evet bitir BİTİR karar->bitir Hayır cikti->bitir
Beş düğümlük başlangıç iskeleti. Altındaki DOT kaynağını kopyalayıp genişletin.
DOT kaynağı
Graphviz Online'da aç ↗ Kodu kopyalayıp Graphviz Online'a yapıştırın; kendi diyagramınızı deneyin.
// Lab 2 başlangıç iskeleti: kopyalayın, düğüm ekleyerek genişletin
digraph Iskelet {
    charset="UTF-8";
    rankdir=TB;
    node [fontname="Helvetica"];

    basla [shape=ellipse, label="BAŞLA"];
    islem [shape=box, label="x = 5"];
    karar [shape=diamond, label="x > 3 mü?"];
    cikti [shape=parallelogram, label="\"büyük\" yaz"];
    bitir [shape=ellipse, label="BİTİR"];

    basla -> islem -> karar;
    karar -> cikti [label="Evet"];
    karar -> bitir [label="Hayır"];
    cikti -> bitir;
}

DOT’un bu lab için yetecek üç kuralı:

  • Düğüm tanımı: ad [shape=box, label="metin"];. Şekiller: ellipse başla/bitir, box işlem, diamond karar, parallelogram girdi/çıktı.
  • Ok: a -> b;. Karardan çıkan oklara etiket: karar -> islem [label="Evet"];.
  • Düğüm adları ASCII (basla, karar1); Türkçe karakterler yalnızca label içinde. Her satır noktalı virgülle biter; Java gibi.

PNG indirmek için: Graphviz Online’da üstteki Format menüsünden png-image seçin, sağdaki görsele sağ tıklayıp “Resmi farklı kaydet” deyin. Dosya adını aşağıdaki gibi verin.

1a · CarpimTablosu.dot ve CarpimTablosu.png

Lab 1’deki CarpimTablosu.java dosyanızın akış diyagramı. Beklenen iskelet: BAŞLA → i = 1 → i ≤ 10 mu? elması → Evet: 5 x i = ... yazdır (paralelkenar) → i = i + 1 → elmasa geri ok; Hayır: BİTİR. Lab 1’de tabloyu 10’dan 1’e yazdırdıysanız diyagramınız da öyle olsun; diyagram sizin kodunuzu anlatmalı.

Önce CarpimTablosu.dot dosyasını deponuzun kök dizinine kaydedin (VS Code’da yeni dosya, içine DOT kodu). Sonra aynı kodu Graphviz Online’da çizdirip CarpimTablosu.png olarak indirin ve depoya koyun.

1b · Ortalama.dot ve Ortalama.png

Aşağıdaki programın diyagramı. Önce kodu okuyun; printf satırı bir çıktı, if bir karar.

public class Ortalama {
    public static void main(String[] args) {
        int not1 = 70;
        int not2 = 80;
        int not3 = 85;
        double ortalama = (not1 + not2 + not3) / 3.0;
        System.out.printf("Ortalama: %.2f%n", ortalama);
        if (ortalama >= 60) {
            System.out.println("Geçti");
        } else {
            System.out.println("Kaldı");
        }
    }
}

Ortalama.dot ve Ortalama.png deponun kök dizininde. Kontrol listesi: tek BAŞLA, tek BİTİR, elmasın iki okunda Evet / Hayır, her println ve printf paralelkenar.

Görev 2 · Diyagramdan koda (20 dk)

Şimdi ters yön: diyagram verildi, kodu siz yazacaksınız. İki dosya; ikisi de tam dosya (public class + main), ikisi de derlenip çalışmalı. Girdi yok; değerler kodda sabit.

2a · NotHarfi.java

NotHarfi basla BAŞLA puan puan = 73 basla->puan k90 puan ≥ 90 mı? puan->k90 k80 puan ≥ 80 mi? k90->k80 Hayır yA "Harf: A" yaz k90->yA Evet k70 puan ≥ 70 mi? k80->k70 Hayır yB "Harf: B" yaz k80->yB Evet k60 puan ≥ 60 mı? k70->k60 Hayır yC "Harf: C" yaz k70->yC Evet yD "Harf: D" yaz k60->yD Evet yF "Harf: F" yaz k60->yF Hayır bitir BİTİR yA->bitir yB->bitir yC->bitir yD->bitir yF->bitir
Puandan harf notu. Her elmasın Hayır oku bir sonraki elmasa gidiyor: Java'da else if zinciri.

int puan = 73; sabit. 90 ve üstü A, 80 ve üstü B, 70 ve üstü C, 60 ve üstü D, altı F. Çıktı tam olarak şu satır olmalı (iki nokta, bir boşluk, harf):

Harf: C

Otomatik kontrol bu satırı birebir arar. İpucu: elmas zincirini if / else if / else if / else olarak yazın; sıra önemli, 90’dan başlayın. Bitince puan’ı 95, 59 ve 80 yapıp deneyin; her seferinde diyagramda hangi oku izlediğinizi söyleyebilmelisiniz. Teslimde puan = 73 kalsın.

2b · GeriSayim.java

GeriSayim basla BAŞLA ilk i = 10 basla->ilk karar i ≥ 1 mi? ilk->karar yaz i'yi yaz (ayrı satır) karar->yaz Evet son "Basla!" yaz karar->son Hayır azalt i = i - 1 yaz->azalt azalt->karar bitir BİTİR son->bitir
Geri sayım: geriye dönen ok tekrar yapısı; Hayır çıkışı döngünün bittiği yer.

10’dan 1’e her sayı ayrı satırda, sonra Basla! (ASCII, ş yok; otomatik kontrol böyle arar):

10
9
8
...
1
Basla!

İpucu: for (int i = 10; i >= 1; i--). Diyagramdaki i = i - 1 kutusu i-- oldu, i ≥ 1 mi? elması döngü koşulu. Derleyin, çalıştırın, çıktıyı sayın: 10 satır sayı, 1 satır Basla!.

Görev 3 · Hata avı (15 dk)

Deponuzda üç dosya hazır geldi; üçü de bozuk. Her birinde bir tür hata var. Dosyaları yerinde düzeltin (adlarını değiştirmeyin) ve hatalar.md dosyasına ne bulduğunuzu yazın.

DosyaHata türüİpucuDüzelince
Hatali1.javaSözdizimijavac iki şikayette bulunuyor: bir noktalı virgül eksik ve system küçük harfle yazılmış. Mesajı okuyun; satır numarasını veriyor.Derlenir ve Merhaba Lab 2 yazar
Hatali2.javaÇalışma zamanıDerlenir, ama çalışınca çöker: int ogrenciSayisi = 0; ve toplam / ogrenciSayisi. Hata mesajındaki ArithmeticException satırını okuyun. Sınıfta 3 öğrenci var; toplam = 75.Ortalama: 25 yazar
Hatali3.javaMantıkDerlenir, çalışır, çökmez, yanlış sonuç verir: double ort = (70 + 80 + 85) / 3; → 78.0. Gerçek ortalama 78,33. Neden? Geçen haftanın 7 / 2 sorusu.printf("%.2f") ile Ortalama: 78.33 yazar

Sıra önemli: Hatali1 düzelmeden derlenmez, Hatali2 çalıştırmadan çökmez, Hatali3 ise çıktıyı önceden tahmin etmeden hiç fark edilmez. Her dosyayı önce çalıştırmadan okuyun ve “bence şu satır” deyin; sonra derleyip çalıştırıp doğrulayın.

hatalar.md

Deponun kök dizinine, şu şablonla (üç dosya için üç blok):

# Lab 2 · Hata avı raporu

## Hatali1.java
- Satır: ...
- Hata türü: sözdizimi / çalışma zamanı / mantık
- Neden hata: ...
- Nasıl düzelttim: ...
- Derleyici / JVM mesajı (varsa): ...

## Hatali2.java
...

## Hatali3.java
...

## En zor bulduğum hata ve nedeni
...

“Neden hata” satırı tek kelime olmasın; “noktalı virgül yok” yerine “Java’da her deyim noktalı virgülle biter, 7. satırdaki println deyimi bitmemiş” gibi bir cümle. Bu raporu lab sorumlu hocanız okuyacak.

Görev 4 · Kantin alt akışı (15 dk)

Derste kantin sipariş uygulamasının büyük resmini gördünüz; “Stokta mı?” elmasının içindeki alt akışın sözde kodunu da. Şimdi o alt akışı bir adım öteye taşıyın: kod yok, yalnızca diyagram ve sözde kod.

Alt akış: stok kontrolü ve sepete ekleme. Girdi: urunKodu, adet. Dersteki sürüme iki kural ekleyin:

  • adet 0 ya da negatifse “Geçersiz adet” mesajı ver, hiçbir şey yapma.
  • Stok adet’ten azsa “Bu üründen en fazla N adet alabilirsiniz” mesajı ver; N o anki stok.
  • Stok yeterliyse: stok = stok - adet, sepete ekle, toplam = toplam + fiyat × adet.

Teslim edilecek üç dosya, deponun kök dizininde:

  1. KantinStok.dot: alt akışın DOT kaynağı. Ürünler veritabanını shape=cylinder ile gösterin; en az iki elmas (adet geçerli mi, stok yeter mi), tek BAŞLA, tek BİTİR.
  2. KantinStok.png: Graphviz Online’dan indirilmiş çizim.
  3. KantinStok.md: içinde sözde kod (dersteki BAŞLA / EĞER ... İSE / DEĞİLSE / BİTİR biçimi) ve altına iki cümle: bu alt akıştaki hangi karar bugün yazdığınız NotHarfi.java’daki kararla aynı yapıda, hangisi farklı?

Sözde kod KantinStok.md içinde üç ters tırnakla (```text) açılan bir blokta dursun.

Teslim (5 dk)

Deponun kök dizininde:

git add .
git commit -m "Lab 2: diyagramlar, kod ve hata avı"
git push

Codespaces’te Source Control düğmesi aynı üç adımı tıklamayla yapar. Push’tan sonra 1-2 dakika bekleyip deponun Releases sayfasına bakın; otomatik kontrol her push’ta çalışır ve puanı orada listeler. Geçmeyen test varsa düzeltin, tekrar push edin; en son push geçerlidir.

Son teslim: 9 Ekim 2026 Cuma 23.59. Lab saatinde bitiremeyenler o saate kadar evden push edebilir.

Kontrol listesi: deponuzun kökünde tam olarak şunlar olmalı: CarpimTablosu.dot, CarpimTablosu.png, Ortalama.dot, Ortalama.png, NotHarfi.java, GeriSayim.java, Hatali1.java, Hatali2.java, Hatali3.java (düzeltilmiş), hatalar.md, KantinStok.dot, KantinStok.png, KantinStok.md.

Otomatik kontrol (100 puan)

#TestPuan
1CarpimTablosu.dot Graphviz ile hatasız render ediliyor10
2CarpimTablosu.png var5
3Ortalama.dot Graphviz ile hatasız render ediliyor10
4Ortalama.png var5
5NotHarfi derleniyor ve çıktıda Harf: C satırı var15
6GeriSayim çıktısı 10’dan 1’e ayrı satırlar ve sonunda Basla!15
7Hatali1 derleniyor10
8Hatali2 çalışıyor ve çıktıda Ortalama: 25 var10
9Hatali3 çıktısında 78.33 var10
10KantinStok.dot render ediliyor, hatalar.md ve KantinStok.md var10

Bitiremediyseniz

Lab’da Adım 0 (depo açıldı), Görev 1a (ilk .dot ve .png) ve Görev 2’den en az bir dosyanın derlenip push edilmiş olması yeterli. Kalanı 9 Ekim Cuma 23.59’a kadar evde bitirip push edin; Graphviz Online evde de aynı şekilde çalışır, kurulum istemez. Cuma’dan sonra gelen push’lar puanlanmaz. Takıldığınız yer DOT sözdizimiyse yapay zekaya sorabilirsiniz (sarı bölge); takıldığınız yer “bu kod ne yapıyor” ise ofis saatine gelin.

Lab araçları

  • Graphviz Online
  • JDK 21 / Codespaces
  • Git

Lab sırasında kodu kendi bilgisayarınızda ya da Java Playground'da çalıştırabilirsiniz.