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:
@@ -13,8 +13,21 @@ kabalang calistir konsol/fraktal/fraktal.kbl
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
**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
|
## Konsol
|
||||||
|
|
||||||
| | Proje | Ne gösteriyor |
|
| | Proje | Ne gösteriyor |
|
||||||
@@ -39,10 +52,10 @@ kabalang calistir konsol/fraktal/fraktal.kbl
|
|||||||
|  | [**Kısalt**](web/kisalt) | Bağlantı kısaltıcı: gerçek 302 yönlendirme, tıklama sayacı, sunucuda çizilen SVG grafik |
|
|  | [**Kısalt**](web/kisalt) | Bağlantı kısaltıcı: gerçek 302 yönlendirme, tıklama sayacı, sunucuda çizilen SVG grafik |
|
||||||
|  | [**Anket**](web/anket) | Canlı anket: adres başına tek oy, POST → 303 → GET, sonuç grafiği KabaLang'da üretilir |
|
|  | [**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.
|
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 |
|
| | Proje | Ne gösteriyor |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
```
|
||||||
@@ -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.
|
||||||
|
```
|
||||||
@@ -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.
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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ış
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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))
|
||||||
|
%%%
|
||||||
|
*
|
||||||
|
**
|
||||||
|
***
|
||||||
|
****
|
||||||
|
*****
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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]
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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ı
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
```
|
||||||
@@ -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.
|
||||||
@@ -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)
|
||||||
@@ -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")
|
||||||
@@ -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.")
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
Ayşe Yılmaz
|
||||||
|
1998
|
||||||
|
68.5
|
||||||
|
1.65
|
||||||
|
on iki
|
||||||
@@ -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")
|
||||||
@@ -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ı.")
|
||||||
@@ -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()
|
||||||
@@ -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]}")
|
||||||
@@ -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.")
|
||||||
@@ -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))
|
||||||
@@ -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())
|
||||||
@@ -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ı.")
|
||||||
@@ -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)}")
|
||||||
@@ -17,6 +17,10 @@ kullan kaba.sistem
|
|||||||
|
|
||||||
SORU = "Bir sonraki KabaLang örneği ne olsun?"
|
SORU = "Bir sonraki KabaLang örneği ne olsun?"
|
||||||
PORT = 8473
|
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")
|
db = cevre.al("ANKET_DB")
|
||||||
eger db == "":
|
eger db == "":
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ kullan kaba.sistem
|
|||||||
ALFABE = "abcdefghjkmnpqrstuvwxyz23456789"
|
ALFABE = "abcdefghjkmnpqrstuvwxyz23456789"
|
||||||
KOD_UZUNLUGU = 6
|
KOD_UZUNLUGU = 6
|
||||||
PORT = 8472
|
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")
|
db = cevre.al("KISALT_DB")
|
||||||
eger db == "":
|
eger db == "":
|
||||||
|
|||||||
+7
-2
@@ -143,7 +143,12 @@ fonksiyon kaldir(istek):
|
|||||||
don web.yanit("", 204)
|
don web.yanit("", 204)
|
||||||
|
|
||||||
# Tek iş parçacığı: SQLite'a yazan işleyiciler sırayla koşar.
|
# 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.hatalar_json()
|
||||||
sunucu.govde_siniri(16384)
|
sunucu.govde_siniri(16384)
|
||||||
|
|
||||||
@@ -154,5 +159,5 @@ sunucu.guncelle("/api/gorevler/{id}", guncelle)
|
|||||||
# DELETE yöntemi `sunucu.kaldir` ile bağlanır
|
# DELETE yöntemi `sunucu.kaldir` ile bağlanır
|
||||||
sunucu.kaldir("/api/gorevler/{id}", kaldir)
|
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()
|
sunucu.basla()
|
||||||
|
|||||||
Reference in New Issue
Block a user