İçeriğe geç
academia.sh

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:

  1. Girdi nedir? Türü, aralığı ve geçerlilik koşulları.
  2. Çıktı nedir? Tek değer mi, koleksiyon mu, yan etki mi.
  3. Hangi durumlar özeldir? Boş girdi, tek elemanlı girdi, eşit değerler, geçersiz değerler.
  4. 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 37/312,3337 / 3 \approx 12{,}33; en büyük 1818. 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat