Yazan : Şadi Evren ŞEKER

Quiz soruları ve çözümleri aşağıdaki şekildedir:

  1. Bir oylama için program yazmanız isteniyor. Oylamaya katılan 5 aday bulunuyor ve bu adayların numarası (1’den 5’e kadar bir sayı) oy pusulasına yazılarak oy kullanılıyor. Programınızda 10 adet oyu okuyup ekrana adayların aldıkları oy miktarını basan bir program yazınız. Kullanılan oyun 1-5 arasında olmaması halinde problemi istisna yakalama ile çözünüz.

Çözüm

Oylama programında basitçe her oyun tutulduğu bir oy pusulası ve bir de oy verilen adaylar olacağını düşünebiliriz. Bu durumda oy pusulası ve aday isimli iki adet sınıf tanımlayıp bu sınıfların kodlamasını aşağıdaki şekilde yapabiliriz.

Yukarıdaki kodda, aday bilgisi tutuluyor. Programımızda olması gereken bilgi, adayın numarası ve oy sayısıdır. Biz de bu bilgileri tutan iki adet değişken tanımlıyor ve bu değişkenlerin getter/Setter fonksiyonlarını kodluyoruz. Ayrıca sınıfın inşa fonksiyonunda (constructor), başlangıç olarak oy sayısını 0 yapıyoruz. Son olarak adayların oy sayısını arttıran bir metot yukarıdaki kodun sonunda yer almaktadır. Basit bir arttırma işlemidir.

Oy pusulasını tutan kod ise aşağıdaki şekilde kodlanmıştır:

Yukarıdaki kodda, görüldüğü üzere, oy pusulasında sadece kime oy verildiği bilgisi tutulmuştur. Bu bilgiyi kapsülleme gereği getter ve setter fonksiyonları ile erişilebilir halde sınıfta kodluyoruz.

Son olarak kodumuzu test etmek için bir main fonksiyonu yazalım:

Oy okuma işlemi için “oyoku” isimli fonksiyon yazılmıştır. Bu fonksiyonun özelliği, oyları okurken yanlış bir oy girilmesi durumunda, (oyların 1 ile 5 arasında olacağını hatırlayınız) bir istisna fırlatmasıdır. Bu istisna, try bloğu içerisinden çağrıldığı yerde yakalanır ve kodun 27nci satırında bulunan catch bloğu ile ekrana bir hata mesajı basılır. Şayet oy başarılı bir şekilde okunabilirse, bu durumda ilgili oy pusulasına (ki toplam 10 adet pusula bulunuyor) oy değeri kaydedilir. Şayet bir istisna burada oluşmamışsa kodun 25. Satırına geçebiliriz. İstisna oluşması durumunda kodun 25. Satırı hiç çalışmadan catch bloğuna gidilir.

Kodumuzun 25. satırında, adayların tutulduğu nesne dizisinin (object array) ilgili elemanının (hangi elemana oy verildiyse) oy miktarını 1 arttıran oysayisiniArttir() fonksiyonu çağrılır.

Son olarak kodun 31-33 satırları arasında, adayların oy durumları ekrana basılır.

Yukarıdaki kodda bulunan ve kendi istisnamız olan hatalioy sınıfını aşağıdaki şekilde kodlayabiliriz:

  1. Bir banka yazılımı için aşağıdaki özelliklerle program yazmanız isteniyor. Sistemde tutulacak veriler:
    1. Hesap sahibinin ismi
    2. Hesap numarası
    3. Bakiye
    4. Hesap tipi (vadeli / vadesiz)

Yukarıdaki hesap bilgileri için aşağıdaki işlemleri yapmanız isteniyor:

  1. Hesapların ilk değer olarak bakiyesinin 0 atanması gerekir.
  2. Hesaba para yatırılabilir
  3. Hesaptan para çekilebilir
  4. Hesap bilgisi görüntülenebilir (sahibinin ismi, numarası, tipi ve bakiyesi)
  1. 2. Sorudaki programınızı, 10 müşteriye hizmet verebilecek şekilde genişletin.
  2. 2. Sorudaki programınızı, hesap hareketleri görüntülenecek şekilde genişletin. Buna göre bir hesap hareketinin, tarihi, saati, miktarı ve hesap numarası bulunur.

Çözüm:

Yukarıdaki sorunun çözümü için basitçe bir hesap nesnesi oluşturmamız yeterli olacaktır. Yukarıdaki 4. soru için hesap hareketlerini tutan ilave bir sınıfa daha ihtiyacımız olacak. Öncelikle, hesapların tutulduğu bir hesap sınıfını programlayarak başlayalım.

Soruda tanımlandığı üzere, her hesap için hesapno, bakiye , hesap tipi ve hesap sahibi bilgilerini tutuyoruz. Ayrıca hesap hareketlerinden oluşan ilave bir dizi, her hareketi ayrıca kayıt altına alıyor.

Hesap sınıfımızın constructor fonksiyonunda, hesap bakiyesini 0 olarak atıyoruz.

Ayrıca sınıfımızdaki hesap hareketlerini tutan dizinin kaçıncı elemanında olduğumuz bilgisi, hhsayisi isimli değişkende durmaktadır. Bu değişken de henüz hesap hareketi olmadığı için 0 olarak atanıyor.

Sırasıyla hesap sınıfındaki metotların kodlamasını inceleyelim:

Yukarıda, hesap detaylarını ekrana basan fonksiyon verilmiştir. Fonksiyondaki 21nci satırda bulunan cout komutu ile ekrana hesabın temel 3 bilgisi bastırılmıştır. Ardında hesabın tipi yazıya çevrilerek bastırılmıştır. Hesap tipini tutmak için kullanılan int tipi, kullanıcı açısından anlamsız olabilir o yüzden yazıya çevirme işlemi yapılır.

Son olarak 27-30 satırları arasında, hesap hareketlerini bastırmak için, mevcut hesap hareketi sayısını tutan değişken kadar dönen döngü içerisinde her hesap hareketinin miktarı basılmaktadır.

Bu çıktının örneği aşağıda verilmiştir.

Yukarıdaki ekran görüntüsünde, örnek olarak bir hesabın detayları basılmış ve bu hesapta yapılan hesap hareketleri altında gösterilmiştir.

Hesap hareketi olarak kabul edilebilecek iki temel işlem para çekmek ve para yatırmak işlemleridir. Bunların kodlamasını aşağıda anlatalım:

Para çekme işlemi, belirtilen miktar kadar bakiyeyi azaltmamaktadır. Bu işlem sırasında öncelikle miktarın yeterli olup olmadığı kontrol edilir. Şayet miktar yeterli bulunursa bakiye azaltılır, şayet yeterli bulunmazsa bu durumda bir istisna (exception) fırlatılır. Burada fırlatılan istisna, proje kapsamında bizim tanımladığımız yetersizBakiye istisnasıdır.

Yetersi bakiye istisnası, basit bir şekilde bakiye bilgisini de içinde saklayan bir sınıf (class) olarak tasarlanabilir:

Hesap hareketlerinin içerisine, ayrıca miktar konulurken -1 değeri ile çarpılmaktadır. Bunun anlamı, hesap hareketinin eksi değer olarak tutulmasıdır.

Benzer kodlama, para yatırma fonksiyonunda da kullanılmaktadır. Yatırılan miktar, hesap hareketlerine işlendikten sonra, bakiye değeri parametre olarak verilen miktar kadar arttırılmaktadır.

Hesap hareketlerinin detayı için sınıf kodlamasını aşağıdaki şekilde yazabiliriz:

Bu sınıf, basit bir şekilde hesapta yapılan işlemleri tutmak için tasarlanmıştır. İlgili üyelerin getter / setter fonksiyonlarının yazılması yeterlidir.

Quiz sorularının kodlarını indirmek için tıklayınız.

Yorumlar

  1. Caresiz

    String olarak girilen 1+21÷2×3-1 gibi bir ifadeyi hesaplatan algoritma nedir hocam (islem onceligi onemlidir).bir fikir dahi verirseniz sevinirim

    1. Şadi Evren ŞEKER

      Sanırım en kolayı sayı ve işlemleri çevirip sonra programlama diline hesaplatmak olacaktır. Bir parser ile string parse edip sayıları int, işlemleri ise if koşullarına dağıtıp programlama dilinin anlayacağı hale getirip çalıştırın derim.

      Başarılar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir