Bölüm 1 · Sunum 5

Program nasıl karar verir?

Bugün sketch’lerimiz duruma göre farklı davranmayı öğrenecek.

if / elseGirintielse if zinciriİç içe koşullar

Skor 10 olunca “Kazandın!” yazsın. Olmadıysa daire çizsin.

draw her frame aynı satırları çalıştırıyor. Bazen yazı, bazen daire çizmesini nasıl sağlarız?

Günlük hayatta hep yapıyoruz

Yağmur yağıyorsa şemsiye al.
Yağmıyorsa alma.

Koşullu ifade (conditional statement)Belirli bir koşul doğruysa (true) bir kod bloğunu, değilse başka bir bloğu çalıştıran yapıdır.

Bir soru var, iki yol var. Program cevaba göre yollardan birini seçiyor.

Yazımı: if, else if, else

  • Koşul parantez içinde yazılır ve bir boolean üretir.
  • Süslü parantezler { } bloğun sınırını belirler.
  • Yukarıdan aşağı bakılır; ilk doğru dal çalışır, diğerleri atlanır.
  • else if ve else zorunlu değildir.

Sıcak mı, serin mi?

“Düzenle” ile sicaklik = 18 değerini 30 yapın. Sonra tam 25 yapın: hangi renk çıkar, neden?

Kararı çizerek göstermek: akış şeması

if/else dallanma akışı: koşula göre renk seçimi
SimgeAnlamıBu örnekte
YuvarlakBaşla / bitişŞemanın girişi ve çıkışı
ElmasKoşul sorususicaklik > 25
DikdörtgenYapılacak işlemfill, ellipse

Şemada yolu izleyin

Fareyi alttaki çubuğun üstünde gezdirin. Program her seferinde iki yoldan yalnızca birini izler; 25’in tam üstünde ne oluyor?

Her akış şeması bir çıkışa varmalı

xkcd 1195: Başla kutusundan çıkan ok tek bir elmasa gidiyor; elmasın evet oku yine kendisine dönüyor
Kaynak: xkcd.com/1195, Randall Munroe (CC BY-NC 2.5)

Elmasın içinde şu yazıyor: “Bir dakika, bu akış şeması bir tuzak!”

  • Tek cevap “evet” ve ok yine aynı elmasa dönüyor.
  • “Hayır” dalı yok, bitiş yok.
Kendi şemanızı çizerkenHer elmastan iki ok çıkmalı ve her yol sonunda bitişe ulaşmalı.

İki kod da aynı çalışıyor. Hangisini okumak daha kolay?

Girinti (indentation)

  • Blok içindeki satırları içeri almaktır.
  • Hangi satırın hangi bloğa ait olduğu göz ucuyla görülür.
  • İç içe koşullarda girinti yoksa iz çabuk kaybolur.
  • Örneklerimizin hepsinde blok gövdesi girintilidir.
JavaScript’te zorunlu değilGirinti bozuk olsa da kod çoğu zaman çalışır. Hata sessizce okunabilirlikte birikir. “Çalışıyor” demek yetmez.
Python’da zorunluOrada girinti sözdiziminin parçasıdır. Yanlışsa program hiç çalışmaz: IndentationError.

Girintiyi kim için yapıyoruz?

Çalışıyor işte. Girinti kimin umurunda?
😎
bugün
Bu } hangi if’i kapatıyor? Bu kodu kim yazmış böyle?
😤
üç ay sonra
…ben yazmışım.
😶
dosyanın tarihine bakınca

Kodu en çok okuyacak kişi gelecekteki sizsiniz.

Boşluk mu, Tab mı?

Boşluk (space)Klavyedeki uzun boşluk çubuğu. Çoğu proje ve p5.js Web Editor 2 ya da 4 boşluk kullanır.
Sekme (Tab)Tab tuşu; genellikle Q’nun solunda, Caps Lock’un üstünde. Editörler bu tuşa basınca boşluk üretecek şekilde ayarlanabilir.
İkisini karıştırmayınAynı dosyada hem boşluk hem Tab kullanmak, başka editörlerde satırların kaymış görünmesine yol açar. Birini seçin ve hep onu kullanın.

Trafik ışığında üç durum var. if / else yalnızca iki yol veriyor.

Kırmızı, sarı, yeşil. Üçüncü yolu nereye koyacağız?

else if: araya yeni bir soru

Zincir nasıl çalışır?

  1. durum === "kirmizi" mı? Evetse kırmızıyı yak, zincirden çık.
  2. Değilse: durum === "sari" mı? Evetse sarıyı yak, zincirden çık.
  3. İkisi de değilse: else çalışır, yeşili yak.
Her seferinde yalnızca bir dalZincir, uyan ilk dalı çalıştırır. Sonrakilere bakılmaz.
Örnekteki numaraÖnce üç lamba da gri çizilir. Zincir yalnızca uygun lambayı yeniden boyar.

Oyunlar sürekli karar verir

OyunKoşulSonuç
Super Mario1-Up mantarı alındıCan bir artar
Pac-ManHayaletle çarpışma var ve güç hapı aktif değilBir can gider
TetrisBir satır tamamen dolduSatır silinir, skor artar
Futbol oyunuTop kale çizgisini geçtiGol; skor güncellenir
Candy CrushÜç ya da daha fazla aynı renk yan yanaTaşlar patlar, puan gelir

Aynı iskelet birazdan yazacağımız Daire Tıklama oyununda da var: isabet varsa skor artar, hedef skora ulaşılınca oyun biter.

Can barı: else if zinciri iş başında

Fareyi sağa sola götürün. Pokémon’dan dövüş oyunlarına kadar can barlarının renk değiştirmesi böyle bir zincirdir; her an yalnızca bir dal çalışır.

Sevdiğiniz oyundan üç karar

  1. Bildiğiniz bir oyundan üç durum seçin.
  2. Her birini kısa bir koşul cümlesi olarak yazın: “… ise … olur.”
  3. Birini seçip küçük bir if / else iskeletine ya da akış şemasına dönüştürün.

Skor yalnızca can varken ve oyun bitmemişken artsın.

İki ayrı koşul var. Bunu kaç farklı biçimde yazabilirsiniz?

İç içe if ya da tek if + &&

İç içe koşul (nested conditional)Bir if bloğunun içine başka bir if yazmaktır. Önce dış koşul, doğruysa iç koşul sorulur.

İki yazım da aynı kararı verir. Arada başka iş yoksa birleşik koşul daha sadedir.

İki yazım, aynı akış

Dört kombinasyonu da deneyin. Turuncu yol, programın o değerlerle izlediği yoldur.

Her dalda farklı mesaj: üç çıkış

Üç yol var: devam, oyun bitti, can yok.

Neden tek && yetmiyor?Burada else’ler de iş yapıyor. Tek bir birleşik koşul yalnızca iki yol verir.

Üç çıkışlı akış: yolu izleyin

Önce tahmin edin: can > 0 false iken oyunBitti’yi değiştirmek sonucu etkiler mi?

Dışarıda birleşik koşul, içeride skor eşiği

Her düzeydeki koşul tek bir karşılaştırma olmak zorunda değil.

BirleştirilebilirDış ya da iç koşul &&, ||, ! ile kurulmuş bir ifade olabilir.

Birleşik koşullu akış: yolu izleyin

Üç düğme, sekiz kombinasyon. Kaç tanesi “Seviye atlandı” mesajına ulaşır?

İki küçük not

Boş else yazmayınelse yalnızca gerçekten yapılacak bir iş varsa eklenir. else { } gereksizdir.
|| için de benzer eşdeğerlik var“Can bitti ya da süre bitti → oyunu bitir” kuralı art arda iki if ile ya da if (can === 0 || sure === 0) ile yazılabilir.

Konsolda hangi satırlar, hangi sırayla görünür?

Adım adım izleyelim

Oyun kuralından koda

  1. Üç kısa oyun kuralı yazın. Örnek: “can sıfırsa bitir”, “skor 10 olunca seviye atla”.
  2. Bir yapay zekâya bu kuralları if / else if / else iskeletine çevirmesini söyleyin.
  3. Gelen kodu denetleyin: = ile === doğru mu? && doğru yerde mi? Hatalı atamaları düzeltin.

Kodunuzu okunabilirlik açısından gözden geçirtin

  1. Bugün yazdığınız bir sketch’i kopyalayın (örneğin sıcaklık rengi).
  2. Bir yapay zekâya şunu sorun: girinti tutarlı mı, değişken adları anlamlı mı (camelCase), sabitler BÜYÜK_HARF mi, gereksiz karmaşık yer var mı?
  3. Kısa, madde madde öneri isteyin. “Kodun mantığını değiştirme” deyin.
  4. Önerileri uygulayıp yeniden çalıştırın. Davranış aynı kalmalı; yalnızca okunuş iyileşmeli.

Kod zamanı

  1. Sıcaklık örneğine üçüncü bir renk ekleyin: 10’un altı mavi, 10–25 arası yeşil, 25’in üstü turuncu.
  2. Kayan daire tuvalin sağ yarısına geçince rengi değişsin.
  3. Yanıp sönen ışık: bir daire bir saniye kırmızı, bir saniye yeşil olsun. İpucu: frameCount % 120.
  4. Zorlu: İlk dersteki söz. Top sağa gitsin; kenara değince yönünü tersine çevirsin. İpucu: x ve hiz diye iki değişken.

skor = 10 iken konsola ne yazılır?

  1. Yalnızca A
  2. A ve B
  3. Yalnızca B
  4. C

İlk doğru dal çalışır, zincir biter. İkinci koşul da doğru ama ona hiç bakılmaz. Sıralama önemli.

Bu kodda sinsi bir hata var. Ne olur?

  1. Hiçbir şey yazılmaz.
  2. “Kazandın!” yazılır ve skor 10 olur.
  3. Program hata verip durur.

Tek = atamadır: skor kutusuna 10 koyar. Koşul da doğru sayılır. Soru sormak için ===.

can = 0, oyunBitti = true. mesaj ne olur?

  1. “Devam”
  2. “Oyun bitti”
  3. “Can yok”

Dış koşul can > 0 yanlış. İçerideki if’e hiç girilmez; dıştaki else çalışır.

Merak edenler için kaynaklar

Bugün ne öğrendik?

  • if bir soru sorar; doğruysa bloğu çalışır, değilse else.
  • else if ile ikiden fazla yol kurulur; uyan ilk dal çalışır.
  • Girinti zorunlu değil ama okunabilirlik için şart. Boşluk ile Tab karışmaz.
  • Akış şeması: yuvarlak başla/bitiş, elmas koşul, dikdörtgen işlem.
  • İç içe if ile && çoğu zaman aynı kararı verir.
  • if (skor = 10) bir sorudur sanmayın; atamadır.

Sıradaki ders

İlk oyunumuz

Fare, mesafe ve Daire Tıklama.