该程序是一个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 回答
你是编写代码还是只是从朋友的家庭作业中复制?
写得很好:
String expr="4+5-12/3.5-5.4*3.14"; // replace with any expression to test
你永远不会在计算器上读到实际的表达式...你只是使用常数值
你有一个硬编码的表达式
String expr="4+5-12/3.5-5.4*3.14";
,每次都会被评估 . 试试String expr = expression.getText();
但是,答案应该是-11.38something ...关于
Double.parseDouble()
的一个好处是它可以使用或 - 符号来解析字符串 . 您可以将符号连接到数字并忘记第二个列表 .