İçeriğe geç
← Tüm yazılar
· 11 dk okuma Programlama Temelleri

Algoritma: Koşullar

Koşul (EĞER-İSE) nedir, bilgisayar nasıl karar verir? Tek/çift/çok kollu koşullar, VE-VEYA-DEĞİL mantığı ve iç içe kararları kod yazmadan, kalemle öğren.

Algoritma: Koşullar

Önceki yazıda değişkenleri, yani bilgiyi saklayan kutuları öğrendik. Sonlara doğru küçük bir satır vardı: yetişkin ← yaş ≥ 18. Bu satır bir doğru/yanlış değeri üretiyordu — ama biz o değerle henüz hiçbir şey yapmadık.

İşte bu yazının konusu tam olarak bu: bir doğru/yanlış değerine bakıp yol ayırmak. Bir programın “şu doğruysa bunu yap, değilse şunu yap” diyebilmesi. Buna koşul diyoruz ve bir algoritmanın karar verebilmesinin tek yolu budur. Şu ana kadar yazdığımız her şey baştan sona düz akıyordu; koşulla birlikte programımız ilk kez seçim yapmaya başlıyor.

Bilgisayar nasıl “karar” verir?

Aslında vermiyor. Bir bilgisayar hava kararınca “ışığı açayım mı acaba?” diye düşünmez. Onun yaptığı çok daha basit ve mekaniktir: kendisine önceden yazdığın bir soruyu sorar, cevabı yalnızca doğru ya da yanlış olur ve bu cevaba göre, yine senin gösterdiğin iki yoldan birine sapar.

Bütün mesele bundan ibaret. Gün boyu sen de aynısını yaparsın:

  • Eğer yağmur yağıyorsa şemsiye al.
  • Eğer ışık kırmızıysa dur, değilse geç.
  • Eğer hesapta yeterli para varsa öde, yoksa iptal et.

Bu “eğer … ise” kalıbını bir bilgisayara anlatmanın yolu koşuldur. Karar bilgisayarın değil, senin kararındır; sen kuralı yazarsın, o harfiyen uygular. İlk yazıdaki kuralı hatırla: bilgisayar zeki değil, itaatkârdır.

Tek kollu koşul: “şu olursa şunu yap”

En yalın koşul, yalnızca bir soru sorar; cevap doğruysa fazladan bir iş yapar, yanlışsa hiçbir şey yapmadan yoluna devam eder. Tek bir kolu vardır.

Kalıbı şöyle: EĞER ile başlar, soruyu yazarsın, İSE dersin, altına yapılacak işi içeri girintili yazarsın ve BİTİREĞER ile bloğu kapatırsın.

Tek kollu koşul
EĞER hava_yağmurlu İSE
YAZ "Şemsiyeni al"
BİTİREĞER
YAZ "Dışarı çık"

Bunu soldan sağa, yukarıdan aşağıya oku: “Eğer hava yağmurluysa, şemsiye al. (Bloğu kapat.) Sonra her hâlükârda dışarı çık.” Yağmur yoksa YAZ "Şemsiyeni al" satırı tamamen atlanır ve program doğrudan Dışarı çıka geçer. Akış şemaları yazısında çizdiğimiz şu şemayı hatırladın mı? İşte onun yazıya dökülmüş hâli tam olarak bu:

flowchart TD
    A([Başla]) --> B{hava yağmurlu mu?}
    B -- Evet --> C[Şemsiyeni al]
    B -- Hayır --> D[Dışarı çık]
    C --> D
    D --> E([Bitti])

Baklava kutusu EĞER, “Evet” oku girintili blok, iki yolun birleştiği yer ise BİTİREĞERden sonrası. Çizim ile yazı, aynı fikrin iki ayrı yüzü.

Koşulun içinde ne var? Bir doğru/yanlış sorusu

EĞER ile İSE arasına yazdığın şey bir sorudur ve cevabı ya doğru ya yanlış olmak zorundadır. Peki bu doğru/yanlış nereden gelir? Değişkenler yazısından tanıdık: bir karşılaştırmadan.

Karşılaştırma operatörlerini geçen yazılardan biliyoruz; koşulların yakıtı bunlardır:

İşaretOkunuşuÖrnek koşulNe zaman doğru?
=eşit mirenk = "kırmızı"renk tam olarak kırmızıysa
eşit değil micevap ≠ "evet"cevap evet’ten farklıysa
>büyük müpuan > 100puan 100’den fazlaysa
<küçük müstok < 5stok 5’in altındaysa
büyük veya eşit miyaş ≥ 18yaş 18 ya da daha fazlaysa
küçük veya eşit mihız ≤ 50hız 50 ya da daha azsa

Her satır bir doğru/yanlış üretir; EĞER de o değere bakıp yol seçer. Örneğin EĞER yaş ≥ 18 İSE, aslında “yaş ≥ 18 doğru mu?” diye sorup cevaba göre davranır.

Çift kollu koşul: “ya bunu ya şunu”

Çoğu zaman bir yol yetmez: koşul doğruysa bir şey, yanlışsa başka bir şey yaparız. İşte burada DEĞİLSE devreye girer. Blok ikiye ayrılır; birinden mutlaka biri çalışır, ikisi birden asla çalışmaz.

Çift kollu koşul — bilet kontrolü
EĞER yaş ≥ 18 İSE
YAZ "Bilet verildi, iyi seyirler"
DEĞİLSE
YAZ "Üzgünüz, bu film 18 yaş üstüne"
BİTİREĞER

Yaş 20 ise üstteki satır, 15 ise alttaki satır çalışır — asla ikisi birden. Bu, bir yol ayrımıdır; iki koldan yalnızca birine girilir:

flowchart TD
    A([Başla]) --> B{yaş ≥ 18 mi?}
    B -- Evet --> C[/"Bilet verildi" yaz/]
    B -- Hayır --> D[/"18 yaş üstüne" yaz/]
    C --> E([Bitti])
    D --> E

Sözde kod yazısındaki çift/tek sayı örneğini de hatırla; o da tam bir çift kollu koşuldu:

Bir sayı çift mi, tek mi?
EĞER sayı MOD 2 = 0 İSE
YAZ "Çift"
DEĞİLSE
YAZ "Tek"
BİTİREĞER

MOD bölmeden kalanı veriyordu; bir sayının 2’ye bölümünden kalan 0’sa o sayı çifttir. Tek bir koşulla bütün sayıları ikiye ayırdık.

Çok kollu koşul: “şıklardan biri”

Bazen iki seçenek de az gelir. Bir öğrencinin notunu harfe çevirmek istiyoruz: 90 ve üstü AA, 80’ler BA, 70’ler BB, altı Kaldı. Burada tam dört olası sonuç var. Bunun için koşulları bir zincir hâline getiririz: DEĞİLSE EĞER.

Notu harfe çevir — çok kollu koşul
EĞER not ≥ 90 İSE
YAZ "AA"
DEĞİLSE EĞER not ≥ 80 İSE
YAZ "BA"
DEĞİLSE EĞER not ≥ 70 İSE
YAZ "BB"
DEĞİLSE
YAZ "Kaldı"
BİTİREĞER

Bunu akış şemaları yazısında bir kararlar zinciri olarak çizmiştik; şimdi aynı zincirin yazıya dökülmüş hâli elimizde. Ama burada çok kritik, gözden kaçan bir kural var:

DEĞİLSE EĞER bir yenilik değil aslında; “önceki koşul yanlış çıktıysa, o zaman şunu sor” demenin kısa yolu. En sondaki yalın DEĞİLSE ise “yukarıdakilerin hiçbiri tutmadıysa” anlamına gelir — bir tür güvenlik ağı. Çok kollu koşulda çoğu zaman bu son yakalayıcıyı koymak iyi bir alışkanlıktır.

Koşulları birleştirmek: VE, VEYA, DEĞİL

Şimdiye kadar her koşulda tek bir soru sorduk. Ama gerçek hayat çoğu zaman birden fazla şartı aynı anda ister: “yağmur yağmıyor ve hava sıcaksa pikniğe git.” İşte bu “ve”, “veya”, “değil” kelimeleri koşulların dünyasında da vardır ve küçük soruları birleştirip tek bir doğru/yanlış cevabına dönüştürür. Bunlara mantıksal operatörler denir.

VE — hepsi doğru olmalı

VE, birleştirdiği koşulların tümü doğruysa doğru olur; biri bile yanlışsa sonuç yanlıştır. Zorlu, titiz bir kapı bekçisidir; herkesin bileti tam olmalı.

İndirimli bilet — iki şart birden
EĞER öğrenci VE hafta_içi İSE
YAZ "İndirimli bilet"
DEĞİLSE
YAZ "Tam bilet"
BİTİREĞER

İndirim yalnızca hem öğrenciysen hem de gün hafta içiyse geçerli. Hafta sonu bir öğrenci gelse indirim yok; hafta içi öğrenci olmayan biri gelse yine yok. VE, “ikisi de” demektir.

VEYA — en az biri yetsin

VEYA, birleştirdiği koşullardan en az biri doğruysa doğru olur; ancak hepsi yanlışsa sonuç yanlış çıkar. Hoşgörülü bir bekçidir; tek bir doğru cevap kapıyı açar.

Hafta sonu mu?
EĞER gün = "cumartesi" VEYA gün = "pazar" İSE
YAZ "Bugün tatil"
DEĞİLSE
YAZ "Bugün iş günü"
BİTİREĞER

Gün ikisinden herhangi biri olduğunda tatil sayılır. Günlük dildeki “veya”nın bazen “ya o ya bu ama ikisi değil” anlamına geldiğine dikkat — programlamada VEYA böyle değildir: en az biri doğruysa, ikisi de doğru olsa bile sonuç doğrudur.

DEĞİL — cevabı ters çevir

DEĞİL, bir koşulun sonucunu tersine çevirir: doğruyu yanlış, yanlışı doğru yapar. Çoğu zaman “olumsuz” bir durumu daha okunur ifade etmek için kullanılır.

Girişi tersinden sormak
EĞER DEĞİL giriş_yapıldı İSE
YAZ "Lütfen önce giriş yapın"
BİTİREĞER

DEĞİL giriş_yapıldı, “giriş yapılmadıysa” diye okunur. EĞER giriş_yapıldı = yanlış yazmak da aynı kapıya çıkar, ama DEĞİL çoğu zaman daha akıcıdır.

Bu üçünü bir arada, gündelik karşılıklarıyla görelim:

OperatörNe zaman doğru?Gündelik karşılığıÖrnek
VEbütün koşullar doğruysa”hem … hem …”yaş ≥ 18 VE bilet_var
VEYAen az bir koşul doğruysa”ya … ya … (ya da ikisi)“cumartesi VEYA pazar
DEĞİLkoşul yanlışsa doğru olur”… değilse”DEĞİL yağmurlu

İç içe koşullar: karar içinde karar

Bazen bir soruyu ancak başka bir soru “evet” çıktıysa sormak isteriz. Bir koşulun bloğunun içine ikinci bir koşul koyarız; buna iç içe (nested) koşul denir.

Bir sitede önce kullanıcının giriş yapıp yapmadığına, ardından —ancak giriş yaptıysa— yönetici olup olmadığına bakalım:

İç içe koşul — kademeli kontrol
EĞER giriş_yapıldı İSE
EĞER yönetici İSE
YAZ "Yönetim paneline hoş geldin"
DEĞİLSE
YAZ "Hoş geldin"
BİTİREĞER
DEĞİLSE
YAZ "Lütfen giriş yapın"
BİTİREĞER

Dıştaki koşul kapıyı açar; yalnızca içeri girildiyse (giriş yapıldıysa) içteki soru sorulur. Giriş yapılmadıysa program “yönetici mi?” diye hiç sormaz bile — o soruya sıra gelmez. İçteki bloğun bir kademe daha fazla girintili olduğuna dikkat et; girinti burada da kimin kime ait olduğunu gösteriyor.

Bir koşulu kâğıtta test etmek

Değişkenler yazısındaki izleme tablosu alışkanlığını hatırla. Koşullarda da benzer bir şey yaparız: aynı koşulu farklı girdilerle kâğıtta çalıştırıp her seferinde hangi dala girdiğimizi işaretleriz. En değerli girdiler sınır değerleridir — tam eşik noktaları.

Bilet örneğini (yaş ≥ 18) birkaç değerle deneyelim:

yaşyaş ≥ 18 doğru mu?Hangi dal çalışır?
25doğru”Bilet verildi”
18doğru”Bilet verildi”
17yanlış”18 yaş üstüne”
0yanlış”18 yaş üstüne”

Özellikle 18 satırına dikkat: “büyük veya eşit” olduğu için tam 18 yaşındaki kişi bileti alır. Eğer koşulu yaş > 18 yazsaydık, 18 yaşındaki biri geri çevrilirdi — tek bir işaretin sınırda kocaman bir fark yarattığını görüyor musun? Koşulları hep bu eşik değerlerinde test et; hataların çoğu tam orada saklanır.

Sık yapılan hatalar

Kendin dene

Kalem ve kâğıt yeter, başka hiçbir araca gerek yok. Önce koşulu sözde kodla yaz, sonra birkaç farklı girdiyle kâğıt üstünde çalıştırıp doğru dala gittiğini kontrol et.

Egzersiz 1 — Geçti mi, kaldı mı? (kolay)

Bir öğrencinin sınav notu var. Not 50 ve üzerindeyse “Geçti”, altındaysa “Kaldı” yaz.

Egzersiz 2 — Ücretsiz kargo (orta)

Bir alışveriş sepetinin tutarı 200 TL ve üzeriyse ya da müşteri üyeyse kargo ücretsiz olsun; ikisi de değilse 30 TL kargo eklensin.

Egzersiz 3 — Ne giymeli? (mini proje)

Hava sıcaklığına göre öneri ver: 30 ve üstü “tişört”, 15–29 arası “ceket”, 15’in altı “mont”. Bir de yağmur yağıyorsa —sıcaklık ne olursa olsun— önerinin yanına “şemsiye de al” eklensin.

Özet

Paylaş

İlgili yazılar

Sıkça sorulan sorular

Koşul (if) nedir?

Koşul, bir programın "eğer şu doğruysa şunu yap" diye yol ayırmasıdır. Bir soru sorulur, cevabı doğru/yanlış olur ve bilgisayar bu cevaba göre farklı bir adıma gider. Akış şemasındaki karar (baklava) kutusunun ve sözde koddaki EĞER … İSE bloğunun yaptığı iş budur; bir algoritmanın karar verebilmesinin tek yoludur.

EĞER … İSE … DEĞİLSE ne işe yarar?

İki yolu olan bir karardır: koşul doğruysa İSE bloğundaki adımlar, yanlışsa DEĞİLSE bloğundaki adımlar çalışır. "Ya bunu ya şunu" durumudur. Gerçek kodda IF … THEN … ELSE olarak geçer. Yalnızca doğru olduğunda bir iş yapılacaksa DEĞİLSE yazılmaz; buna tek kollu koşul denir.

Karşılaştırma operatörleri nelerdir?

Bir koşulun içindeki soruyu kuran işaretlerdir: = (eşit mi), ≠ (eşit değil mi), > (büyük mü), < (küçük mü), ≥ (büyük veya eşit mi) ve ≤ (küçük veya eşit mi). Her biri bir doğru/yanlış değeri üretir; koşullar bu değerle çalışır. Koşulun içindeki = "eşit mi?" diye SORAR, atamadaki gibi "içine koy" DEMEZ.

VE, VEYA, DEĞİL (mantıksal operatörler) ne demek?

Birden fazla koşulu birleştirmeye ya da bir koşulu tersine çevirmeye yararlar. VE, iki koşulun DA doğru olmasını ister (yaş ≥ 18 VE bilet var). VEYA, en az birinin doğru olması yeter (cumartesi VEYA pazar). DEĞİL, bir koşulun sonucunu ters çevirir (DEĞİL yağmurlu). Bunlar Boole mantığından gelir.

Çok kollu koşul (else if) nedir?

İkiden fazla seçenek olduğunda kurulan koşul zinciridir: EĞER … İSE, DEĞİLSE EĞER … İSE, DEĞİLSE … Bilgisayar koşulları yukarıdan aşağıya sırayla dener ve DOĞRU olan İLK dala girer, gerisine hiç bakmaz. Notu harfe çevirmek (90 ve üstü AA, 80 ve üstü BA…) buna klasik örnektir. Bu yüzden koşulların sırası önemlidir.

İç içe koşul (nested if) nedir?

Bir koşulun İSE ya da DEĞİLSE bloğunun içine başka bir koşul koymaktır. Önce dıştaki soru cevaplanır, ancak o dala girildiyse içteki soru sorulur. "Önce giriş yaptı mı? Yaptıysa yönetici mi?" gibi, birbirine bağlı, kademeli kararlar için kullanılır.

Koşuldaki = ile atamadaki = farkı nedir?

Bir koşulun içinde = işareti "iki şey birbirine eşit mi?" diye SORAN bir karşılaştırmadır ve doğru/yanlış üretir. Atamada ise = "şu değeri şu kutuya koy" diye EMREDEN bir komuttur. Yeni başlayanların en çok karıştırdığı nokta budur; birçok gerçek dil bu yüzden eşitliği kontrol etmek için == kullanır, atama için = kullanır.