首页 文章

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

提问于
浏览
-4

该程序是一个GUI计算器 . 由于某种原因,它的问题是它的等于方法 . 一切都等于4.0

这可能是我想念的非常简单的事情 . 我觉得我从来没有真正编写代码来告诉它如何评估事物,虽然我被告知我可以使用这个算法进行评估,我确实使用过(这是我需要使用的算法):什么时候有* OR /运营商仍然找到或/在索引索引的第一次发生操作将在索引I和我1执行或/操作2操作员替换这两个操作,结果删除操作员您刚刚从操作员列表中删除结束时

返回并完成相同的循环,但过程和操作员

如果您的表达有效,那么以下情况将是正确的,否则您将获得BOGUS表达式A)您将与一个空运营商名单一起下单B)将在运营商名单中保留一个单独的运营商 . 如果上述两个条件不正确,那么最后的操作是评估的结果,那么你的表情就是BOGUS

谢谢你的帮助!

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

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

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

    你永远不会在计算器上读到实际的表达式...你只是使用常数值

  • 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);
    }
    

相关问题