Python ile Adım Adım Hesap Makinesi Yapımı: Kapsamlı ve Detaylı Kod Analizi

Programlama dünyasına adım atan herkesin ilk duraklarından biri, şüphesiz ki teorik bilgileri pratiğe dökmek ve işlevsel küçük projeler geliştirmektir. Yazılım dünyasında genellikle “Hello World” (Merhaba Dünya) yazıldıktan hemen sonra akla ilk gelen ve öğrenilmesi gereken en temel yapı taşlarını barındıran proje, bir hesap makinesi kodlamaktır. Bu yazımızda, günümüzün en popüler, okunabilirliği en yüksek ve öğrenmesi en kolay dillerinden biri olan Python kullanarak hem tamamen fonksiyonel hem de kullanıcı kaynaklı hata payı en aza indirilmiş detaylı bir hesap makinesi kodu yazacağız.

Sadece kodu verip geçmeyeceğiz; kodun her satırının, her bir fonksiyonunun ve her bir döngüsünün arka planda tam olarak ne işe yaradığını, neden o şekilde yazıldığını ve yazılım mühendisliği prensipleri açısından ne anlam ifade ettiğini en ince detaylarıyla inceleyeceğiz. Bu rehberi okumayı tamamladığınızda, Python’daki döngüler, fonksiyonlar, veri tipleri ve hata yakalama mekanizmaları hakkında çok daha derinlemesine bir anlayışa sahip olacaksınız.

Python Hesap Makinesi Tam Kod Bloğu

Aşağıdaki kodu kopyalayarak kullandığınız herhangi bir Python IDE’sinde (PyCharm, VS Code, Thonny) veya online bir derleyicide anında çalıştırabilirsiniz:

def toplama(x, y):
    return x + y

def cikarma(x, y):
    return x - y

def carpma(x, y):
    return x * y

def bolme(x, y):
    if y == 0:
        return "Hata! Sıfıra bölme yapılamaz."
    return x / y

print("--- Python Hesap Makinesi ---")

while True:
    print("\nİşlem Seçin: 1: Topla, 2: Çıkar, 3: Çarp, 4: Böl, q: Çıkış")
    secim = input("Seçiminiz: ")

    if secim.lower() == 'q':
        print("Çıkış yapılıyor...")
        break

    if secim in ('1', '2', '3', '4'):
        try:
            sayi1 = float(input("Birinci sayı: "))
            sayi2 = float(input("İkinci sayı: "))
        except ValueError:
            print("Geçersiz giriş! Lütfen sayı girin.")
            continue

        if secim == '1':
            print("Sonuç:", toplama(sayi1, sayi2))
        elif secim == '2':
            print("Sonuç:", cikarma(sayi1, sayi2))
        elif secim == '3':
            print("Sonuç:", carpma(sayi1, sayi2))
        elif secim == '4':
            print("Sonuç:", bolme(sayi1, sayi2))
    else:
        print("Hatalı seçim! Lütfen menüdeki seçeneklerden birini girin.")

Kodun Satır Satır Kapsamlı Açıklaması ve Analizi

1. Fonksiyonların Tanımlanması (def) ve Modüler Yapı

Yazılım geliştirirken “Spagetti Kod” adı verilen, karmaşık, içi içe geçmiş ve sonradan okunması zor kod dizilimleri yazmaktan kaçınmak en önemli kurallardan biridir. Kodun en başında def anahtar kelimesiyle tanımladığımız dört temel işlem, kodumuzu tamamen modüler bir yapıya kavuşturur. Örneğin toplama(x, y) fonksiyonunu ele alalım. Bu fonksiyon, dışarıdan iki adet parametre (x ve y değişkenleri) alır. Bu parametreler program çalışırken kullanıcıdan gelecek olan sayılardır. Fonksiyonun içinde yer alan return ifadesi ise, arka planda hesaplanan bu matematiksel işlemin sonucunu fonksiyonun çağrıldığı yere geri gönderir. İşlemleri tek bir uzun kod bloğu yerine bu şekilde ayrı bloklar halinde tanımlamak, ileride programımıza yeni bir özellik (örneğin üs alma veya karekök hesaplama modülü) eklemek istediğimizde işimizi inanılmaz derecede kolaylaştırır. Ayrıca hata ayıklama (debugging) sürecinde kodun neresinde sorun olduğunu bulmamızı hızlandırır.

2. Mantıksal Hata Yönetimi: Sıfıra Bölme İstisnası

Bölme işleminde, matematiğin değişmez ve evrensel bir kuralı olan “bir sayı sıfıra bölünemez” kuralı ile karşı karşıyayız. Eğer standart bir bölme işlemi yazıp geçseydik, kullanıcı bölen sayıyı sıfır girdiğinde programımız büyük ihtimalle çökecek ve ekrana son kullanıcı için anlamsız olan bir ZeroDivisionError hata mesajı basacaktı. Başarılı bir yazılımın sırrı, kullanıcının yapabileceği hataları önceden öngörmek ve yazılımı korumaktır. Bu sebeple bolme(x, y) fonksiyonumuzun içine kritik bir if y == 0: koşulu ekledik. Bu satır, kullanıcının girdiği ikinci sayıyı işleme sokmadan önce kontrol eder. Eğer sayı sıfırsa, programın çökmesini engeller ve bunun yerine son derece kibar, açıklayıcı bir metin olan “Hata! Sıfıra bölme yapılamaz.” uyarısını döndürür.

3. Sonsuz Döngü Mekanizması ve Güvenli Çıkış (while True)

Hesap makinesi, işletim sistemleri veya sunucular gibi araçlar, kullanıcı kendisi kapatma komutu verene kadar kesintisiz çalışması beklenen programlardır. Her bir toplama veya çarpma işleminden sonra kodun sona ermesi ve kullanıcının tekrar programı baştan başlatmak zorunda kalması kötü bir deneyim yaratır. İşte bu noktada imdadımıza while True: döngüsü yetişiyor. Bu yapı, şartı sürekli olarak “Doğru” (True) kabul edildiği için sonsuz bir döngü yaratır ve hesap makinesini terminalde sürekli açık tutar. Ancak unutulmamalıdır ki her sonsuz döngünün mutlaka bir “kaçış kapısı” olmalıdır. Kullanıcıya işlem menüsünde q: Çıkış opsiyonunu sunuyoruz. Kullanıcının girdiği değeri secim.lower() == ‘q’ ile sürekli denetliyoruz. (Burada lower() metodunu kullanmamızın sebebi, kullanıcının klavyeden yanlışlıkla büyük ‘Q’ harfini girmesi durumunda bile programın bunu küçük harfe çevirip algılayabilmesini sağlamaktır). Eğer kullanıcı gerçekten çıkmak istiyorsa, break komutu devreye girer. Bu komut, içinde bulunduğu sonsuz döngüyü anında parçalar ve programı güvenli bir şekilde sonlandırır.

4. Veri Tipi Dönüşümleri ve İstisna Yakalama (try – except Blokları)

Python’da input() fonksiyonu kullanılarak klavyeden alınan her türlü veri, yazılımcı aksi bir durum belirtmedikçe varsayılan olarak metin (string) formatındadır. Yani kullanıcı klavyeden “5” rakamını tuşlasa bile program bunu matematikteki 5 sayısı olarak değil, “5” kelimesi (karakteri) olarak görür. İki metin değeriyle aritmetik işlem yapılamayacağı için, bu veriyi float() fonksiyonu yardımıyla ondalıklı sayı tipine dönüştürüyoruz. Tam sayı (int) yerine ondalıklı sayı (float) kullanmamızın amacı, programı daha yetenekli hale getirmek ve kullanıcının 5.5 veya 3.14 gibi virgüllü sayılarla da işlem yapabilmesine olanak tanımaktır.

Peki ya kullanıcı sayı girmesi gereken yerde yanlışlıkla bir harfe veya özel karaktere basarsa ne olur? Normal şartlarda dönüşüm başarısız olur ve program ValueError hatası vererek kapanır. Biz bu senaryoyu engellemek için dönüşüm işlemini güvenli bir try – except bloğu içine aldık. try bloğu altındaki kodlar öncelikle çalıştırılmaya çalışılır. Eğer harf girildiği için bir veri tipi hatası oluşursa, sistem asla çökmez; onun yerine anında except ValueError: bloğu tetiklenir. Kullanıcıya ekranda “Geçersiz giriş! Lütfen sayı girin.” mesajı gösterilir ve ardından continue komutu devreye girer. continue, kodun geri kalanını (toplama/çıkarma kısımlarını) pas geçerek akışı doğrudan döngünün en başına, yani menü ekranına geri fırlatır.

5. İşlem Yönlendirme ve Karar Yapıları (if – elif – else)

Kullanıcı hiçbir hata yapmadan iki adet geçerli sayı girdiğinde, geriye sadece kullanıcının ilk başta yaptığı seçime göre doğru matematiksel fonksiyonu çağırmak kalır. Bunu da Python’un çoklu durum kontrolü sağlayan if – elif – else mekanizmasıyla yönetiyoruz. Eğer seçim ‘1’ ise toplama işlemi çağrılıyor ve sonucu print() komutuyla ekrana yansıtılıyor. Bu hiyerarşik yapı, birbirini dışlayan ve sadece birinin doğru olabileceği durumlar için tasarlanmış en hızlı sorgulama yöntemidir. En altta yer alan yalnız else bloğu ise projemizin son güvenlik ağıdır. Eğer kullanıcı menüdeki 1, 2, 3, 4 veya q seçenekleri dışında, sistemde tanımlı olmayan tamamen alakasız bir tuşa (örneğin 9’a) basarsa, “Hatalı seçim!” uyarısını alır ve döngü sayesinde yeniden geçerli bir seçim yapması için menüye yönlendirilir.

Sonuç ve Değerlendirme: Bu detaylı proje ile birlikte, sıradan ve basit bir hesap makinesi kodlamaktan çok daha fazlasını yapmış olduk. Python dilinin temelini oluşturan; modüler fonksiyon tanımı, koşullu ifadeler, akış kontrolü sağlayan döngüler ve uygulamayı kullanıcı hatalarına karşı koruyan kapsamlı hata yönetimi (exception handling) kavramlarını gerçek dünya standartlarına uygun, dayanıklı (robust) bir örnek üzerinden harmanladık. Bu temelleri kavradıktan sonra aynı projenin üzerine Tkinter veya PyQt5 gibi kütüphaneler ekleyerek hesap makinenize görsel bir arayüz (GUI) tasarlayabilirsiniz. Geliştirmeye devam edin, kodlamanın temeli pratik yapmaktır.

By mvers

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir