该程序是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();
}
}
答案 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);
}