Java:GUI计算器一切都等于4.0

时间:2018-12-09 03:46:49

标签: java

该程序是GUI计算器。由于某些原因,它的equals方法存在问题。一切都等于4.0

我可能缺少的很简单。我觉得我从未真正编写过代码来告诉它如何评估事物,尽管有人告诉我可以使用我确实使用过的算法(这就是我需要使用的算法)进行评估: 有任何*或/运营商剩余     查找*或/索引INDEX的第一次出现     运营商将在索引I和I + 1     对这2个操作符执行*或/操作     用结果替换这两个运营商     从运营商列表中删除您刚去过的运营商 结束时

返回并按照上述过程+和-进行完全相同的循环

如果您的表达方式有效,那么以下内容将是正确的,否则您将拥有假肢表达     A)您将剩下空的操作员列表     B)在“运营商”列表中将保留一个单独的“运营商”。最后的评价是评估的结果 如果以上两个条件都不正确,那么您的表情就是假冒

感谢您的帮助!

   import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class SimpleCalc
{
    JFrame window;  // the main window which contains everything
    Container content ;
    JButton[] digits = new JButton[12]; 
    JButton[] ops = new JButton[4];
    JTextField expression;
    JButton equals;
    JTextField result;

    public SimpleCalc()
    {
        window = new JFrame( "Simple Calc");
        content = window.getContentPane();
        content.setLayout(new GridLayout(2,1)); // 2 row, 1 col
        ButtonListener listener = new ButtonListener();

        // top panel holds expression field, equals sign and result field  
        // [4+3/2-(5/3.5)+3]  =   [3.456]

        JPanel topPanel = new JPanel();
        topPanel.setLayout(new GridLayout(1,3)); // 1 row, 3 col

        expression = new JTextField();
        expression.setFont(new Font("verdana", Font.BOLD, 16));
        expression.setText("");

        equals = new JButton("=");
        equals.setFont(new Font("verdana", Font.BOLD, 20 ));
        equals.addActionListener( listener ); 

        result = new JTextField();
        result.setFont(new Font("verdana", Font.BOLD, 16));
        result.setText("");

        topPanel.add(expression);
        topPanel.add(equals);
        topPanel.add(result);

        // bottom panel holds the digit buttons in the left sub panel and the operators in the right sub panel
        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new GridLayout(1,2)); // 1 row, 2 col

        JPanel  digitsPanel = new JPanel();
        digitsPanel.setLayout(new GridLayout(4,3)); 

        for (int i=0 ; i<10 ; i++ )
        {
            digits[i] = new JButton( ""+i );
            digitsPanel.add( digits[i] );
            digits[i].addActionListener( listener ); 
        }
        digits[10] = new JButton( "C" );
        digitsPanel.add( digits[10] );
        digits[10].addActionListener( listener ); 

        digits[11] = new JButton( "CE" );
        digitsPanel.add( digits[11] );
        digits[11].addActionListener( listener );       

        JPanel opsPanel = new JPanel();
        opsPanel.setLayout(new GridLayout(4,1));
        String[] opCodes = { "+", "-", "*", "/" };
        for (int i=0 ; i<4 ; i++ )
        {
            ops[i] = new JButton( opCodes[i] );
            opsPanel.add( ops[i] );
            ops[i].addActionListener( listener ); 
        }
        bottomPanel.add( digitsPanel );
        bottomPanel.add( opsPanel );

        content.add( topPanel );
        content.add( bottomPanel );

        window.setSize( 640,480);
        window.setVisible( true );
    }

    // We are again using an inner class here so that we can access
    // components from within the listener.  Note the different ways
    // of getting the int counts into the String of the label

    class ButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            Component whichButton = (Component) e.getSource();
            // how to test for which button?
            // this is why our widgets are 'global' class members
            // so we can refer to them in here

            for (int i=0 ; i<10 ; i++ )
            {
                if (whichButton == digits[i])
                    expression.setText( expression.getText() + i );
            }



                    if (whichButton == ops[0]) 
                        expression.setText(expression.getText() + "+");
            if (whichButton == ops[1]) 
                expression.setText(expression.getText() + "-");
            if (whichButton == ops[2]) 
                expression.setText(expression.getText() + "*");
            if (whichButton == ops[3]) 
                expression.setText(expression.getText() + "/");

            if (whichButton == digits[10]) 
            {
                expression.setText("");
                result.setText("");
            }

            if (whichButton == digits[11]) expression.setText(expression.getText().substring(0, expression.getText().length() -1));

            if (whichButton == equals)
            {
                //if (expression.getText().contains("/0")) result.setText("DIVIDE BY ZERO ERROR");
                result.setText(evaluate());

        }
    }


            // need to add tests for other controls that may have been
            // click that got us in here. Write code to handle those

            // if it was the == button click then
            // result.setText( evaluate() );



        String evaluate()
        {
            if ( !isValid( expression.getText() )) return "INVALID"; // WRITE A ISVALID method
             // WRITE A ISVALID method

                String expr="4+5-12/3.5-5.4*3.14"; // replace with any expression to test
        System.out.println( "expr: " + expr );
        ArrayList<String> operatorList = new ArrayList<String>();
        ArrayList<Double> operandList = new ArrayList<Double>();
        // StringTokenizer is like an infile and calling .hasNext()
        StringTokenizer st = new StringTokenizer( expr,"+-*/", true );
        while (st.hasMoreTokens())
        {
            String token = st.nextToken();
            if ("+-/*".contains(token))
                operatorList.add(token);
            else
                operandList.add( Double.parseDouble( token) );
            }

        while(operandList.contains("*") || operandList.contains("/"))
        {
            int multiply = operandList.indexOf("*");
            int divide = operandList.indexOf("/");

            if(multiply<divide)
            {
                double quotients = (operandList.get(multiply)*operandList.get(multiply+1));
                operandList.set(multiply, quotients);
                operandList.remove(multiply+1);
                operandList.remove(multiply);
            }
            if(divide<multiply)
            {
                double products = (operandList.get(divide)/operandList.get(divide+1));
                operandList.set(divide, products);
                operandList.remove(divide+1);
                operandList.remove(divide);
            }

        }
        while(operandList.contains("+")||operandList.contains("-"))
        {
            int add = operandList.indexOf("+");
            int subtract = operandList.indexOf("-");

            if(add<subtract)
            {
                double adds = (operandList.get(add)+operandList.get(add+1));
                operandList.set(add, adds);
                operandList.remove(add+1);
                operandList.remove(add);
            }
            if(subtract<add)
            {
                double subs = (operandList.get(subtract)-operandList.get(subtract+1));
                operandList.set(subtract, subs);
                operandList.remove(subtract+1);
                operandList.remove(subtract);
            }
        }
        return (" " + operandList.get(0));

        }
        boolean isValid( String expr )
        {   

            if(expr.matches("[a-zA-Z]+")==false) return true; 
            else if(expr.startsWith("+")||expr.startsWith("-")||expr.startsWith("*")||expr.startsWith("/")==false) return true;
            else if(expr.endsWith("+")||expr.endsWith("-")||expr.endsWith("*")||expr.endsWith("/")==false) return true;
            if(expr.matches("[0-9]/0")==false) return true; 




            //test for no chars other than 0123456789+-*/
            //no operator at fornt of back of expr
            //no two ops in a row
            //no divide by zero
            //else return false
            else return false;
        }
    } // END BUTTON LISTNER
    public static void main(String [] args)
    {
        new SimpleCalc();
    }
}

2 个答案:

答案 0 :(得分:0)

您是编写代码还是只是从朋友的家庭作业中复制代码?

它写得很好: String expr="4+5-12/3.5-5.4*3.14"; // replace with any expression to test

您永远不会在计算器上读取实际表达式...您只是在使用常量值

答案 1 :(得分:0)

您有一个硬编码表达式String expr="4+5-12/3.5-5.4*3.14";,每次都会对其求值。尝试String expr = expression.getText();仍然,答案应该是-11.38something ...

Double.parseDouble()的一个优点是它可以解析带有 +或-符号的字符串。您可以将符号连接到数字上,而不必考虑第二个列表。

String evaluate(){
  if ( !isValid( expression.getText() )) return "INVALID";
  String expr = expression.getText();
  //String expr="4+5-12/3.5-5.4*3.14";
  System.out.println( "expr: " + expr );
  String [] dividedExpresions = expr.split("(?=[-|\\+])");  //split by + and -
  Double result = 0.0;
  for (String dividedExpresion:dividedExpresions){
      System.out.println(dividedExpresion);
      result += evaluateMultiplicativeExpression(dividedExpresion);
  }
  return result + "";
}
Double evaluateMultiplicativeExpression(String expression) {
    for(int i = expression.length() -1 ; i > 0 ; i--){
        if(expression.charAt(i) == '*'){
            return evaluateMultiplicativeExpression(expression.substring(0,i))
                * Double.parseDouble(expression.substring(i+1));
        }
        if(expression.charAt(i) == '/'){
            return evaluateMultiplicativeExpression(expression.substring(0,i))
                / Double.parseDouble(expression.substring(i+1));
        }
    }
    return Double.parseDouble(expression);
}