Ek Çalışma — Bozuk Kod Havuzu

Bozuk kod havuzu

Her vaka için aynı dört adımı uygulayın:

  1. Programın amaçlanan davranışını okuyun.
  2. Hatanın bulunduğu satırı/yapıyı belirleyin.
  3. Nedenini kendi cümlenizle açıklayın.
  4. En küçük düzeltmeyi yapın ve en az bir sınır durumuyla yeniden deneyin.

A — Sınır ve off-by-one hataları (6 vaka)

A1 — 1’den 5’e kadar yazdır

Amaç: 1 2 3 4 5

for i in range(1, 5):
    print(i, end=" ")

Gözlenen: 1 2 3 4

A2 — 0 dahil 4 elemanı işle

Amaç: Listenin dört elemanını da yazdırmak.

sayilar = [10, 20, 30, 40]
for i in range(1, len(sayilar)):
    print(sayilar[i])

Gözlenen: 10 hiç yazdırılmıyor.

A3 — Metnin son karakterini de al

Amaç: Python metninin tamamını yazdırmak.

metin = "Python"
print(metin[0:len(metin) - 1])

Gözlenen: Pytho; son karakter dilimin dışında kalıyor.

A4 — Yaş 18 ise yetişkin kabul et

yas = 18
if yas > 18:
    print("Yetişkin")
else:
    print("Koşul sağlanmadı")

Gözlenen: Koşul sağlanmadı

A5 — Listenin son indeksini aşma

Amaç: Her elemanı indeksle yazdırmak.

sayilar = [4, 8, 12]
i = 0
while i <= len(sayilar):
    print(sayilar[i])
    i += 1

Gözlenen: İlk üç değer yazıldıktan sonra IndexError.

A6 — 0 ve 100 geçerli puan olsun

puan = 100
if 0 < puan < 100:
    print("Geçerli")
else:
    print("Geçersiz")

Gözlenen: 100 için Geçersiz.

  • A1: range(1, 6) kullanın; range üst sınırı dahil etmez.
  • A2: range(len(sayilar)) ile 0dan başlayın veya daha Pythonik olarak for sayi in sayilar kullanın.
  • A3: dilimin üst sınırı zaten dahil değildir; tüm metin için metin[:] veya metin[0:len(metin)] kullanılabilir.
  • A4: sınır değeri dahilse yas >= 18.
  • A5: i < len(sayilar); son geçerli indeks len(...) - 1dir.
  • A6: 0 <= puan <= 100.

B — input() ve tür dönüşümü hataları (4 vaka)

B1 — Yaşa 1 ekle

yas = input("Yaş: ")
print(yas + 1)

Gözlenen: TypeError.

B2 — İki sayıyı topla

Örnek girdi: 10 ve 20; amaç 30.

a = input("A: ")
b = input("B: ")
print(a + b)

Gözlenen: 1020.

B3 — Ondalıklı fiyatı dönüştür

fiyat = input("Fiyat: ")   # kullanıcı: 12.5
print(int(fiyat))

Gözlenen: ValueError.

B4 — Sayısal olmayan girdiyi aralık kontrolüyle yakalama

puan = int(input("Puan: "))   # kullanıcı: abc
if 0 <= puan <= 100:
    print("Geçerli")
else:
    print("Geçersiz")

Gözlenen: if satırına gelmeden ValueError.

  • B1: yas = int(input(...)) veya dönüşümü ayrı satırda yapın.
  • B2: her iki girdiyi int()/gereksinime göre float() ile dönüştürün.
  • B3: float(fiyat) kullanın; ondalıklı metin doğrudan int("12.5") olamaz.
  • B4: dönüşüm hatası aralık kontrolünden önce oluşur. 13. bölüm bilgisiyle try/except ValueError kullanın; ardından 0–100 aralığını kontrol edin.

C — Aliasing ve kopyalama hataları (5 vaka)

C1 — Yedek listeyi bağımsız tut

notlar = [70, 80]
yedek = notlar
yedek.append(90)
print(notlar)

Gözlenen: [70, 80, 90]; özgün liste de değişti.

C2 — İki öğrencinin not listesi ayrı olsun

ortak = []
ada = ortak
ece = ortak
ada.append(100)
print(ece)

Gözlenen: [100].

C3 — Sığ kopyanın sınırı

a = [[1, 2], [3, 4]]
b = a.copy()
b[0].append(9)
print(a)

Gözlenen: [[1, 2, 9], [3, 4]].

C4 — Fonksiyon özgün listeyi değiştirmesin

def sirala(veri):
    veri.sort()
    return veri

sayilar = [3, 1, 2]
sonuc = sirala(sayilar)
print(sayilar)

Gözlenen: [1, 2, 3]; özgün liste de sıralandı.

C5 — “Kopya” değişkeni aslında aynı nesne

a = [1, 2]
b = a
print(a is b)

Gözlenen: True; amaç bağımsız listeydi.

  • C1: yedek = notlar.copy() gibi sığ kopya oluşturun.
  • C2: ada = [] ve ece = [] ayrı oluşturulmalı; aynı listeyi iki ada bağlamayın.
  • C3: sığ kopya yalnız dış listeyi ayırır. İç listelerin de bağımsız olması gerekiyorsa bu yapı için örneğin [satir.copy() for satir in a] kullanılabilir; daha genel iç içe yapılarda derin kopya gereksinimini ayrıca değerlendirin.
  • C4: özgünü korumak isteniyorsa return sorted(veri) kullanın veya önce kopya alın.
  • C5: b = a.copy() (veya bağlama uygun başka kopyalama) gerekir.

D — Sonsuz döngü ve eksik ilerleme (4 vaka)

D1 — Sayaç hiç değişmiyor

sayac = 1
while sayac <= 5:
    print(sayac)

Gözlenen: 1 sürekli yazdırılıyor.

D2 — Yanlış yönde güncelleme

kalan = 3
while kalan > 0:
    print(kalan)
    kalan += 1

Gözlenen: 3, 4, 5, ... diye devam ediyor.

D3 — Geçersiz girdi değişmiyor

puan = -1
while puan < 0 or puan > 100:
    print("Geçersiz")

Gözlenen: döngü bitmiyor.

D4 — continue güncellemeyi atlıyor

i = 0
while i < 5:
    if i == 2:
        continue
    print(i)
    i += 1

Gözlenen: i == 2 olduktan sonra döngü sonsuza giriyor.

  • D1: gövdeye sayac += 1 ekleyin.
  • D2: kalan -= 1 olmalı.
  • D3: döngü içinde yeni girdi alınmalı veya koşulu değiştirecek başka bir durum güncellenmelidir.
  • D4: güncellemeyi continue öncesine taşıyın ya da döngüyü, her yolda ilerleme garanti edecek şekilde yeniden düzenleyin.

E — Kapsam ve dönüş değeri hataları (4 vaka)

E1 — return unutulmuş

def kare(x):
    x * x

sonuc = kare(4)
print(sonuc)

Gözlenen: None.

E2 — Yerel değişkeni dışarıda kullanma

def hesapla():
    toplam = 10 + 20

hesapla()
print(toplam)

Gözlenen: NameError.

E3 — print ile return karıştırılmış

def topla(a, b):
    print(a + b)

sonuc = topla(2, 3)
print(sonuc * 2)

Gözlenen: önce 5, ardından TypeError (None * 2).

E4 — Global adı değiştirmeye çalışırken UnboundLocalError

sayac = 0

def artir():
    sayac = sayac + 1
    return sayac

print(artir())

Gözlenen: UnboundLocalError.

  • E1: return x * x.
  • E2: toplam yalnız fonksiyonun yerel kapsamındadır; değer gerekiyorsa return toplam ile çağırana verin.
  • E3: hesap yapan fonksiyon return a + b döndürmeli; kullanıcıya yazdırma çağıran tarafta yapılabilir.
  • E4: en iyi başlangıç, global durum yerine değeri parametre olarak alıp yeni değeri döndürmektir. Global değişken gerçekten gerekiyorsa global sayac sözdizimi vardır; fakat küçük işlevlerde gereksiz global durumdan kaçının.

F — İndeks ve anahtar hataları (2 vaka)

F1 — Son siparişi raporla

Amaç: Listedeki son sipariş kimliği olan S-103 değerini yazdırmak.

siparisler = ["S-101", "S-102", "S-103"]
son_indeks = len(siparisler)
print(siparisler[son_indeks])

Gözlenen: IndexError; len(siparisler) eleman sayısıdır, son geçerli indeks değildir.

F2 — Yeni ürün gelirse stok kaydını başlat

Amaç: Gelen ürünleri mevcut stoğa eklemek; sözlükte olmayan ürünün stok sayısını 0dan başlatmak.

stok = {"kalem": 5, "defter": 2}
gelenler = ["kalem", "silgi", "kalem"]

for urun in gelenler:
    stok[urun] += 1

print(stok)

Gözlenen: silgi işlenirken KeyError; program sonraki ürüne geçemiyor.

  • F1: son eleman için siparisler[-1] veya siparisler[len(siparisler) - 1] kullanılabilir. Boş liste olasılığı varsa ayrıca eleman bulunup bulunmadığını kontrol edin.
  • F2: eksik anahtarın bu problemde normal olduğu sözleşmeye göre stok[urun] = stok.get(urun, 0) + 1 kullanın. Eksik anahtarın program hatası olması gereken başka bir problemde [] erişiminin KeyError üretmesi yararlı olabilir.

Son kontrol

Düzelttiğiniz her vakada yalnız “artık hata vermiyor” demeyin. Bir normal örnek ve mümkünse bir sınır/geçersiz durum daha deneyerek düzeltmenin gerçekten amaçlanan davranışı sağladığını doğrulayın.

Back to top