Ders 09 / 18
Sözde Kod
Çözümü dilden bağımsız yazma, elle izleme tablosuyla sınama ve kenar durumların belirlenmesi.
İçindekiler
Önceki üç ders, denetim yapılarını doğrudan kod üzerinden tanıttı. Karmaşık bir problemde ise sıra tersine döner: önce çözüm tasarlanır, sonra koda çevrilir. Tasarımı doğrudan dilin sözdiziminde yapmak, iki farklı sorunu — “ne yapılacak” ve “nasıl yazılacak” — aynı anda düşünmeyi gerektirir.
Bu ders, çözümü dilden bağımsız yazmanın ve koda dökmeden önce sınamanın yollarını tanımlar.
Sözde Kod Nedir
Sözde kod, bir çözümü doğal dile yakın ama adımları belirsizlik bırakmayacak kesinlikte yazma biçimidir. Derlenmez, çalıştırılmaz; okunur.
Katı bir sözdizimi yoktur, ancak yaygın sözleşmeler vardır:
- Atama için ok veya “olsun” ifadesi kullanılır.
- Bloklar girinti ile gösterilir.
- Döngü ve koşullar açık yazılır: her ölçüm için, eğer … ise.
- Dile özgü ayrıntılar — kütüphane adları, tip bildirimleri, bellek yönetimi — dışarıda bırakılır.
Ölçüsü şudur: sözde kodu okuyan iki kişi, aynı davranışı anlamalıdır — çözümün tartışıldığı yer, kod yazılmadan önceki bu metindir. Belirsizlik kalıyorsa yeterince ayrıntılı değildir; dilin sözdizimine yaklaşıyorsa gereğinden fazla ayrıntılıdır.
Problemi Çözümlemek
Sözde kod yazmadan önce problemin anlaşılması gerekir. Dört soru bu işi yapar:
- Girdi nedir? Türü, aralığı ve geçerlilik koşulları.
- Çıktı nedir? Tek değer mi, koleksiyon mu, yan etki mi.
- Hangi durumlar özeldir? Boş girdi, tek elemanlı girdi, eşit değerler, geçersiz değerler.
- Elle nasıl çözerdim? Küçük bir örnek üzerinde adımları söze dökmek, çözümün kendisini ortaya çıkarır.
Dördüncü soru en verimlisidir. Beş ölçümün ortalamasını elle hesaplayan biri, farkında olmadan bir birikeç kalıbı kullanır: sayıları sırayla toplar, sonra beşe böler.
Ortak Problemin Sözde Kodu
Kursun ortak problemi — ortalama ve en büyük değer — sözde kodla şöyle yazılır:
GİRDİ: ölçümler (sayı listesi)
ÇIKTI: ortalama (sayı), en_büyük (sayı)
eğer ölçümler boş ise
hata bildir: "boş girdi"
toplam ← 0
en_büyük ← ölçümler[0]
her ölçüm için ölçümler içinde
toplam ← toplam + ölçüm
eğer ölçüm > en_büyük ise
en_büyük ← ölçüm
ortalama ← toplam / ölçümlerin sayısı
ortalama ve en_büyük'ü döndür
Bu metinde hiçbir dile ait ayrıntı yoktur; buna karşılık her adım tektir ve tartışmaya
yer bırakmaz. Boş girdi denetiminin döngüden önce yapıldığına dikkat edin: en_büyük
değişkeninin ilk elemanla başlatılması, listenin boş olmadığını varsayar.
Aynı sözde kod, iki döngü yerine tek döngüde iki birikeç kullanır. Bu bir tasarım kararıdır: veri bir kez gezilir, iki sonuç birlikte üretilir.
Elle İzleme
Çözümün doğruluğu, koda çevrilmeden önce izleme tablosuyla sınanabilir. Tabloda her satır bir turu, her sütun bir değişkeni gösterir.
[12, 18, 7] girdisi için:
| Tur | ölçüm | toplam | en_büyük |
|---|---|---|---|
| başlangıç | — | 0 | 12 |
| 1 | 12 | 12 | 12 |
| 2 | 18 | 30 | 18 |
| 3 | 7 | 37 | 18 |
| sonuç | — | 37 | 18 |
Ortalama ; en büyük . Sonuçlar elle hesaplananla uyuşur.
İzleme tablosu iki tür hatayı yakalar: yanlış başlangıç değeri ve yanlış güncelleme
sırası. Örneğin en_büyük sıfırla başlatılsaydı, tüm ölçümler negatif olan bir girdide
tablo sonucun sıfır çıktığını hemen gösterirdi.
Yöntem yavaştır ve büyük girdilerde uygulanamaz; amacı da bu değildir. Üç–dört elemanlık bir girdi, mantık hatalarının çoğunu açığa çıkarmaya yeter. Aynı tablo, hata ayıklama sırasında çalışan bir program üzerinde de kurulabilir: değişkenlerin her turdaki değerini yazdırmak, izleme tablosunu programın kendisine hazırlatmaktır.
Kenar Durumlar
Bir çözümün olağan girdide çalışması yeterli değildir. Kenar durumlar, çözümün varsayımlarının kırıldığı yerlerdir:
| Kenar durum | Bu problemdeki davranış |
|---|---|
| Boş liste | Ortalama tanımsız; hata bildirilir |
| Tek eleman | Ortalama o eleman, en büyük o eleman |
| Tüm değerler eşit | En büyük, o değer |
| Tüm değerler negatif | En büyük, en az negatif olan |
| Çok büyük değerler | Toplam, tip aralığını aşabilir |
Son satır, önceki kursun taşma dersine bağlanır: sabit genişlikli bir tipte biriken toplam, aralık dışına çıkarsa sessizce yanlış sonuç verir.
Kenar durumların listelenmesi, sonradan yazılacak testlerin de listesidir. Yazılım kalitesi müfredatında bu, sınır değer analizi olarak adlandırılır.
Problemi Alt Problemlere Bölmek
Ortak problem tek bir sözde kod bloğuna sığdı. Gerçek problemler sığmaz; çözüm, tek parça hâlinde hem yazılamaz hem izlenemez.
Standart yöntem ayrıştırmadır: problem, her biri tek bir işi yapan alt problemlere bölünür. Ölçüm verisiyle çalışan bir program şöyle ayrışabilir:
oku(kaynak) → ham satırlar ayıkla(ham satırlar) → geçerli ölçümler, atlanan sayısı özetle(ölçümler) → ortalama, en büyük raporla(ortalama, en büyük, atlanan) → çıktı metni
Dört adımın her biri ayrı ayrı yazılabilir, ayrı ayrı sınanabilir ve biri değiştiğinde diğerleri etkilenmez. Bölmenin ölçütü, adımın tek cümleyle anlatılabilmesidir: “ve” bağlacıyla birleştirilen iki iş yapan bir adım, muhtemelen ikiye bölünmelidir.
Bu ayrıştırmanın koddaki karşılığı fonksiyonlardır. Sözde kodda bir adıma ad vermek, kodda bir fonksiyon tanımlamaya karşılık gelir; bu nedenle ayrıştırma, kod yazılmadan önce yapılan bir tasarım işidir.
Sözde Koddan Koda
Çeviri, sözde kodun her satırının hedef dildeki karşılığını yazmaktır:
def ozetle(olcumler: list[int]) -> tuple[float, int]: """Ölçümlerin ortalamasını ve en büyüğünü döndürür.""" if not olcumler: raise ValueError("boş girdi") toplam = 0 en_buyuk = olcumler[0] for olcum in olcumler: toplam += olcum if olcum > en_buyuk: en_buyuk = olcum return toplam / len(olcumler), en_buyuk print(ozetle([12, 18, 7])) # (12.333333333333334, 18) print(ozetle([12, 18, 7, 25, 14])) # (15.2, 25)
İlk çıktı, izleme tablosunda elle hesaplanan değerlerle uyuşur — bu, çevirinin doğru yapıldığının kanıtıdır.
Çeviri sırasında sözde kodda olmayan kararlar ortaya çıkar: hata nasıl bildirilecek, iki değer nasıl birlikte döndürülecek, tipler ne olacak. Bu kararlar dile aittir ve sözde kodun eksikliği değildir; sözde kodun bilinçli olarak dışarıda bıraktığı ayrıntılardır.
Özet
- Sözde kod, çözümü dilden bağımsız ve belirsizlik bırakmadan yazma biçimidir; ölçüsü iki okuyucunun aynı davranışı anlamasıdır.
- Problem çözümlemesi dört soruyla yapılır: girdi, çıktı, özel durumlar ve elle çözüm.
- İzleme tablosu, çözümü çalıştırmadan sınar; yanlış başlangıç değeri ve yanlış güncelleme sırası bu yolla yakalanır.
- Kenar durumların listesi, sonradan yazılacak testlerin listesidir.
- Sözde koddan koda çeviri sırasında ortaya çıkan kararlar dile aittir; sözde kod bu ayrıntıları bilinçli olarak dışarıda bırakır.
Sonraki Adım
Son örnekteki çözüm bir def bloğuyla sarmalandı ve ozetle adıyla anıldı. Bu yapı
şimdiye kadar açıklanmadan kullanıldı. Sonraki konu, fonksiyonları tanımlar: parametre
ve dönüş değeri nasıl çalışır, adlar hangi bölgede geçerlidir ve bir fonksiyon kendini
çağırdığında ne olur?
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.