Soru & Cevap

Gelişmiş hesap makinasında işlem önceliğine yer veremiyorum. ...

28.08.2016 - 07:42

Merhaba android üzerinde gelişmiş bir hesap makinası yapmaktayım. Oluşturduğum sayı klavyesi ile basılan tuşlardan aldığım sayıları StringBuffer'a ekliyorum ardından Double'a parse ediyorum ve 4 işlem tuşlarından birine bastığında gerçek zamanlı hesaplama yapabiliyorum. Ancak  doğru sonucu sadece toplama ve çıkarma işlemlerinde alabiliyorum. Araya çarpma bölme işlemi girdiğinde hesabı yanlış yapıyor. Örnek vermek gerekirse kullanıcı 23+4+4 gibi bir işlemi doğru hesaplayabiliyor.  Önceki yazılan sayıyı şimdiki yazılan sayıyla çarp topla gibi.  Ama benim yaptığım kodlama  23+4x8 dediğimde 23 ile 4 ü toplayıp sonra 8 ile çarpıyor. Tabi sonuç yanlış.

Umarım anlatabilmişimdir. Benim sizden istediğim ise; bu konuda sizin öneriniz nedir veya yararlanabileceğim bir kaynak gösterebilecek misiniz.

 

Aşağıda class'ımdaki bazı kod bölümleri ve en altta da tamamı yer almaktadır.

 

 

 Aşağıda ki kod kalıbında kullanıcıdan gelen isteğe göre yapılacak işlemi belirliyor.

 


            if(lastString.equals("+") || lastString.equals("-") || lastString.equals("*") || lastString.equals("/")){



                if(bufferText.length()>0) {
                    Sil();


                    if (mesaj == "+") {


                        bufferText.append("+");
                        islemYap = true;
                        islemYapilan = ISLEM_TOPLA;
                        sonucDuzeni();

                    } else if (mesaj == "-") {

                        bufferText.append("-");
                        islemYap = true;
                        islemYapilan = ISLEM_CIKART;
                        sonucDuzeni();
                    } else if (mesaj == "*") {

                        bufferText.append("*");
                        islemYap = true;
                        islemYapilan = ISLEM_CARP;
                        sonucDuzeni();

                    } else if (mesaj == "/") {

                        bufferText.append("/");
                        islemYap = true;
                        islemYapilan = ISLEM_BOL;
                        sonucDuzeni();
                    }


                }

            }

 

Şu kısımda da işlemin yapıldığı bölüm :

( 'd'  değişkeni kullanıcının 3+56*4 gibi bir kısımda kısımda ki " +-*/ " işleminden sonraki yazdığı en son sayıdır. Bunu önceki yazılmış sayı ile toplayıp çarpıp bölüyor gibi düşünebilirsiniz)

  private void KontrolEtVeDortIslemYap() {



        if(islemYap==true){

            if(islemYapilan==ISLEM_TOPLA){


                ToplamaIslemiYap();

            }
            else if(islemYapilan==ISLEM_CIKART){

                CikartmaIslemiYap();
            }
            else if(islemYapilan==ISLEM_CARP){


                CarpmaIslemiYap();
            }

            else if(islemYapilan==ISLEM_BOL){

                BolmeIslemiYap();
            }
        }


    }
    private void ToplamaIslemiYap(){

      //  sonuc=ESKI_SONUC[say-1];
        sonuc=(d+Double.valueOf(String.valueOf(bufferSayi)));
        SonucYaz();
        SonucYaziGosterGizle();

    }
    private void CikartmaIslemiYap(){

        sonuc=(d-Double.valueOf(String.valueOf(bufferSayi)));
        SonucYaz();
        SonucYaziGosterGizle();

    }
    private void BolmeIslemiYap(){

        sonuc=(d/Double.valueOf(String.valueOf(bufferSayi)));
        SonucYaz();
        SonucYaziGosterGizle();

    }
    private void CarpmaIslemiYap(){

        sonuc=(d*Double.valueOf(String.valueOf(bufferSayi)));
        SonucYaz();
        SonucYaziGosterGizle();
    }

 

 

 

 

Buda Class'ımdaki kodun tamamı : 

 

package com.dr.minaz.drbirimsel.Fragments.Hesap;


import android.content.ClipData;
import android.content.ClipboardManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.dr.minaz.drbirimsel.Fragments.Birim.StandartHesapla;
import com.dr.minaz.drbirimsel.PublicDegerler;
import com.dr.minaz.drbirimsel.R;
import com.easyandroidanimations.library.TransferAnimation;

public class HesapMakinesi extends Fragment {


    private static final int NUM_PAGES = 1;

    private ViewPager mPager;


    private PagerAdapter mPagerAdapter;

StandartHesapla standartHesapla;




    String ISLEM_TOPLA="+"
            ,ISLEM_CIKART="-"
            ,ISLEM_BOL="/"
            ,ISLEM_CARP="*";

    String islemYapilan=null;

    PublicDegerler publicDegerler;

    TextView tx_yazilan
            ,tx_sonuc;



    public double d
            ,sonuc;

    StringBuffer bufferText
            ,bufferSayi;
    boolean islemYap
            ,animasyonAktif
            ,noktayaBasildi;

    int i=0
            ,k=0;

    

    double eskiBufferSayi;



    int sayiForGeriadim;
    int say=-1;
    double[] ESKI_D,ESKI_SONUC;



    String KLAVYE_GIRILEN;


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sayfa_hesap_makinesi, null);

        return root;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Ilkle();

        MediumYaziTipiUygula();

        mPager.setAdapter(mPagerAdapter);
        LightTextYaziTipiUygula();


        sayiForGeriadim=100;

        ESKI_D= new double[sayiForGeriadim];
        ESKI_SONUC = new double[sayiForGeriadim];


        SonucYaziGosterGizle();

        setHasOptionsMenu(true);




    }


    private void LightTextYaziTipiUygula() {
        publicDegerler.YaziTipiUygulaTextView(tx_sonuc,0);
        publicDegerler.YaziTipiUygulaTextView(tx_yazilan,0);


    }




    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {



            case R.id.id_menu_hesap_sonuc_kopyala: {


                SonucuKopyala();

                return true;
            }
        }
        return super.onOptionsItemSelected(item);
    }

    private void SonucuKopyala() {


        if (sonuc==0) {


            publicDegerler.ToastGoster(getActivity().getResources().getString(R.string.copy_bos_value));


        } else {
            ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(getActivity().CLIPBOARD_SERVICE);
            ClipData clip = ClipData.newPlainText("drbirimsel", String.valueOf(sonuc));
            clipboard.setPrimaryClip(clip);
            publicDegerler.ToastGoster("" + getActivity().getResources().getString(R.string.deger_kopyalandi_mesaj));


        }


    }


    public void Al(String mesaj) {

        KLAVYE_GIRILEN=mesaj;


        if (mesaj == "tan" || mesaj == "cos" || mesaj == "sin" || mesaj == "in" || mesaj == "pi" || mesaj == "us" || mesaj == "e" || mesaj == "kok"

                || mesaj == "log" || mesaj == "(" || mesaj == ")" || mesaj == "%") {


            switch (mesaj) {


                case "sin":


                    bufferText.append("sin(");
                    LabelYazdir();

                    break;




                case "tan":





                    break;


            }
        }


        if (mesaj == "0" || mesaj == "1" || mesaj == "2" || mesaj == "3" || mesaj == "4" || mesaj == "5" || mesaj == "6" || mesaj == "7" || mesaj == "8" || mesaj == "9") {

            bufferText.append(mesaj);
            bufferSayi.append(mesaj);

            KontrolEtVeDortIslemYap();

            LabelYazdir();

        } else if (mesaj == ".") {

            if (bufferText.length() < 1) {

                if(noktayaBasildi==false){


                bufferText.append("0.");
                bufferSayi.append("0.");
                noktayaBasildi=true;

                }
            } else {

                if(noktayaBasildi==false) {

                    bufferText.append(".");
                    bufferSayi.append(".");
                    noktayaBasildi = true;
                }
            }
            LabelYazdir();

        } else if (mesaj == "+-") {


        } else if (mesaj == "=") {
            noktayaBasildi=false;


        } else if (mesaj == "SIL") {


            Sil();
        } else if (mesaj == "TEMIZLE") {
            noktayaBasildi=false;


            Temizle();


        } else if (mesaj == "+" || mesaj == "-" || mesaj == "*" || mesaj == "/") {


            noktayaBasildi=false;


            String lastString="";

            if(bufferText.length()>0) {
                char last = bufferText.charAt(bufferText.length() - 1);
            lastString= String.valueOf(last);

            }

            if(lastString.equals("+") || lastString.equals("-") || lastString.equals("*") || lastString.equals("/")){



                if(bufferText.length()>0) {
                    Sil();


                    if (mesaj == "+") {


                        bufferText.append("+");
                        islemYap = true;
                        islemYapilan = ISLEM_TOPLA;
                        sonucDuzeni();

                    } else if (mesaj == "-") {

                        bufferText.append("-");
                        islemYap = true;
                        islemYapilan = ISLEM_CIKART;
                        sonucDuzeni();
                    } else if (mesaj == "*") {

                        bufferText.append("*");
                        islemYap = true;
                        islemYapilan = ISLEM_CARP;
                        sonucDuzeni();

                    } else if (mesaj == "/") {

                        bufferText.append("/");
                        islemYap = true;
                        islemYapilan = ISLEM_BOL;
                        sonucDuzeni();
                    }


                }

            }







            if (bufferSayi.length() > 0) {

                d = Double.valueOf(String.valueOf(bufferSayi));
                say++;
                ESKI_D[say]=d;

                ESKI_SONUC[say]=sonuc;
              //  publicDegerler.ToastGoster("D: "+ESKI_D[say]+ "SONUC : "+ESKI_SONUC[say]);


                bufferSayi.delete(0, bufferSayi.length());


                if (mesaj == "+") {
                    bufferText.append("+");
                    islemYap = true;
                    islemYapilan = ISLEM_TOPLA;
                    sonucDuzeni();
                } else if (mesaj == "-") {

                    bufferText.append("-");
                    islemYap = true;
                    islemYapilan = ISLEM_CIKART;
                    sonucDuzeni();
                } else if (mesaj == "*") {

                    bufferText.append("*");
                    islemYap = true;
                    islemYapilan = ISLEM_CARP;
                    sonucDuzeni();

                } else if (mesaj == "/") {

                    bufferText.append("/");
                    islemYap = true;
                    islemYapilan = ISLEM_BOL;
                    sonucDuzeni();
                }



                




            }
            LabelYazdir();
        }
/*
*/


    }
    private void MediumYaziTipiUygula() {

    }

    private void Ilkle() {
        publicDegerler = new PublicDegerler(getActivity());

        standartHesapla=(StandartHesapla)getActivity().getSupportFragmentManager().findFragmentByTag("STANDART");
        
        mPager = (ViewPager) getActivity().findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getActivity().getSupportFragmentManager());
        
        tx_sonuc=(TextView)getActivity().findViewById(R.id.id_tx_bilimsel_sonuc);
        tx_yazilan=(TextView)getActivity().findViewById(R.id.id_tx_bilimsel_yazilan);
        
        bufferText =new StringBuffer();
        bufferSayi=new StringBuffer();
        
    }



    private void KontrolEtVeDortIslemYap() {



        if(islemYap==true){

            if(islemYapilan==ISLEM_TOPLA){


                ToplamaIslemiYap();

            }
            else if(islemYapilan==ISLEM_CIKART){

                CikartmaIslemiYap();
            }
            else if(islemYapilan==ISLEM_CARP){


                CarpmaIslemiYap();
            }

            else if(islemYapilan==ISLEM_BOL){

                BolmeIslemiYap();
            }
        }


    }
    private void ToplamaIslemiYap(){

      //  sonuc=ESKI_SONUC[say-1];
        sonuc=(d+Double.valueOf(String.valueOf(bufferSayi)));
        SonucYaz();
        SonucYaziGosterGizle();

    }
    private void CikartmaIslemiYap(){

        sonuc=(d-Double.valueOf(String.valueOf(bufferSayi)));
        SonucYaz();
        SonucYaziGosterGizle();

    }
    private void BolmeIslemiYap(){

        sonuc=(d/Double.valueOf(String.valueOf(bufferSayi)));
        SonucYaz();
        SonucYaziGosterGizle();

    }
    private void CarpmaIslemiYap(){

        sonuc=(d*Double.valueOf(String.valueOf(bufferSayi)));
        SonucYaz();
        SonucYaziGosterGizle();
    }


    private void EsittirAnimasyonUygula() {


        for(;i<=1;i++){

            new TransferAnimation(tx_yazilan).setDestinationView(getView().findViewById(R.id.textView2)).animate();
            new TransferAnimation(tx_sonuc).setDestinationView(getActivity().findViewById(R.id.textView3)).animate();




        }
        animasyonAktif=true;

    }
    private void SonucYaz(){

        tx_sonuc.setText(""+sonuc);

    }
    private void LabelYazdir(){

        if(bufferText.length()==0){

            tx_yazilan.setText("0");

        }
        else {
            tx_yazilan.setText("" + bufferText.toString());

        }

    }
    private void Temizle(){


        if(bufferText.length()>=1){

            bufferText.delete(0, bufferText.length());


        }
        if(bufferSayi.length()>=1){

            bufferSayi.delete(0,bufferSayi.length());

        }
        sonuc=0;
        islemYap=false;
        SonucYaziGosterGizle();

        if(animasyonAktif==true){




        }

        LabelYazdir();



    }
    private void SonucYaziGosterGizle(){



        if(bufferSayi.length()==0&& bufferText.length()==0){
            tx_sonuc.setVisibility(View.INVISIBLE);

        }
        else{
            tx_sonuc.setVisibility(View.VISIBLE);
        }

    }
    private void Sil(){



        char lastOfSilinen;
        String lastStringofSilinen;

        if(bufferText.length()>0){

            lastOfSilinen = bufferText.charAt(bufferText.length() - 1);

            lastStringofSilinen=String.valueOf(lastOfSilinen);




            bufferText.deleteCharAt(bufferText.length() - 1);





            if(lastStringofSilinen.equals("+")){




                BufferSayiTemizle();
                bufferSayi.append(ESKI_D[say]);


                d = ESKI_SONUC[say-1];

                say--;

                KontrolEtVeDortIslemYap();


                publicDegerler.ToastGoster("Sonuc : "+sonuc +"\nBufferSayi : "+ bufferSayi +"\nSay :"+ say);



            }




        }


        if(bufferSayi.length()>0){

            char last = bufferSayi.charAt(bufferSayi.length() - 1);
            String lastString=String.valueOf(last);
            if(lastString.equals(".")){

                noktayaBasildi=false;

            }

            bufferSayi.deleteCharAt(bufferSayi.length()-1);












            if(bufferSayi.length()!=0){

                KontrolEtVeDortIslemYap();

            }

            else if(bufferSayi.length()==0){

                tx_sonuc.setVisibility(View.INVISIBLE);

            }


        }
        LabelYazdir();


    }

    private void sonucDuzeni(){

        if(sonuc==0){


            sonuc=d;

        } else {d=sonuc;}


    }

    private void  BufferSayiTemizle(){


        if(bufferSayi.length()>=1){

            bufferSayi.delete(0,bufferSayi.length());

        }

    }


    class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {

            switch (position){

                case 0:

                    return new StandartSlide();
                

                default:

                    return null;
            }



        }

        @Override
        public int getCount() {
            return NUM_PAGES;
        }
    }
}


 

14 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user emresimurg
emresimurg
29.08.2016 - 02:01

Merhaba Ahmet,

Aşağıdaki adresteki çözüm yollarına göz atmanı öneririm.

Umarım işine yarar.

http://stackoverflow.com/questions/12448417/java-calculator-with-multiple-operations

Ahmet
30.08.2016 - 07:49
Teşekkürler Emre, aradığım çözüm kesinlikle buydu. Sorun çözülmüştür.