Yrd. Doç. Dr. Şadi Evren ŞEKER

  1. Bir masa lambasının 4 farklı durumu bulunabilmektedir. Kapalı, az ışık, orta ışık ve çok ışık seviyelerinde yanabilen bu lambayı nesne yönelimli olarak programlayınız. Herhangi bir insanın bu lambanın durumunu değiştirebilmesi ve lambanın mevcut durumunu görebilmesini sağlayınız. (JAVA dilinde sadece gerekli sınıfları yazınız) (10 puan)

    Masa lambasında durumu tutan bir değişkene ve bu durumu değiştiren bir metoda ihtiyaç duyulmaktadır. 4 farklı durum olduğu için en uygun değişken int tipidir.

    Yukarıdaki kod doğru olmakla birlikte, insan sınıfında yapıcı fonksiyon içerisinde masa lambası tanımlanmaması kabul edilebilir (insanın masa lambası olabilir ama her insanın masa lambası olmak zorunda değildir). Veya durumu döndüren fonksiyon (durumuBildir) değer döndürmek yerine ekrana durumu basabilir, veya String tipinde kapalı, az, orta ışık, çok ışık şeklinde değerler döndürebilir. Benzer şekilde yeniDurum fonksiyonu paramatre olarak int yerine String tipinde değer alabilir. Bu açıklamada olduğu üzere makul kabul edilebilecek değişken tipinde ve fonksiyon yapısında değişiklik olabilir.

     

  2. Bir bankanın ATM cihazına gelen müşteriler, giriş (şifre yazarak), para yatırma, para çekme ve bakiye sorgulama işlemlerini yapabilmektedir. Bu sistemi nesne yönelimli olarak modelleyiniz, ihtiyaç duyuluyorsa ilave sınıfları da tanımlayınız. Her sınıfın metotlarını ve özelliklerini belirtiniz ve modelinizi JAVA dilinde kodlayınız. (30 puan)

        

  3. Aşağıda verilen sınıfların özellik ve metotlarının isimlerini yazınız. Bu sınıflardan hangilerinin arasında ilişki olduğunu ve bu ilişkinin çeşidini yazınız.

    {çember, daire, nokta, şekil, doğru, kare, yamuk, piramit, küp, silindir }

    Yukarıdaki tanımınız ışığında, bir şekil vektörünü parametre olarak alıp bu vektördeki elemanların alanlarını hesaplayan fonksiyonu JAVA dilinde kodlayınız. (Bu sorudaki vektör kelimesi, java.util.Vector sınıfını ifade etmektedir, sorudaki hesaplama fonksiyonu dışında kod yazmanız gerekmemektedir ancak isterseniz sınıfların metotlarını ve özelliklerini kod yazarak da gösterebilirsiniz. Sınıflar arasındaki ilişkilerin isimlerini her durumda yazınız.) (50 puan)

     

     

    1. Aşağıdaki kod parçasının ekran çıktısını yazınız (10 Puan):

      int x = 6; // 110

      int y = 3; // 011

               // 101 = ^

               // 010 = 2

      // 111 = |

      System.out.println(x^y|2);

      if(++y == 3&& x<6 )

      System.out.println(y);

      System.out.println(y);

      Not: Bu sorunun cevabı hem “Thinking in JAVA” kitabında hem de “JAVA Tutorial” içeriğinde bulunmaktadır.

      7

      3

      Yukarıdaki ilk işlem x^y işlemidir ve ikilik tabanda XOR işlemi olarak çalışır. Bu durumad 6 = (110)2 ve 3 = (011)2 olarak çevrildikten sonra aralarında özel veya (xor) operatörü çalıştırıldığında, 101 sonucu bulunur. Ardından gelen tek boru (pipe) işlemi ise ikilik tabanda veya (or) işlemidir ve (101)2 | (010)2 şeklinde düşünülmelidir. Bu işlemin sağ tarafı 2 sayısının ikilik tabandaki karşılığıdır. Bu işlemin sonucu da (111)2 olarak bulunur ki bu değer onluk tabanda 7 yapar.

      Ardından gelen if satırında önce x değerinin 6’dan küçük olup olmadığı kontrol edilir. Bu kontrol doğru değildir (false) dolayısıyla if satırındaki ikinci kısım çalışmaz. Yani y++ == 3 satırı çalışmaz. Bunun sebebi JAVA dilindeki kısa devre (short circuit) uygulamasıdır. Ve işlemi ile birbirine bağlı olan if kontrollerinde sol tarafın false dönmesi halinde sonuç flase olacağı için sağ tarafa bakılmaz. Ayrıca bu if satırının altında olan if bloğu da sonuç false olduğu için çalışmaz ve ikinci println fonksiyonu ekrana basılmaz.

      Son satırdaki println fonksiyonu ise y’nin orijinal değeri olan 3’ü ekrana basar.

       

    “Bilgisayarların, bilgisayar bilimindeki yeri, teleskopların, astronomi bilimindeki yerinden fazla değildir.” — Dijkstra

Yorumlar

  1. ali poyraz

    mrb hocam C de
    1)Sağa dayalı metin ,
    2) Sola hizalanmış metin ,
    3) Ortalanmış metin gerceklemem gerekiyor bir fikrim yok netten arastırdım hiç bişi bulamadım hocaya yapıp teslim etmem lazım yardımcı olursanız sevinirim umarım bu konuyu buraya yazdığım için kızmazsınız herhangi bir C konusu olmadıgı için bir baslık altına yazamadım

  2. ela
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    public static void main(String[] args) {
     
         insan ali = new insan();
         insan veli = new insan();
         ali.hesapno=123;   veli.hesapno= 42;
         ali.sifre = 321;   veli.sifre = 24;
         ali.bakiye= 150;   veli.bakiye =140;
         atm a = new atm(ali);
         Scanner data = new Scanner(System.in);
            System.out.println(" hesap no giriniz:");
            int hspno = data.nextInt();
            System.out.println("şifrenizi giriniz");
            int şfr=data.nextInt();
             a.giris(şfr);
            System.out.println("para miktarı");
            int mktr = data.nextInt();
            a.paracekmek(mktr);

    şeklinde kodu yazdım hesap no grildiginde sorun yok fakat şifre girildiğinde

    1
    2
    3
    4
    5
    6
    
    void giris(int sifre){
            for(int j=0; j<musteriler.length; j++){
                    if(musteriler[j].hesapno==i.hesapno)
                        if(musteriler[j].sifre==i.sifre)
                            onay= true;
        }

    bu fonksiyonun şifre kıyaslaması satırında hata veriyor hocam nasıl çözebiliriz????

  3. ela

    Exception in thread "main" java.lang.NullPointerException
    at atmcihazı.atm.giris(Atmcihazı.java:32)
    at atmcihazı.Atmcihazı.main(Atmcihazı.java:64)
    Java Result: 1
    hatası veriyor hocam

  4. Şadi Evren ŞEKER Article Author

    çok büyük ihtimalle musteriler isimli nesne atıfının (object referrer) içerisine bir nesne atamadan erişmeye çalışıyorsunuz.

    Örneğin yukarıdaki ikinci kodunuzda (giris fonksiyonu) bulunan musteriler dizisi null olabilir veya musteriler dizisinin herhangi bir elemanı null olabilir. Bu durumu görmek için aşağıdaki şekilde kodunuzu değiştirebilirsiniz:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    void giris(int sifre){
            if(musteriler == null)
                   System.out.println("dizi bos geliyor");
            for(int j=0; j<musteriler.length; j++){
                    if(musteriler[j] == null)
                           System.out.println("dizinin " +j+" . elemanı boş");
                    if(musteriler[j].hesapno==i.hesapno)
                        if(musteriler[j].sifre==i.sifre)
                            onay= true;
        }

    Ancak musteriler isimli değişkeninizin içeriğinin neden boş olduğunu anlamak için kodunuzun tamamına bakmamız gerekiyor.

    Başarılar

  5. ela
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    
    package atmcihazı;
     
    import java.util.Scanner;
     
    /**
     *
     * @author runay
     */
    class atm{
        insan i;
        insan[] musteriler = new insan[100];
        boolean onay= false;
        public atm(insan i){
            this.i= i;
        }
        void paracekmek(int miktar){
            if(onay)
                i.bakiye -= miktar;
     
        }
        void paracekmek(int miktar, insan x){
            if(onay)
                x.bakiye -= miktar;
        }
        void parayatirmak(int miktar){
            if(onay)
                i.bakiye += miktar;
        }
        void giris(int sifre){
            for(int j=0; j&lt;musteriler.length; j++){
                    if(musteriler[j].hesapno==i.hesapno)
                        if(musteriler[j].sifre==i.sifre)
                            onay= true;
        }
        } 
        void cıkıs(){
            onay = false;
        }
    }
     
    class insan{
        int sifre;
        int hesapno;
        int bakiye;
    }
     
    public class Atmcihazı {
     
     
        public static void main(String[] args) {
     
         insan ali = new insan();
         insan veli = new insan();
         ali.hesapno=123;   veli.hesapno= 42;
         ali.sifre = 321;   veli.sifre = 24;
         ali.bakiye= 150;   veli.bakiye =140;
         atm a = new atm(ali);
         Scanner data = new Scanner(System.in);
            System.out.println(&quot; hesap no giriniz:&quot;);
            int hspno = data.nextInt();
            System.out.println(&quot;şifrenizi giriniz&quot;);
            int şfr=data.nextInt();
             a.giris(şfr);
            System.out.println(&quot;para miktarı&quot;);
            int mktr = data.nextInt();
            a.paracekmek(mktr);
        }
    }

    yukarıdaki kodun aynısını kullandım hocam sadece birkaç yerde kod ekledim müşterinin hesapnosunda hata vermiyor şifresinde hata veriyor

  6. Şadi Evren ŞEKER Article Author

    probleminiz, insanları (ali ve veli gibi) müşteri listenize eklemiyor oluşunuz.

    En hızlı çözüm için (en güzel çözüm değil, sadece hızlıca çözmek istersek) aşağıdaki şekilde kodunuzu değiştirirdim:

    main fonksiyonunda :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     public static void main(String[] args) {
     
         insan ali = new insan();
         insan veli = new insan();
         ali.hesapno=123;   veli.hesapno= 42;
         ali.sifre = 321;   veli.sifre = 24;
         ali.bakiye= 150;   veli.bakiye =140;
         atm a = new atm(ali);
         a.musteriler[0] = ali;
         a.musteriler[1] = veli;

    mainde yukarıdaki şekide araya eklenecek (yukarıdaki son iki) satırlar ile musteriler dizinizde artık müşteri olmuş olur. Daha önce olmadığı için hata alıyordunuz.

    İlave olarak dizinin geri kalan 98 elemanı boş olduğu için giriş fonksiyonunuzdaki döngüye de kontrol eklemek gerekir (şayet girilen şifre bu iki kişiden birine ait değilse boş olan elemanlara bakacak ve nullpointerexception alacaksınız:
    giriş fonksiyonunda:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    void giris(int sifre){
            for(int j=0; j<musteriler.length; j++){
                    if(musteriler[j] == null)
                        break;
                    if(musteriler[j].hesapno==i.hesapno)
                        if(musteriler[j].sifre==i.sifre)
                            onay= true;
        }
    }

    Yukarıda görüldüğü üzere 3. ve 4. satırlar ile artık boş bir müşteriye gelirsek daha fazla devam etmiyoruz. Bu durum aradan müşteri silinmesi halinde sorun olur ama en hızlı çözüm sanırım bu şekilde olacaktır. Daha sağlıklı bir çözüm için dizi yerine vektör gibi dinamik boyutlu bir veri yapısı kullanmanızı veya dizide ısrar ediyorsanız bir sayaçla kaç eleman olduğunu saymanızı tavsiye edebilirim.

    Başarılar

Bir Cevap Yazın

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


− 4 = dört