如何让方程以正确的顺序打印?

时间:2011-11-18 14:23:36

标签: java

我正在创建一个计算器,它必须计算出像(12.0 + 10.0)* 3.0这样的表达式。到目前为止,我已根据每个数学运算创建了子类。

例如:

的增添。的java

class Addition extends ArithmeticExpression {
Addition(double value1, double value2) {
    result = value1 + value2;
    this.value1 = value1;
    this.value2 = value2;
}
public Addition( ArithmeticExpression an,double num2) {
    value1 = an.evaluate();
    value2 = num2;
    result1 = value1 + value2;
}
public double evaluate1() {
    System.out.println("Arbitrary Answer Is");
    return result1;
}
public double display1() {
    System.out.println("Arbitrary Question Is");
    System.out.println( "(" + value1 + "+"  + value2 + ")" + " =" + result1);
    return result1;
}
public double display() {
    System.out.println("Addition Question Is");
    System.out.println(value1 + " + "+ value2);
    return result;
}
public double evaluate() {
    System.out.println("Addition Answer Is");
    System.out.println(result);
    return result;
}

}

和另一个相似的乘法,但乘法而不是加法。然后我为我回答的问题创建了一个课程;课程如下。 Arbitrary.java

   public class arbitrary {
  public Arbitrary() {
       Addition arbitrary1 = new Addition(12.0,10.0);
       arbitrary1.display1();
       Multiplication arbitrary2 = new Multiplication(arbitrary1,3.0);
       arbitrary2.display2();
}

}

当它显示答案时显示:

任意问题

(12.0 + 10.0)= 0.0

添加答案

22.0

任意问题

(22.0 * 3.0)= 66.0

有关如何打印答案旁边的原始问题的任何建议?

3 个答案:

答案 0 :(得分:2)

您应该在类字段中保留ArithmeticExpressions而不是评估值。

使'values'成为ArithmeticExpressions的特殊子类。

  • 注意现在如何使用

    实现显示
    System.out.println(expr1.display() + " + "+ expr2.display());
    
  • 评估使用:

    double result = expr1.evaluate() + expr2.evaluate();
    

更多提示:

  • 考虑将打印与评估逻辑混合(我假设你这样做是为了调试?)
  • 考虑使用/覆盖Java toString()而不是display()
  • 考虑制作BinaryExpression代替AdditionExpressionMultiplicationExpressionSubtractionExpressionDivisonExpression以及您拥有更多的运算符(%, ^, ~, !等)

class LiteralNumberExpression : extends ArithmeticExpression
{
    public double value; 
    LiteralNumberExpression(double v) { this.value = v; }

    public double display() {
        // todo
    }
    public double evaluate() {
        // todo
        return this.value;
    }
}

class Addition extends ArithmeticExpression {
    ArithmeticExpression expr1, expr2;

    Addition(ArithmeticExpression expr1, ArithmeticExpression expr2) {
        this.expr1 = expr1;
        this.expr2 = expr2;
    }
    public string toString() {
        return expr1.display() + " + "+ expr2.display();
    }
    public double evaluate() {
        return expr1.evaluate() + expr2.evaluate();
    }
}

或者,BinaryExpression版本:

class BinaryExpression extends ArithmeticExpression {
    ArithmeticExpression expr1, expr2;
    char op;

    BinaryExpression(char op, ArithmeticExpression expr1, ArithmeticExpression expr2) {
        this.op = op;
        this.expr1 = expr1;
        this.expr2 = expr2;
    }
    public String toString() {
        return "(" + expr1.display() + " " + op + " "+ expr2.display() + ")";
    }
    public double evaluate() {
        switch (op)
        {
            case '+': return expr1.evaluate() + expr2.evaluate();
            case '-': return expr1.evaluate() - expr2.evaluate();
            case '/': return expr1.evaluate() / expr2.evaluate();
            case '*': return expr1.evaluate() * expr2.evaluate();
        }
        throw new // todo exception
    }
}

答案 1 :(得分:1)

System.out.println()evaluate()方法中删除所有display()语句。相反,为每个操作覆盖toString()方法,这样它只返回操作数和操作符 - 这将允许您嵌套操作。让Arbitrary类使用每个操作的toString()来处理所有打印。

您可能想要创建一个Identity操作,其目的是返回提供给它的任何参数。这样,您就可以将ArithmeticExpression的存储值更改为ArithmeticExpression个对象,而不是double。这将有助于嵌套表达式,因为在评估整个表达式之前,您不需要对它们进行求值。

答案 2 :(得分:0)

定义class MyDouble extends ArithmeticExpression以包装双值。

AdditionMutliplication的构造函数应该收到两个ArithmeticExpression

Addition(ArithmeticExpression e1, ArithmeticExpression e2)

display()的{​​{1}}替换为Addition

toString()