Files
ornekler/dersler/24-sayilabilir.md
T
semih 494781e84f Dersler ve Temeller; web örnekleri PORT ortam değişkenini okur
- dersler/: 29 kısa ders (açıklama, çalıştırılabilir örnek, alıştırma). Her örneğin
  ve alıştırma çözümünün çıktısı Online IDE'nin hazırlık adımında gerçekten koşulup
  dosyadakiyle karşılaştırılır; biçim dersler/BICIM.md.
- temeller/: tek konulu 12 başlangıç programı.
- web/anket, web/kisalt, web/pano: port PORT ortam değişkeninden okunur (Online IDE
  önizlemesi 8080 verir), yoksa eski sabit port.
- README: öğrenme bölümü, Online IDE bağlantısı.
2026-10-17 22:07:47 +03:00

159 lines
3.5 KiB
Markdown

---
baslik: Sayılabilir türler
bolum: Kendi türlerin
ozet: sayilabilir ile sınırlı seçenekleri güvenle tutmak
---
Bir siparişin durumu "hazırlanıyor", "kargoda" ya da "teslim edildi" olabilir; başka bir şey olamaz. Bunu metinle tutarsan bir gün biri `"kargda"` yazar ve hata gözden kaçar. `sayilabilir`, bir değişkenin alabileceği değerleri baştan sayar; yanlış yazılan bir değer program çalışmadan yakalanır.
## Tanımlamak ve kullanmak
Her üye kendi satırına yazılır. Üyeye `Tur.UYE` diye ulaşırsın.
```kbl
sayilabilir Durum:
HAZIRLANIYOR
KARGODA
TESLIM_EDILDI
siparis = Durum.KARGODA
yazdir(siparis)
eger siparis == Durum.KARGODA:
yazdir("Siparişin yolda.")
```
```cikti
KARGODA
Siparişin yolda.
```
Yazdırınca üyenin adı görünür.
## Yanlış üye derlenmez
```kbl goster
sayilabilir Renk:
KIRMIZI
MAVI
r = Renk.MOR # derleme hatası: Renk'in MOR diye bir üyesi yok
```
Bu, sayılabilir türlerin asıl yararıdır: yazım hatası programın çalıştığı ana değil, derlendiği ana yakalanır.
## Seçeneğe göre karar vermek
Sayılabilir değerler `eger / degilse eger` ile çok iyi anlaşır. Bir trafik ışığının sıradaki rengini bulalım.
```kbl
sayilabilir Isik:
KIRMIZI
SARI
YESIL
fonksiyon sonraki(i: Isik) -> Isik:
eger i == Isik.KIRMIZI:
don Isik.YESIL
degilse eger i == Isik.YESIL:
don Isik.SARI
don Isik.KIRMIZI
isik = Isik.KIRMIZI
dongu adim icinde 1..4:
yazdir(isik)
isik = sonraki(isik)
```
```cikti
KIRMIZI
YESIL
SARI
KIRMIZI
```
## Üyelerin sayı değerleri
Her üyenin arkasında bir sayı vardır. İlk üye 0'dan başlar; istersen değeri kendin verirsin. Değer yazılmayan üye bir öncekinden devam eder. `sayi()` ile bu değeri alırsın.
```kbl
sayilabilir Oncelik:
DUSUK = 1
ORTA
YUKSEK = 10
yazdir(sayi(Oncelik.DUSUK))
yazdir(sayi(Oncelik.ORTA))
yazdir(sayi(Oncelik.YUKSEK))
yazdir(Oncelik.YUKSEK > Oncelik.ORTA)
```
```cikti
1
2
10
doğru
```
## Yapı alanı ve liste öğesi olarak
Sayılabilir bir değer yapının alanı ya da listenin öğesi olabilir.
```kbl
sayilabilir Tur:
KEDI
KOPEK
KUS
yapi Hayvan:
ad = ""
tur = Tur.KEDI
barinak = [Hayvan("Pamuk", Tur.KEDI), Hayvan("Karabaş", Tur.KOPEK), Hayvan("Maviş", Tur.KUS), Hayvan("Tekir", Tur.KEDI)]
kedi_sayisi = 0
dongu h icinde barinak:
yazdir(f"{h.ad:<8}{h.tur}")
eger h.tur == Tur.KEDI:
kedi_sayisi += 1
yazdir(f"{kedi_sayisi} kedi var.")
```
```cikti
Pamuk KEDI
Karabaş KOPEK
Maviş KUS
Tekir KEDI
2 kedi var.
```
> **Dikkat:** Sözlük değerleri sayılabilir tutamaz: `{"a": Tur.KEDI}` derlenmez. Böyle bir eşleme gerekiyorsa değeri bir yapının alanında tut.
## Alıştırma
```alistirma
`Mevsim` adında `ILKBAHAR`, `YAZ`, `SONBAHAR`, `KIS` üyeli bir sayılabilir tür tanımla. `mevsim_bul(ay: sayi) -> Mevsim` fonksiyonu ay numarasına göre mevsimi döndürsün (12, 1, 2 kış; 3-5 ilkbahar; 6-8 yaz; 9-11 sonbahar). Verilen aylar için sonucu yazdır.
%%%
# buraya yaz
dongu ay icinde [1, 4, 7, 10]:
yazdir(mevsim_bul(ay))
%%%
sayilabilir Mevsim:
ILKBAHAR
YAZ
SONBAHAR
KIS
fonksiyon mevsim_bul(ay: sayi) -> Mevsim:
eger ay >= 3 ve ay <= 5:
don Mevsim.ILKBAHAR
degilse eger ay >= 6 ve ay <= 8:
don Mevsim.YAZ
degilse eger ay >= 9 ve ay <= 11:
don Mevsim.SONBAHAR
don Mevsim.KIS
dongu ay icinde [1, 4, 7, 10]:
yazdir(mevsim_bul(ay))
%%%
KIS
ILKBAHAR
YAZ
SONBAHAR
```