我正在创建一个计算器,它必须计算出像(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
有关如何打印答案旁边的原始问题的任何建议?
答案 0 :(得分:2)
您应该在类字段中保留ArithmeticExpressions而不是评估值。
使'values'成为ArithmeticExpressions的特殊子类。
注意现在如何使用
实现显示System.out.println(expr1.display() + " + "+ expr2.display());
评估使用:
double result = expr1.evaluate() + expr2.evaluate();
更多提示:
toString()
而不是display()
BinaryExpression
代替AdditionExpression
,MultiplicationExpression
,SubtractionExpression
,DivisonExpression
以及您拥有更多的运算符(%, ^, ~, !
等)
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
以包装双值。
Addition
和Mutliplication
的构造函数应该收到两个ArithmeticExpression
。
Addition(ArithmeticExpression e1, ArithmeticExpression e2)
将display()
的{{1}}替换为Addition
:
toString()