科学计算器android studio

blmhpbnm  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(306)

我正在使用一台科学计算器,在进行某些特定计算时,例如3sin30或5tan45或2cos90,很少发生崩溃。请问我该怎么纠正这个问题。我还想添加一些函数,比如x^n,其中n可以是任何值,cot,csc,sec和shiftbutton,将cos,tan和sin改为倒数。下面是java文件。
主活动.java
'''

b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "1");
            }
        });
        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "2");
            }
        });
        b3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "3");
            }
        });
        b4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "4");
            }
        });
        b5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "5");
            }
        });
        b6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "6");
            }
        });
        b7.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "7");
            }
        });
        b8.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "8");
            }
        });
        b9.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "9");
            }
        });
        b0.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "0");
            }
        });
        bdot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + ".");
            }
        });
        bac.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText("");
                txtsec.setText("");
            }
        });
        bc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String text = txtmain.getText().toString();
                if (text.length()==1){
                    txtmain.setText("0");
                }else{
                    txtmain.setText(text.substring(0, text.length() - 1));
                    txtmain.setSelection(txtmain.getText().length());
                    }
            }
        });

        badd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "+");
            }
        });
        bminus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "-");
            }
        });
        bdivide.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "÷");
            }
        });
        bmulti.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "×");
            }
        });
        bb1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "(");
            }
        });
        bb2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + ")");
            }
        });
        bsroot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = txtmain.getText().toString();
                double r = Math.sqrt(Double.parseDouble(val));
                txtmain.setText(String.valueOf(r));
            }
        });
        bpie.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtsec.setText(txtsec.getText());
                txtmain.setText(txtmain.getText() + pie);

            }
        });
        binv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText()+"^"+"(-1)" );

            }
        });
        bsin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "sin");

            }
        });
        btan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "tan");

            }
        });
        bcos.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText() + "cos");

            }
        });

        blog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText()+"ln");
            }
        });

        bln.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txtmain.setText(txtmain.getText()+"log");
            }
        });

        bfact.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int val = Integer.parseInt(txtmain.getText().toString());
                int fact = factorial(val);
                txtmain.setText(String.valueOf(fact));
                txtsec.setText(val+"!");

            }
        });
        power.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int p = Integer.parseInt(txtmain.getText().toString());
                int pow = (p*p*p);
                txtmain.setText(String.valueOf(pow));
                txtsec.setText(p +"^");
            }
        });

        bsquare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                double d = Double.parseDouble(txtmain.getText().toString());
                double square = d*d;
                txtmain.setText(String.valueOf(square));
                txtsec.setText(d+"²");

            }
        });
        bequals.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = txtmain.getText().toString();
                String replacedstr = val.replace('÷', '/').replace('×', '*');
                double result = eval(replacedstr);
                txtmain.setText(String.valueOf(result));
                txtsec.setText(val);
            }
        });
    }

    //factorial function
    int factorial(int n)
    {
        return (n==1 || n==0) ? 1 : n*factorial(n-1);
    }

    public static double eval(final String str){
        return new Object(){
            int pos =  -1, ch;

            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }

            boolean eat(int charToEat) {
                while (ch == ' ') nextChar();
                if (ch == charToEat){
                    nextChar();
                    return true;
                }
                return false;
            }

            double parse(){
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) throw new RuntimeException("Unexpected: " + (char)ch);
                return x;
            }

            double parseExpression() {
                double x = parseTerm();
                for (; ; ) {
                    if      (eat('+')) x += parseTerm(); //addition
                    else if (eat('-')) x -= parseTerm(); //subtraction
                    else return x;
                }
            }
            double parseTerm(){
                double x = parseFactor();
                for (;;) {
                    if      (eat('*')) x *= parseTerm(); //multiplication
                    else if (eat( '/')) x /= parseTerm(); //division
                    else return x;
                }
            }

            double parseFactor(){
                if (eat('+')) return parseFactor(); //unary plus
                if (eat('-')) return -parseFactor(); //unary minus

                double x;
                int startPos = this.pos;
                if (eat('(')){ //parentheses
                    x = parseExpression();
                    eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') { //numbers
                    while ((ch >= '0' && ch <= '9') || ch == '.') nextChar();
                    x = Double.parseDouble(str.substring(startPos, this.pos));
                } else if (ch >= 'a' && ch <= 'z') { //functions
                    while (ch >= 'a' && ch <= 'z') nextChar();
                    String func = str.substring(startPos, this.pos);
                    x = parseFactor();
                    if (func.equals("sroot")) x = Math.sqrt(x);
                    else if (func.equals("sin")) x = Math.sin(Math.toRadians(x));
                    else if (func.equals("cos")) x = Math.cos(Math.toRadians(x));
                    else if (func.equals("tan")) x = Math.tan(Math.toRadians(x));
                    else if (func.equals("log")) x = Math.log10(x);
                    else if (func.equals("ln")) x = Math.log(x);
                    else throw new RuntimeException("Unknown function: " + func);
                } else {
                    throw new RuntimeException("Unexpected: " + (char)ch);
                }

                if (eat('^')) x =Math.pow(x, parseFactor());

                return x;
            }
        }.parse();
    }
}

'''

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题