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ı.
This commit is contained in:
2026-10-17 22:07:47 +03:00
parent c5468f5d0a
commit 494781e84f
47 changed files with 5942 additions and 4 deletions
+15 -2
View File
@@ -13,8 +13,21 @@ kabalang calistir konsol/fraktal/fraktal.kbl
![KabaLang Kcode içinde](medya/kcode.png)
**Tarayıcıda dene:** bütün örnekler ve dersler [ide.kabaforce.com](https://ide.kabaforce.com)
adresindeki Online IDE'de kurulumsuz çalışır.
---
## KabaLang'ı öğren
- [**Dersler**](dersler): sıfırdan 29 kısa ders: giriş, temeller, akış denetimi, veri
yapıları, fonksiyonlar, kendi türlerin, hatalar ve dosyalar. Her derste açıklama,
çalıştırılabilir örnekler ve alıştırmalar var; örneklerin çıktısı yayından önce gerçekten
koşulup doğrulanır (biçim: [dersler/BICIM.md](dersler/BICIM.md)).
- [**Temeller**](temeller): her biri tek konuyu baştan sona gösteren 12 küçük program
(merhaba, değişkenler, girdi, koşullar, döngüler, fonksiyonlar, listeler, sözlükler,
metinler, yapılar, hatalar, dosyalar).
## Konsol
| | Proje | Ne gösteriyor |
@@ -39,10 +52,10 @@ kabalang calistir konsol/fraktal/fraktal.kbl
| ![](medya/kisalt-istatistik.png) | [**Kısalt**](web/kisalt) | Bağlantı kısaltıcı: gerçek 302 yönlendirme, tıklama sayacı, sunucuda çizilen SVG grafik |
| ![](medya/anket.png) | [**Anket**](web/anket) | Canlı anket: adres başına tek oy, POST → 303 → GET, sonuç grafiği KabaLang'da üretilir |
Web uygulamaları yalnız `127.0.0.1`'i dinler. Kullanıcıdan gelen her değer
Web uygulamaları yalnız `127.0.0.1`'i dinler; port `PORT` ortam değişkeniyle değiştirilebilir. Kullanıcıdan gelen her değer
SQL'e **parametre olarak** bağlanır, HTML'e girerken `web.kacir` ile kaçırılır.
## Çekirdek
## Sistem programlama (çekirdek)
| | Proje | Ne gösteriyor |
|---|---|---|
+107
View File
@@ -0,0 +1,107 @@
---
baslik: KabaLang'a giriş
bolum: Giriş
ozet: İlk programın, yazdir ve örnekleri IDE'de çalıştırmak
---
KabaLang, anahtar sözcükleri Türkçe olan bir programlama dilidir. `eger`, `dongu`, `fonksiyon` gibi sözcüklerle yazarsın; derleyici programını hızlı çalışan bir makine koduna çevirir.
Bu derslerde her konuyu küçük örneklerle öğreneceksin. Her örneğin altında programın gerçek çıktısı var. **Dene** düğmesine basınca örnek düzenleyicide açılır; değiştirip yeniden çalıştırabilirsin.
## İlk programın
Ekrana bir şey yazdırmak için `yazdir(...)` kullanılır. Parantez içindeki metin ekrana basılır ve satır biter.
```kbl
yazdir("Merhaba, dünya!")
```
```cikti
Merhaba, dünya!
```
Metinler çift tırnak arasına yazılır. Türkçe harfler olduğu gibi çalışır.
## Birden çok satır
Program yukarıdan aşağıya, satır satır çalışır. Her `yazdir` yeni bir satıra yazar.
```kbl
yazdir("Günaydın İstanbul!")
yazdir("Bugün hava güneşli.")
yazdir("Çay demlendi.")
```
```cikti
Günaydın İstanbul!
Bugün hava güneşli.
Çay demlendi.
```
## Sayı yazdırmak ve hesap yapmak
`yazdir` yalnız metin değil, sayı da yazar. Parantez içine bir hesap koyarsan önce hesaplanır, sonra sonucu yazılır.
```kbl
yazdir(42)
yazdir(7 * 6)
yazdir(100 - 58)
```
```cikti
42
42
42
```
## Virgülle birden çok değer
`yazdir`'a virgülle ayırarak birden çok değer verebilirsin. Aralarına birer boşluk konur.
```kbl
yazdir("Bir yılda", 12, "ay var.")
yazdir("Bir günde", 24 * 60, "dakika var.")
```
```cikti
Bir yılda 12 ay var.
Bir günde 1440 dakika var.
```
Boş bir `yazdir()` araya boş bir satır koyar.
```kbl
yazdir("Birinci bölüm")
yazdir()
yazdir("İkinci bölüm")
```
```cikti
Birinci bölüm
İkinci bölüm
```
> **Dikkat:** `yazdir` küçük harfle yazılır. `Yazdir("x")` yazarsan derleyici "'Yazdir' adında bir değişken veya fonksiyon tanımlanmamış" der. KabaLang büyük ve küçük harfi ayırır.
> **İpucu:** Örnekleri yalnız okuma; **Dene**'ye basıp metni değiştir, kendi adını yazdır. En hızlı böyle öğrenirsin.
## Alıştırma
```alistirma
Ekrana iki satır yazdır: önce `Merhaba KabaLang`, sonra `Programlamaya başladım.`
%%%
yazdir("Merhaba KabaLang")
# buraya yaz
%%%
yazdir("Merhaba KabaLang")
yazdir("Programlamaya başladım.")
%%%
Merhaba KabaLang
Programlamaya başladım.
```
```alistirma
Bir haftada kaç saat olduğunu hesaplatıp `Bir haftada 168 saat var.` biçiminde yazdır. Sayıyı kendin yazma, `7 * 24` hesabını kullan.
%%%
# buraya yaz
%%%
yazdir("Bir haftada", 7 * 24, "saat var.")
%%%
Bir haftada 168 saat var.
```
+118
View File
@@ -0,0 +1,118 @@
---
baslik: Sözdizimi ve girinti
bolum: Giriş
ozet: Satırlar, iki nokta, girintili bloklar ve büyük/küçük harf
---
Her dilin bir yazım kuralı vardır. KabaLang'de kurallar az ve sade: her komut kendi satırında durur, bloklar süslü parantezle değil **girintiyle** belirtilir.
## Her satır bir komut
Satır sonuna noktalı virgül koymazsın. Satır bitince komut da biter.
```kbl
yazdir("Ankara")
yazdir("İzmir")
```
```cikti
Ankara
İzmir
```
## Bloklar: iki nokta ve girinti
Bazı satırlar bir **blok** açar: `eger`, `dongu`, `fonksiyon` gibi. Bu satırlar `:` ile biter. Altındaki satırlar 4 boşluk içeriden başlar; o satırlar bloğa aittir.
```kbl
sicaklik = 32
eger sicaklik > 30:
yazdir("Hava çok sıcak.")
yazdir("Bol su iç.")
yazdir("Bu satır her zaman çalışır.")
```
```cikti
Hava çok sıcak.
Bol su iç.
Bu satır her zaman çalışır.
```
Girintisi biten satır, bloğun dışına çıkmış olur. Yukarıdaki son satır `eger`'e bağlı değildir.
Sıcaklığı 20 yapıp **Dene** ile çalıştır: ilk iki satır kaybolur, son satır yine görünür.
## İç içe bloklar
Bir bloğun içinde başka bir blok açabilirsin. Her düzey 4 boşluk daha içeride başlar.
```kbl
sicaklik = 32
yagmur = yanlis
eger sicaklik > 25:
yazdir("Hava sıcak.")
eger degil yagmur:
yazdir("Pikniğe gidebilirsin.")
```
```cikti
Hava sıcak.
Pikniğe gidebilirsin.
```
> **Dikkat:** `:`'dan sonraki satırı girintisiz yazmak hatadır. Aşağıdaki kod derlenmez; derleyici "blok gövdesi boş — ':' sonrasındaki satırlar girintili olmalı" der.
```kbl goster
eger dogru:
yazdir("girinti unutuldu")
```
Sebepsiz girinti de hatadır: blok açmayan bir satırın altını içeriden başlatamazsın. Bir de `:`'yı unutursan derleyici "':' bekleniyordu" der.
## Büyük ve küçük harf
KabaLang büyük/küçük harfi ayırır. `sehir`, `Sehir` ve `SEHIR` üç ayrı addır. Anahtar sözcükler (`eger`, `dongu`, `dogru`) ve hazır fonksiyonlar (`yazdir`) hep küçük harfle yazılır.
```kbl
sehir = "Bursa"
Sehir = "Konya"
yazdir(sehir)
yazdir(Sehir)
```
```cikti
Bursa
Konya
```
> **İpucu:** Kodda Türkçe karakterli ad kullanmak yerine ASCII harfler yeğle: `sehir`, `ogrenci`, `dogru`. Anahtar sözcükler de böyle yazılır (`degilse`, `iken`). Metinlerin içinde ise ç, ğ, ı, ö, ş, ü'yü serbestçe kullan.
## Uzun satırı bölmek
Parantez açıkken satırı bölebilirsin; parantez kapanana kadar tek satır sayılır.
```kbl
toplam = (120 +
75 +
300)
yazdir(toplam)
```
```cikti
495
```
## Alıştırma
```alistirma
`puan` 50'den büyükse önce `Geçtin.` sonra `Tebrikler!` yazdır. Bu iki satır bloğun içinde olsun. En sonda, bloğun dışında `Sınav bitti.` yazdır.
%%%
puan = 72
eger puan > 50:
# buraya yaz
%%%
puan = 72
eger puan > 50:
yazdir("Geçtin.")
yazdir("Tebrikler!")
yazdir("Sınav bitti.")
%%%
Geçtin.
Tebrikler!
Sınav bitti.
```
+94
View File
@@ -0,0 +1,94 @@
---
baslik: Yorumlar
bolum: Giriş
ozet: Kodun içine kendine ve başkalarına not bırakmak
---
Yorum, derleyicinin okumadığı, yalnız insanlar için yazılmış nottur. Bir hafta sonra kendi koduna baktığında "bunu neden yazmıştım?" diye sormamak için yorum yazarsın.
## Tek satırlık yorum
`#` işaretinden sonra satırın sonuna kadar her şey yorumdur.
```kbl
# Bu program bir selam yazar.
yazdir("Merhaba!")
```
```cikti
Merhaba!
```
## Satır sonunda yorum
Kodun yanına da yorum yazabilirsin. `#`'den öncesi çalışır, sonrası yok sayılır.
```kbl
fiyat = 250 # TL cinsinden
adet = 3 # sepetteki ürün sayısı
yazdir(fiyat * adet)
```
```cikti
750
```
## Kodu geçici olarak kapatmak
Bir satırın başına `#` koyarsan o satır çalışmaz. Silmeden denemek için çok işe yarar.
```kbl
yazdir("Birinci satır")
# yazdir("Bu satır şimdilik kapalı")
yazdir("Üçüncü satır")
```
```cikti
Birinci satır
Üçüncü satır
```
## Metnin içindeki # yorum değildir
Tırnak içindeki `#` sıradan bir karakterdir.
```kbl
yazdir("Sıra numaran: #12") # bu kısım ise yorum
```
```cikti
Sıra numaran: #12
```
> **İpucu:** İyi yorum kodun *ne* yaptığını değil *neden* yaptığını anlatır. `x = x + 1 # x'i bir artır` gereksizdir; `misafir += 1 # kapıdaki kişiyi de sayıyoruz` işe yarar.
## Birden çok satırlık açıklama
Uzun bir açıklama için her satırın başına `#` koyarsın.
```kbl
# Kargo ücreti hesabı:
# 500 TL ve üstü siparişte kargo ücretsiz,
# altında 60 TL.
sepet = 420
kargo = 60
eger sepet >= 500:
kargo = 0
yazdir("Kargo:", kargo, "TL")
```
```cikti
Kargo: 60 TL
```
## Alıştırma
```alistirma
Aşağıdaki programda ikinci satır hatalı bir duyuru yazıyor. O satırı **silmeden**, başına `#` koyarak kapat. Çıktıda yalnız iki doğru satır kalsın.
%%%
yazdir("Kütüphane 09:00'da açılır.")
yazdir("Kütüphane pazar günü de açıktır.")
yazdir("Kütüphane 18:00'de kapanır.")
%%%
yazdir("Kütüphane 09:00'da açılır.")
# yazdir("Kütüphane pazar günü de açıktır.")
yazdir("Kütüphane 18:00'de kapanır.")
%%%
Kütüphane 09:00'da açılır.
Kütüphane 18:00'de kapanır.
```
+156
View File
@@ -0,0 +1,156 @@
---
baslik: Değişkenler
bolum: Temeller
ozet: Değerlere ad vermek, yeniden atamak ve değişmezler
---
Program çalışırken bilgileri bir yerde tutman gerekir: bir öğrencinin adı, sepetteki ürün sayısı, bugünkü sıcaklık. Değişken, bir değere verdiğin addır.
## Değişken oluşturmak
`ad = değer` yazınca değer o ada bağlanır. Sonra o adı her kullandığında değeri gelir.
```kbl
ogrenci = "Elif"
yas = 15
yazdir(ogrenci)
yazdir(yas)
```
```cikti
Elif
15
```
Türü yazmana gerek yoktur; KabaLang değere bakıp anlar. `"Elif"` bir metin, `15` bir tam sayıdır.
## Değeri değiştirmek
Bir değişkene yeni değer atayınca eskisi unutulur.
```kbl
sicaklik = 18
yazdir(sicaklik)
sicaklik = 24
yazdir(sicaklik)
```
```cikti
18
24
```
Değişkenin yeni değerini eskisinden de hesaplayabilirsin.
```kbl
bakiye = 500
bakiye = bakiye - 120
bakiye = bakiye + 75
yazdir(bakiye)
```
```cikti
455
```
## Kısaltmalar: += ve -=
`bakiye = bakiye + 75` yerine `bakiye += 75` yazabilirsin. `-=` ve `*=` de aynı mantıkla çalışır.
```kbl
puan = 10
puan += 5 # puan = puan + 5
puan *= 2 # puan = puan * 2
puan -= 4 # puan = puan - 4
yazdir(puan)
```
```cikti
26
```
## Değişken adları
- Harfle ya da `_` ile başlar; içinde harf, rakam ve `_` olabilir.
- Boşluk içeremez: `dogum yili` olmaz, `dogum_yili` olur.
- Anahtar sözcükler ad olamaz: `eger`, `dongu`, `sinif` gibi.
- Anlamlı ad seç: `x` yerine `fiyat`, `n` yerine `ogrenci_sayisi`.
```kbl
dogum_yili = 2010
bu_yil = 2026
yazdir(bu_yil - dogum_yili)
```
```cikti
16
```
## Bir değişkenin türü sabittir
Bir değişkene ilk verdiğin değerin türü onun türü olur. Sonra başka türde bir değer atayamazsın.
```kbl goster
adet = 5
adet = "beş" # derleme hatası: metin, sayı türündeki değişkene atanamaz
```
> **Dikkat:** Program derlenmeden önce bu hata yakalanır. Farklı türde bir değer saklamak istiyorsan yeni bir ad kullan: `adet_yazi = "beş"`.
## Aynı anda birden çok değişken
Virgülle ayırarak birkaç değişkeni tek satırda oluşturabilirsin.
```kbl
ad, sehir = "Mert", "Trabzon"
yazdir(ad, sehir)
```
```cikti
Mert Trabzon
```
## Değişmezler
Programda hiç değişmemesi gereken değerler için `degismez` kullan. Böyle bir değere yeniden atama yaparsan program derlenmez.
```kbl
degismez KDV_ORANI = 20
fiyat = 150
yazdir(fiyat + fiyat * KDV_ORANI / 100)
```
```cikti
180.0
```
```kbl goster
degismez KDV_ORANI = 20
KDV_ORANI = 18 # hata: 'KDV_ORANI' değişmez — değeri değiştirilemez
```
> **İpucu:** Değişmezleri BÜYÜK_HARFLE yazmak yaygın bir alışkanlıktır; kodu okuyan biri onun değişmeyeceğini hemen anlar.
## Alıştırma
```alistirma
`cuzdan` 200 TL ile başlıyor. Önce 45 TL'lik bir kitap al (`-=`), sonra 30 TL harçlık ekle (`+=`). Son durumu yazdır.
%%%
cuzdan = 200
# buraya yaz
yazdir(cuzdan)
%%%
cuzdan = 200
cuzdan -= 45
cuzdan += 30
yazdir(cuzdan)
%%%
185
```
```alistirma
`kenar` değişkeni bir karenin kenar uzunluğunu tutuyor. `alan` ve `cevre` adında iki değişken oluşturup karenin alanını ve çevresini hesapla, ikisini aynı satırda yazdır.
%%%
kenar = 7
# buraya yaz
%%%
kenar = 7
alan = kenar * kenar
cevre = 4 * kenar
yazdir(alan, cevre)
%%%
49 28
```
+111
View File
@@ -0,0 +1,111 @@
---
baslik: Veri türleri
bolum: Temeller
ozet: sayi, ondalik, metin, mantik ve tür belirtmek
---
Her değerin bir türü vardır. Tür, o değerle neler yapabileceğini belirler: sayılar toplanır, metinler birleştirilir, mantık değerleriyle karar verilir.
## Dört temel tür
| Tür | Ne tutar | Örnek |
|---|---|---|
| `sayi` | tam sayı | `42`, `-7`, `85_000_000` |
| `ondalik` | küsuratlı sayı | `3.14`, `-0.5`, `1.0` |
| `metin` | yazı | `"Kars"`, `""` |
| `mantik` | doğru ya da yanlış | `dogru`, `yanlis` |
```kbl
il = "Kars" # metin
rakim = 1768 # sayi
sicaklik = -4.5 # ondalik
kar_yagiyor = dogru # mantik
yazdir(il, rakim, sicaklik, kar_yagiyor)
```
```cikti
Kars 1768 -4.5 doğru
```
Mantık değerleri kodda `dogru`/`yanlis` diye yazılır ama ekranda Türkçe harflerle `doğru`/`yanlış` görünür.
## sayi ve ondalik farklı türlerdir
Ondalık sayılarda virgül değil **nokta** kullanılır. `3` bir `sayi`, `3.0` ise bir `ondalik`tır.
```kbl
a = 3
b = 3.0
yazdir(a)
yazdir(b)
```
```cikti
3
3.0
```
Uzun sayılarda basamakları `_` ile ayırabilirsin; değer değişmez, okumak kolaylaşır.
```kbl
nufus = 85_000_000
yazdir(nufus)
```
```cikti
85000000
```
## Metinler
Metin, tırnak içindeki yazıdır. Çift ya da tek tırnak kullanabilirsin. Hiç karakter içermeyen `""` boş metindir.
```kbl
selam = "Merhaba"
isim = 'Zeynep'
yazdir(selam + " " + isim)
```
```cikti
Merhaba Zeynep
```
> **Dikkat:** `"42"` bir sayı değil, iki karakterlik bir metindir. `"42" + 1` derlenmez. Metinle sayı arasında geçişi *Tür dönüşümleri* dersinde göreceksin.
## Türü açıkça yazmak
Türü yazmak zorunlu değil ama istersen `ad: tur = değer` biçiminde yazabilirsin. Derleyici o zaman değerin o türde olduğunu denetler.
```kbl
fiyat: ondalik = 49.90
stok: sayi = 12
urun: metin = "Defter"
yazdir(urun, stok, fiyat)
```
```cikti
Defter 12 49.9
```
`49.90` ekranda `49.9` olarak görünür; sondaki sıfır sayının değerini değiştirmez. Biçimini kendin belirlemeyi *Biçimlendirme* dersinde öğreneceksin.
## Türler karşılaştırılabilir mi?
Farklı türden iki değeri karşılaştırmak anlamsızdır ve derleyici buna izin vermez:
```kbl goster
yazdir("5" == 5) # hata: 'metin' ile 'sayi' karşılaştırılamaz
```
Bu bir kolaylıktır: yanlışlıkla metni sayıyla karşılaştırdığın bir hatayı program çalışmadan yakalarsın.
## Alıştırma
```alistirma
Bir kitap için dört değişken oluştur: `ad` (metin, "Çalıkuşu"), `sayfa` (sayi, 544), `puan` (ondalik, 4.8), `okundu` (mantik, dogru). Dördünü tek bir `yazdir` ile sırayla yazdır.
%%%
# buraya yaz
%%%
ad = "Çalıkuşu"
sayfa = 544
puan = 4.8
okundu = dogru
yazdir(ad, sayfa, puan, okundu)
%%%
Çalıkuşu 544 4.8 doğru
```
+145
View File
@@ -0,0 +1,145 @@
---
baslik: Sayılar ve aritmetik
bolum: Temeller
ozet: Dört işlem, tam bölme, kalan, üs ve işlem önceliği
---
Bilgisayarın en iyi yaptığı iş hesaptır. Bu derste KabaLang'in aritmetik işleçlerini ve sık yapılan hesapları göreceksin.
## Aritmetik işleçler
| İşleç | Anlamı | Örnek | Sonuç |
|---|---|---|---|
| `+` | toplama | `17 + 5` | `22` |
| `-` | çıkarma | `17 - 5` | `12` |
| `*` | çarpma | `17 * 5` | `85` |
| `/` | bölme | `17 / 5` | `3.4` |
| `//` | tam bölme | `17 // 5` | `3` |
| `%` | kalan | `17 % 5` | `2` |
| `**` | üs alma | `2 ** 10` | `1024` |
```kbl
a = 17
b = 5
yazdir(a + b, a - b, a * b)
yazdir(a / b, a // b, a % b)
yazdir(2 ** 10)
```
```cikti
22 12 85
3.4 3 2
1024
```
## / her zaman ondalık verir
`/` bölmesinin sonucu, sayılar tam bölünse bile `ondalik`tır. Küsuratsız tam sayı istiyorsan `//` kullan.
```kbl
yazdir(10 / 2)
yazdir(10 // 2)
yazdir(7 // 2)
```
```cikti
5.0
5
3
```
## Kalan işleci: %
`%` bölümden kalanı verir. Bir sayının çift mi tek mi olduğunu, bir sayıya bölünüp bölünmediğini anlamak için kullanılır.
```kbl
yazdir(14 % 2) # 0 ise çift
yazdir(15 % 2) # 1 ise tek
yazdir(2026 % 4) # 4'e tam bölünmüyor
```
```cikti
0
1
2
```
## Gerçek bir hesap: saniyeyi saate çevirmek
`//` ve `%` birlikte çok işe yarar.
```kbl
toplam_saniye = 7384
saat = toplam_saniye // 3600
dakika = (toplam_saniye % 3600) // 60
saniye = toplam_saniye % 60
yazdir(saat, "saat", dakika, "dakika", saniye, "saniye")
```
```cikti
2 saat 3 dakika 4 saniye
```
## İşlem önceliği
Matematikteki gibi: önce `**`, sonra `*` `/` `//` `%`, en son `+` `-`. Parantez önceliği değiştirir.
```kbl
yazdir(2 + 3 * 4)
yazdir((2 + 3) * 4)
yazdir(2 * 3 ** 2)
```
```cikti
14
20
18
```
> **İpucu:** Emin olmadığın her yerde parantez kullan. `(a + b) / 2` hem doğru çalışır hem kolay okunur.
## sayi ile ondalik birlikte
Bir işlemde biri `sayi` öteki `ondalik` ise sonuç `ondalik` olur.
```kbl
adet = 3
fiyat = 12.5
yazdir(adet * fiyat)
```
```cikti
37.5
```
> **Dikkat:** Ondalık sayılar bilgisayarda yaklaşık tutulur. `0.1 + 0.2` tam `0.3` değil `0.30000000000000004` çıkar. Bu her dilde böyledir; para gibi değerleri ekrana yazarken basamak sayısını sınırlarsın (*Biçimlendirme* dersi).
```kbl
yazdir(0.1 + 0.2)
```
```cikti
0.30000000000000004
```
## Alıştırma
```alistirma
Bir sınıfta 29 öğrenci var ve 4 kişilik gruplar kurulacak. Kaç tam grup olacağını ve kaç öğrencinin açıkta kalacağını aynı satırda yazdır.
%%%
ogrenci = 29
grup_buyuklugu = 4
# buraya yaz
%%%
ogrenci = 29
grup_buyuklugu = 4
yazdir(ogrenci // grup_buyuklugu, ogrenci % grup_buyuklugu)
%%%
7 1
```
```alistirma
Fahrenhayt'ı Celsius'a çevir: `C = (F - 32) * 5 / 9`. `f` değişkeni 212 iken sonucu yazdır.
%%%
f = 212
# buraya yaz
%%%
f = 212
c = (f - 32) * 5 / 9
yazdir(c)
%%%
100.0
```
+130
View File
@@ -0,0 +1,130 @@
---
baslik: Tür dönüşümleri
bolum: Temeller
ozet: sayi(), ondalik() ve metin() ile türler arasında geçiş
---
Türler kendiliğinden birbirine dönüşmez. Kullanıcıdan ya da bir dosyadan gelen `"42"` bir metindir; onunla hesap yapmak için önce sayıya çevirmen gerekir. Dönüşümü her zaman açıkça yazarsın.
## Üç dönüşüm fonksiyonu
| Fonksiyon | Ne yapar | Örnek | Sonuç |
|---|---|---|---|
| `sayi(x)` | tam sayıya çevirir | `sayi("42")` | `42` |
| `ondalik(x)` | ondalık sayıya çevirir | `ondalik("2.75")` | `2.75` |
| `metin(x)` | metne çevirir | `metin(24)` | `"24"` |
## Metinden sayıya
```kbl
yas_yazi = "17"
yas = sayi(yas_yazi)
yazdir(yas + 1)
fiyat = ondalik("19.90")
yazdir(fiyat * 2)
```
```cikti
18
39.8
```
Baştaki ve sondaki boşluklar sorun olmaz: `sayi(" 42 ")` da `42` verir.
## Sayıdan metne
Bir metni sayıyla `+` ile birleştiremezsin. Önce sayıyı `metin()` ile çevir.
```kbl
ogrenci = 24
yazdir("Sınıfta " + metin(ogrenci) + " öğrenci var.")
```
```cikti
Sınıfta 24 öğrenci var.
```
> **İpucu:** Metinle sayıyı yan yana yazmanın daha kolay bir yolu var: `f"Sınıfta {ogrenci} öğrenci var."`. Bunu *Biçimlendirme* dersinde göreceksin.
## ondalik ile sayi arasında
`sayi()` bir ondalığın küsuratını **atar**, yuvarlamaz. `ondalik()` tam sayıyı ondalığa çevirir.
```kbl
yazdir(sayi(3.99))
yazdir(sayi(-3.99))
yazdir(ondalik(7))
yazdir(ondalik(7) / 2)
```
```cikti
3
-3
7.0
3.5
```
Yuvarlamak istiyorsan `matematik.yuvarla()` kullanırsın; onu *Modüller* dersinde göreceksin.
## Mantık değerini metne çevirmek
```kbl
gecti = dogru
yazdir("Sonuç: " + metin(gecti))
```
```cikti
Sonuç: doğru
```
> **Dikkat:** `sayi()` yalnız tam sayı yazılmış bir metni doğru çevirir. `sayi("3.9")` ya da `sayi("on iki")` hata vermez ama **0** döndürür; bu da fark edilmesi zor bir yanlışa yol açar. Ondalık bir metni önce `ondalik()` ile çevir. Kullanıcıdan gelen sayıyı güvenle okumanın yolunu *Kullanıcıdan girdi* dersinde öğreneceksin.
```kbl
yazdir(sayi(ondalik("3.9")))
```
```cikti
3
```
## Gerçek bir örnek: virgülle ayrılmış veriler
Bir satırdaki verileri metin olarak alıp sayıya çevirerek hesap yapalım. `bol(";")` metni parçalara ayırır (ayrıntısı *Metin işlemleri* dersinde).
```kbl
satir = "Defter;3;24.50"
parca = satir.bol(";")
urun = parca[0]
adet = sayi(parca[1])
fiyat = ondalik(parca[2])
yazdir(urun + ": " + metin(adet * fiyat) + " TL")
```
```cikti
Defter: 73.5 TL
```
## Alıştırma
```alistirma
`a` ve `b` metin olarak verilmiş. İkisini sayıya çevirip toplamını yazdır.
%%%
a = "125"
b = "75"
# buraya yaz
%%%
a = "125"
b = "75"
yazdir(sayi(a) + sayi(b))
%%%
200
```
```alistirma
`metin()` kullanarak `Toplam: 3 ürün, 45.5 TL` satırını yazdır. Sayıları değişkenlerden al, `+` ile birleştir.
%%%
adet = 3
tutar = 45.5
# buraya yaz
%%%
adet = 3
tutar = 45.5
yazdir("Toplam: " + metin(adet) + " ürün, " + metin(tutar) + " TL")
%%%
Toplam: 3 ürün, 45.5 TL
```
+163
View File
@@ -0,0 +1,163 @@
---
baslik: Metinler
bolum: Temeller
ozet: Metin yazmak, birleştirmek, kaçış karakterleri ve harflere erişim
---
Ad, adres, mesaj, ürün açıklaması... Programların işlediği verilerin çoğu metindir. KabaLang metinleri Türkçe harflerle sorunsuz çalışır.
## Metin oluşturmak
Metin çift (`"..."`) ya da tek (`'...'`) tırnak arasına yazılır.
```kbl
sehir = "Çanakkale"
ulke = 'Türkiye'
yazdir(sehir)
yazdir(ulke)
```
```cikti
Çanakkale
Türkiye
```
## Birleştirmek
İki metni `+` ile uç uca eklersin. `+=` bir metnin sonuna ekleme yapar.
```kbl
ad = "Reşat Nuri"
soyad = "Güntekin"
tam_ad = ad + " " + soyad
yazdir(tam_ad)
mesaj = "Merhaba"
mesaj += ", hoş geldin!"
yazdir(mesaj)
```
```cikti
Reşat Nuri Güntekin
Merhaba, hoş geldin!
```
## Kaçış karakterleri
Bazı karakterler ters eğik çizgiyle yazılır:
| Yazım | Anlamı |
|---|---|
| `\n` | yeni satır |
| `\t` | sekme |
| `\"` | çift tırnak |
| `\\` | ters eğik çizgi |
```kbl
yazdir("Birinci satır\nİkinci satır")
yazdir("Öğretmen \"tahtaya bakın\" dedi.")
yazdir("Dosya: C:\\belgeler")
```
```cikti
Birinci satır
İkinci satır
Öğretmen "tahtaya bakın" dedi.
Dosya: C:\belgeler
```
## Çok satırlı metin
Üç tırnak (`"""`) arasına yazdığın metin, satır sonlarıyla birlikte olduğu gibi saklanır.
```kbl
siir = """Gün doğdu,
kuşlar uyandı."""
yazdir(siir)
```
```cikti
Gün doğdu,
kuşlar uyandı.
```
## Uzunluk
`uzunluk()` metindeki karakter sayısını verir. ş, ğ, İ gibi harfler de tek karakter sayılır.
```kbl
il = "Şanlıurfa"
yazdir(il.uzunluk())
```
```cikti
9
```
## Harflere erişmek: indeks
Metindeki her karakterin bir sıra numarası (indeks) vardır. Sayma **0'dan** başlar. Negatif indeks sondan sayar: `-1` son karakterdir.
```kbl
il = "Kayseri"
yazdir(il[0])
yazdir(il[1])
yazdir(il[-1])
```
```cikti
K
a
i
```
`[a..b]` ile a'dan b'ye kadar (b dahil) bir parça alırsın.
```kbl
il = "Kayseri"
yazdir(il[0..2])
yazdir(il[3..6])
```
```cikti
Kay
seri
```
> **Dikkat:** Metindeki bir harfi yerinde değiştiremezsin: `il[0] = "M"` derlenmez. Değişmiş bir metin istiyorsan yenisini oluşturursun, örneğin `"M" + il[1..6]`.
## Harf harf gezmek
`dongu harf icinde metin:` her turda bir karakter verir (döngüleri ileride ayrıntılı göreceksin).
```kbl
dongu harf icinde "Ağrı":
yazdir(harf)
```
```cikti
A
ğ
r
ı
```
## Alıştırma
```alistirma
`ad` ve `sehir` değişkenlerini `+` ile birleştirerek `Ayşe, Eskişehir'de yaşıyor.` satırını yazdır.
%%%
ad = "Ayşe"
sehir = "Eskişehir"
# buraya yaz
%%%
ad = "Ayşe"
sehir = "Eskişehir"
yazdir(ad + ", " + sehir + "'de yaşıyor.")
%%%
Ayşe, Eskişehir'de yaşıyor.
```
```alistirma
`kelime` değişkeninin ilk harfini, son harfini ve uzunluğunu aynı satırda yazdır.
%%%
kelime = "Çiçekçi"
# buraya yaz
%%%
kelime = "Çiçekçi"
yazdir(kelime[0], kelime[-1], kelime.uzunluk())
%%%
Ç i 7
```
+176
View File
@@ -0,0 +1,176 @@
---
baslik: Metin işlemleri
bolum: Temeller
ozet: buyut, kucult, kirp, bol, birlestir, degistir, bul ve diğer metin yöntemleri
---
Metinlerin kendi yöntemleri (metotları) vardır: `metin.yontem()` biçiminde çağrılır. Kullanıcının yazdığını temizlemek, bir cümleyi kelimelere ayırmak, bir sözcüğü değiştirmek bu yöntemlerle yapılır.
## Türkçe büyük ve küçük harf
`buyut()` bütün harfleri büyütür, `kucult()` küçültür. Türkçe kurallara uyar: `i` büyüyünce `İ`, `I` küçülünce `ı` olur.
```kbl
yazdir("istanbul".buyut())
yazdir("ILIK IRMAK".kucult())
yazdir("şişli öğüt".buyut())
```
```cikti
İSTANBUL
ılık ırmak
ŞİŞLİ ÖĞÜT
```
Büyük/küçük harfe aldırmadan karşılaştırmak için iki tarafı da küçültürsün.
```kbl
girilen = "İZMİR"
yazdir(girilen.kucult() == "izmir")
```
```cikti
doğru
```
## Boşlukları temizlemek: kirp
`kirp()` baştaki ve sondaki boşlukları atar. Kullanıcı girdisinde çok işe yarar.
```kbl
ham = " Merhaba Dünya "
yazdir("[" + ham + "]")
yazdir("[" + ham.kirp() + "]")
```
```cikti
[ Merhaba Dünya ]
[Merhaba Dünya]
```
## Aramak
| Yöntem | Sorusu | Sonuç |
|---|---|---|
| `icerir(x)` | x geçiyor mu? | `dogru`/`yanlis` |
| `ile_baslar(x)` | x ile mi başlıyor? | `dogru`/`yanlis` |
| `ile_biter(x)` | x ile mi bitiyor? | `dogru`/`yanlis` |
| `bul(x)` | x nerede başlıyor? | indeks, yoksa `-1` |
```kbl
cumle = "Ankara Türkiye'nin başkentidir"
yazdir(cumle.icerir("başkent"))
yazdir(cumle.ile_baslar("Ankara"))
yazdir(cumle.ile_biter("dir"))
yazdir(cumle.bul("Türkiye"))
yazdir(cumle.bul("İzmir"))
```
```cikti
doğru
doğru
doğru
7
-1
```
## Değiştirmek: degistir
`degistir(eski, yeni)` metindeki her `eski`yi `yeni` ile değiştirir. Asıl metin değişmez, yeni bir metin döner.
```kbl
duyuru = "Toplantı salı günü, salı saat 10'da."
yeni = duyuru.degistir("salı", "çarşamba")
yazdir(yeni)
```
```cikti
Toplantı çarşamba günü, çarşamba saat 10'da.
```
## Parça almak
`bastan(n)` ilk n karakteri, `sondan(n)` son n karakteri, `dilim(baslangic, adet)` belli bir yerden başlayan parçayı verir.
```kbl
kelime = "Karadeniz"
yazdir(kelime.bastan(4))
yazdir(kelime.sondan(5))
yazdir(kelime.dilim(2, 3))
```
```cikti
Kara
deniz
rad
```
## Bölmek ve birleştirmek
`bol(ayrac)` metni parçalara ayırıp bir liste verir. `birlestir(ayrac)` ise bir metin listesini tek metne çevirir.
```kbl
satir = "Ayşe;Kaya;Eskişehir"
alanlar = satir.bol(";")
yazdir(alanlar)
yazdir(alanlar[2])
yazdir(alanlar.birlestir(" | "))
```
```cikti
[Ayşe, Kaya, Eskişehir]
Eskişehir
Ayşe | Kaya | Eskişehir
```
## Diğer yararlı yöntemler
```kbl
yazdir("=".tekrarla(20))
yazdir("".bos_mu())
yazdir("abc".bos_mu())
```
```cikti
====================
doğru
yanlış
```
> **Dikkat:** Yöntem adlarına dikkat: büyütme `buyut()`, küçültme `kucult()`, uzunluk `uzunluk()`'tür. `buyuk()`, `kucuk()` diye yöntem yoktur; derleyici "böyle bir metot bulunamadı" der.
## Yöntemleri zincirlemek
Her yöntem yeni bir metin döndürdüğü için arka arkaya yazabilirsin.
```kbl
girdi = " ankara "
yazdir(girdi.kirp().buyut())
```
```cikti
ANKARA
```
## Alıştırma
```alistirma
`eposta` değişkenindeki boşlukları temizle, harflerini küçült ve sonucu yazdır. Ardından temizlenmiş adresin `@` içerip içermediğini yazdır.
%%%
eposta = " [email protected] "
# buraya yaz
%%%
eposta = " [email protected] "
temiz = eposta.kirp().kucult()
yazdir(temiz)
yazdir(temiz.icerir("@"))
%%%
[email protected]
doğru
```
```alistirma
`liste` metnindeki ürünler virgülle ayrılmış. Metni böl, ürün sayısını yazdır, sonra ürünleri ` - ` ile birleştirip yazdır.
%%%
liste = "ekmek,süt,peynir,zeytin"
# buraya yaz
%%%
liste = "ekmek,süt,peynir,zeytin"
urunler = liste.bol(",")
yazdir(urunler.uzunluk())
yazdir(urunler.birlestir(" - "))
%%%
4
ekmek - süt - peynir - zeytin
```
+151
View File
@@ -0,0 +1,151 @@
---
baslik: Biçimlendirme
bolum: Temeller
ozet: f-string ile değerleri metne yerleştirmek, basamak ve hizalama
---
Metinle sayıları `+` ve `metin()` ile birleştirmek çabuk karışır. Biçimli metin (f-string) bunu çok kolaylaştırır: değişkenleri doğrudan metnin içine yazarsın.
## f-string
Metnin önüne `f` koy, değerleri süslü parantez `{}` içine yaz.
```kbl
ad = "Deniz"
yas = 14
yazdir(f"{ad} {yas} yaşında.")
```
```cikti
Deniz 14 yaşında.
```
Süslü parantezin içine hesap da yazabilirsin.
```kbl
adet = 3
fiyat = 12
yazdir(f"{adet} kalem toplam {adet * fiyat} TL.")
```
```cikti
3 kalem toplam 36 TL.
```
## Ondalık basamak sayısı
`{deger:.2f}` virgülden sonra 2 basamak yazar ve yuvarlar.
```kbl
pi = 3.14159
fiyat = 49.9
yazdir(f"{pi:.2f}")
yazdir(f"{fiyat:.2f} TL")
yazdir(f"{0.1 + 0.2:.2f}")
```
```cikti
3.14
49.90 TL
0.30
```
## Sıfırla doldurmak
`{deger:02}` sayıyı en az 2 basamağa tamamlar; eksik basamaklar sıfır olur. Saat ve tarih yazarken işe yarar.
```kbl
saat = 9
dakika = 5
yazdir(f"{saat:02}:{dakika:02}")
```
```cikti
09:05
```
## Binlik ayırıcı ve yüzde
```kbl
nufus = 85_372_377
oran = 0.256
yazdir(f"{nufus:,}")
yazdir(f"{oran:.1%}")
```
```cikti
85,372,377
25.6%
```
## Hizalama
`{deger:<10}` değeri 10 karakterlik alana sola, `{deger:>10}` sağa, `{deger:^10}` ortaya yaslar. Tablo yazmak için birebirdir.
```kbl
yazdir(f"[{'Rize':<8}]")
yazdir(f"[{'Rize':>8}]")
yazdir(f"[{'Rize':^8}]")
```
```cikti
[Rize ]
[ Rize]
[ Rize ]
```
Hizalama ile basamak sayısını birlikte de verebilirsin: `{fiyat:>8.2f}`.
```kbl
yazdir(f"{'Ürün':<10}{'Fiyat':>8}")
yazdir(f"{'Ekmek':<10}{12.5:>8.2f}")
yazdir(f"{'Peynir':<10}{149.0:>8.2f}")
```
```cikti
Ürün Fiyat
Ekmek 12.50
Peynir 149.00
```
> **Dikkat:** f-string içinde metin yazarken iç tırnağı dıştakinden farklı seç: `f"{'Ürün':<10}"` doğrudur. Süslü parantezin kendisini yazmak için ikiler: `f"{{ }}"` ekrana `{ }` basar.
## Özet tablo
| Yazım | Anlamı | Örnek | Sonuç |
|---|---|---|---|
| `{x:.2f}` | 2 ondalık basamak | `{3.14159:.2f}` | `3.14` |
| `{x:03}` | 3 basamağa sıfırla tamamla | `{7:03}` | `007` |
| `{x:,}` | binlik ayırıcı | `{1234567:,}` | `1,234,567` |
| `{x:.0%}` | yüzde | `{0.5:.0%}` | `50%` |
| `{x:<6}` | sola yasla | `[{'ab':<6}]` | `[ab ]` |
| `{x:>6}` | sağa yasla | `[{'ab':>6}]` | `[ ab]` |
| `{x:^6}` | ortala | `[{'ab':^6}]` | `[ ab ]` |
## Alıştırma
```alistirma
f-string kullanarak `Elif'in ortalaması: 84.67` satırını yazdır. Ortalamayı üç notun ortalaması olarak hesapla ve 2 basamakla yaz.
%%%
ad = "Elif"
not1 = 78
not2 = 91
not3 = 85
# buraya yaz
%%%
ad = "Elif"
not1 = 78
not2 = 91
not3 = 85
ortalama = (not1 + not2 + not3) / 3
yazdir(f"{ad}'in ortalaması: {ortalama:.2f}")
%%%
Elif'in ortalaması: 84.67
```
```alistirma
`toplam_dakika` değerini `SS:DD` biçiminde (iki basamaklı saat ve dakika) yazdır. 425 dakika `07:05` olmalı.
%%%
toplam_dakika = 425
# buraya yaz
%%%
toplam_dakika = 425
saat = toplam_dakika // 60
dakika = toplam_dakika % 60
yazdir(f"{saat:02}:{dakika:02}")
%%%
07:05
```
+159
View File
@@ -0,0 +1,159 @@
---
baslik: Mantık ve karşılaştırma
bolum: Temeller
ozet: dogru/yanlis, karşılaştırma işleçleri, ve/veya/degil ve işleçlerin özeti
---
Program karar verirken bir sorunun cevabına bakar: "puan 50'den büyük mü?", "kullanıcı adı doğru mu?". Bu soruların cevabı bir mantık değeridir: `dogru` ya da `yanlis`.
## Karşılaştırma işleçleri
| İşleç | Sorusu |
|---|---|
| `==` | eşit mi? |
| `!=` | farklı mı? |
| `<` | küçük mü? |
| `<=` | küçük ya da eşit mi? |
| `>` | büyük mü? |
| `>=` | büyük ya da eşit mi? |
```kbl
yazdir(7 > 3)
yazdir(7 == 3)
yazdir(7 != 3)
yazdir(5 <= 5)
```
```cikti
doğru
yanlış
doğru
doğru
```
> **Dikkat:** Eşitlik sorusu **iki** eşittir işaretiyle yazılır: `==`. Tek `=` atamadır, değeri değiştirir.
## Metinleri karşılaştırmak
Metinler harf harf karşılaştırılır; büyük/küçük harf fark eder.
```kbl
yazdir("elma" == "elma")
yazdir("elma" == "Elma")
yazdir("elma".kucult() == "Elma".kucult())
```
```cikti
doğru
yanlış
doğru
```
## Sonucu değişkende tutmak
Karşılaştırmanın sonucu bir değerdir; değişkene atayabilirsin.
```kbl
yas = 20
ehliyet_alabilir = yas >= 18
yazdir(ehliyet_alabilir)
```
```cikti
doğru
```
## ve, veya, degil
Birden çok koşulu birleştirmek için sözcük işleçleri kullanılır:
| İşleç | Ne zaman doğru? |
|---|---|
| `a ve b` | ikisi de doğruysa |
| `a veya b` | en az biri doğruysa |
| `degil a` | a yanlışsa |
```kbl
yas = 16
veli_izni = dogru
yazdir(yas >= 18 ve veli_izni)
yazdir(yas >= 18 veya veli_izni)
yazdir(degil veli_izni)
```
```cikti
yanlış
doğru
yanlış
```
> **Dikkat:** `&&`, `||`, `!` gibi simgeler KabaLang'de yoktur. Her zaman `ve`, `veya`, `degil` yaz.
## Aralık sorusu
Bir değerin iki sınır arasında olup olmadığını `ve` ile sorarsın.
```kbl
sicaklik = 22
yazdir(sicaklik >= 18 ve sicaklik <= 26)
```
```cikti
doğru
```
## Parantezle gruplamak
`ve`, `veya`'dan önce hesaplanır. Uzun koşullarda parantez kullanmak hem doğru sonucu garanti eder hem okumayı kolaylaştırır. Artık yıl kuralı buna güzel bir örnek: yıl 4'e bölünür ve 100'e bölünmez **ya da** 400'e bölünür.
```kbl
yil = 2024
artik = (yil % 4 == 0 ve yil % 100 != 0) veya yil % 400 == 0
yazdir(artik)
```
```cikti
doğru
```
## Tek satırda seçim
`A eger kosul degilse B` ifadesi, koşul doğruysa A'yı, değilse B'yi verir.
```kbl
n = 7
yazdir("çift" eger n % 2 == 0 degilse "tek")
```
```cikti
tek
```
## İşleçlerin özeti
| Tür | İşleçler |
|---|---|
| Aritmetik | `+` `-` `*` `/` `//` `%` `**` |
| Atama | `=` `+=` `-=` `*=` |
| Karşılaştırma | `==` `!=` `<` `<=` `>` `>=` |
| Mantık | `ve` `veya` `degil` |
## Alıştırma
```alistirma
Bir bilet indirimi şöyle: yaşı 12'den küçük **veya** 65'ten büyük olanlar indirim alır. `yas` için bu koşulun sonucunu yazdır.
%%%
yas = 70
# buraya yaz
%%%
yas = 70
yazdir(yas < 12 veya yas > 65)
%%%
doğru
```
```alistirma
Bir şifre geçerli sayılmak için en az 8 karakter olmalı **ve** içinde boşluk bulunmamalı. `sifre` için `gecerli` değişkenini hesaplayıp yazdır.
%%%
sifre = "kirmizi kalem"
# buraya yaz
%%%
sifre = "kirmizi kalem"
gecerli = sifre.uzunluk() >= 8 ve degil sifre.icerir(" ")
yazdir(gecerli)
%%%
yanlış
```
+164
View File
@@ -0,0 +1,164 @@
---
baslik: Koşullar
bolum: Akış denetimi
ozet: eger, degilse eger, degilse ile karar vermek
---
Program her zaman aynı şeyi yapmaz: hava sıcaksa bir şey, soğuksa başka bir şey söyler. `eger` ile kodun bir bölümünü yalnız belli bir durumda çalıştırırsın.
## eger
`eger kosul:` satırının altındaki girintili blok, koşul doğruysa çalışır.
```kbl
sicaklik = 31
eger sicaklik > 30:
yazdir("Hava çok sıcak.")
yazdir("İyi günler.")
```
```cikti
Hava çok sıcak.
İyi günler.
```
## degilse
Koşul yanlışsa çalışacak bir blok istiyorsan `degilse:` ekle.
```kbl
bakiye = 80
fiyat = 120
eger bakiye >= fiyat:
yazdir("Ödeme yapıldı.")
degilse:
yazdir("Bakiye yetersiz.")
```
```cikti
Bakiye yetersiz.
```
## degilse eger: birden çok seçenek
Seçenek ikiden fazlaysa `degilse eger` kullanırsın. Koşullar yukarıdan aşağıya denenir; **doğru çıkan ilk dal** çalışır, gerisi atlanır.
```kbl
puan = 77
eger puan >= 85:
harf = "AA"
degilse eger puan >= 70:
harf = "BA"
degilse eger puan >= 60:
harf = "BB"
degilse eger puan >= 50:
harf = "CC"
degilse:
harf = "FF"
yazdir(f"{puan} puan: {harf}")
```
```cikti
77 puan: BA
```
> **Dikkat:** Sıralama önemlidir. Yukarıdaki örnekte önce `puan >= 50` sorulsaydı, 77 puan o dala girer ve `CC` alırdı. Eşikleri büyükten küçüğe sırala.
## Birleşik koşullar
Koşulda `ve`, `veya`, `degil` kullanabilirsin.
```kbl
yas = 16
veli_izni = dogru
eger yas >= 18 veya veli_izni:
yazdir("Geziye katılabilir.")
degilse:
yazdir("Veli izni gerekli.")
```
```cikti
Geziye katılabilir.
```
## İç içe koşul
Bir `eger` bloğunun içinde başka bir `eger` olabilir.
```kbl
kullanici = "ayse"
parola = "kirmizi-kalem"
eger kullanici == "ayse":
eger parola == "kirmizi-kalem":
yazdir("Giriş başarılı.")
degilse:
yazdir("Parola yanlış.")
degilse:
yazdir("Böyle bir kullanıcı yok.")
```
```cikti
Giriş başarılı.
```
**Dene**'ye basıp parolayı değiştir; hangi dalın çalıştığını gör.
## Gerçek bir örnek: kargo ücreti
```kbl
sepet = 420.0
agirlik = 3.2
eger sepet >= 500.0:
kargo = 0.0
degilse eger agirlik <= 1.0:
kargo = 39.90
degilse eger agirlik <= 5.0:
kargo = 59.90
degilse:
kargo = 89.90
yazdir(f"Kargo: {kargo:.2f} TL")
eger kargo > 0.0:
yazdir(f"{500.0 - sepet:.2f} TL daha ekle, kargo bedava.")
```
```cikti
Kargo: 59.90 TL
80.00 TL daha ekle, kargo bedava.
```
> **İpucu:** Bir değişkeni `eger` dallarında oluşturuyorsan (yukarıdaki `kargo` gibi) her dalda aynı türde değer ver: hepsi `ondalik` ya da hepsi `sayi`.
## Alıştırma
```alistirma
`sayi_degeri` pozitifse `pozitif`, negatifse `negatif`, sıfırsa `sıfır` yazdır.
%%%
sayi_degeri = -8
# buraya yaz
%%%
sayi_degeri = -8
eger sayi_degeri > 0:
yazdir("pozitif")
degilse eger sayi_degeri < 0:
yazdir("negatif")
degilse:
yazdir("sıfır")
%%%
negatif
```
```alistirma
Vücut kitle indeksini (`kilo / (boy * boy)`) hesapla ve 1 basamakla yazdır. Sonra değer 18.5'ten küçükse `zayıf`, 25'ten küçükse `normal`, değilse `fazla kilolu` yazdır.
%%%
kilo = 68.0
boy = 1.75
# buraya yaz
%%%
kilo = 68.0
boy = 1.75
vki = kilo / (boy * boy)
yazdir(f"{vki:.1f}")
eger vki < 18.5:
yazdir("zayıf")
degilse eger vki < 25.0:
yazdir("normal")
degilse:
yazdir("fazla kilolu")
%%%
22.2
normal
```
+140
View File
@@ -0,0 +1,140 @@
---
baslik: iken döngüsü
bolum: Akış denetimi
ozet: Koşul doğru olduğu sürece tekrar etmek
---
Bir işi defalarca yapmak için aynı satırı tekrar tekrar yazmazsın; döngü kullanırsın. `iken` döngüsü, koşul doğru olduğu **sürece** bloğunu tekrarlar.
## Temel kullanım
```kbl
sayac = 1
iken sayac <= 5:
yazdir(sayac)
sayac += 1
yazdir("Bitti")
```
```cikti
1
2
3
4
5
Bitti
```
Her turdan önce koşul sorulur. `sayac` 6 olunca koşul yanlış çıkar ve döngü biter.
## Geri sayım
```kbl
kalan = 3
iken kalan > 0:
yazdir(f"{kalan}...")
kalan -= 1
yazdir("Kalkış!")
```
```cikti
3...
2...
1...
Kalkış!
```
## Toplam biriktirmek
Döngüde bir değişkene her turda ekleme yaparak toplam bulursun.
```kbl
toplam = 0
n = 1
iken n <= 100:
toplam += n
n += 1
yazdir(f"1'den 100'e kadar toplam: {toplam}")
```
```cikti
1'den 100'e kadar toplam: 5050
```
## Kaç turda biteceğini bilmediğin işler
`iken`, tekrar sayısını önceden bilmediğin durumlar için idealdir. Yıllık %40 faizle 10.000 TL kaç yılda iki katını geçer?
```kbl
para = 10_000.0
yil = 0
iken para < 20_000.0:
para = para * 1.40
yil += 1
yazdir(f"{yil} yıl sonra: {para:,.2f} TL")
```
```cikti
3 yıl sonra: 27,440.00 TL
```
Bir sayının basamaklarını tek tek ayırmak da böyle bir iştir.
```kbl
n = 4729
basamak_toplami = 0
iken n > 0:
basamak_toplami += n % 10
n = n // 10
yazdir(basamak_toplami)
```
```cikti
22
```
> **Dikkat:** Koşulu bir gün yanlış yapacak satırı unutursan döngü **sonsuza dek** döner. Aşağıdaki kodda `sayac` hiç artmıyor; program durmaz (IDE belli bir süre sonra onu keser).
```kbl goster
sayac = 1
iken sayac <= 5:
yazdir(sayac)
# sayac += 1 unutuldu!
```
## Alıştırma
```alistirma
`iken` ile 2'nin kuvvetlerini yazdır: 1, 2, 4, 8, ... 1000'i geçmeyenleri, her biri ayrı satırda.
%%%
kuvvet = 1
# buraya yaz
%%%
kuvvet = 1
iken kuvvet <= 1000:
yazdir(kuvvet)
kuvvet *= 2
%%%
1
2
4
8
16
32
64
128
256
512
```
```alistirma
Bir kumbarada 0 TL var. Her hafta 35 TL atılıyor. Kumbara 500 TL'ye ulaşana ya da geçene kadar kaç hafta gerektiğini ve son tutarı `X hafta, Y TL` biçiminde yazdır.
%%%
kumbara = 0
hafta = 0
# buraya yaz
%%%
kumbara = 0
hafta = 0
iken kumbara < 500:
kumbara += 35
hafta += 1
yazdir(f"{hafta} hafta, {kumbara} TL")
%%%
15 hafta, 525 TL
```
+150
View File
@@ -0,0 +1,150 @@
---
baslik: dongu ... icinde ve aralıklar
bolum: Akış denetimi
ozet: Bir listenin, metnin ya da sayı aralığının her öğesi için tekrar etmek
---
Elinde bir şehir listesi var ve her birini yazdırmak istiyorsun. `dongu x icinde ...` döngüsü bir topluluğun her öğesi için bloğunu bir kez çalıştırır; sayaç tutmana gerek kalmaz.
## Liste üzerinde dönmek
Her turda `sehir` değişkeni sıradaki öğeyi alır.
```kbl
sehirler = ["Ankara", "İzmir", "Trabzon", "Van"]
dongu sehir icinde sehirler:
yazdir(f"• {sehir}")
```
```cikti
• Ankara
• İzmir
• Trabzon
• Van
```
Döngü değişkenine istediğin adı verebilirsin. Anlamlı bir ad seç: `dongu ogrenci icinde ogrenciler`.
## Sayı aralığı: a..b
`1..5` aralığı 1, 2, 3, 4, 5 demektir. **Üst sınır dahildir.**
```kbl
dongu i icinde 1..5:
yazdir(f"{i} x 3 = {i * 3}")
```
```cikti
1 x 3 = 3
2 x 3 = 6
3 x 3 = 9
4 x 3 = 12
5 x 3 = 15
```
Sınırlar değişken ya da hesap olabilir.
```kbl
n = 4
toplam = 0
dongu i icinde 1..n:
toplam += i * i
yazdir(f"1'den {n}'e kadar karelerin toplamı: {toplam}")
```
```cikti
1'den 4'e kadar karelerin toplamı: 30
```
## İndeksle dönmek
Sıra numarasına da ihtiyacın varsa `0..liste.uzunluk() - 1` aralığında dönersin.
```kbl
kazananlar = ["Elif", "Mert", "Zeynep"]
dongu i icinde 0..kazananlar.uzunluk() - 1:
yazdir(f"{i + 1}. {kazananlar[i]}")
```
```cikti
1. Elif
2. Mert
3. Zeynep
```
## Metin üzerinde dönmek
Bir metin üzerinde dönünce her turda bir karakter gelir.
```kbl
kelime = "Çalışkan öğrenciler"
unlu = 0
dongu harf icinde kelime.kucult():
eger "aeıioöuü".icerir(harf):
unlu += 1
yazdir(f"{unlu} ünlü harf var.")
```
```cikti
7 ünlü harf var.
```
## İç içe döngü
Dıştaki döngünün her turunda içteki döngü baştan sona çalışır. Çarpım tablosu buna klasik bir örnektir.
```kbl
dongu satir icinde 1..4:
cizgi = ""
dongu sutun icinde 1..4:
cizgi += f"{satir * sutun:4}"
yazdir(cizgi)
```
```cikti
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
```
> **Dikkat:** Aralık yalnız ileri sayar. `5..1` boş bir aralıktır, döngü hiç çalışmaz. Geri saymak için `iken` kullan.
```kbl
dongu i icinde 5..1:
yazdir(i)
yazdir("Döngü hiç çalışmadı.")
```
```cikti
Döngü hiç çalışmadı.
```
> **İpucu:** Döngü değişkenini değiştirmek listeyi değiştirmez. `dongu x icinde l: x = x * 2` yazınca `l` aynı kalır. Listeyi güncellemenin yolunu *Liste işlemleri* dersinde göreceksin.
## Alıştırma
```alistirma
`notlar` listesindeki notların toplamını ve ortalamasını bul. Ortalamayı 1 basamakla `Toplam: 404, ortalama: 80.8` biçiminde yazdır.
%%%
notlar = [72, 95, 88, 61, 88]
toplam = 0
# buraya yaz
%%%
notlar = [72, 95, 88, 61, 88]
toplam = 0
dongu n icinde notlar:
toplam += n
ortalama = toplam / notlar.uzunluk()
yazdir(f"Toplam: {toplam}, ortalama: {ortalama:.1f}")
%%%
Toplam: 404, ortalama: 80.8
```
```alistirma
1'den 5'e kadar her `n` için `n` tane yıldızdan oluşan bir satır yazdır (bir merdiven). `"*".tekrarla(n)` işini görür.
%%%
# buraya yaz
%%%
dongu n icinde 1..5:
yazdir("*".tekrarla(n))
%%%
*
**
***
****
*****
```
+146
View File
@@ -0,0 +1,146 @@
---
baslik: kir ve devam
bolum: Akış denetimi
ozet: Döngüden erken çıkmak ve bir turu atlamak
---
Bazen döngünün sonuna kadar gitmek gerekmez: aradığını bulmuşsundur ya da bu turdaki öğe seni ilgilendirmiyordur. `kir` döngüden tümden çıkar, `devam` yalnız bu turu atlar.
## kir: döngüden çık
Listede ilk başarısız notu arayalım. Bulunca aramaya devam etmenin anlamı yok.
```kbl
notlar = [62, 81, 48, 77, 35]
dongu n icinde notlar:
eger n < 50:
yazdir(f"İlk başarısız not: {n}")
kir
yazdir(f"{n} geçti")
```
```cikti
62 geçti
81 geçti
İlk başarısız not: 48
```
`kir` çalışınca döngü hemen biter; 77 ve 35'e hiç bakılmaz.
## devam: bu turu atla
`devam`'a gelince turun geri kalanı atlanır, döngü bir sonraki öğeyle sürer.
```kbl
dongu i icinde 1..10:
eger i % 3 == 0:
devam
konsol.yaz(f"{i} ")
yazdir()
```
```cikti
1 2 4 5 7 8 10
```
Burada `konsol.yaz` kullandık: `yazdir` gibidir ama satırı bitirmez, böylece sayılar yan yana dizilir. En sondaki boş `yazdir()` satırı kapatır.
## iken dogru ile kir
Kaç tur süreceği belli olmayan bir döngüyü `iken dogru:` ile başlatıp koşul sağlanınca `kir` ile bitirebilirsin.
```kbl
n = 27
adim = 0
iken dogru:
eger n == 1:
kir
eger n % 2 == 0:
n = n // 2
degilse:
n = 3 * n + 1
adim += 1
yazdir(f"27, {adim} adımda 1'e ulaştı.")
```
```cikti
27, 111 adımda 1'e ulaştı.
```
> **Dikkat:** `iken dogru:` yazdıysan döngünün içinde mutlaka bir `kir` olmalı ve ona bir gün ulaşılmalı. Yoksa döngü sonsuza dek döner.
## İç içe döngüde kir
`kir` yalnız **içinde bulunduğu** döngüden çıkar; dıştaki döngü devam eder.
```kbl
dongu satir icinde 1..3:
dongu sutun icinde 1..3:
eger sutun > satir:
kir
konsol.yaz(f"{satir}{sutun} ")
yazdir()
```
```cikti
11
21 22
31 32 33
```
## Hepsi bir arada: asal sayılar
Bir sayı, 1 ve kendisinden başka böleni yoksa asaldır. Her aday için bölen arıyoruz; bulunca `kir` ile içteki döngüden çıkıyoruz.
```kbl
dongu aday icinde 2..30:
asal = dogru
bolen = 2
iken bolen * bolen <= aday:
eger aday % bolen == 0:
asal = yanlis
kir
bolen += 1
eger asal:
konsol.yaz(f"{aday} ")
yazdir()
```
```cikti
2 3 5 7 11 13 17 19 23 29
```
## Alıştırma
```alistirma
`urunler` listesinde ilk `"süt"`ü bul: bulunduğu sırayı (1'den sayarak) `süt 3. sırada` biçiminde yazdır ve döngüden çık.
%%%
urunler = ["ekmek", "peynir", "süt", "yumurta", "süt"]
sira = 0
dongu u icinde urunler:
sira += 1
# buraya yaz
%%%
urunler = ["ekmek", "peynir", "süt", "yumurta", "süt"]
sira = 0
dongu u icinde urunler:
sira += 1
eger u == "süt":
yazdir(f"süt {sira}. sırada")
kir
%%%
süt 3. sırada
```
```alistirma
1'den 20'ye kadar sayıları gez. Çift sayıları `devam` ile atla, tek sayıların toplamını bulup yazdır.
%%%
toplam = 0
dongu i icinde 1..20:
# buraya yaz
yazdir(toplam)
%%%
toplam = 0
dongu i icinde 1..20:
eger i % 2 == 0:
devam
toplam += i
yazdir(toplam)
%%%
100
```
+159
View File
@@ -0,0 +1,159 @@
---
baslik: Listeler
bolum: Veri yapıları
ozet: Değerleri sırayla tutmak, indeksle okumak ve değiştirmek
---
Bir sınıfın 30 notunu 30 ayrı değişkende tutamazsın. Liste, birçok değeri sırayla tek bir adın altında tutar.
## Liste oluşturmak
Köşeli parantez içine öğeleri virgülle ayırarak yazarsın.
```kbl
meyveler = ["elma", "armut", "kiraz"]
notlar = [72, 95, 48, 88]
yazdir(meyveler)
yazdir(notlar)
```
```cikti
[elma, armut, kiraz]
[72, 95, 48, 88]
```
Bir listedeki öğelerin hepsi **aynı türde** olmalıdır: hepsi sayı, hepsi metin gibi.
## Uzunluk
`uzunluk()` listedeki öğe sayısını verir.
```kbl
meyveler = ["elma", "armut", "kiraz"]
yazdir(meyveler.uzunluk())
```
```cikti
3
```
## Öğelere erişmek
Her öğenin bir sıra numarası (indeksi) vardır. Sayma **0'dan** başlar. Negatif indeks sondan sayar.
```kbl
gunler = ["Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma"]
yazdir(gunler[0])
yazdir(gunler[2])
yazdir(gunler[-1])
yazdir(gunler[-2])
```
```cikti
Pazartesi
Çarşamba
Cuma
Perşembe
```
> **Dikkat:** Listede olmayan bir indeksi okumak programı durdurur. 5 öğeli bir listede geçerli indeksler 0'dan 4'e kadardır; `gunler[5]` çalışma anında "liste sınır dışı" hatası verir.
## Öğe değiştirmek
İndeksle bir öğeye yeni değer atayabilirsin.
```kbl
sepet = ["ekmek", "süt", "çay"]
sepet[1] = "ayran"
yazdir(sepet)
```
```cikti
[ekmek, ayran, çay]
```
## Parça almak
`liste[a..b]` a'dan b'ye kadar olan öğeleri (b dahil) yeni bir liste olarak verir. `dilim(baslangic, adet)` ise bir yerden başlayıp belli sayıda öğe alır.
```kbl
sayilar = [10, 20, 30, 40, 50, 60]
yazdir(sayilar[1..3])
yazdir(sayilar.dilim(3, 2))
```
```cikti
[20, 30, 40]
[40, 50]
```
## Boş listeyle başlamak ve ekleme
`[]` boş bir listedir. `ekle()` sona bir öğe ekler.
```kbl
alisveris = []
alisveris.ekle("domates")
alisveris.ekle("biber")
alisveris.ekle("patlıcan")
yazdir(alisveris)
yazdir(alisveris.uzunluk())
```
```cikti
[domates, biber, patlıcan]
3
```
> **İpucu:** Boş listenin türü, ona ilk eklediğin değerden anlaşılır. Türü baştan belirtmek istersen `notlar: liste<sayi> = []` yazabilirsin.
## Liste ve döngü
Listeler en çok döngüyle birlikte kullanılır.
```kbl
fiyatlar = [12.5, 34.9, 8.75]
toplam = 0.0
dongu f icinde fiyatlar:
toplam += f
yazdir(f"Toplam: {toplam:.2f} TL")
```
```cikti
Toplam: 56.15 TL
```
## Liste içinde liste
Listenin öğeleri de liste olabilir; tablo gibi düşünebilirsin. `tablo[satir][sutun]` diye okunur.
```kbl
tablo = [[3, 8, 1], [9, 4, 7]]
yazdir(tablo[0])
yazdir(tablo[1][0])
```
```cikti
[3, 8, 1]
9
```
## Alıştırma
```alistirma
`sehirler` listesinin ilk ve son öğesini ve öğe sayısını aynı satırda yazdır.
%%%
sehirler = ["Edirne", "Bursa", "Konya", "Kars"]
# buraya yaz
%%%
sehirler = ["Edirne", "Bursa", "Konya", "Kars"]
yazdir(sehirler[0], sehirler[-1], sehirler.uzunluk())
%%%
Edirne Kars 4
```
```alistirma
Boş bir `kareler` listesi oluştur. 1'den 6'ya kadar her sayının karesini listeye ekle ve listeyi yazdır.
%%%
kareler = []
# buraya yaz
%%%
kareler = []
dongu i icinde 1..6:
kareler.ekle(i * i)
yazdir(kareler)
%%%
[1, 4, 9, 16, 25, 36]
```
+186
View File
@@ -0,0 +1,186 @@
---
baslik: Liste işlemleri
bolum: Veri yapıları
ozet: Aramak, silmek, sıralamak, birleştirmek ve koleksiyon modülü
---
Listeyi oluşturmayı öğrendin. Şimdi listeyle yapılan günlük işlere bakalım: bir öğe var mı, nerede, nasıl silinir, nasıl sıralanır.
## Aramak: icerir ve bul
`icerir(x)` öğe listede var mı diye sorar. `bul(x)` öğenin indeksini verir; yoksa `-1` döner.
```kbl
meyveler = ["elma", "armut", "kiraz"]
yazdir(meyveler.icerir("kiraz"))
yazdir(meyveler.bul("kiraz"))
yazdir(meyveler.bul("karpuz"))
```
```cikti
doğru
2
-1
```
## Silmek: sil
`sil(i)` **i'nci sıradaki** öğeyi siler; değere göre değil, konuma göre çalışır. Bir değeri silmek için önce `bul()` ile yerini bulursun.
```kbl
meyveler = ["elma", "armut", "kiraz", "muz"]
meyveler.sil(0)
yazdir(meyveler)
konum = meyveler.bul("kiraz")
eger konum != -1:
meyveler.sil(konum)
yazdir(meyveler)
```
```cikti
[armut, kiraz, muz]
[armut, muz]
```
`temizle()` bütün öğeleri siler, `bos_mu()` listenin boş olup olmadığını söyler.
```kbl
sepet = ["ekmek", "süt"]
sepet.temizle()
yazdir(sepet.bos_mu())
```
```cikti
doğru
```
## Sıralamak: sirala
`sirala()` listeyi yerinde, küçükten büyüğe dizer. Metinler Türk alfabesine göre sıralanır: Ç, C'den sonra; İ, I'dan sonra gelir.
```kbl
notlar = [72, 95, 48, 88]
notlar.sirala()
yazdir(notlar)
isimler = ["Zeynep", "Ömer", "Can", "Çağla", "İlker", "Işıl", "Ahmet"]
isimler.sirala()
yazdir(isimler)
```
```cikti
[48, 72, 88, 95]
[Ahmet, Can, Çağla, Işıl, İlker, Ömer, Zeynep]
```
## Metne çevirmek: birlestir
Bir metin listesini `birlestir(ayrac)` ile tek bir metne çevirirsin.
```kbl
renkler = ["kırmızı", "beyaz"]
yazdir(renkler.birlestir(" ve "))
```
```cikti
kırmızı ve beyaz
```
## Koşula uyanları toplamak
Boş bir listeyle başlayıp koşula uyan öğeleri eklemek çok sık yapılan bir iştir.
```kbl
notlar = [72, 95, 48, 88, 35, 61]
gecenler = []
dongu n icinde notlar:
eger n >= 50:
gecenler.ekle(n)
yazdir(gecenler)
```
```cikti
[72, 95, 88, 61]
```
## Öğeleri indeksle güncellemek
Listedeki her öğeyi değiştirmek için indeksle dönersin.
```kbl
fiyatlar = [100, 250, 40]
dongu i icinde 0..fiyatlar.uzunluk() - 1:
fiyatlar[i] = fiyatlar[i] * 2
yazdir(fiyatlar)
```
```cikti
[200, 500, 80]
```
## koleksiyon modülü
Toplam, en büyük, en küçük gibi işler için `kullan kaba.koleksiyon` yazıp hazır fonksiyonları kullanabilirsin. Bu fonksiyonlar asıl listeyi değiştirmez, sonuç döndürür.
```kbl
kullan kaba.koleksiyon
notlar = [72, 95, 48, 88, 72]
yazdir(koleksiyon.topla(notlar))
yazdir(koleksiyon.en_buyuk(notlar))
yazdir(koleksiyon.en_kucuk(notlar))
yazdir(koleksiyon.say(notlar, 72))
yazdir(koleksiyon.sirali(notlar))
yazdir(koleksiyon.ters(notlar))
yazdir(notlar)
```
```cikti
375
95
48
2
[48, 72, 72, 88, 95]
[72, 88, 48, 95, 72]
[72, 95, 48, 88, 72]
```
| Fonksiyon | Ne verir |
|---|---|
| `koleksiyon.topla(l)` | öğelerin toplamı |
| `koleksiyon.en_buyuk(l)` / `en_kucuk(l)` | en büyük / en küçük öğe |
| `koleksiyon.say(l, x)` | x kaç kez geçiyor |
| `koleksiyon.sirali(l)` | sıralı bir kopya |
| `koleksiyon.ters(l)` | ters çevrilmiş bir kopya |
| `koleksiyon.benzersiz(l)` | tekrarları atılmış bir kopya |
> **Dikkat:** Listenin kendisinde `toplam()`, `en_buyuk()` ya da `ters_cevir()` diye yöntem yoktur. Bunlar için ya döngü yazarsın ya da `koleksiyon` modülünü kullanırsın.
## Alıştırma
```alistirma
`misafirler` listesinden `"Kemal"`i sil (önce `bul` ile yerini bul), sonra listeyi alfabetik sırala ve virgülle birleştirip yazdır.
%%%
misafirler = ["Selin", "Kemal", "Burak", "Ayla"]
# buraya yaz
%%%
misafirler = ["Selin", "Kemal", "Burak", "Ayla"]
konum = misafirler.bul("Kemal")
misafirler.sil(konum)
misafirler.sirala()
yazdir(misafirler.birlestir(", "))
%%%
Ayla, Burak, Selin
```
```alistirma
`sicakliklar` listesindeki en yüksek ve en düşük değeri **döngüyle** (modül kullanmadan) bul ve `En yüksek 31, en düşük 18` biçiminde yazdır.
%%%
sicakliklar = [24, 31, 18, 27, 22]
en_yuksek = sicakliklar[0]
en_dusuk = sicakliklar[0]
# buraya yaz
%%%
sicakliklar = [24, 31, 18, 27, 22]
en_yuksek = sicakliklar[0]
en_dusuk = sicakliklar[0]
dongu s icinde sicakliklar:
eger s > en_yuksek:
en_yuksek = s
eger s < en_dusuk:
en_dusuk = s
yazdir(f"En yüksek {en_yuksek}, en düşük {en_dusuk}")
%%%
En yüksek 31, en düşük 18
```
+176
View File
@@ -0,0 +1,176 @@
---
baslik: Sözlükler
bolum: Veri yapıları
ozet: Anahtar-değer çiftleri, ekleme, sorgulama, gezme ve sayım
---
Listede bir öğeye sıra numarasıyla ulaşırsın. Ama "Ankara'nın plakası kaç?" sorusunda sıra numarası işe yaramaz. Sözlük, her değeri bir **anahtarla** eşleştirir: `plaka["Ankara"]` gibi.
## Sözlük oluşturmak
Süslü parantez içine `anahtar: değer` çiftlerini virgülle ayırarak yazarsın.
```kbl
plaka = {"İstanbul": 34, "Ankara": 6, "İzmir": 35}
yazdir(plaka["Ankara"])
yazdir(plaka.uzunluk())
```
```cikti
6
3
```
## Ekleme ve güncelleme
Olmayan bir anahtara değer atamak yeni çift ekler; var olan bir anahtara atamak değeri değiştirir.
```kbl
stok = {"elma": 40, "armut": 25}
stok["kiraz"] = 12
stok["elma"] = stok["elma"] - 5
yazdir(stok["elma"])
yazdir(stok["kiraz"])
```
```cikti
35
12
```
## Anahtar var mı?
Sözlükte olmayan bir anahtarı okumak programı hatayla durdurur. Emin değilsen önce `var_mi()` ile sor.
```kbl
plaka = {"İstanbul": 34, "Ankara": 6}
dongu sehir icinde ["Ankara", "Konya"]:
eger plaka.var_mi(sehir):
yazdir(f"{sehir}: {plaka[sehir]}")
degilse:
yazdir(f"{sehir}: kayıtlı değil")
```
```cikti
Ankara: 6
Konya: kayıtlı değil
```
## Silmek
Sözlükte `sil()` **anahtara** göre siler (listede konuma göre silerdi).
```kbl
stok = {"elma": 40, "armut": 25, "kiraz": 12}
stok.sil("armut")
yazdir(stok.uzunluk())
yazdir(stok.var_mi("armut"))
```
```cikti
2
yanlış
```
## Sözlükte gezmek
`anahtarlar()` bütün anahtarları bir liste olarak verir. Her anahtar için değeri `sozluk[anahtar]` ile okursun.
```kbl
fiyat = {"ekmek": 12.5, "süt": 34.9, "peynir": 149.0}
anahtarlar = fiyat.anahtarlar()
anahtarlar.sirala()
dongu urun icinde anahtarlar:
yazdir(f"{urun:<8}{fiyat[urun]:>8.2f} TL")
```
```cikti
ekmek 12.50 TL
peynir 149.00 TL
süt 34.90 TL
```
> **Dikkat:** `anahtarlar()` listesi ekleme sırasında gelmez. Belli bir sırada gezmek istiyorsan yukarıdaki gibi önce `sirala()` ile sırala.
## Sayım: en sık kullanılan sözlük işi
Bir metinde hangi kelimenin kaç kez geçtiğini sayalım. Her kelime için: daha önce gördüysek sayısını artırırız, görmediysek 1 ile başlatırız.
```kbl
cumle = "bir elma bir armut iki elma bir kiraz"
sayim = {}
dongu kelime icinde cumle.bol(" "):
eger sayim.var_mi(kelime):
sayim[kelime] = sayim[kelime] + 1
degilse:
sayim[kelime] = 1
kelimeler = sayim.anahtarlar()
kelimeler.sirala()
dongu k icinde kelimeler:
yazdir(f"{k}: {sayim[k]}")
```
```cikti
armut: 1
bir: 3
elma: 2
iki: 1
kiraz: 1
```
## Değerleri toplamak
Bir sözlükteki sayıların toplamını anahtarlar üzerinden dönerek bulursun.
```kbl
notlar = {"Ayşe": 88, "Mehmet": 64, "Elif": 92}
toplam = 0
dongu ad icinde notlar.anahtarlar():
toplam += notlar[ad]
yazdir(f"Ortalama: {toplam / notlar.uzunluk():.1f}")
```
```cikti
Ortalama: 81.3
```
> **İpucu:** Bir sözlüğün bütün değerleri aynı türde olsun: hepsi sayı ya da hepsi metin. Öğrencinin adını, notunu ve şehrini birlikte tutmak istiyorsan *Yapılar* dersindeki `yapi` daha uygun bir araçtır.
## Alıştırma
```alistirma
`telefon` sözlüğüne `"Can": "0532 111 22 33"` kaydını ekle. Sonra `"Can"` ve `"Deniz"` için ya numarayı ya da `Deniz: bulunamadı` yazdır.
%%%
telefon = {"Ayşe": "0555 123 45 67"}
# buraya yaz
%%%
telefon = {"Ayşe": "0555 123 45 67"}
telefon["Can"] = "0532 111 22 33"
dongu ad icinde ["Can", "Deniz"]:
eger telefon.var_mi(ad):
yazdir(f"{ad}: {telefon[ad]}")
degilse:
yazdir(f"{ad}: bulunamadı")
%%%
Can: 0532 111 22 33
Deniz: bulunamadı
```
```alistirma
`metin_` içindeki her harfin kaç kez geçtiğini say (boşlukları atla). Harfleri sıralayıp `a 3` biçiminde, her biri ayrı satırda yazdır.
%%%
metin_ = "kar kara"
sayim = {}
# buraya yaz
%%%
metin_ = "kar kara"
sayim = {}
dongu h icinde metin_:
eger h == " ":
devam
eger sayim.var_mi(h):
sayim[h] = sayim[h] + 1
degilse:
sayim[h] = 1
harfler = sayim.anahtarlar()
harfler.sirala()
dongu h icinde harfler:
yazdir(f"{h} {sayim[h]}")
%%%
a 3
k 2
r 2
```
+168
View File
@@ -0,0 +1,168 @@
---
baslik: Fonksiyon tanımlama
bolum: Fonksiyonlar
ozet: Bir işi adlandırıp istediğin kadar çağırmak
---
Aynı kodu programın üç yerinde yazıyorsan, bir yerde hata yaptığında üç yerde düzeltmen gerekir. Fonksiyon, bir işi yapan ve bir adı olan kod bloğudur: bir kez yazarsın, istediğin kadar çağırırsın.
## İlk fonksiyonun
Tanım `fonksiyon ad():` ile başlar; gövdesi girintilidir. Fonksiyon tanımlandığında çalışmaz, **çağrıldığında** çalışır.
```kbl
fonksiyon ayrac():
yazdir("─".tekrarla(20))
ayrac()
yazdir("Günün menüsü")
ayrac()
```
```cikti
────────────────────
Günün menüsü
────────────────────
```
## Parametre almak
Parantez içine yazdığın ad bir **parametredir**. Çağırırken verdiğin değer onun yerine geçer.
```kbl
fonksiyon selamla(ad):
yazdir(f"Merhaba {ad}, hoş geldin.")
selamla("Zeynep")
selamla("Mehmet")
```
```cikti
Merhaba Zeynep, hoş geldin.
Merhaba Mehmet, hoş geldin.
```
Birden çok parametre virgülle ayrılır; değerler aynı sırayla verilir.
```kbl
fonksiyon fis_satiri(urun, adet, fiyat):
yazdir(f"{urun:<10}{adet:>3} x {fiyat:>6.2f}")
fis_satiri("Ekmek", 2, 12.5)
fis_satiri("Peynir", 1, 149.0)
```
```cikti
Ekmek 2 x 12.50
Peynir 1 x 149.00
```
## Değer döndürmek: don
`don` sonucu çağıran yere geri verir. Dönen değeri bir değişkene atayabilir ya da doğrudan kullanabilirsin.
```kbl
fonksiyon kare(x):
don x * x
alan = kare(7)
yazdir(alan)
yazdir(kare(3) + kare(4))
```
```cikti
49
25
```
`don` fonksiyonu orada bitirir; altındaki satırlar çalışmaz. Cevap belli olduğu anda çıkmak kodu sadeleştirir.
```kbl
fonksiyon not_harfi(puan):
eger puan >= 85:
don "AA"
eger puan >= 70:
don "BA"
eger puan >= 50:
don "CC"
don "FF"
yazdir(not_harfi(92))
yazdir(not_harfi(74))
yazdir(not_harfi(31))
```
```cikti
AA
BA
FF
```
## Fonksiyon fonksiyonu çağırabilir
```kbl
fonksiyon cift_mi(n):
don n % 2 == 0
fonksiyon ciftleri_yaz(son):
dongu i icinde 1..son:
eger cift_mi(i):
konsol.yaz(f"{i} ")
yazdir()
ciftleri_yaz(12)
```
```cikti
2 4 6 8 10 12
```
> **Dikkat:** Fonksiyonun içinde, programın başka bir yerinde kullandığın değişken adlarını kullanmamaya özen göster; her fonksiyonun içinde kendine özgü adlar seç. İyi bir alışkanlık da şudur: fonksiyonlarını dosyanın başına yaz, programın asıl işini altlarına koy.
## Gerçek bir örnek
```kbl
fonksiyon kdvli(fiyat):
don fiyat * 1.20
fonksiyon fiyat_yaz(urun, fiyat):
yazdir(f"{urun}: {fiyat:.2f} TL (KDV dahil {kdvli(fiyat):.2f} TL)")
fiyat_yaz("Kulaklık", 850.0)
fiyat_yaz("Kılıf", 120.0)
```
```cikti
Kulaklık: 850.00 TL (KDV dahil 1020.00 TL)
Kılıf: 120.00 TL (KDV dahil 144.00 TL)
```
## Alıştırma
```alistirma
`cevre(en, boy)` adında, bir dikdörtgenin çevresini döndüren bir fonksiyon yaz. Sonra `cevre(5, 3)` ve `cevre(10, 10)` sonuçlarını ayrı satırlarda yazdır.
%%%
# buraya yaz
yazdir(cevre(5, 3))
yazdir(cevre(10, 10))
%%%
fonksiyon cevre(en, boy):
don 2 * (en + boy)
yazdir(cevre(5, 3))
yazdir(cevre(10, 10))
%%%
16
40
```
```alistirma
`buyuk_olan(a, b)` adında, iki sayıdan büyük olanı döndüren bir fonksiyon yaz. Sonra onu kullanarak üç sayının en büyüğünü bulup yazdır.
%%%
# buraya yaz
yazdir(buyuk_olan(buyuk_olan(14, 27), 9))
%%%
fonksiyon buyuk_olan(a, b):
eger a > b:
don a
don b
yazdir(buyuk_olan(buyuk_olan(14, 27), 9))
%%%
27
```
+200
View File
@@ -0,0 +1,200 @@
---
baslik: Parametreler ve dönüş değeri
bolum: Fonksiyonlar
ozet: Tür belirtmek, varsayılan değer, adlı argüman, birden çok değer döndürmek
---
Fonksiyonlar büyüdükçe "bu parametreye ne vermeliyim?" sorusu önem kazanır. Türleri yazmak, varsayılan değer vermek ve adlı argüman kullanmak fonksiyonunu hem güvenli hem rahat kullanılır yapar.
## Türleri yazmak
Parametrenin türünü `ad: tur`, dönüş türünü `-> tur` ile yazarsın. Zorunlu değil ama yazarsan derleyici denetler.
```kbl
fonksiyon dikdortgen_alani(en: sayi, boy: sayi) -> sayi:
don en * boy
fonksiyon ortalama(a: ondalik, b: ondalik) -> ondalik:
don (a + b) / 2.0
yazdir(dikdortgen_alani(3, 4))
yazdir(ortalama(72.0, 85.0))
```
```cikti
12
78.5
```
Yanlış türde değer verirsen program çalışmadan uyarılırsın:
```kbl goster
fonksiyon kare(x: sayi) -> sayi:
don x * x
yazdir(kare("üç")) # hata: 'x' parametresi 'sayi' bekler, 'metin' verildi
```
## Varsayılan değer
Bir parametreye `= değer` ile varsayılan verirsen, çağıran o değeri yazmadığında varsayılan kullanılır. Varsayılanlı parametreler en sona yazılır.
```kbl
fonksiyon kdvli_fiyat(fiyat: ondalik, oran: sayi = 20) -> ondalik:
don fiyat * (1.0 + ondalik(oran) / 100.0)
yazdir(f"{kdvli_fiyat(100.0):.2f}")
yazdir(f"{kdvli_fiyat(100.0, 10):.2f}")
```
```cikti
120.00
110.00
```
## Adlı argüman
Çağırırken parametrenin adını yazarsan kod daha okunur olur, sıra karışmaz.
```kbl
fonksiyon selamla(ad: metin, unvan: metin = "") -> metin:
eger unvan.bos_mu():
don f"Merhaba {ad}"
don f"Merhaba {unvan} {ad}"
yazdir(selamla("Ayşe"))
yazdir(selamla("Kaya", "Dr."))
yazdir(selamla(ad="Can", unvan="Av."))
```
```cikti
Merhaba Ayşe
Merhaba Dr. Kaya
Merhaba Av. Can
```
## Mantık döndüren fonksiyon
Adı `_mi` ile biten, `dogru`/`yanlis` döndüren fonksiyonlar `eger` içinde çok doğal okunur.
```kbl
fonksiyon asal_mi(n: sayi) -> mantik:
eger n < 2:
don yanlis
bolen = 2
iken bolen * bolen <= n:
eger n % bolen == 0:
don yanlis
bolen += 1
don dogru
dongu aday icinde [2, 9, 17, 21]:
eger asal_mi(aday):
yazdir(f"{aday} asaldır")
degilse:
yazdir(f"{aday} asal değildir")
```
```cikti
2 asaldır
9 asal değildir
17 asaldır
21 asal değildir
```
## Liste döndürmek
Fonksiyon bir liste de döndürebilir.
```kbl
fonksiyon bolenler(n: sayi) -> liste<sayi>:
bulunan = []
dongu i icinde 1..n:
eger n % i == 0:
bulunan.ekle(i)
don bulunan
yazdir(bolenler(36))
```
```cikti
[1, 2, 3, 4, 6, 9, 12, 18, 36]
```
## Birden çok değer döndürmek
`don a, b` iki değer döndürür; çağıran taraf `x, y = ...` ile ikisini birden alır.
```kbl
fonksiyon bol_ve_kalan(a: sayi, b: sayi):
don a // b, a % b
bolum, kalan = bol_ve_kalan(17, 5)
yazdir(f"17 = 5 x {bolum} + {kalan}")
```
```cikti
17 = 5 x 3 + 2
```
## Fonksiyona verilen liste kopyalanır
Fonksiyona bir liste verdiğinde fonksiyon onun **kopyasıyla** çalışır. İçeride yapılan değişiklik dışarıdaki listeyi etkilemez. Değişikliği görmek istiyorsan sonucu döndürüp yeniden atarsın.
```kbl
fonksiyon sifir_ekle(l: liste<sayi>) -> liste<sayi>:
l.ekle(0)
don l
sayilar = [5, 6]
yeni = sifir_ekle(sayilar)
yazdir(sayilar)
yazdir(yeni)
sayilar = sifir_ekle(sayilar)
yazdir(sayilar)
```
```cikti
[5, 6]
[5, 6, 0]
[5, 6, 0]
```
> **Dikkat:** Bir fonksiyonun bütün `don` dalları aynı türü döndürmeli. Bir dalda `don 0`, başka dalda `don toplam / adet` (ondalık) yazarsan derleme hatası alırsın; o dalda `don 0.0` yaz.
## Alıştırma
```alistirma
`indirimli(fiyat: ondalik, yuzde: sayi = 10) -> ondalik` fonksiyonunu yaz: fiyattan yüzde kadar indirim düşsün. `indirimli(200.0)` ve `indirimli(200.0, 25)` sonuçlarını 2 basamakla yazdır.
%%%
# buraya yaz
yazdir(f"{indirimli(200.0):.2f}")
yazdir(f"{indirimli(200.0, 25):.2f}")
%%%
fonksiyon indirimli(fiyat: ondalik, yuzde: sayi = 10) -> ondalik:
don fiyat - fiyat * ondalik(yuzde) / 100.0
yazdir(f"{indirimli(200.0):.2f}")
yazdir(f"{indirimli(200.0, 25):.2f}")
%%%
180.00
150.00
```
```alistirma
`en_kucuk_en_buyuk(l: liste<sayi>)` fonksiyonu listedeki en küçük ve en büyük değeri birlikte döndürsün. Sonucu iki değişkene alıp `3 - 41` biçiminde yazdır.
%%%
# buraya yaz
kucuk, buyuk = en_kucuk_en_buyuk([17, 3, 41, 8])
yazdir(f"{kucuk} - {buyuk}")
%%%
fonksiyon en_kucuk_en_buyuk(l: liste<sayi>):
enk = l[0]
enb = l[0]
dongu x icinde l:
eger x < enk:
enk = x
eger x > enb:
enb = x
don enk, enb
kucuk, buyuk = en_kucuk_en_buyuk([17, 3, 41, 8])
yazdir(f"{kucuk} - {buyuk}")
%%%
3 - 41
```
+172
View File
@@ -0,0 +1,172 @@
---
baslik: Özyineleme
bolum: Fonksiyonlar
ozet: Kendini çağıran fonksiyonlar, durma koşulu ve klasik örnekler
---
Bazı problemler kendisinin daha küçük bir kopyasını içerir: 5! = 5 × 4!, bir klasörün boyutu = içindeki dosyalar + alt klasörlerin boyutu. Böyle problemleri, kendini çağıran fonksiyonlarla (özyineleme) çok doğal çözersin.
## Faktöriyel
n! = n × (n-1)! ve 1! = 1. Fonksiyon kendini bir küçük sayıyla çağırır; n 1'e inince durur.
```kbl
fonksiyon faktoriyel(n: sayi) -> sayi:
eger n <= 1:
don 1
don n * faktoriyel(n - 1)
yazdir(faktoriyel(5))
yazdir(faktoriyel(10))
```
```cikti
120
3628800
```
Her özyinelemeli fonksiyonun iki parçası vardır:
1. **Durma koşulu:** cevabın doğrudan bilindiği en küçük durum (`n <= 1` ise 1).
2. **Küçülten adım:** problemi biraz küçültüp fonksiyonu yeniden çağırmak (`faktoriyel(n - 1)`).
> **Dikkat:** Durma koşulunu unutursan ya da adım problemi küçültmezse fonksiyon kendini sonsuza dek çağırır ve program çöker. Her çağrının durma koşuluna biraz daha yaklaştığından emin ol.
## Adım adım izlemek
Ne olduğunu görmek için fonksiyonun içine `yazdir` koyalım.
```kbl
fonksiyon geri_say(n: sayi):
eger n == 0:
yazdir("Kalkış!")
don
yazdir(n)
geri_say(n - 1)
geri_say(3)
```
```cikti
3
2
1
Kalkış!
```
Bu fonksiyon değer döndürmez; tek başına `don` yazmak fonksiyondan çıkmak demektir.
## Basamakların toplamı
4729 → 4 + 7 + 2 + 9. Son basamak `n % 10`, geri kalan `n // 10`'dur.
```kbl
fonksiyon basamak_toplami(n: sayi) -> sayi:
eger n < 10:
don n
don n % 10 + basamak_toplami(n // 10)
yazdir(basamak_toplami(4729))
```
```cikti
22
```
## Fibonacci
Her sayı kendinden önceki iki sayının toplamıdır: 0, 1, 1, 2, 3, 5, 8...
```kbl
fonksiyon fib(n: sayi) -> sayi:
eger n < 2:
don n
don fib(n - 1) + fib(n - 2)
dongu i icinde 0..10:
konsol.yaz(f"{fib(i)} ")
yazdir()
```
```cikti
0 1 1 2 3 5 8 13 21 34 55
```
> **İpucu:** Bu Fibonacci fonksiyonu aynı değerleri defalarca hesaplar; `fib(40)` gibi büyük değerlerde çok yavaşlar. Özyineleme her zaman en hızlı yol değildir; aynı işi bir `iken` döngüsüyle de yapabilirsin.
## Metni ters çevirmek
Özyineleme yalnız sayılarla çalışmaz. Bir metnin tersi = ilk harf hariç kalanın tersi + ilk harf.
```kbl
fonksiyon ters(m: metin) -> metin:
eger m.uzunluk() <= 1:
don m
don ters(m.dilim(1, m.uzunluk() - 1)) + m[0]
yazdir(ters("kalem"))
yazdir(ters("Ey Edip"))
```
```cikti
melak
pidE yE
```
## Hanoi kuleleri
n diski A'dan C'ye taşımak için: n-1 diski B'ye taşı, en büyüğünü C'ye taşı, n-1 diski B'den C'ye taşı. Üç satırlık bir tanım, döngüyle yazması zor bir işi çözer.
```kbl
fonksiyon hanoi(n: sayi, kaynak: metin, hedef: metin, ara: metin):
eger n == 0:
don
hanoi(n - 1, kaynak, ara, hedef)
yazdir(f"{n}. diski {kaynak} → {hedef}")
hanoi(n - 1, ara, hedef, kaynak)
hanoi(3, "A", "C", "B")
```
```cikti
1. diski A → C
2. diski A → B
1. diski C → B
3. diski A → C
1. diski B → A
2. diski B → C
1. diski A → C
```
## Alıştırma
```alistirma
`us(taban: sayi, kuvvet: sayi) -> sayi` fonksiyonunu özyinelemeyle yaz: `us(t, 0)` 1'dir, `us(t, k)` ise `t * us(t, k - 1)`'dir. `us(2, 10)` ve `us(3, 4)` sonuçlarını yazdır.
%%%
# buraya yaz
yazdir(us(2, 10))
yazdir(us(3, 4))
%%%
fonksiyon us(taban: sayi, kuvvet: sayi) -> sayi:
eger kuvvet == 0:
don 1
don taban * us(taban, kuvvet - 1)
yazdir(us(2, 10))
yazdir(us(3, 4))
%%%
1024
81
```
```alistirma
`liste_toplami(l: liste<sayi>, i: sayi) -> sayi` fonksiyonunu özyinelemeyle yaz: listenin `i`'nci öğesinden sonuna kadar olan öğelerin toplamını döndürsün. `i` listenin uzunluğuna eşitse 0 döndür.
%%%
# buraya yaz
yazdir(liste_toplami([4, 8, 15, 16, 23, 42], 0))
%%%
fonksiyon liste_toplami(l: liste<sayi>, i: sayi) -> sayi:
eger i == l.uzunluk():
don 0
don l[i] + liste_toplami(l, i + 1)
yazdir(liste_toplami([4, 8, 15, 16, 23, 42], 0))
%%%
108
```
+210
View File
@@ -0,0 +1,210 @@
---
baslik: Yapılar
bolum: Kendi türlerin
ozet: yapi ile ilgili verileri tek bir türde toplamak
---
Bir kitabın adı, yazarı, sayfa sayısı ve yılı birbirine aittir. Bunları dört ayrı değişkende ya da dört ayrı listede tutmak çabuk karışır. `yapi` ile kendi türünü tanımlar, bu bilgileri tek bir değerde toplarsın.
## Yapı tanımlamak
Yapının her alanına bir varsayılan değer verirsin; alanın türü bu değerden anlaşılır.
```kbl
yapi Kitap:
ad = ""
yazar = ""
sayfa = 0
yil = 0
k = Kitap("Kuyucaklı Yusuf", "Sabahattin Ali", 232, 1937)
yazdir(k.ad)
yazdir(k.sayfa)
yazdir(k)
```
```cikti
Kuyucaklı Yusuf
232
Kitap(ad: Kuyucaklı Yusuf, yazar: Sabahattin Ali, sayfa: 232, yil: 1937)
```
`Kitap(...)` yeni bir nesne oluşturur; değerler alanların tanım sırasıyla verilir. Alanlara `nesne.alan` diye ulaşırsın.
## Nesne oluşturmanın yolları
Boş bir nesne oluşturup alanları sonra da doldurabilir, ya da yalnız bazı alanları adıyla verebilirsin. Verilmeyen alanlar varsayılan değerinde kalır.
```kbl
yapi Kitap:
ad = ""
yazar = ""
sayfa = 0
k1 = Kitap()
k1.ad = "Çalıkuşu"
k1.sayfa = 544
yazdir(k1)
k2 = Kitap(ad="İnce Memed", yazar="Yaşar Kemal")
yazdir(k2)
```
```cikti
Kitap(ad: Çalıkuşu, yazar: , sayfa: 544)
Kitap(ad: İnce Memed, yazar: Yaşar Kemal, sayfa: 0)
```
## Metotlar
Yapının içine fonksiyon yazabilirsin; bunlara **metot** denir. Yapı metotları alanlara doğrudan adıyla ulaşır.
```kbl
yapi Urun:
ad = ""
fiyat = 0.0
adet = 0
fonksiyon tutar() -> ondalik:
don fiyat * adet
fonksiyon etiket() -> metin:
don f"{ad} x{adet}: {tutar():.2f} TL"
u = Urun("Defter", 24.5, 3)
yazdir(u.tutar())
yazdir(u.etiket())
u.adet = 5
yazdir(u.etiket())
```
```cikti
73.5
Defter x3: 73.50 TL
Defter x5: 122.50 TL
```
## Nesne listesi
Yapılar listelerde tutulabilir. Böylece bir tabloyu çok rahat işlersin.
```kbl
yapi Ogrenci:
ad = ""
puan = 0
sinif_listesi = [Ogrenci("Ayşe", 88), Ogrenci("Mehmet", 64), Ogrenci("Elif", 92)]
sinif_listesi.ekle(Ogrenci("Can", 47))
en_iyi = sinif_listesi[0]
dongu o icinde sinif_listesi:
durum = "geçti" eger o.puan >= 50 degilse "kaldı"
yazdir(f"{o.ad:<8}{o.puan:>4} {durum}")
eger o.puan > en_iyi.puan:
en_iyi = o
yazdir(f"En yüksek puan: {en_iyi.ad} ({en_iyi.puan})")
```
```cikti
Ayşe 88 geçti
Mehmet 64 geçti
Elif 92 geçti
Can 47 kaldı
En yüksek puan: Elif (92)
```
## Karşılaştırmak
İki yapı nesnesi, bütün alanları eşitse eşittir.
```kbl
yapi Nokta:
x = 0
y = 0
a = Nokta(3, 4)
b = Nokta(3, 4)
c = Nokta(0, 4)
yazdir(a == b)
yazdir(a == c)
```
```cikti
doğru
yanlış
```
## Atama bir kopya oluşturur
Bir yapı nesnesini başka bir değişkene atamak **kopyasını** oluşturur. Kopyayı değiştirmek aslını etkilemez.
```kbl
yapi Nokta:
x = 0
y = 0
a = Nokta(1, 2)
b = a
b.x = 99
yazdir(a.x)
yazdir(b.x)
```
```cikti
1
99
```
> **Dikkat:** Aynı kural fonksiyonlar için de geçerli: bir fonksiyona yapı verirsen fonksiyon kopyasını değiştirir. Nesnenin kendisini değiştirmek istiyorsan işi yapının **metodu** olarak yaz (bir sonraki ders), ya da değiştirilmiş nesneyi döndürüp yeniden ata.
> **İpucu:** Tür adlarını büyük harfle başlat (`Kitap`, `Ogrenci`); değişken adlarını küçük harfle. `Hata`, `Liste`, `Metin` gibi bazı adlar dilin kendi türlerine ayrılmıştır, onları seçme.
## Alıştırma
```alistirma
`Dikdortgen` adında, `en` ve `boy` alanları (varsayılan 0) ile `alan()` ve `cevre()` metotları olan bir yapı tanımla. `Dikdortgen(6, 4)` için alanı ve çevreyi aynı satırda yazdır.
%%%
# buraya yaz
d = Dikdortgen(6, 4)
yazdir(d.alan(), d.cevre())
%%%
yapi Dikdortgen:
en = 0
boy = 0
fonksiyon alan() -> sayi:
don en * boy
fonksiyon cevre() -> sayi:
don 2 * (en + boy)
d = Dikdortgen(6, 4)
yazdir(d.alan(), d.cevre())
%%%
24 20
```
```alistirma
Verilen `Film` yapısıyla bir liste oluşturulmuş. 1990'dan sonra çıkan filmlerin adlarını ve hepsinin toplam süresini yazdır.
%%%
yapi Film:
ad = ""
yil = 0
sure = 0
filmler = [Film("Eşkıya", 1996, 128), Film("Selvi Boylum Al Yazmalım", 1977, 90), Film("Kış Uykusu", 2014, 196)]
toplam_sure = 0
# buraya yaz
%%%
yapi Film:
ad = ""
yil = 0
sure = 0
filmler = [Film("Eşkıya", 1996, 128), Film("Selvi Boylum Al Yazmalım", 1977, 90), Film("Kış Uykusu", 2014, 196)]
toplam_sure = 0
dongu f icinde filmler:
eger f.yil > 1990:
yazdir(f.ad)
toplam_sure += f.sure
yazdir(f"Toplam süre: {toplam_sure} dakika")
%%%
Eşkıya
Kış Uykusu
Toplam süre: 414 dakika
```
+231
View File
@@ -0,0 +1,231 @@
---
baslik: Sınıflar ve metotlar
bolum: Kendi türlerin
ozet: sinif, kurucu (kur), self ile metotlar ve kalıtım
---
Yapı veriyi bir arada tutar. Bir banka hesabı ise yalnız veri değildir: para yatırılır, çekilir, yetersiz bakiyede işlem reddedilir. Davranışı olan nesneler için `sinif` kullanırsın.
## Sınıf, kurucu ve self
`sinif` tanımı yapıya benzer. Farkları:
- `fonksiyon kur(self, ...)` bir **kurucudur**: nesne oluşturulurken çalışır.
- Metotların ilk parametresi `self`'tir: "bu nesnenin kendisi" demektir. Alanlara `self.alan` ile ulaşırsın.
```kbl
sinif Hesap:
sahip = ""
bakiye = 0.0
fonksiyon kur(self, kisi: metin, ilk: ondalik):
self.sahip = kisi
self.bakiye = ilk
fonksiyon yatir(self, miktar: ondalik):
self.bakiye += miktar
fonksiyon ozet(self) -> metin:
don f"{self.sahip}: {self.bakiye:.2f} TL"
h = Hesap("Ayşe", 100.0)
h.yatir(50.0)
yazdir(h.ozet())
```
```cikti
Ayşe: 150.00 TL
```
`Hesap("Ayşe", 100.0)` yazınca `kur(self, "Ayşe", 100.0)` çağrılır.
## Metot nesneyi kalıcı olarak değiştirir
Metot kendi nesnesinin alanlarını değiştirdiğinde değişiklik kalıcıdır. Bir metot ayrıca değer de döndürebilir.
```kbl
sinif Hesap:
bakiye = 0.0
fonksiyon kur(self, ilk: ondalik):
self.bakiye = ilk
fonksiyon cek(self, miktar: ondalik) -> mantik:
eger miktar > self.bakiye:
don yanlis
self.bakiye -= miktar
don dogru
h = Hesap(100.0)
yazdir(h.cek(30.0))
yazdir(h.cek(500.0))
yazdir(h.bakiye)
```
```cikti
doğru
yanlış
70.0
```
## Her nesnenin kendi alanları vardır
Aynı sınıftan oluşturulan nesneler birbirinden bağımsızdır.
```kbl
sinif Sayac:
adet = 0
fonksiyon kur(self, baslangic: sayi):
self.adet = baslangic
fonksiyon artir(self):
self.adet += 1
a = Sayac(0)
b = Sayac(10)
a.artir()
a.artir()
b.artir()
yazdir(f"a: {a.adet}, b: {b.adet}")
```
```cikti
a: 2, b: 11
```
## Metot başka bir nesne alabilir
```kbl
yapi Kitap:
ad = ""
sayfa = 0
sinif Okuyucu:
ad = ""
okunan_sayfa = 0
kitap_sayisi = 0
fonksiyon kur(self, isim: metin):
self.ad = isim
fonksiyon bitirdi(self, k: Kitap):
self.okunan_sayfa += k.sayfa
self.kitap_sayisi += 1
fonksiyon rapor(self) -> metin:
don f"{self.ad}: {self.kitap_sayisi} kitap, {self.okunan_sayfa} sayfa"
elif = Okuyucu("Elif")
elif.bitirdi(Kitap("Çalıkuşu", 544))
elif.bitirdi(Kitap("Kuyucaklı Yusuf", 232))
yazdir(elif.rapor())
```
```cikti
Elif: 2 kitap, 776 sayfa
```
> **Dikkat:** Kurucunun adı mutlaka `kur`, ilk parametresi `self` olmalıdır. Parametre adını alanla aynı seçmek yerine farklı bir ad ver (`self.ad = isim`); kod daha kolay okunur.
## Kalıtım
Bir sınıf başka bir sınıfın alanlarını ve metotlarını devralabilir. Taban sınıfın adı parantez içinde yazılır. Türev sınıf bir metodu yeniden tanımlarsa (geçersiz kılma) kendi sürümü kullanılır.
```kbl
sinif Hayvan:
ad = ""
fonksiyon kur(self, isim: metin):
self.ad = isim
fonksiyon ses(self) -> metin:
don "..."
fonksiyon tanit(self) -> metin:
don f"Ben {self.ad}."
sinif Kedi(Hayvan):
fonksiyon ses(self) -> metin:
don "Miyav!"
k = Kedi("Tekir")
yazdir(k.tanit())
yazdir(k.ses())
```
```cikti
Ben Tekir.
Miyav!
```
`Kedi`'nin kendi `kur`'u yok; `Hayvan`'ınkini devraldı. `tanit` de devralındı, `ses` ise yeniden tanımlandı.
> **İpucu:** Kalıtımda türev sınıfın kendi alanları ve kurucusu varsa, kurucusunun ilk satırında `ust.kur(...)` ile taban sınıfı kurar. Başlangıçta kalıtıma çok yaslanma; çoğu iş için yapılar ve basit sınıflar yeter.
## Alıştırma
```alistirma
`Termometre` sınıfı yaz: `olcumler` alanı (boş sayı listesi, `liste<sayi> = []`), `ekle(self, d: sayi)` metodu ve ortalamayı döndüren `ortalama(self) -> ondalik` metodu olsun. Verilen ölçümlerle ortalamayı 1 basamakla yazdır.
%%%
# buraya yaz
t = Termometre()
t.ekle(18)
t.ekle(24)
t.ekle(27)
yazdir(f"{t.ortalama():.1f}")
%%%
sinif Termometre:
olcumler: liste<sayi> = []
fonksiyon ekle(self, d: sayi):
self.olcumler.ekle(d)
fonksiyon ortalama(self) -> ondalik:
toplam = 0
dongu o icinde self.olcumler:
toplam += o
don toplam / self.olcumler.uzunluk()
t = Termometre()
t.ekle(18)
t.ekle(24)
t.ekle(27)
yazdir(f"{t.ortalama():.1f}")
%%%
23.0
```
```alistirma
Verilen `Hesap` sınıfına `cek(self, miktar: sayi) -> mantik` metodunu ekle: bakiye yetmezse `yanlis` döndürsün ve bakiyeye dokunmasın. Programın çıktısı aşağıdaki gibi olmalı.
%%%
sinif Hesap:
bakiye = 0
fonksiyon kur(self, ilk: sayi):
self.bakiye = ilk
# buraya yaz
h = Hesap(200)
yazdir(h.cek(150))
yazdir(h.cek(100))
yazdir(h.bakiye)
%%%
sinif Hesap:
bakiye = 0
fonksiyon kur(self, ilk: sayi):
self.bakiye = ilk
fonksiyon cek(self, miktar: sayi) -> mantik:
eger miktar > self.bakiye:
don yanlis
self.bakiye -= miktar
don dogru
h = Hesap(200)
yazdir(h.cek(150))
yazdir(h.cek(100))
yazdir(h.bakiye)
%%%
doğru
yanlış
50
```
+158
View File
@@ -0,0 +1,158 @@
---
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
```
+217
View File
@@ -0,0 +1,217 @@
---
baslik: Hata yönetimi: sonuc ve ?
bolum: Hatalar ve dosyalar
ozet: Başarı ya da hata döndüren fonksiyonlar, ? ile hata iletmek ve belki
---
Programlar her zaman yolunda gitmez: kullanıcı yaş yerine "otuz" yazar, bir sayı sıfıra bölünür, aranan kayıt bulunamaz. KabaLang'de beklenebilir hatalar **dönüş değeriyle** bildirilir: fonksiyon ya başarıyı ya da hatayı döndürür ve çağıran taraf ikisini de ele almak zorundadır.
## sonuc: başarı ya da hata
Dönüş türü `sonuc<sayi, Hata>` olan bir fonksiyon başarıda `tamam(deger)`, başarısızlıkta `hata("mesaj")` döndürür.
```kbl
fonksiyon bol(a: sayi, b: sayi) -> sonuc<sayi, Hata>:
eger b == 0:
don hata("sıfıra bölünemez")
don tamam(a // b)
r = bol(20, 4)
eger r.tamam_mi():
yazdir(f"Sonuç: {r.deger()}")
h = bol(5, 0)
eger h.hatali_mi():
yazdir("Hata: " + h.hata().mesaj())
```
```cikti
Sonuç: 5
Hata: sıfıra bölünemez
```
| Yazım | Anlamı |
|---|---|
| `tamam(deger)` | başarı döndür |
| `hata("mesaj")` | hata döndür |
| `.tamam_mi()` / `.hatali_mi()` | hangisi olduğunu sor |
| `.deger()` | başarıdaki değeri al |
| `.hata().mesaj()` | hatanın açıklamasını al |
| `.deger_veya(yedek)` | hata varsa yedek değeri ver |
## Yedek değerle devam etmek
Hatanın nedeni seni ilgilendirmiyorsa `deger_veya()` ile bir yedek değer verirsin.
```kbl
fonksiyon bol(a: sayi, b: sayi) -> sonuc<sayi, Hata>:
eger b == 0:
don hata("sıfıra bölünemez")
don tamam(a // b)
yazdir(bol(20, 4).deger_veya(0))
yazdir(bol(20, 0).deger_veya(0))
```
```cikti
5
0
```
## Girdiyi denetleyen bir fonksiyon
Kullanıcıdan gelen bir yaşı denetleyelim: boş olmasın, yalnız rakam içersin, gerçekçi olsun.
```kbl
fonksiyon yas_coz(girdi: metin) -> sonuc<sayi, Hata>:
temiz = girdi.kirp()
eger temiz.bos_mu():
don hata("yaş boş bırakılamaz")
dongu harf icinde temiz:
eger degil "0123456789".icerir(harf):
don hata(f"'{temiz}' bir sayı değil")
yas = sayi(temiz)
eger yas > 130:
don hata(f"{yas} yaş gerçekçi değil")
don tamam(yas)
dongu g icinde ["34", " 7 ", "", "otuz", "250"]:
r = yas_coz(g)
eger r.tamam_mi():
yazdir(f"✓ {r.deger()}")
degilse:
yazdir(f"✗ {r.hata().mesaj()}")
```
```cikti
✓ 34
✓ 7
✗ yaş boş bırakılamaz
✗ 'otuz' bir sayı değil
✗ 250 yaş gerçekçi değil
```
## ? ile hatayı yukarı iletmek
Her çağrıdan sonra `eger hatali_mi()` yazmak yorucudur. Çağrının sonuna `?` koyarsan şu anlama gelir: "hata varsa bu fonksiyondan da aynı hatayla hemen çık; yoksa içindeki değeri ver."
```kbl
fonksiyon bol(a: sayi, b: sayi) -> sonuc<sayi, Hata>:
eger b == 0:
don hata("sıfıra bölünemez")
don tamam(a // b)
fonksiyon kisi_basi(toplam: sayi, kisi: sayi, gun: sayi) -> sonuc<sayi, Hata>:
kisi_payi = bol(toplam, kisi)?
gunluk = bol(kisi_payi, gun)?
don tamam(gunluk)
yazdir(kisi_basi(12000, 4, 5).deger())
yazdir(kisi_basi(12000, 0, 5).hata().mesaj())
```
```cikti
600
sıfıra bölünemez
```
> **Dikkat:** `?`'yi yalnız dönüş türü kendisi de `sonuc` olan bir fonksiyonun içinde kullan. Hata ancak o zaman yukarı iletilebilir; programın ana akışında ya da dönüş türü olmayan bir fonksiyonda `?` yerine `tamam_mi()` / `deger_veya()` kullan.
## Sonucu yok saymak yasaktır
`sonuc` döndüren bir fonksiyonu çağırıp sonucu hiç kullanmazsan program derlenmez.
```kbl goster
fonksiyon kaydet() -> sonuc<sayi, Hata>:
don tamam(1)
kaydet() # hata: bu çağrı bir 'sonuc' döndürüyor ve sonuç yok sayılıyor
```
Sonucu bilerek atmak istiyorsan bunu açıkça yazarsın: `_ = kaydet()`.
## belki: değer var ya da yok
Hatanın bir nedeni yoksa, yalnız "bulundu / bulunamadı" ayrımı gerekiyorsa `belki<T>` kullanılır: `dolu(deger)` ya da `bos`.
```kbl
fonksiyon ilk_uzun_kelime(kelimeler: liste<metin>, en_az: sayi) -> belki<metin>:
dongu k icinde kelimeler:
eger k.uzunluk() >= en_az:
don dolu(k)
don bos
liste_ = ["kar", "yağmur", "fırtına"]
b = ilk_uzun_kelime(liste_, 6)
eger b.var_mi():
yazdir(b.deger())
yazdir(ilk_uzun_kelime(liste_, 10).deger_veya("yok"))
```
```cikti
yağmur
yok
```
## Alıştırma
```alistirma
`karekok_tam(n: sayi) -> sonuc<sayi, Hata>` fonksiyonunu yaz: n negatifse `"negatif sayının karekökü yok"` hatası döndürsün; değilse karesi n'yi geçmeyen en büyük tam sayıyı (`k * k <= n` olan en büyük k) döndürsün. Verilen değerler için sonucu ya da hata mesajını yazdır.
%%%
# buraya yaz
dongu n icinde [49, 50, -4]:
r = karekok_tam(n)
eger r.tamam_mi():
yazdir(r.deger())
degilse:
yazdir(r.hata().mesaj())
%%%
fonksiyon karekok_tam(n: sayi) -> sonuc<sayi, Hata>:
eger n < 0:
don hata("negatif sayının karekökü yok")
k = 0
iken (k + 1) * (k + 1) <= n:
k += 1
don tamam(k)
dongu n icinde [49, 50, -4]:
r = karekok_tam(n)
eger r.tamam_mi():
yazdir(r.deger())
degilse:
yazdir(r.hata().mesaj())
%%%
7
7
negatif sayının karekökü yok
```
```alistirma
Verilen `stok_bul` fonksiyonunu kullanan `toplam_stok(a: metin, b: metin) -> sonuc<sayi, Hata>` fonksiyonunu `?` ile yaz: iki ürünün stoklarını toplayıp döndürsün.
%%%
fonksiyon stok_bul(urun: metin) -> sonuc<sayi, Hata>:
eger urun == "kalem":
don tamam(40)
eger urun == "defter":
don tamam(25)
don hata(f"{urun} bulunamadı")
# buraya yaz
yazdir(toplam_stok("kalem", "defter").deger())
yazdir(toplam_stok("kalem", "silgi").hata().mesaj())
%%%
fonksiyon stok_bul(urun: metin) -> sonuc<sayi, Hata>:
eger urun == "kalem":
don tamam(40)
eger urun == "defter":
don tamam(25)
don hata(f"{urun} bulunamadı")
fonksiyon toplam_stok(a: metin, b: metin) -> sonuc<sayi, Hata>:
x = stok_bul(a)?
y = stok_bul(b)?
don tamam(x + y)
yazdir(toplam_stok("kalem", "defter").deger())
yazdir(toplam_stok("kalem", "silgi").hata().mesaj())
%%%
65
silgi bulunamadı
```
+157
View File
@@ -0,0 +1,157 @@
---
baslik: Hata yakalama: dene ve yakala
bolum: Hatalar ve dosyalar
ozet: firlat, dene, yakala ve sonunda ile beklenmeyen durumlar
---
`sonuc` beklenebilir hatalar içindir. Bazı durumlarda ise program o noktada devam edemez: stokta olmayan bir ürün satılmaya çalışılır, listede olmayan bir sıra istenir. Böyle durumlarda hata **fırlatılır**; onu yakalayan bir `dene` bloğu yoksa program durur.
## dene ve yakala
`dene` bloğunda bir hata fırlatılırsa blok orada kesilir ve `yakala` bloğu çalışır. `yakala h:` hata mesajını `h` adıyla verir.
```kbl
dene:
yazdir("İşlem başlıyor")
firlat "bağlantı kurulamadı"
yazdir("Bu satır çalışmaz")
yakala h:
yazdir("Yakalandı: " + h)
yazdir("Program devam ediyor")
```
```cikti
İşlem başlıyor
Yakalandı: bağlantı kurulamadı
Program devam ediyor
```
Hata olmazsa `yakala` bloğu hiç çalışmaz.
## Fonksiyondan hata fırlatmak
`firlat hata("mesaj")` fonksiyonu orada bitirir; hata, onu yakalayan ilk `dene` bloğuna kadar çıkar.
```kbl
fonksiyon stoktan_dus(stok: sayi, adet: sayi) -> sayi:
eger adet <= 0:
firlat hata(f"geçersiz adet: {adet}")
eger adet > stok:
firlat hata(f"stokta {stok} ürün var, {adet} istendi")
don stok - adet
kalan = 10
dongu istek icinde [3, 4, 0, 5]:
dene:
kalan = stoktan_dus(kalan, istek)
yazdir(f"{istek} adet satıldı, {kalan} kaldı")
yakala h:
yazdir(f"Satış yapılamadı: {h}")
```
```cikti
3 adet satıldı, 7 kaldı
4 adet satıldı, 3 kaldı
Satış yapılamadı: geçersiz adet: 0
Satış yapılamadı: stokta 3 ürün var, 5 istendi
```
## Dilin kendi fırlattığı hatalar
Sıfıra bölme, listede olmayan bir sıra, sözlükte olmayan bir anahtar... Bunlar da fırlatılan hatalardır. Yakalanırlarsa program devam eder.
```kbl
sehirler = ["Rize", "Artvin"]
dene:
yazdir(sehirler[5])
yakala:
yazdir("Listede 5. sırada şehir yok.")
bolen = 0
dene:
yazdir(100 // bolen)
yakala:
yazdir("Sıfıra bölme yakalandı.")
```
```cikti
Listede 5. sırada şehir yok.
Sıfıra bölme yakalandı.
```
`yakala`'dan sonra ad yazmazsan hata mesajı kullanılmaz, yalnız yakalanır.
> **Dikkat:** Yakalanmayan bir hata programı o satırda durdurur ve altındaki hiçbir şey çalışmaz. Ama her şeyi `dene` içine sarmak da hatayı gizler. Beklenen durumlar (geçersiz girdi gibi) için `sonuc`, gerçekten olağandışı durumlar için `firlat` kullan.
## sonunda: her durumda çalışan blok
`sonunda:` bloğu, hata olsa da olmasa da en son çalışır. Temizlik işleri (dosyayı kapatmak, "işlem bitti" demek) için kullanılır.
```kbl
dongu bolen icinde [5, 0]:
dene:
yazdir(f"100 / {bolen} = {100 // bolen}")
yakala:
yazdir("bölme yapılamadı")
sonunda:
yazdir("--- işlem tamam")
```
```cikti
100 / 5 = 20
--- işlem tamam
bölme yapılamadı
--- işlem tamam
```
## Hangi yolu seçmeli?
| Durum | Yol |
|---|---|
| Kullanıcı yanlış değer girdi, kayıt bulunamadı | `sonuc` / `belki` döndür |
| Programın o noktada devam etmesi anlamsız | `firlat` |
| Bir hatayı yakalayıp programı sürdürmek | `dene` / `yakala` |
## Alıştırma
```alistirma
`yas_kontrol(yas: sayi) -> sayi` fonksiyonu yaş 0'dan küçükse `"yaş negatif olamaz"` hatası fırlatsın, değilse yaşı döndürsün. Verilen her yaş için `dene/yakala` ile ya `Yaş: 25` ya da `Hata: yaş negatif olamaz` yazdır.
%%%
# buraya yaz
dongu y icinde [25, -3]:
dene:
yazdir(f"Yaş: {yas_kontrol(y)}")
yakala h:
yazdir(f"Hata: {h}")
%%%
fonksiyon yas_kontrol(yas: sayi) -> sayi:
eger yas < 0:
firlat hata("yaş negatif olamaz")
don yas
dongu y icinde [25, -3]:
dene:
yazdir(f"Yaş: {yas_kontrol(y)}")
yakala h:
yazdir(f"Hata: {h}")
%%%
Yaş: 25
Hata: yaş negatif olamaz
```
```alistirma
`fiyat` sözlüğünde olmayan bir ürünü okumak hata fırlatır. `sepet` listesindeki her ürün için `dene/yakala` ile fiyatı yazdır; bulunamayan ürün için `muz: fiyat yok` yaz.
%%%
fiyat = {"elma": 30, "armut": 45}
sepet = ["elma", "muz", "armut"]
# buraya yaz
%%%
fiyat = {"elma": 30, "armut": 45}
sepet = ["elma", "muz", "armut"]
dongu urun icinde sepet:
dene:
yazdir(f"{urun}: {fiyat[urun]} TL")
yakala:
yazdir(f"{urun}: fiyat yok")
%%%
elma: 30 TL
muz: fiyat yok
armut: 45 TL
```
+161
View File
@@ -0,0 +1,161 @@
---
baslik: Kullanıcıdan girdi
bolum: Hatalar ve dosyalar
ozet: konsol.satir_oku ve konsol.sayi_oku ile klavyeden okumak
---
Şimdiye kadar bütün değerleri koda kendin yazdın. Gerçek programlar kullanıcıyla konuşur: adını sorar, bir sayı ister, cevaba göre davranır. Bunun için `konsol` modülünü kullanırsın.
> **Not:** Bu dersteki örneklerin altında bir **girdi** bloğu var: oradaki satırlar, kullanıcı klavyeden yazıp Enter'a basmış gibi programa verilir. Bu yüzden çıktıda yazılan cevap da görünür.
## Bir satır okumak
`kullan kaba.sistem` yazıp `konsol.satir_oku()` ile bir satır okursun. `konsol.yaz()` soruyu yazar ama satırı bitirmez; cevap sorunun yanında görünür.
```kbl
kullan kaba.sistem
konsol.yaz("Adın: ")
ad = konsol.satir_oku().deger_veya("misafir").kirp()
yazdir(f"Merhaba {ad}!")
```
```girdi
Ayşe
```
```cikti
Adın: Ayşe
Merhaba Ayşe!
```
`satir_oku()` bir `belki<metin>` döndürür: girdi bitmişse ortada okunacak satır yoktur. `deger_veya("misafir")` satır varsa onu, yoksa `"misafir"`i verir. `kirp()` ise baştaki ve sondaki boşlukları atar.
## Sayı okumak
`konsol.sayi_oku("soru")` soruyu yazar, satırı okur ve tam sayıya çevirmeyi dener. Sonuç bir `sonuc`'tur: ya sayı ya hata.
```kbl
kullan kaba.sistem
r = konsol.sayi_oku("Doğum yılın: ")
eger r.tamam_mi():
yazdir(f"2026'da {2026 - r.deger()} yaşına giriyorsun.")
degilse:
yazdir("Okunamadı: " + r.hata().mesaj())
```
```girdi
2011
```
```cikti
Doğum yılın: 2011
2026'da 15 yaşına giriyorsun.
```
Kullanıcı sayı yerine yazı girerse program çökmez; hatayı sen ele alırsın.
```kbl
kullan kaba.sistem
r = konsol.sayi_oku("Kaç kitap okudun? ")
eger r.tamam_mi():
yazdir(f"{r.deger()} kitap, harika!")
degilse:
yazdir("Okunamadı: " + r.hata().mesaj())
```
```girdi
on iki
```
```cikti
Kaç kitap okudun? on iki
Okunamadı: 'on iki' bir tam sayı değil
```
> **Dikkat:** Kullanıcıdan gelen sayıyı `sayi(satir)` ile çevirme: `sayi("on iki")` hata vermez, sessizce 0 döndürür. Tam sayı için `konsol.sayi_oku` kullan; böylece yanlış girdiyi fark edersin.
## Ondalık sayı okumak
Ondalık sayı için satırı okuyup `ondalik()` ile çevirirsin.
```kbl
kullan kaba.sistem
konsol.yaz("Boyun (m): ")
boy = ondalik(konsol.satir_oku().deger_veya("0").kirp())
konsol.yaz("Kilon (kg): ")
kilo = ondalik(konsol.satir_oku().deger_veya("0").kirp())
yazdir(f"Vücut kitle indeksin: {kilo / (boy * boy):.1f}")
```
```girdi
1.70
65
```
```cikti
Boyun (m): 1.70
Kilon (kg): 65
Vücut kitle indeksin: 22.5
```
## Birden çok girdi: küçük bir hesap makinesi
```kbl
kullan kaba.sistem
a = konsol.sayi_oku("Birinci sayı: ").deger_veya(0)
b = konsol.sayi_oku("İkinci sayı: ").deger_veya(0)
yazdir(f"{a} + {b} = {a + b}")
yazdir(f"{a} x {b} = {a * b}")
```
```girdi
12
7
```
```cikti
Birinci sayı: 12
İkinci sayı: 7
12 + 7 = 19
12 x 7 = 84
```
> **İpucu:** Örneği **Dene** ile açıp kendi sayılarınla çalıştır. Girdi okuyan programlarda IDE senden cevap bekler.
## Alıştırma
Alıştırmalar girdi verilmeden denetlendiği için burada klavyeden okumak yerine, kullanıcının yazdığı satırların bir listede durduğunu varsayıyoruz. Okuma kısmını örneklerde **Dene** ile kendin dene.
```alistirma
`girdiler` listesi kullanıcının yazdığı satırları tutuyor; satırlarda fazladan boşluk olabilir. Her satırı temizle ve şehir adını büyük harfle `İZMİR'den selam!` biçiminde yazdır.
%%%
girdiler = [" İzmir ", "rize", " Iğdır"]
dongu satir icinde girdiler:
# buraya yaz
%%%
girdiler = [" İzmir ", "rize", " Iğdır"]
dongu satir icinde girdiler:
sehir = satir.kirp()
yazdir(f"{sehir.buyut()}'den selam!")
%%%
İZMİR'den selam!
RİZE'den selam!
IĞDIR'den selam!
```
```alistirma
`girdiler` listesindeki her satır bir yaş olmalı. Yalnız rakamlardan oluşan satırları sayıya çevirip topla; geçersiz satırlar için tırnak içinde `geçersiz: 'on beş'` biçiminde yazdır. En sonda toplamı yazdır.
%%%
girdiler = ["14", "on beş", "16", "", "17a"]
toplam = 0
# buraya yaz
yazdir(f"Toplam: {toplam}")
%%%
girdiler = ["14", "on beş", "16", "", "17a"]
toplam = 0
dongu satir icinde girdiler:
gecerli = degil satir.bos_mu()
dongu harf icinde satir:
eger degil "0123456789".icerir(harf):
gecerli = yanlis
eger gecerli:
toplam += sayi(satir)
degilse:
yazdir(f"geçersiz: '{satir}'")
yazdir(f"Toplam: {toplam}")
%%%
geçersiz: 'on beş'
geçersiz: ''
geçersiz: '17a'
Toplam: 30
```
+135
View File
@@ -0,0 +1,135 @@
---
baslik: Dosyalar
bolum: Hatalar ve dosyalar
ozet: Dosyaya yazmak, sonuna eklemek, geri okumak ve JSON ile saklamak
---
Program bittiğinde değişkenlerdeki her şey kaybolur. Bilgiyi saklamak için dosyaya yazarsın; program bir sonraki çalışmada onu geri okuyabilir. Dosya işlemleri `dosya` modülündedir; `kullan kaba.sistem` ile gelir.
> **Not:** Bu dersteki örnekler çalıştıkları klasörde dosya oluşturur. Her örnek önce yazar, sonra aynı programda geri okur.
## Yazmak ve okumak
`dosya.yaz(yol, metin)` dosyayı oluşturur; dosya varsa içeriğini **silip** yeniden yazar. `dosya.oku(yol)` bütün dosyayı tek bir metin olarak verir.
```kbl
kullan kaba.sistem
dosya.yaz("selam.txt", "Merhaba dosya!\n")
icerik = dosya.oku("selam.txt")
yazdir(icerik)
```
```cikti
Merhaba dosya!
```
Her satırın sonuna `\n` koyarsın; yoksa satırlar yan yana birleşir.
## Sonuna eklemek
`dosya.ekle(yol, metin)` var olan içeriğe dokunmadan sonuna ekler.
```kbl
kullan kaba.sistem
dosya.yaz("gunluk.txt", "Pazartesi: 5 km koştum\n")
dosya.ekle("gunluk.txt", "Salı: dinlendim\n")
dosya.ekle("gunluk.txt", "Çarşamba: 7 km koştum\n")
yazdir(dosya.oku("gunluk.txt"))
```
```cikti
Pazartesi: 5 km koştum
Salı: dinlendim
Çarşamba: 7 km koştum
```
> **Dikkat:** Bir kayıt eklemek istiyorken `dosya.yaz` kullanırsan dosyadaki eski her şey silinir. Eklemek için `dosya.ekle` kullan.
## Satır satır işlemek
Okuduğun metni `kirp()` ile sondaki `\n`'den arındırıp `bol("\n")` ile satırlara ayırırsın. Her satırı da `;` gibi bir ayraçla bölüp alanlara ulaşırsın.
```kbl
kullan kaba.sistem
dosya.yaz("alisveris.txt", "ekmek;2;12.50\n")
dosya.ekle("alisveris.txt", "süt;1;34.90\n")
dosya.ekle("alisveris.txt", "domates;3;18.75\n")
toplam = 0.0
dongu satir icinde dosya.oku("alisveris.txt").kirp().bol("\n"):
parca = satir.bol(";")
adet = sayi(parca[1])
tutar = adet * ondalik(parca[2])
toplam += tutar
yazdir(f"{parca[0]:<10}{adet:>3}{tutar:>9.2f}")
yazdir(f"{'Toplam':<13}{toplam:>9.2f} TL")
```
```cikti
ekmek 2 25.00
süt 1 34.90
domates 3 56.25
Toplam 116.15 TL
```
## Dosya var mı?
Olmayan bir dosyayı okumak hata vermez, boş metin döndürür. Bu yüzden önce `dosya.var_mi()` ile sorarsın. `dosya.sil()` dosyayı siler.
```kbl
kullan kaba.sistem
dosya.yaz("gecici.txt", "deneme\n")
yazdir(dosya.var_mi("gecici.txt"))
dosya.sil("gecici.txt")
yazdir(dosya.var_mi("gecici.txt"))
eger degil dosya.var_mi("ayarlar.txt"):
yazdir("ayarlar.txt yok, varsayılanlar kullanılacak.")
```
```cikti
doğru
yanlış
ayarlar.txt yok, varsayılanlar kullanılacak.
```
## JSON ile saklamak
JSON, sözlük ve listeleri metne çevirmenin yaygın bir biçimidir; başka programlar da okuyabilir. `json.uret()` bir sözlüğü metne çevirir, `json.coz()` metni geri çözer.
```kbl
kullan kaba.sistem
ayarlar = {"tema": "koyu", "yazi_boyutu": 14}
dosya.yaz("ayarlar.json", json.uret(ayarlar))
yazdir(dosya.oku("ayarlar.json"))
okunan = json.coz(dosya.oku("ayarlar.json"))
yazdir(f"Tema: {metin(okunan['tema'])}")
yazdir(f"Yazı boyutu + 2: {sayi(okunan['yazi_boyutu']) + 2}")
```
```cikti
{"tema":"koyu","yazi_boyutu":14}
Tema: koyu
Yazı boyutu + 2: 16
```
JSON'dan çözülen değerin türü derleme anında bilinmez; `metin()` ve `sayi()` ile hangi türde kullanacağını açıkça söylersin.
> **İpucu:** Bozuk olabilecek bir dosyayı çözmeden önce `json.gecerli_mi(metin)` ile denetle; geçerli değilse `yanlis` döner.
## Alıştırma
```alistirma
`notlar.txt` dosyasına üç satır yaz: `Ayşe;88`, `Can;47`, `Elif;92` (ilkini `yaz`, diğerlerini `ekle` ile). Sonra dosyayı okuyup her satırı bölerek notların ortalamasını 1 basamakla `Ortalama: 75.7` biçiminde yazdır.
%%%
kullan kaba.sistem
# buraya yaz
%%%
kullan kaba.sistem
dosya.yaz("notlar.txt", "Ayşe;88\n")
dosya.ekle("notlar.txt", "Can;47\n")
dosya.ekle("notlar.txt", "Elif;92\n")
toplam = 0
satirlar = dosya.oku("notlar.txt").kirp().bol("\n")
dongu satir icinde satirlar:
toplam += sayi(satir.bol(";")[1])
yazdir(f"Ortalama: {toplam / satirlar.uzunluk():.1f}")
%%%
Ortalama: 75.7
```
+169
View File
@@ -0,0 +1,169 @@
---
baslik: Modüller
bolum: Hatalar ve dosyalar
ozet: kullan ile hazır kütüphaneleri programına katmak
---
Karekök almak, bir listeyi toplamak, metnin özetini çıkarmak gibi işleri her seferinde sıfırdan yazmazsın. KabaLang'in standart kütüphanesi bu işleri **modüller** halinde hazır sunar. `kullan` ile bir modülü programına katarsın.
## kullan
`kullan kaba.sistem` yazınca `matematik`, `dosya`, `konsol`, `json`, `kripto`, `zaman`, `rastgele` gibi modüller birlikte gelir. Bir modülün fonksiyonu `modul.fonksiyon()` diye çağrılır.
```kbl
kullan kaba.sistem
yazdir(matematik.karekok(144.0))
yazdir(matematik.mutlak(-17))
yazdir(f"{matematik.pi:.4f}")
```
```cikti
12.0
17
3.1416
```
> **İpucu:** `kullan` satırlarını dosyanın en başına yaz. Hangi yetenekleri kullandığını okuyana hemen gösterir.
## matematik
| Fonksiyon | Ne yapar | Örnek | Sonuç |
|---|---|---|---|
| `matematik.karekok(x)` | karekök | `karekok(9.0)` | `3.0` |
| `matematik.mutlak(x)` | mutlak değer | `mutlak(-3)` | `3` |
| `matematik.yuvarla(x)` | en yakın tam değere yuvarla | `yuvarla(2.5)` | `3.0` |
| `matematik.taban(x)` | aşağı yuvarla | `taban(3.7)` | `3.0` |
| `matematik.tavan(x)` | yukarı yuvarla | `tavan(3.2)` | `4.0` |
| `matematik.us(a, b)` | a üzeri b | `us(2.0, 10.0)` | `1024.0` |
| `matematik.pi` | π sayısı | | `3.14159…` |
```kbl
kullan kaba.sistem
yazdir(matematik.yuvarla(2.5))
yazdir(matematik.taban(3.7))
yazdir(matematik.tavan(3.2))
yazdir(matematik.us(2.0, 10.0))
```
```cikti
3.0
3.0
4.0
1024.0
```
`yuvarla`, `taban` ve `tavan` sonucu `ondalik` olarak verir. Tam sayı gerekiyorsa `sayi(matematik.tavan(x))` yazarsın.
Gerçek bir örnek: dairenin alanı ve bir dik üçgenin hipotenüsü.
```kbl
kullan kaba.sistem
yaricap = 2.5
yazdir(f"Alan: {matematik.pi * yaricap * yaricap:.2f}")
a = 3.0
b = 4.0
yazdir(f"Hipotenüs: {matematik.karekok(a * a + b * b)}")
```
```cikti
Alan: 19.63
Hipotenüs: 5.0
```
## koleksiyon
`kullan kaba.koleksiyon` listelerle çalışan hazır fonksiyonları getirir. Bunları *Liste işlemleri* dersinde görmüştün.
```kbl
kullan kaba.koleksiyon
satislar = [120, 340, 90, 410, 250]
yazdir(koleksiyon.topla(satislar))
yazdir(koleksiyon.en_buyuk(satislar))
yazdir(koleksiyon.sirali(satislar))
```
```cikti
1210
410
[90, 120, 250, 340, 410]
```
## kripto
`kripto` metinlerin özetini (hash) çıkarır ve base64 kodlaması yapar. Özet, bir metnin parmak izidir: metin bir harf bile değişse özet tümden değişir.
```kbl
kullan kaba.sistem
yazdir(kripto.sha256("merhaba").bastan(16))
yazdir(kripto.sha256("Merhaba").bastan(16))
kod = kripto.base64_kodla("KabaLang")
yazdir(kod)
yazdir(kripto.base64_coz(kod))
```
```cikti
4c6bcdd55f3153e1
7fdc9f4717c5fe66
S2FiYUxhbmc=
KabaLang
```
## Diğer modüller
| Modül | Ne için |
|---|---|
| `dosya` | dosya okuma/yazma (*Dosyalar* dersi) |
| `konsol` | klavyeden okuma (*Kullanıcıdan girdi* dersi) |
| `json` | JSON üretme ve çözme |
| `zaman` | saat, tarih, süre ölçümü |
| `rastgele` | rastgele sayı ve seçim |
`zaman` ve `rastgele` her çalıştırmada farklı sonuç verir. Örneğin `rastgele.sayi(1, 6)` bir zar atar, `zaman.saat()` şu anki saati verir. Kendi bilgisayarında **Dene** ile çalıştırıp her seferinde değiştiğini gör:
```kbl goster
kullan kaba.sistem
yazdir("Saat: " + zaman.saat())
yazdir(f"Zar: {rastgele.sayi(1, 6)}")
```
> **Dikkat:** Modül adlarını değişken adı olarak kullanma. `dosya = "notlar.txt"` gibi bir atama, `dosya` modülünü gölgeleyip kafa karıştırıcı hatalara yol açar; `dosya_adi` gibi bir ad seç.
## Tebrikler!
Temel dersleri bitirdin: değişkenler, koşullar, döngüler, listeler, sözlükler, fonksiyonlar, kendi türlerin, hata yönetimi ve dosyalar. Artık **Örnekler** bölümündeki daha büyük programları okuyabilir, kendi küçük projelerine başlayabilirsin.
## Alıştırma
```alistirma
`alanlar` listesindeki her sayı bir karenin alanı. `matematik.karekok` ile her karenin kenar uzunluğunu bulup `Alan 49.0 → kenar 7.0` biçiminde yazdır.
%%%
kullan kaba.sistem
alanlar = [49.0, 2.25, 100.0]
# buraya yaz
%%%
kullan kaba.sistem
alanlar = [49.0, 2.25, 100.0]
dongu a icinde alanlar:
yazdir(f"Alan {a} → kenar {matematik.karekok(a)}")
%%%
Alan 49.0 → kenar 7.0
Alan 2.25 → kenar 1.5
Alan 100.0 → kenar 10.0
```
```alistirma
`fiyatlar` listesindeki her fiyatı `matematik.tavan` ile yukarı yuvarla, `sayi()` ile tam sayıya çevirip listeye ekle ve `koleksiyon.topla` ile yuvarlanmış fiyatların toplamını bul. Önce yuvarlanmış listeyi, sonra toplamı yazdır.
%%%
kullan kaba.sistem
kullan kaba.koleksiyon
fiyatlar = [12.3, 7.8, 19.01]
yuvarlanmis = []
# buraya yaz
%%%
kullan kaba.sistem
kullan kaba.koleksiyon
fiyatlar = [12.3, 7.8, 19.01]
yuvarlanmis = []
dongu f icinde fiyatlar:
yuvarlanmis.ekle(sayi(matematik.tavan(f)))
yazdir(yuvarlanmis)
yazdir(koleksiyon.topla(yuvarlanmis))
%%%
[13, 8, 20]
41
```
+90
View File
@@ -0,0 +1,90 @@
# Ders dosyası biçimi
Online IDE'nin **Dersler** bölümü bu dizindeki `NN-ad.md` dosyalarından üretilir
(dosya adı sırası = ders sırası). Her ders tek dosyadır.
⚠️ Yayına almadan önce `hazirla.py` her çalıştırılabilir kod bloğunu ve her
alıştırmanın çözümünü **gerçekten derleyip çalıştırır** ve çıktıyı dosyada
yazanla karşılaştırır. Tutmayan ders listeye girmez.
## Başlık bilgisi
```
---
baslik: Değişkenler
bolum: Temeller
ozet: Değerlere ad vermek, türler ve atama
---
```
`bolum` aynı olan dersler yan çubukta aynı başlık altında toplanır.
## Metin
Düz paragraf, `## Alt başlık`, `### Küçük başlık`, **kalın**, *eğik*,
`satır içi kod`, [bağlantı](https://…), `-` ya da `1.` ile listeler,
`| a | b |` tabloları (ikinci satır `|---|---|`).
Not kutusu: `>` ile başlayan satırlar. İlk sözcük türü belirler:
```
> **İpucu:** … (bilgi)
> **Dikkat:** … (uyarı)
> **Not:** … (nötr)
```
## Kod örneği
Kod bloğu `kbl` dilinde yazılır. Hemen ardından gelen `cikti` bloğu beklenen
çıktıdır; ikisi birlikte doğrulanır ve sayfada "Dene" düğmesiyle gösterilir.
```kbl
yazdir("Merhaba")
```
```cikti
Merhaba
```
Program girdi okuyorsa `girdi` bloğu `cikti`dan önce gelir; satırlar sırayla
standart girdiye verilir:
```kbl
kullan kaba.sistem
konsol.yaz("Adın: ")
ad = konsol.satir_oku().deger_veya("misafir").kirp()
yazdir(f"Merhaba {ad}")
```
```girdi
Ayşe
```
```cikti
Adın: Ayşe
Merhaba Ayşe
```
(Program uçbirimde çalışır; verilen girdi, kullanıcı yazmış gibi ekranda da görünür.)
Doğrulanmayacak blok (ör. bilerek hatalı kod, yalnız gösterim):
`kbl goster`. Bu blokta "Dene" düğmesi yine vardır.
## Alıştırma
Dersin sonunda bir ya da birkaç alıştırma. Bölümler `%%%` satırıyla ayrılır:
soru (markdown) · başlangıç kodu · çözüm · beklenen çıktı. Çözüm çalıştırılıp
beklenen çıktıyla karşılaştırılır; öğrencinin kodu da aynı çıktıyı verince
alıştırma tamamlanmış sayılır.
```alistirma
`sayi` değişkeninin karesini ekrana yazdır.
%%%
sayi = 7
# buraya yaz
%%%
sayi = 7
yazdir(sayi * sayi)
%%%
49
```
Karşılaştırmada satır sonlarındaki boşluklar ve en sondaki boş satırlar yok
sayılır.
+51
View File
@@ -0,0 +1,51 @@
# Merhaba: ekrana yazı yazmak, metinler, f-string ve yorum satırları
#
# Bir KabaLang programı yukarıdan aşağıya, satır satır çalışır.
# "#" işaretinden sonra gelen her şey yorumdur: derleyici onu okumaz,
# yalnız kodu okuyan insanlar için yazılır.
# yazdir(...) parantez içindekini ekrana yazar ve satırı bitirir.
yazdir("Merhaba, dünya!")
# Metinler çift tırnak arasına yazılır. Türkçe harfler olduğu gibi çalışır.
yazdir("Çağlayan, ılık bir İstanbul sabahında şiir okuyor.")
# Boş bir yazdir() araya boş satır koyar.
yazdir()
# Metinler + ile uç uca eklenir.
yazdir("Programlamaya " + "hoş geldiniz.")
# Bir değere ad verip sonra o adla kullanabiliriz.
# Buna değişken denir; ayrıntısı bir sonraki derste.
ad = "Ayşe"
sehir = "Eskişehir"
# f"..." biçimli metindir: süslü parantez içindeki ad, değeriyle değiştirilir.
yazdir(f"{ad}, {sehir} şehrinden selam gönderiyor.")
# Süslü parantezin içine bir hesap da yazılabilir.
yazdir(f"Bir günde {24 * 60} dakika, bir haftada {7 * 24} saat vardır.")
yazdir()
# Bazı karakterler ters eğik çizgiyle yazılır:
# \n yeni satır \t sekme (boşluk atlar) \" tırnak işareti
yazdir("Birinci satır\nİkinci satır")
yazdir("Ad:\tAyşe\nŞehir:\t" + sehir)
yazdir("Öğretmen \"tahtaya bakın\" dedi.")
yazdir()
# Uçbirimde renkli yazı için ANSI kodları kullanılır.
# \033[32m yeşile, \033[33m sarıya geçer; \033[1m kalın yazar; \033[0m her şeyi sıfırlar.
# Rengi sıfırlamayı unutursan sonraki bütün satırlar da renkli kalır.
yazdir("\033[32mYeşil\033[0m, \033[33msarı\033[0m ve \033[1mkalın\033[0m yazı.")
yazdir()
# Küçük bir kartvizit. tekrarla(n) bir metni n kez yan yana koyar;
# {ad:<12} değeri 12 karakterlik alana sola yaslayarak yazar.
cizgi = "─".tekrarla(30)
yazdir(cizgi)
yazdir(f" {'Ad':<12}{ad}")
yazdir(f" {'Şehir':<12}{sehir}")
yazdir(f" {'Dil':<12}KabaLang")
yazdir(cizgi)
+94
View File
@@ -0,0 +1,94 @@
# Değişkenler: sayı, ondalık, metin ve mantık türleri, dönüşümler ve aritmetik
#
# Değişken, bir değere verilen addır. "ad = değer" yazınca değer o ada bağlanır.
# Türü yazmak gerekmez; KabaLang değere bakıp türü kendisi anlar.
# ── Dört temel tür ─────────────────────────────────────────────
ogrenci = "Mehmet" # metin : tırnak içindeki yazı
yas = 17 # sayi : tam sayı
boy = 1.74 # ondalik : virgüllü sayı (Türkçedeki virgül yerine nokta yazılır)
mezun = yanlis # mantik : dogru ya da yanlis
yazdir(f"Öğrenci: {ogrenci}, yaş: {yas}, boy: {boy} m, mezun: {mezun}")
# Değişkene yeni bir değer atanabilir; eski değer unutulur.
yas = 18
mezun = dogru
yazdir(f"Bir yıl sonra: yaş {yas}, mezun: {mezun}")
# Uzun sayılarda basamakları _ ile ayırmak okumayı kolaylaştırır.
nufus = 85_000_000
yazdir(f"Nüfus: {nufus} (binlik ayırıcıyla: {nufus:,})")
# degismez ile tanımlanan değer bir daha değiştirilemez.
# PI = 3 yazmaya kalkarsan derleyici programı çalıştırmadan durdurur.
degismez PI = 3.14159
yazdir()
# ── Aritmetik ─────────────────────────────────────────────────
a = 17
b = 5
yazdir(f"{a} + {b} = {a + b}")
yazdir(f"{a} - {b} = {a - b}")
yazdir(f"{a} * {b} = {a * b}")
yazdir(f"{a} / {b} = {a / b}") # / her zaman ondalık sonuç verir
yazdir(f"{a} // {b} = {a // b}") # // tam bölme: küsuratı atar
yazdir(f"{a} % {b} = {a % b}") # % bölümden kalan
yazdir(f"2 ** 10 = {2 ** 10}") # ** üs alma
yazdir()
# İşlem önceliği matematikteki gibidir; parantez önceliği değiştirir.
yazdir(f"2 + 3 * 4 = {2 + 3 * 4}")
yazdir(f"(2 + 3) * 4 = {(2 + 3) * 4}")
# Kısaltmalar: x += 5, "x = x + 5" demektir. -= ve *= de aynı mantıkla çalışır.
puan = 10
puan += 5
puan *= 2
yazdir(f"Puan: {puan}")
yazdir()
# ── // ve % ile gerçek bir hesap ───────────────────────────────
# Toplam saniyeyi saat, dakika ve saniyeye ayıralım.
toplam_saniye = 10_000
saat = toplam_saniye // 3600
dakika = (toplam_saniye % 3600) // 60
saniye = toplam_saniye % 60
# {dakika:02} sayıyı iki basamağa tamamlar: 6 yerine 06 yazar.
yazdir(f"{toplam_saniye} saniye = {saat} saat {dakika:02} dakika {saniye:02} saniye")
# Dairenin alanı: ondalık sayılarla hesap. {alan:.2f} virgülden sonra iki basamak yazar.
yaricap = 2.5
alan = PI * yaricap * yaricap
yazdir(f"Yarıçapı {yaricap} olan dairenin alanı: {alan:.2f}")
yazdir()
# ── Tür dönüşümü ──────────────────────────────────────────────
# Türler kendiliğinden birbirine dönüşmez; dönüşümü açıkça yazarız.
metin_sayi = "42"
gercek_sayi = sayi(metin_sayi) # metinden tam sayıya
yazdir(f"sayi(\"42\") + 8 = {gercek_sayi + 8}")
fiyat = ondalik("19.90") # metinden ondalığa
yazdir(f"ondalik(\"19.90\") * 3 = {fiyat * 3:.2f}")
yazdir(f"sayi(3.99) = {sayi(3.99)} (küsurat atılır, yuvarlanmaz)")
yazdir(f"ondalik(7) / 2 = {ondalik(7) / 2}")
# Bir sayıyı metne + ile eklemek için önce metin() ile çeviririz.
yazdir("Sınıfta " + metin(24) + " öğrenci var.")
# Dikkat: sayıya benzemeyen bir metin hata vermez, 0'a dönüşür.
# Kullanıcıdan gelen sayıları denetlemenin yolu bir sonraki derste.
yazdir(f"sayi(\"on iki\") = {sayi('on iki')}")
yazdir()
# ── Küçük bir alışveriş hesabı ─────────────────────────────────
adet = 3
birim_fiyat = 249.90
kdv_orani = 0.20
ara_toplam = adet * birim_fiyat
kdv = ara_toplam * kdv_orani
yazdir(f"Ara toplam : {ara_toplam:>9.2f} TL")
yazdir(f"KDV (%20) : {kdv:>9.2f} TL")
yazdir(f"Toplam : {ara_toplam + kdv:>9.2f} TL")
+85
View File
@@ -0,0 +1,85 @@
# Girdi: kullanıcıdan satır okumak, sayıya çevirmek ve okunanla hesap yapmak
#
# Bu program beş satır okur: ad, doğum yılı, kilo, boy ve kitap sayısı.
# IDE'de girdiler aynı klasördeki girdi.txt dosyasından gelir; her satır,
# kullanıcının yazıp Enter'a bastığı bir cevap gibidir.
# Uçbirimde çalıştırırsan soruları görür, cevapları kendin yazarsın.
kullan kaba.sistem
# Soruları yalnız karşıda gerçekten bir insan varsa yazdıralım. Girdi bir
# dosyadan geliyorsa sorular kimseye hitap etmez, çıktıyı kalabalıklaştırır.
# etkilesimli_mi() bunu söyler: dogru ise klavyeden, yanlis ise dosyadan okuyoruz.
etkilesimli = konsol.etkilesimli_mi()
# ── 1. Bir satır metin okumak ─────────────────────────────────
# konsol.yaz() yazdir() gibidir ama satırı bitirmez; imleç sorunun yanında kalır.
eger etkilesimli:
konsol.yaz("Adınız: ")
# satir_oku() bir satır okur. Ama girdi bitmiş de olabilir; bu yüzden sonuç
# "ya bir satır ya hiçbir şey" taşıyan bir kutudur. deger_veya("misafir")
# kutuda satır varsa onu, yoksa "misafir"i verir. kirp() baştaki ve sondaki
# boşlukları atar.
ad = konsol.satir_oku().deger_veya("misafir").kirp()
# ── 2. Bir tam sayı okumak ve denetlemek ──────────────────────
eger etkilesimli:
konsol.yaz("Doğum yılınız: ")
# sayi_oku() satırı okur ve tam sayıya çevirmeyi dener. Sonuç iki şeyden biridir:
# başarı (içinde sayı) ya da hata (içinde nedeni). tamam_mi() hangisi olduğunu söyler.
# (Burada soruyu yukarıda kendimiz yazdığımız için sayi_oku'ya boş istem veriyoruz.)
yil_sonucu = konsol.sayi_oku("")
# Başarılıysa sayıyı deger() ile kutudan çıkarırız; değilse 2000 ile devam ederiz.
dogum_yili = 2000
eger yil_sonucu.tamam_mi():
dogum_yili = yil_sonucu.deger()
# ── 3. Ondalık sayı okumak ────────────────────────────────────
eger etkilesimli:
konsol.yaz("Kilonuz (kg): ")
kilo = ondalik(konsol.satir_oku().deger_veya("0").kirp())
eger etkilesimli:
konsol.yaz("Boyunuz (m): ")
boy = ondalik(konsol.satir_oku().deger_veya("0").kirp())
# ── 4. Hatalı bir girdi ───────────────────────────────────────
eger etkilesimli:
konsol.yaz("Bu ay kaç kitap okudunuz? ")
kitap_sonucu = konsol.sayi_oku("")
# ── Okunanlarla hesap ─────────────────────────────────────────
# Bu yılı saatten alıyoruz: zaman.bicimlendir("%Y") "2026" gibi bir metin verir.
bu_yil = sayi(zaman.bicimlendir("%Y"))
yas = bu_yil - dogum_yili
# Vücut kitle indeksi: kilo / (boy * boy)
vki = kilo / (boy * boy)
yazdir(f"Merhaba {ad}!")
yazdir(f"Adınız boşluk dahil {ad.uzunluk()} karakter.")
eger yil_sonucu.tamam_mi():
yazdir(f"{dogum_yili} doğumlusunuz; bu yıl {yas} yaşına giriyorsunuz.")
degilse:
yazdir("Doğum yılı okunamadı: " + yil_sonucu.hata().mesaj())
yazdir(f"Kilo {kilo} kg, boy {boy} m → vücut kitle indeksi {vki:.1f}")
# "on iki" bir sayı değil: sayi_oku bunu hata olarak bildirir, program çökmez.
eger kitap_sonucu.tamam_mi():
yazdir(f"Bu ay {kitap_sonucu.deger()} kitap okumuşsunuz.")
degilse:
yazdir("Kitap sayısı anlaşılamadı: " + kitap_sonucu.hata().mesaj())
yazdir(" (Rakamla yazmayı deneyin, örneğin 12.)")
# ── Girdinin sonu ─────────────────────────────────────────────
# Beş satırın hepsini okuduk. Bir kez daha okumaya kalkarsak kutu boş gelir:
# bos_mu() "okunacak satır kalmadı" demektir. Bu, boş bir satırla aynı şey değildir;
# yalnız Enter'a basılan satır, içi boş bir metin olarak gelir.
fazla = konsol.satir_oku()
eger fazla.bos_mu():
yazdir("Girdi bitti; okunacak başka satır yok.")
+5
View File
@@ -0,0 +1,5 @@
Ayşe Yılmaz
1998
68.5
1.65
on iki
+101
View File
@@ -0,0 +1,101 @@
# Koşullar: eger, degilse eger, degilse; karşılaştırma ve ve/veya/degil
#
# Program bazen bir şeyi yalnız belli bir durumda yapmalıdır.
# "eger koşul:" satırının altındaki girintili kod, koşul doğruysa çalışır.
# Girinti (satır başındaki 4 boşluk) hangi satırların bloğa ait olduğunu gösterir.
# ── Karşılaştırma işleçleri ───────────────────────────────────
# Her karşılaştırmanın sonucu bir mantık değeridir: dogru ya da yanlis.
# == eşit mi != farklı mı
# < küçük mü <= küçük ya da eşit mi
# > büyük mü >= büyük ya da eşit mi
yazdir(f"7 > 3 : {7 > 3}")
yazdir(f"7 == 3 : {7 == 3}")
yazdir(f"7 != 3 : {7 != 3}")
yazdir(f"\"elma\" == \"Elma\" : {'elma' == 'Elma'} (büyük/küçük harf fark eder)")
yazdir()
# ── eger / degilse ────────────────────────────────────────────
sicaklik = 31
eger sicaklik > 30:
yazdir(f"Hava {sicaklik} derece: sıcak, bol su için.")
degilse:
yazdir(f"Hava {sicaklik} derece: serin.")
# ── degilse eger: birden çok seçenek ──────────────────────────
# Koşullar yukarıdan aşağı denenir; DOĞRU çıkan İLK dal çalışır, gerisi atlanır.
# Bu yüzden sıralama önemlidir: önce en büyük eşiği soruyoruz.
puan = 77
eger puan >= 85:
harf = "AA"
degilse eger puan >= 70:
harf = "BA"
degilse eger puan >= 60:
harf = "BB"
degilse eger puan >= 50:
harf = "CC"
degilse:
harf = "FF"
yazdir(f"{puan} puan → harf notu {harf}")
yazdir()
# ── ve / veya / degil ─────────────────────────────────────────
# ve : iki taraf da doğruysa doğru
# veya : taraflardan en az biri doğruysa doğru
# degil : doğruyu yanlışa, yanlışı doğruya çevirir
yas = 16
veli_izni = dogru
eger yas >= 18 veya veli_izni:
yazdir(f"{yas} yaşında: geziye katılabilir.")
degilse:
yazdir(f"{yas} yaşında: veli izni gerekli.")
# Artık yıl kuralı: 4'e bölünür ve 100'e bölünmez, YA DA 400'e bölünür.
# Uzun koşulları parantezle gruplamak hem doğru çalışmasını hem okunmasını sağlar.
yil = 2024
artik = (yil % 4 == 0 ve yil % 100 != 0) veya yil % 400 == 0
eger artik:
yazdir(f"{yil} artık yıl: şubat 29 gün.")
degilse:
yazdir(f"{yil} artık yıl değil: şubat 28 gün.")
eger degil artik:
yazdir("Bu satır görünmez, çünkü yıl artık yıl.")
yazdir()
# ── İç içe koşul ──────────────────────────────────────────────
# Bir eger bloğunun içine başka bir eger yazılabilir. Her düzey 4 boşluk daha içeride.
kullanici = "ayse"
parola = "kirmizi-kalem"
eger kullanici == "ayse":
eger parola == "kirmizi-kalem":
yazdir("Giriş başarılı. Hoş geldin, Ayşe.")
degilse:
yazdir("Parola yanlış.")
degilse:
yazdir("Böyle bir kullanıcı yok.")
# ── Küçük bir hesap: kargo ücreti ─────────────────────────────
# Sepet 500 TL ve üstüyse kargo ücretsiz; değilse ağırlığa göre ücret.
sepet = 420.0
agirlik_kg = 3.2
eger sepet >= 500.0:
kargo = 0.0
degilse eger agirlik_kg <= 1.0:
kargo = 39.90
degilse eger agirlik_kg <= 5.0:
kargo = 59.90
degilse:
kargo = 89.90
yazdir()
yazdir(f"Sepet {sepet:.2f} TL, {agirlik_kg} kg → kargo {kargo:.2f} TL")
eger kargo > 0.0:
eksik = 500.0 - sepet
yazdir(f"\033[33m{eksik:.2f} TL'lik ürün daha eklerseniz kargo ücretsiz.\033[0m")
+96
View File
@@ -0,0 +1,96 @@
# Döngüler: dongu ... icinde, sayı aralıkları, iken, kir ve devam
#
# Döngü, bir kod bloğunu tekrar tekrar çalıştırır. KabaLang'de iki türü var:
# dongu x icinde ... : bir listenin ya da aralığın her öğesi için bir kez
# iken koşul: : koşul doğru olduğu sürece
# ── Bir listenin üzerinden geçmek ─────────────────────────────
# Her turda sehir değişkeni sıradaki öğeyi alır.
sehirler = ["Ankara", "İzmir", "Trabzon", "Van"]
dongu sehir icinde sehirler:
yazdir(f"• {sehir}")
yazdir()
# ── Sayı aralığı: 1..5 ────────────────────────────────────────
# 1..5 aralığı 1, 2, 3, 4, 5 demektir; üst sınır DAHİLDİR.
toplam = 0
dongu i icinde 1..5:
toplam += i
yazdir(f"i = {i}, şimdiye kadarki toplam = {toplam}")
yazdir()
# Aralığın sınırları değişken de olabilir.
n = 6
konsol.yaz(f"7'nin ilk {n} katı:")
dongu i icinde 1..n:
konsol.yaz(f" {7 * i}")
yazdir()
yazdir()
# ── İç içe döngü: çarpım tablosu ──────────────────────────────
# Dıştaki döngünün her turunda içteki döngü baştan sona çalışır.
# {deger:4} sayıyı 4 karakterlik alana sağa yaslar; sütunlar böyle hizalanır.
dongu satir icinde 1..5:
cizelge = ""
dongu sutun icinde 1..5:
cizelge = cizelge + f"{satir * sutun:4}"
yazdir(cizelge)
yazdir()
# ── iken: koşul doğru olduğu sürece ───────────────────────────
# Aralık yalnız ileri sayar (5..1 boştur); geri saymak için iken kullanılır.
# Koşulu bir gün yanlış yapacak satırı (burada sayac -= 1) unutmak döngüyü sonsuz yapar.
sayac = 5
iken sayac > 0:
konsol.yaz(f"{sayac}... ")
sayac -= 1
yazdir("kalkış!")
# Kaç turda biteceğini bilmediğimiz işler için iken uygundur.
# Yıllık %40 faizle 10.000 TL kaç yılda iki katını geçer?
para = 10_000.0
yil = 0
iken para < 20_000.0:
para = para * 1.40
yil += 1
yazdir(f"{yil} yıl sonra para {para:,.2f} TL oldu; iki katını geçti.")
yazdir()
# ── devam: bu turu atla ───────────────────────────────────────
# devam'a gelince turun geri kalanı atlanır, döngü bir sonraki öğeyle sürer.
konsol.yaz("1-20 arası 3'e bölünmeyen tek sayılar:")
dongu i icinde 1..20:
eger i % 2 == 0:
devam # çift sayıysa geç
eger i % 3 == 0:
devam # 3'e bölünüyorsa geç
konsol.yaz(f" {i}")
yazdir()
# ── kir: döngüden tümden çık ──────────────────────────────────
# Aradığımızı bulunca aramaya devam etmenin anlamı yok.
notlar = [62, 48, 91, 77, 35, 88]
dongu notu icinde notlar:
eger notu < 50:
yazdir(f"İlk başarısız not bulundu: {notu}")
kir
yazdir()
# ── Hepsi bir arada: asal sayılar ─────────────────────────────
# Bir sayı, 1 ve kendisinden başka böleni yoksa asaldır.
# Her aday için 2'den başlayıp bölen arıyoruz; bölen bulunca kir ile çıkıyoruz.
asal_sayisi = 0
konsol.yaz("50'ye kadar asal sayılar:")
dongu aday icinde 2..50:
asal = dogru
bolen = 2
iken bolen * bolen <= aday:
eger aday % bolen == 0:
asal = yanlis
kir # yalnız içteki iken döngüsünden çıkar
bolen += 1
eger asal:
konsol.yaz(f" {aday}")
asal_sayisi += 1
yazdir()
yazdir(f"Toplam {asal_sayisi} asal sayı.")
+100
View File
@@ -0,0 +1,100 @@
# Fonksiyonlar: parametre, dönüş değeri, tür belirtme, varsayılan değer ve özyineleme
#
# Fonksiyon, bir işi yapan ve bir adı olan kod bloğudur. Bir kez yazılır,
# istendiği kadar çağrılır. Tanımı "fonksiyon ad(parametreler):" ile başlar.
#
# Fonksiyonları dosyanın başına, değişkenlerden önce yazıyoruz. Bunun bir nedeni
# var: bir fonksiyonun içinde, kendisinden ÖNCE tanımlanmış bir değişkenle aynı
# adı kullanırsan fonksiyon o değişkeni değiştirir. Başta tanımlanan fonksiyonun
# içindeki adlar yalnız ona ait kalır.
# ── En basit fonksiyon: parametresiz, değer döndürmeyen ───────
fonksiyon ayrac():
yazdir("─".tekrarla(44))
# ── Parametre almak ───────────────────────────────────────────
# Çağırırken parantez içine verilen değer, parametrenin (ad) yerine geçer.
fonksiyon selamla(ad):
yazdir(f"Merhaba {ad}, hoş geldin.")
# ── Değer döndürmek: don ──────────────────────────────────────
# don, sonucu çağıran yere geri verir ve fonksiyonu orada bitirir.
# Parametre ve dönüş türünü yazmak zorunlu değil; yazarsan derleyici denetler:
# dikdortgen_alani("üç", 4) yazan biri program çalışmadan uyarılır.
fonksiyon dikdortgen_alani(en: sayi, boy: sayi) -> sayi:
don en * boy
fonksiyon ortalama(a: ondalik, b: ondalik, c: ondalik) -> ondalik:
don (a + b + c) / 3.0
# ── Varsayılan değerli parametre ──────────────────────────────
# Çağıran kdv vermezse 20 kullanılır. Varsayılanlı parametreler en sona yazılır.
fonksiyon kdvli_fiyat(fiyat: ondalik, kdv: sayi = 20) -> ondalik:
don fiyat * (1.0 + ondalik(kdv) / 100.0)
# ── Mantık döndüren fonksiyon ve birden çok don ───────────────
# Cevabı belli olduğu anda don ile çıkmak kodu sadeleştirir.
fonksiyon asal_mi(n: sayi) -> mantik:
eger n < 2:
don yanlis
bolen = 2
iken bolen * bolen <= n:
eger n % bolen == 0:
don yanlis
bolen += 1
don dogru
# ── Fonksiyon başka bir fonksiyonu çağırabilir ────────────────
fonksiyon asallari_yaz(baslangic: sayi, bitis: sayi):
bulunan = ""
dongu sayi_adayi icinde baslangic..bitis:
eger asal_mi(sayi_adayi):
bulunan = bulunan + f" {sayi_adayi}"
yazdir(f"{baslangic}-{bitis} arası asallar:{bulunan}")
# ── Özyineleme: kendini çağıran fonksiyon ─────────────────────
# n! = n × (n-1)! ve 1! = 1. Her çağrı problemi biraz küçültür;
# n <= 1 olunca durur. Bu durma koşulu olmazsa fonksiyon kendini sonsuza dek çağırırdı.
fonksiyon faktoriyel(n: sayi) -> sayi:
eger n <= 1:
don 1
don n * faktoriyel(n - 1)
# Bir sayının basamakları toplamı: 4729 → 4 + 7 + 2 + 9 = 22
# Son basamak n % 10, geri kalanı n // 10.
fonksiyon basamak_toplami(n: sayi) -> sayi:
eger n < 10:
don n
don n % 10 + basamak_toplami(n // 10)
# ════════════════ Program buradan başlıyor ════════════════
ayrac()
selamla("Zeynep")
selamla("Mehmet")
ayrac()
yazdir(f"3 x 4 dikdörtgenin alanı: {dikdortgen_alani(3, 4)}")
# Fonksiyonun sonucu bir değişkene atanabilir ya da doğrudan kullanılabilir.
ort = ortalama(72.0, 85.0, 90.0)
yazdir(f"72, 85 ve 90'ın ortalaması: {ort:.2f}")
yazdir(f"100 TL, KDV %20 ile : {kdvli_fiyat(100.0):.2f} TL")
yazdir(f"100 TL, KDV %10 ile : {kdvli_fiyat(100.0, 10):.2f} TL")
# Parametreyi adıyla vermek, çok parametreli çağrıları okunur yapar.
yazdir(f"100 TL, KDV %1 ile : {kdvli_fiyat(100.0, kdv=1):.2f} TL")
ayrac()
dongu n icinde [1, 2, 17, 21, 97]:
eger asal_mi(n):
yazdir(f"{n} asaldır")
degilse:
yazdir(f"{n} asal değildir")
asallari_yaz(50, 80)
ayrac()
dongu n icinde 1..10:
yazdir(f"{n:2}! = {faktoriyel(n):>9,}")
yazdir(f"4729 sayısının basamakları toplamı: {basamak_toplami(4729)}")
ayrac()
+126
View File
@@ -0,0 +1,126 @@
# Listeler: oluşturma, ekleme, silme, dilimleme, sıralama ve döngüyle gezme
#
# Liste, değerleri sırayla tutan bir kaptır. Köşeli parantezle yazılır,
# öğeler virgülle ayrılır. Bir listedeki öğelerin hepsi aynı türde olmalıdır.
# Listeyi alan bir fonksiyon. Önemli bir ayrıntı: fonksiyona verilen liste
# KOPYALANIR. Fonksiyon kendi kopyasını değiştirir; değişikliği görmek için
# sonucu döndürüp yeniden atarız (aşağıda: notlar = yuvarla(notlar)).
fonksiyon yuvarla(liste: liste<sayi>) -> liste<sayi>:
i = 0
iken i < liste.uzunluk():
eger liste[i] % 5 != 0:
liste[i] = liste[i] + (5 - liste[i] % 5) # bir üst 5'in katına
i += 1
don liste
# ── Oluşturma ve okuma ────────────────────────────────────────
meyveler = ["elma", "armut", "kiraz", "muz"]
yazdir(f"Liste : {meyveler}")
yazdir(f"Öğe sayısı : {meyveler.uzunluk()}")
# Öğelere sıra numarasıyla (indeks) ulaşılır. Sayma 0'dan başlar.
# Negatif indeks sondan sayar: -1 son öğe, -2 sondan ikinci.
yazdir(f"İlk öğe : {meyveler[0]}")
yazdir(f"İkinci öğe : {meyveler[1]}")
yazdir(f"Son öğe : {meyveler[-1]}")
# Bir öğe yerinde değiştirilebilir.
meyveler[3] = "incir"
yazdir(f"Değiştirdik : {meyveler}")
yazdir()
# ── Ekleme, arama, silme ──────────────────────────────────────
meyveler.ekle("üzüm") # sona ekler
meyveler.ekle("çilek")
yazdir(f"Ekledik : {meyveler}")
yazdir(f"kiraz var mı? : {meyveler.icerir('kiraz')}")
yazdir(f"kirazın indeksi : {meyveler.bul('kiraz')}") # bul() indeksi verir
yazdir(f"karpuzun indeksi : {meyveler.bul('karpuz')} (listede yoksa -1)")
# sil(i) i'NCİ SIRADAKİ öğeyi siler (değere göre değil, konuma göre).
# Bir değeri silmek için önce bul() ile yerini buluruz.
konum = meyveler.bul("armut")
meyveler.sil(konum)
yazdir(f"armut gitti : {meyveler}")
yazdir()
# ── Dilimleme ─────────────────────────────────────────────────
# l[a..b] a'dan b'ye kadar olan öğeleri yeni bir liste olarak verir (b dahil).
# l.dilim(a, adet) a'dan başlayıp adet tane öğe alır.
sayilar = [10, 20, 30, 40, 50, 60, 70]
yazdir(f"sayilar[1..3] : {sayilar[1..3]}")
yazdir(f"sayilar.dilim(4, 2) : {sayilar.dilim(4, 2)}")
yazdir()
# ── Sıralama ──────────────────────────────────────────────────
# sirala() listeyi yerinde, küçükten büyüğe dizer.
# Metinler Türk alfabesine göre sıralanır: Ç, C'den sonra; İ, I'dan sonra gelir.
isimler = ["Zeynep", "Ömer", "Can", "Çağla", "İlker", "Işıl", "Ahmet"]
isimler.sirala()
yazdir(f"Sıralı isimler : {isimler}")
# Ters çevirmek için listeyi sondan başa gezip yeni bir listeye ekleriz.
ters = []
i = isimler.uzunluk() - 1
iken i >= 0:
ters.ekle(isimler[i])
i -= 1
yazdir(f"Tersten : {ters}")
# birlestir(ayrac) metin listesini tek bir metne çevirir.
yazdir(f"Virgülle : {isimler.birlestir(', ')}")
yazdir()
# ── Döngüyle gezme ve hesap ───────────────────────────────────
notlar = [72, 95, 48, 88, 61, 79, 53]
# Sıra numarası gerekiyorsa indeksle geziyoruz.
i = 0
iken i < notlar.uzunluk():
yazdir(f" {i + 1}. öğrenci: {notlar[i]}")
i += 1
# Toplam, en büyük ve en küçük: hepsini tek bir döngüde bulabiliriz.
toplam = 0
en_yuksek = notlar[0]
en_dusuk = notlar[0]
dongu n icinde notlar:
toplam += n
eger n > en_yuksek:
en_yuksek = n
eger n < en_dusuk:
en_dusuk = n
yazdir(f"Toplam {toplam}, ortalama {toplam / notlar.uzunluk():.1f}, en yüksek {en_yuksek}, en düşük {en_dusuk}")
# Boş bir listeyle başlayıp koşula uyanları toplamak çok sık yapılan bir iştir.
gecenler = []
kalanlar = []
dongu n icinde notlar:
eger n >= 60:
gecenler.ekle(n)
degilse:
kalanlar.ekle(n)
yazdir(f"Geçenler ({gecenler.uzunluk()}): {gecenler}")
yazdir(f"Kalanlar ({kalanlar.uzunluk()}): {kalanlar}")
yazdir()
# ── Fonksiyona liste vermek ───────────────────────────────────
yuvarlanmis = yuvarla(notlar)
yazdir(f"Yuvarlanmış kopya : {yuvarlanmis}")
yazdir(f"Asıl liste : {notlar} (değişmedi)")
notlar = yuvarla(notlar)
yazdir(f"Yeniden atayınca : {notlar}")
yazdir()
# ── Liste içinde liste: tablo ─────────────────────────────────
# Her satır bir liste; tablo[satır][sütun] diye okunur.
tablo = [[3, 8, 1], [9, 4, 7], [2, 6, 5]]
dongu satir icinde tablo:
satir_toplami = 0
dongu hucre icinde satir:
satir_toplami += hucre
yazdir(f" {satir} → satır toplamı {satir_toplami}")
yazdir(f"Ortadaki hücre tablo[1][1] = {tablo[1][1]}")
+102
View File
@@ -0,0 +1,102 @@
# Sözlükler: anahtar-değer çiftleri, ekleme, sorgulama, gezme ve kelime sayımı
#
# Sözlük, her değeri bir anahtarla eşleştiren kaptır. Listede öğeye sıra
# numarasıyla ulaşırken sözlükte anahtarla ulaşırız: plaka["Ankara"] gibi.
# Süslü parantezle yazılır: {anahtar: değer, anahtar: değer}.
# ── Oluşturma ve okuma ────────────────────────────────────────
plaka = {"İstanbul": 34, "Ankara": 6, "İzmir": 35}
yazdir(f"Sözlük : {plaka}")
yazdir(f"Ankara'nın plakası : {plaka['Ankara']:02}")
yazdir(f"Kaç şehir var : {plaka.uzunluk()}")
yazdir()
# ── Ekleme ve güncelleme ──────────────────────────────────────
# Olmayan bir anahtara değer atamak yeni çift ekler; var olana atamak değeri değiştirir.
plaka["Bursa"] = 16
plaka["Trabzon"] = 61
plaka["İzmir"] = 35
yazdir(f"Eklemeden sonra: {plaka}")
# ── Sorgulama ─────────────────────────────────────────────────
# Sözlükte olmayan bir anahtarı okumak programı hatayla durdurur.
# Emin değilsek önce var_mi() ile soruyoruz.
dongu sehir icinde ["Trabzon", "Konya"]:
eger plaka.var_mi(sehir):
yazdir(f"{sehir}: {plaka[sehir]}")
degilse:
yazdir(f"{sehir}: sözlükte yok")
# ── Silme ─────────────────────────────────────────────────────
# Sözlükte sil() ANAHTARA göre siler (listede konuma göre silerdi).
plaka.sil("Bursa")
yazdir(f"Bursa silindi, kalan {plaka.uzunluk()} şehir")
yazdir()
# ── Gezme ─────────────────────────────────────────────────────
# anahtarlar() bütün anahtarları bir liste olarak verir.
# Bu liste eklenme sırasında değildir; harflerin bilgisayardaki kod sırasına
# göre dizilir ve bu sırada İ, Ş, Ö gibi harfler Z'den sonra gelir (yukarıda
# Trabzon, İstanbul'dan önce yazıldı). Türk alfabesine göre gezmek için
# anahtar listesini alıp sirala() ile sıralıyoruz.
sehirler = plaka.anahtarlar()
sehirler.sirala()
yazdir("Şehir Plaka")
dongu sehir icinde sehirler:
yazdir(f"{sehir:<12}{plaka[sehir]:>5}")
yazdir()
# ── Metinden metne sözlük: küçük bir sözlük uygulaması ────────
ingilizce = {
"kitap": "book",
"kalem": "pencil",
"okul": "school",
"öğretmen": "teacher"
}
cumle = ["öğretmen", "okul", "kitap", "defter"]
ceviri = []
dongu kelime icinde cumle:
eger ingilizce.var_mi(kelime):
ceviri.ekle(ingilizce[kelime])
degilse:
ceviri.ekle(f"?{kelime}?") # bilinmeyen kelimeyi işaretle
yazdir(f"{cumle.birlestir(' ')} → {ceviri.birlestir(' ')}")
yazdir()
# ── Sayım: hangi kelime kaç kez geçiyor? ──────────────────────
# Sözlüğün en sık kullanıldığı iş budur. Her kelime için:
# daha önce gördüysek sayısını bir artırırız, görmediysek 1 ile başlatırız.
metin_parcasi = "bir elma bir armut iki elma bir kiraz üç elma iki armut"
sayim = {}
dongu kelime icinde metin_parcasi.bol(" "):
eger sayim.var_mi(kelime):
sayim[kelime] = sayim[kelime] + 1
degilse:
sayim[kelime] = 1
yazdir(f"Metin: \"{metin_parcasi}\"")
yazdir(f"{sayim.uzunluk()} farklı kelime bulundu:")
# En sık geçen kelimeyi de aynı gezintide bulalım.
# Eşitlik olursa ilk karşılaşılan kalır, çünkü yalnız daha BÜYÜK adet yerini alır.
en_sik = ""
en_cok = 0
dongu kelime icinde sayim.anahtarlar():
adet = sayim[kelime]
# Her kelime için adedi kadar ▇ çizerek küçük bir çubuk grafik yapıyoruz.
yazdir(f" {kelime:<7}{adet:>2} " + "▇".tekrarla(adet))
eger adet > en_cok:
en_cok = adet
en_sik = kelime
yazdir(f"En sık geçen: \"{en_sik}\" ({en_cok} kez)")
yazdir()
# ── Not defteri: öğrenci → not ────────────────────────────────
notlar = {"Ayşe": 88, "Mehmet": 64, "Elif": 92, "Can": 47, "Deniz": 75}
toplam = 0
gecen = 0
dongu ogrenci icinde notlar.anahtarlar():
toplam += notlar[ogrenci]
eger notlar[ogrenci] >= 50:
gecen += 1
yazdir(f"Sınıf ortalaması {toplam / notlar.uzunluk():.1f}; {notlar.uzunluk()} öğrenciden {gecen} kişi geçti.")
+98
View File
@@ -0,0 +1,98 @@
# Metinler: Türkçe büyük/küçük harf, bölme, birleştirme, arama ve uzunluk
#
# Metin (string) bir harf dizisidir. KabaLang metinleri Türkçe kurallara göre
# işler: "i" büyüyünce "İ", "I" küçülünce "ı" olur. Birçok dilde bu yanlış çalışır.
# Bir metni tersine çeviren fonksiyon: harfleri tek tek gezip her birini başa ekler.
fonksiyon ters_cevir(m: metin) -> metin:
sonuc = ""
dongu harf icinde m:
sonuc = harf + sonuc
don sonuc
# Boşlukları ve büyük/küçük farkını atınca tersi kendisine eşit mi?
fonksiyon palindrom_mu(m: metin) -> mantik:
sade = m.kucult().degistir(" ", "")
don sade == ters_cevir(sade)
# ── Türkçe büyük/küçük harf ───────────────────────────────────
sehir = "istanbul"
yazdir(f"\"{sehir}\".buyut() → {sehir.buyut()}")
yazdir(f"\"IĞDIR\".kucult() → {'IĞDIR'.kucult()}")
yazdir(f"\"ılık İğne\".buyut() → {'ılık İğne'.buyut()}")
yazdir(f"\"ŞİŞLİ ÖĞÜT\".kucult() → {'ŞİŞLİ ÖĞÜT'.kucult()}")
# Büyük/küçük harfe aldırmadan karşılaştırmak için iki tarafı da küçültürüz.
girilen = "İZMİR"
eger girilen.kucult() == "izmir":
yazdir(f"\"{girilen}\" ile \"izmir\" aynı şehir")
yazdir()
# ── Uzunluk ve harflere erişim ────────────────────────────────
# uzunluk() harf sayısını verir; ş, ğ, İ gibi harfler de tek harf sayılır.
kelime = "Şanlıurfa"
yazdir(f"\"{kelime}\" {kelime.uzunluk()} harf")
yazdir(f"İlk harf: {kelime[0]}, son harf: {kelime[-1]}, 0..3 arası: {kelime[0..3]}")
yazdir(f"bastan(5): {kelime.bastan(5)}, sondan(4): {kelime.sondan(4)}, dilim(2, 3): {kelime.dilim(2, 3)}")
yazdir()
# ── Temizleme, arama, değiştirme ──────────────────────────────
# kirp() baştaki ve sondaki boşlukları siler; kullanıcı girdisinde çok işe yarar.
ham = " Merhaba Dünya "
yazdir(f"[{ham}] → [{ham.kirp()}]")
cumle = "Ankara Türkiye'nin başkentidir"
yazdir(f"\"başkent\" geçiyor mu? {cumle.icerir('başkent')}")
yazdir(f"\"Ankara\" ile mi başlıyor? {cumle.ile_baslar('Ankara')}")
yazdir(f"\"dir\" ile mi bitiyor? {cumle.ile_biter('dir')}")
yazdir(f"\"Türkiye\" hangi konumda başlıyor? {cumle.bul('Türkiye')} (0'dan sayarak; yoksa -1)")
yazdir(f"Değiştir: {cumle.degistir('Ankara', 'Bursa').degistir('başkentidir', 'dördüncü büyük şehridir')}")
yazdir()
# ── Bölme ve birleştirme ──────────────────────────────────────
# bol(ayrac) metni parçalara ayırıp liste verir; birlestir(ayrac) tersini yapar.
satir = "Ayşe;Kaya;Eskişehir;34"
alanlar = satir.bol(";")
yazdir(f"Bölündü : {alanlar} ({alanlar.uzunluk()} parça)")
yazdir(f"Ad soyad: {alanlar[0]} {alanlar[1].buyut()}")
yazdir(f"Birleşti: {alanlar.birlestir(' | ')}")
# Bir cümleyi kelimelere ayırıp her kelimenin ilk harfini büyütelim.
baslik = "yaşlı ırmak ile genç irmik"
kelimeler = baslik.bol(" ")
duzgun = []
dongu k icinde kelimeler:
duzgun.ekle(k.bastan(1).buyut() + k.dilim(1, k.uzunluk() - 1))
yazdir(f"Başlık biçimi: {duzgun.birlestir(' ')}")
yazdir()
# ── Harf harf gezme ───────────────────────────────────────────
# dongu harf icinde metin: her turda bir harf gelir.
metin_ornegi = "Çalışkan öğrenciler ödevlerini erken bitirir"
unlu = 0
bosluk = 0
dongu harf icinde metin_ornegi.kucult():
eger "aeıioöuü".icerir(harf):
unlu += 1
degilse eger harf == " ":
bosluk += 1
yazdir(f"\"{metin_ornegi}\"")
yazdir(f" {metin_ornegi.uzunluk()} karakter, {unlu} ünlü, {bosluk + 1} kelime")
dongu aday icinde ["Ey Edip Adanada pide ye", "Kayak", "Kalem"]:
eger palindrom_mu(aday):
yazdir(f" \"{aday}\" tersten de aynı okunur")
degilse:
yazdir(f" \"{aday}\" tersten \"{ters_cevir(aday)}\" olur")
yazdir()
# ── Tekrarlama ve hizalama ────────────────────────────────────
# tekrarla(n) metni n kez yan yana koyar. f-string içinde
# {x:<10} sola, {x:>10} sağa, {x:^10} ortaya yaslar.
yazdir("=".tekrarla(32))
yazdir(f"{'ŞEHİR':^32}")
yazdir("=".tekrarla(32))
dongu ad icinde ["Rize", "Muğla", "Çanakkale"]:
yazdir(f"{ad:<14}|{ad.buyut():>17}")
yazdir("=".tekrarla(32))
+132
View File
@@ -0,0 +1,132 @@
# Yapılar ve sınıflar: kendi türünü tanımlamak, metotlar ve nesne listeleri
#
# Bir kitabın adı, yazarı, sayfa sayısı ve yılı birbirine aittir. Bunları dört
# ayrı değişkende tutmak yerine tek bir "Kitap" türünde toplarız.
# yapi : ilgili verileri (alanları) ve onlarla çalışan fonksiyonları bir arada tutar
# sinif : yapıya ek olarak kurucu (kur) ve self ile çalışan metotlar sunar
# ── yapi: alanlar ve metotlar ─────────────────────────────────
# Her alana bir varsayılan değer verilir; alanın türü bu değerden anlaşılır.
# Yapının içindeki fonksiyonlara metot denir. Metotlar alanlara doğrudan adıyla ulaşır.
yapi Kitap:
ad = ""
yazar = ""
sayfa = 0
yil = 0
fonksiyon ozet() -> metin:
don f"{ad} ({yazar}, {yil})"
fonksiyon okuma_suresi(gunluk_sayfa: sayi) -> sayi:
# Kalan sayfaları da saymak için yukarı yuvarlıyoruz.
don (sayfa + gunluk_sayfa - 1) // gunluk_sayfa
# ── sayilabilir: sınırlı seçenekler ───────────────────────────
# Bir değişken yalnız belli değerleri alabiliyorsa sayilabilir kullanılır.
# Yanlış yazılan bir üye (Durum.KAYIP gibi) program çalışmadan yakalanır.
sayilabilir Durum:
RAFTA
ODUNCTE
# ── sinif: kurucu ve self ─────────────────────────────────────
# kur(self, ...) nesne oluşturulurken çalışır. self "bu nesnenin kendisi" demektir;
# self.ad, bu okuyucunun adı alanıdır.
sinif Okuyucu:
ad = ""
okunan_sayfa = 0
kitap_sayisi = 0
fonksiyon kur(self, ad_: metin):
self.ad = ad_
# Metot nesnenin kendi alanlarını değiştirir; değişiklik kalıcıdır.
fonksiyon bitirdi(self, k: Kitap):
self.okunan_sayfa = self.okunan_sayfa + k.sayfa
self.kitap_sayisi = self.kitap_sayisi + 1
fonksiyon rapor(self) -> metin:
don f"{self.ad}: {self.kitap_sayisi} kitap, toplam {self.okunan_sayfa} sayfa"
# ════════════════ Program buradan başlıyor ════════════════
# ── Nesne oluşturmak ──────────────────────────────────────────
# Yol 1: boş nesne oluşturup alanları tek tek doldurmak.
k1 = Kitap()
k1.ad = "Çalıkuşu"
k1.yazar = "Reşat Nuri Güntekin"
k1.sayfa = 544
k1.yil = 1922
# Yol 2: alanları tanım sırasıyla vermek (ad, yazar, sayfa, yil).
k2 = Kitap("Kuyucaklı Yusuf", "Sabahattin Ali", 232, 1937)
yazdir(k1.ozet())
yazdir(k2.ozet())
yazdir(f"{k2.ad} günde 20 sayfayla {k2.okuma_suresi(20)} günde biter.")
# Yapıyı doğrudan yazdırınca bütün alanları görünür.
yazdir(k2)
yazdir()
# ── Nesne listesi ─────────────────────────────────────────────
raf = [k1, k2]
raf.ekle(Kitap("İnce Memed", "Yaşar Kemal", 436, 1955))
raf.ekle(Kitap("Tutunamayanlar", "Oğuz Atay", 724, 1972))
raf.ekle(Kitap("Saatleri Ayarlama Enstitüsü", "Ahmet Hamdi Tanpınar", 382, 1961))
yazdir(f"{'Kitap':<30}{'Yazar':<22}{'Yıl':>5}{'Sayfa':>7}")
yazdir("─".tekrarla(64))
dongu k icinde raf:
yazdir(f"{k.ad:<30}{k.yazar:<22}{k.yil:>5}{k.sayfa:>7}")
yazdir()
# Listedeki nesnelerin alanlarıyla hesap: en kalın kitap ve toplam sayfa.
en_kalin = raf[0]
toplam_sayfa = 0
dongu k icinde raf:
toplam_sayfa += k.sayfa
eger k.sayfa > en_kalin.sayfa:
en_kalin = k
yazdir(f"Raftaki {raf.uzunluk()} kitap toplam {toplam_sayfa:,} sayfa.")
yazdir(f"En kalını: {en_kalin.ozet()}, {en_kalin.sayfa} sayfa")
# Yıla göre sıralama: her adımda kalan kitapların en eskisini öne alıyoruz (seçmeli sıralama).
i = 0
iken i < raf.uzunluk():
en_eski = i
j = i + 1
iken j < raf.uzunluk():
eger raf[j].yil < raf[en_eski].yil:
en_eski = j
j += 1
gecici = raf[i]
raf[i] = raf[en_eski]
raf[en_eski] = gecici
i += 1
yazdir("Yayın yılına göre:")
dongu k icinde raf:
yazdir(f" {k.yil} {k.ad}")
yazdir()
# ── sayilabilir değerlerle çalışmak ───────────────────────────
durum = Durum.RAFTA
yazdir(f"{k2.ad}: {durum}")
durum = Durum.ODUNCTE
eger durum == Durum.ODUNCTE:
yazdir(f"{k2.ad} şu an ödünç verildi.")
yazdir()
# ── Sınıf nesnesiyle çalışmak ─────────────────────────────────
# Okuyucu("Elif") yazınca kur(self, "Elif") çağrılır.
elif = Okuyucu("Elif")
emre = Okuyucu("Emre")
elif.bitirdi(raf[0])
elif.bitirdi(raf[2])
emre.bitirdi(raf[4])
# Her nesnenin kendi alanları vardır; Elif'in okuduğu Emre'yi etkilemez.
yazdir(elif.rapor())
yazdir(emre.rapor())
+116
View File
@@ -0,0 +1,116 @@
# Hatalar: sonuc türüyle beklenen hatalar, ? ile yayma, dene/yakala/firlat
#
# Programlar her zaman yolunda gitmez: kullanıcı yanlış değer girer, bir sayı
# sıfıra bölünür, listede olmayan bir sıra istenir. KabaLang'de iki yol vardır:
# sonuc<T, Hata> : beklenebilir hatalar için. Fonksiyon ya başarıyı (tamam)
# ya da hatayı (hata) döndürür; çağıran ikisini de ele almak zorundadır.
# dene / yakala / firlat : programın o noktada devam edemeyeceği durumlar için.
# ── sonuc: başarı ya da hata döndüren fonksiyon ───────────────
# Dönüş türü sonuc<sayi, Hata>: başarıda bir sayı, başarısızlıkta bir hata taşır.
fonksiyon yas_coz(girdi: metin) -> sonuc<sayi, Hata>:
temiz = girdi.kirp()
eger temiz.bos_mu():
don hata("yaş boş bırakılamaz")
# Her karakter bir rakam mı?
dongu harf icinde temiz:
eger degil "0123456789".icerir(harf):
don hata(f"'{temiz}' bir sayı değil")
yas = sayi(temiz)
eger yas > 130:
don hata(f"{yas} yaş gerçekçi değil")
don tamam(yas)
# ── ?: hatayı yukarı iletmek ──────────────────────────────────
# yas_coz(...)? şunu der: sonuç hataysa bu fonksiyondan da AYNI hatayla hemen çık;
# başarılıysa içindeki sayıyı ver. Her adımda eger yazmaktan kurtarır.
# ? yalnız kendisi de sonuc döndüren bir fonksiyonun içinde kullanılabilir.
fonksiyon yas_farki(birinci: metin, ikinci: metin) -> sonuc<sayi, Hata>:
a = yas_coz(birinci)?
b = yas_coz(ikinci)?
eger a > b:
don tamam(a - b)
don tamam(b - a)
# ── firlat: devam edilemeyen durum ────────────────────────────
# firlat çalışınca fonksiyon orada biter; hata, onu yakalayan ilk dene bloğuna kadar çıkar.
fonksiyon stoktan_dus(stok: sayi, adet: sayi) -> sayi:
eger adet <= 0:
firlat hata(f"geçersiz adet: {adet}")
eger adet > stok:
firlat hata(f"stokta {stok} ürün var, {adet} istendi")
don stok - adet
fonksiyon yesil(m: metin) -> metin:
don "\033[32m" + m + "\033[0m"
fonksiyon kirmizi(m: metin) -> metin:
don "\033[31m" + m + "\033[0m"
# ════════════════ Program buradan başlıyor ════════════════
# ── sonuc'u kullanmak ─────────────────────────────────────────
yazdir("Yaş girdilerini denetleyelim:")
dongu girdi icinde ["34", " 7 ", "", "otuz", "250"]:
r = yas_coz(girdi)
# tamam_mi() / hatali_mi() hangisi olduğunu söyler.
# deger() başarıdaki sayıyı, hata().mesaj() hatanın açıklamasını verir.
eger r.tamam_mi():
yazdir(yesil(" ✓ ") + f"\"{girdi}\" → {r.deger()} yaş")
degilse:
yazdir(kirmizi(" ✗ ") + f"\"{girdi}\" → {r.hata().mesaj()}")
# sonuc döndüren bir fonksiyonu çağırıp sonucu hiç kullanmamak derleme hatasıdır:
# yas_coz("12") tek başına bir satırda yazılırsa program derlenmez.
# Sonucu bilerek atmak istiyorsan bunu açıkça yazarsın: _ = yas_coz("12")
yazdir()
yazdir("Yaş farkları:")
dongu ikili icinde [["40", "12"], ["40", "kırk"], ["", "12"]]:
f = yas_farki(ikili[0], ikili[1])
eger f.tamam_mi():
yazdir(f" {ikili[0]} ile {ikili[1]} arası {f.deger()} yıl")
degilse:
yazdir(f" hesaplanamadı: {f.hata().mesaj()}")
yazdir()
# ── dene / yakala ─────────────────────────────────────────────
# dene bloğunda bir hata fırlatılırsa blok orada kesilir ve yakala bloğu çalışır.
# yakala h: hata metnini h adıyla verir. Hata olmazsa yakala hiç çalışmaz.
stok = 10
dongu istek icinde [3, 4, 0, 5]:
dene:
stok = stoktan_dus(stok, istek)
yazdir(f" {istek} adet satıldı, stokta {stok} kaldı")
yakala h:
yazdir(kirmizi(" satış yapılamadı: ") + h)
yazdir()
# ── Dilin kendi fırlattığı hatalar ────────────────────────────
# Sıfıra bölme, listede olmayan bir sıra, sözlükte olmayan bir anahtar...
# Yakalanmazlarsa program bu satırda durur. Yakalanırlarsa program devam eder.
# Hata metni dosya adını ve satır numarasını da içerir; hatayı bulmanın ilk ipucu budur.
bolen = 0
dene:
yazdir(100 // bolen)
yakala h:
yazdir("Bölme hatası yakalandı:")
yazdir(f" {h}")
sehirler = ["Rize", "Artvin"]
dene:
yazdir(sehirler[5])
yakala h:
yazdir("Liste hatası yakalandı:")
yazdir(f" {h}")
# yakala'dan sonra ad yazmazsak hata metni kullanılmaz, yalnız yakalanır.
basarili = dogru
dene:
firlat "bağlantı kurulamadı"
yakala:
basarili = yanlis
yazdir(f"İşlem başarılı mı? {basarili}")
yazdir()
yazdir("Bütün hatalar ele alındı; program sonuna kadar çalıştı.")
+107
View File
@@ -0,0 +1,107 @@
# Dosyalar: metin ve JSON dosyasına yazmak, dosyayı geri okuyup işlemek
#
# Program bittiğinde değişkenlerdeki her şey kaybolur. Bilgiyi saklamak için
# dosyaya yazarız; program bir sonraki çalışmada onu geri okuyabilir.
# Bu ders çalıştığı klasörde iki dosya oluşturur: alisveris.txt ve sinif.json.
# Program bitince dosyalar yerinde kalır; açıp içlerine bakabilirsin.
kullan kaba.sistem
degismez LISTE_DOSYASI = "alisveris.txt"
degismez JSON_DOSYASI = "sinif.json"
# ── 1. Metin dosyasına yazmak ─────────────────────────────────
# dosya.yaz(yol, metin) dosyayı oluşturur; dosya zaten varsa içeriğini SİLİP yeniden yazar.
# Her satırın sonuna \n koyuyoruz; yoksa bütün satırlar yan yana birleşirdi.
# Satır biçimimiz: ürün;adet;birim fiyat
dosya.yaz(LISTE_DOSYASI, "ekmek;2;12.50\n")
# dosya.ekle(yol, metin) var olan içeriğe dokunmadan sonuna ekler.
dosya.ekle(LISTE_DOSYASI, "süt;1;34.90\n")
dosya.ekle(LISTE_DOSYASI, "domates;3;18.75\n")
dosya.ekle(LISTE_DOSYASI, "peynir;1;149.00\n")
yazdir(f"{LISTE_DOSYASI} yazıldı: {dosya.boyut(LISTE_DOSYASI)} bayt")
# ── 2. Metin dosyasını okumak ─────────────────────────────────
# dosya.oku(yol) bütün dosyayı tek bir metin olarak verir.
# Olmayan bir dosyayı okumak hata vermez, boş metin döner; bu yüzden önce var_mi() ile soruyoruz.
eger dosya.var_mi(LISTE_DOSYASI):
icerik = dosya.oku(LISTE_DOSYASI)
# kirp() sondaki \n'yi atar, bol("\n") metni satırlara ayırır.
satirlar = icerik.kirp().bol("\n")
yazdir(f"{satirlar.uzunluk()} satır okundu:")
yazdir()
toplam = 0.0
yazdir(f" {'Ürün':<10}{'Adet':>5}{'Fiyat':>9}{'Tutar':>10}")
yazdir(" " + "─".tekrarla(34))
dongu satir icinde satirlar:
# Her satırı ; işaretinden bölüp parçaları uygun türe çeviriyoruz.
parca = satir.bol(";")
urun = parca[0]
adet = sayi(parca[1])
fiyat = ondalik(parca[2])
tutar = adet * fiyat
toplam += tutar
yazdir(f" {urun:<10}{adet:>5}{fiyat:>9.2f}{tutar:>10.2f}")
yazdir(" " + "─".tekrarla(34))
yazdir(f" {'Toplam':<24}{toplam:>10.2f} TL")
yazdir()
eger degil dosya.var_mi("olmayan-dosya.txt"):
yazdir("olmayan-dosya.txt bulunamadı (beklenen durum).")
yazdir()
# ── 3. JSON dosyasına yazmak ──────────────────────────────────
# JSON, sözlük ve listeleri metne dönüştürmenin yaygın bir biçimidir; başka
# programlar ve diller de okuyabilir. Önce bilgiyi sözlüklerle kuruyoruz.
ogrenciler = {}
ogrenciler["Ayşe"] = {"not": 88, "sehir": "Eskişehir"}
ogrenciler["Mehmet"] = {"not": 64, "sehir": "Konya"}
ogrenciler["Elif"] = {"not": 92, "sehir": "Trabzon"}
ogrenciler["Can"] = {"not": 47, "sehir": "Mersin"}
# Adı "sinif" koyamıyoruz: sinif dilin anahtar sözcüğü, değişken adı olamaz.
sinif_bilgisi = {"ad": "9-A", "ogretmen": "Deniz Arslan", "ogrenciler": ogrenciler}
# json.uret(sozluk, dogru) okunaklı, girintili bir JSON metni üretir.
# (İkinci değer yazılmazsa her şey tek satıra sıkıştırılır.)
# Anahtarlar dosyaya alfabetik sırayla yazılır.
json_metni = json.uret(sinif_bilgisi, dogru)
dosya.yaz(JSON_DOSYASI, json_metni)
yazdir(f"{JSON_DOSYASI} yazıldı. İçeriği:")
yazdir(json_metni)
# ── 4. JSON dosyasını geri okumak ─────────────────────────────
okunan = dosya.oku(JSON_DOSYASI)
# Bozuk bir dosyayı çözmeye kalkmadan önce geçerli JSON olup olmadığını soruyoruz.
eger json.gecerli_mi(okunan):
veri = json.coz(okunan)
# Çözülen veride anahtarlarla iç içe ilerlenir: veri["ogrenciler"]["Elif"]["not"].
# JSON'dan gelen değerin türü derleme anında bilinmez; sayi() ve metin() ile
# hangi türde kullanacağımızı açıkça söylüyoruz.
yazdir(f"Sınıf {metin(veri['ad'])}, öğretmen {metin(veri['ogretmen'])}")
toplam_not = 0
sayac = 0
dongu ad icinde veri["ogrenciler"].anahtarlar():
kayit = veri["ogrenciler"][ad]
notu = sayi(kayit["not"])
toplam_not += notu
sayac += 1
durum = "geçti"
eger notu < 50:
durum = "kaldı"
yazdir(f" {ad:<8}{metin(kayit['sehir']):<11}{notu:>4} {durum}")
yazdir(f"Ortalama: {toplam_not / sayac:.1f}")
degilse:
yazdir(f"{JSON_DOSYASI} geçerli bir JSON değil.")
# Bozuk JSON örneği: süslü parantez kapanmamış.
bozuk = "{\"ad\": \"9-A\""
yazdir()
yazdir(f"{bozuk} geçerli JSON mu? {json.gecerli_mi(bozuk)}")
+4
View File
@@ -17,6 +17,10 @@ kullan kaba.sistem
SORU = "Bir sonraki KabaLang örneği ne olsun?"
PORT = 8473
# Barındıran ortam (ör. Online IDE) portu PORT ortam değişkeniyle verir.
port_ortam = cevre.al("PORT")
eger port_ortam != "":
PORT = sayi(port_ortam)
db = cevre.al("ANKET_DB")
eger db == "":
+4
View File
@@ -18,6 +18,10 @@ kullan kaba.sistem
ALFABE = "abcdefghjkmnpqrstuvwxyz23456789"
KOD_UZUNLUGU = 6
PORT = 8472
# Barındıran ortam (ör. Online IDE) portu PORT ortam değişkeniyle verir.
port_ortam = cevre.al("PORT")
eger port_ortam != "":
PORT = sayi(port_ortam)
db = cevre.al("KISALT_DB")
eger db == "":
+7 -2
View File
@@ -143,7 +143,12 @@ fonksiyon kaldir(istek):
don web.yanit("", 204)
# Tek iş parçacığı: SQLite'a yazan işleyiciler sırayla koşar.
sunucu = web.sunucu(8471, "127.0.0.1", 1)
# Barındıran ortam (ör. Online IDE) portu PORT ortam değişkeniyle verir.
port = 8471
port_ortam = cevre.al("PORT")
eger port_ortam != "":
port = sayi(port_ortam)
sunucu = web.sunucu(port, "127.0.0.1", 1)
sunucu.hatalar_json()
sunucu.govde_siniri(16384)
@@ -154,5 +159,5 @@ sunucu.guncelle("/api/gorevler/{id}", guncelle)
# DELETE yöntemi `sunucu.kaldir` ile bağlanır
sunucu.kaldir("/api/gorevler/{id}", kaldir)
yazdir("📋 Pano hazır — http://127.0.0.1:8471")
yazdir("📋 Pano hazır — http://127.0.0.1:" + metin(port))
sunucu.basla()