60 lines
1.6 KiB
Plaintext
60 lines
1.6 KiB
Plaintext
abstract class OperatorExpression : IExpression {
|
|
IExpression A;
|
|
IExpression B;
|
|
|
|
internal void Init!(IExpression a, IExpression b) {
|
|
A = a;
|
|
B = b;
|
|
}
|
|
|
|
internal abstract double OperatorImplementation(double a, double b);
|
|
|
|
internal override double Calculate() => OperatorImplementation(A.Calculate(), B.Calculate());
|
|
}
|
|
|
|
class OperatorExpressionAdd : OperatorExpression {
|
|
internal override double OperatorImplementation(double a, double b) => a+b;
|
|
}
|
|
|
|
class OperatorExpressionSub : OperatorExpression {
|
|
internal override double OperatorImplementation(double a, double b) => a-b;
|
|
}
|
|
|
|
class OperatorExpressionMul : OperatorExpression {
|
|
internal override double OperatorImplementation(double a, double b) => a*b;
|
|
}
|
|
|
|
class OperatorExpressionDiv : OperatorExpression {
|
|
internal override double OperatorImplementation(double a, double b) => a/b;
|
|
}
|
|
|
|
class OperatorExpressionMod : OperatorExpression {
|
|
internal override double OperatorImplementation(double a, double b) {
|
|
if(a == 0)
|
|
return b;
|
|
if(b == 0)
|
|
return a;
|
|
if(a > 0){
|
|
if(b > 0)
|
|
while(a-b >= 0)
|
|
a -= b;
|
|
else
|
|
while(a+b >= 0)
|
|
a += b;
|
|
}
|
|
else {
|
|
if(b > 0)
|
|
while(a+b <= 0)
|
|
a += b;
|
|
else
|
|
while(a-b <= 0)
|
|
a -= b;
|
|
}
|
|
return a;
|
|
}
|
|
}
|
|
|
|
class OperatorExpressionPow : OperatorExpression {
|
|
internal override double OperatorImplementation(double a, double b) => Math.Pow(a, b);
|
|
}
|