数学运算符

时间:2012-03-04 16:36:03

标签: java android if-statement

我有这个方法会生成一个随机数学表达式来解决它并输出一个变量的答案:

public int Nov2()
{
    char[] ops = new char[] {'+', '-', '*', '/'};
    int i = rand.nextInt(4-0) + 0;
    char op1 = ops[i];

    int novnum1 = rand.nextInt(101-1) + 1;

    int novnum2 = rand.nextInt(101-1) + 1;

    int nov2result = 0;

    switch(op1) {
        case '+': nov2result = novnum1 + novnum2; break;
        case '-': nov2result = novnum1 - novnum2; break;
        case '*': nov2result = novnum1 * novnum2; break;
        case '/': nov2result = novnum1 / novnum2; break;
    }

    String nov2Exp = novnum1 + " " + op1 + " " + novnum2 + " = ";

    Nov2resstor = nov2result;

    setContentView(R.layout.gameview);

    TextView display = (TextView) findViewById(R.id.exp);

    display.setText(nov2Exp);

    return nov2result;
}

我如何对具有两个以上术语的表达式使用相同类型的东西,而不必在我的下一个方法中编写这样的非常复杂的if语句:

public int Eas3()
{
    char[] ops = new char[] {'+', '-', '*', '/'};
    int i = rand.nextInt(4-0) + 0;
    char op1 = ops[i];
    i = rand.nextInt(4-0) + 0;
    char op2 = ops[i];

    int easnum1 = rand.nextInt(101-1) + 1;

    int easnum2 = rand.nextInt(101-1) + 1;

    int easnum3 = rand.nextInt(101-1) + 1;

    int eas3result = 0;


    if (op1 == '+' && op2 == '+')
    {
        eas3result = ((easnum1 + easnum2) + easnum3);
    }
    else if (op1 == '+' && op2 == '-')
    {
        eas3result = ((easnum1 + easnum2) - easnum3);
    }
    else if (op1 == '+' && op2 == '*')
    {
        eas3result = ((easnum1 + easnum2) * easnum3);
    }
    else if (op1 == '+' && op2 == '-')
    {
        eas3result = ((easnum1 + easnum2) - easnum3);
    } 
.../

我有方法为2,3,4,5和6执行此操作,因此使用此方法我的if语句会变得非常大。

有什么想法吗?

9 个答案:

答案 0 :(得分:2)

是的,另一种方法是编写Command对象:

public interface Command<V> {
    V execute(Object ... args); 
}

您将编写一个实现此接口的对象:

public class AdditionCommand implements Command<Double> {
    public Double execute(Object ... args) {
        Double x = (Double)args[0];
        Double y = (Double)args[1];
        return x+y;    
    }
}

现在您可以使用运算符在Map中查找:

Map<String, Command> opsLookup = new HashMap<String, Command>() {{
   opsLookup.put("+", new AddCommand<Number>());
   opsLookup.put("-", new SubtractCommand<Number>());
}};

无需转换。

答案 1 :(得分:2)

您可以使用内置的Javascript引擎。

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;

public class Test 
{
  public static void main(String[] args) throws Exception
  {
       ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");
        String foo = "40+2";
        System.out.println(engine.eval(foo));
    } 
}

答案 2 :(得分:2)

Check out this MathEval class I found online它将评估一个表示方程式的字符串。

mySolver = new MathEval();
double answer = mySolver.evaluate(equation);

答案 3 :(得分:1)

您正在寻找的是composite pattern。您定义了一个抽象的Expression基类并派生它。

这些类必须实现一个返回结果的evaluate()方法。

一个子类将是返回其值的常量,另一个将是二进制表达式,如加号,减号等。evaluate()方法将添加/减去/ etc得到的子表达式的结果

然后,您可以从其他表达式中构建任意表达式,然后在不使用if条件的情况下对其进行求值。

答案 4 :(得分:1)

如何使用递归:

int num(int numberOfOperands, int current){
    if(numberOfOperands<=0) return current;
    switch(rand.nextInt(4)){
        case 0: return num(numberOfOperands-1, current + (rand.nextInt(100)+1)); break;
        case 1: return num(numberOfOperands-1, current - (rand.nextInt(100)+1)); break;
        case 2: return num(numberOfOperands-1, current * (rand.nextInt(100)+1)); break;
        case 3: return num(numberOfOperands-1, current / (rand.nextInt(100)+1)); break;
    }

}

int num(int numberOfOperands) throws Exception{
    if(numberOfOperands <=0) 
        throw new Exception("invalid number of operands: "+numberOfOperands);
    return num(numberOfOperands, rand.nextInt(100)+1);
}

当然,这会忽略操作的优先顺序。

答案 5 :(得分:0)

您可以使用您正在使用的变量创建一个字符串,如下所示:

String temp = "(" + easnum1 + op1 + easnum2 + ")" + op2 + easnum3;

之后,您可以使用ScriptEngineManager类将javascript用作引擎,以便您可以使用eval方法。

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");        
Object result = engine.eval(temp);

此方法执行计算并返回结果。

希望这有帮助。

答案 6 :(得分:0)

我会使用一个数组作为值easnum [],一个数组用于操作数op []和一个带有中间值的数组。 以下几行

  for(...)
  {
     if(op[i]=='+') easintermediat[i+1] = easintermediate[i] + easnum[i]
     ...
  }

答案 7 :(得分:0)

如果您对 n + 1 号码进行了 n 操作,并且您执行了第一次操作,那么您将使用 n-1 < / em>对 n 号码的操作。您可以将此作为循环的基础,以便轻松处理任意数量的项目。

int operate(int[] numbers, int[] operations) {
  if (numbers.length < 1 || numbers.length != operations.length + 1) {
    throw new IllegalArgumentException();
  }
  int result = numbers[0];  
  for (int i = 0; i < operations.length; ++i) {
    result = operate(operations[i], result, numbers[i+1]);
    // where operate() is your switch statement
  }
  return result;
}

答案 8 :(得分:0)

试试这个:

public int Eas3()
{

    char[] ops = new char[] {'+', '-', '*', '/'};
    int i = rand.nextInt(4-0) + 0;
    char op1 = ops[i];
    i = rand.nextInt(4-0) + 0;
    char op2 = ops[i];

    int easnum1 = rand.nextInt(101-1) + 1;
    int easnum2 = rand.nextInt(101-1) + 1;
    int easnum3 = rand.nextInt(101-1) + 1;
    int eas3result = 0;
    if (op1 == '+')
    {
         switch(op2) 
         {
               case '+': eas3result=((easnum1 + easnum2) + easnum3); break;
               case '-': eas3result=((easnum1 - easnum2) - easnum3); break;
               case '*': eas3result=((easnum1 * easnum2) * easnum3); break;
               case '/': eas3result=((easnum1 / easnum2) / easnum3); break;        
         }
    }

..../

}

甚至可以将外部IF放在SWITCH中,如下所示

public int Eas3()
{

    char[] ops = new char[] {'+', '-', '*', '/'};
    int i = rand.nextInt(4-0) + 0;
    char op1 = ops[i];
    i = rand.nextInt(4-0) + 0;
    char op2 = ops[i];

    int easnum1 = rand.nextInt(101-1) + 1;
    int easnum2 = rand.nextInt(101-1) + 1;
    int easnum3 = rand.nextInt(101-1) + 1;
    int eas3result = 0;
    int tempResult=0;
    switch(op1)
    {
         case '+': tempResult=(easnum1 + easnum2); break;
         case '-': tempResult=(easnum1 + easnum2) ; break;
         case '*': tempResult=(easnum1 + easnum2) ; break;
         case '/': tempResult=(easnum1 + easnum2) ; break;        
    }    
   switch(op2) 
     {
         case '+': eas3result=(tempResult + easnum3); break;
         case '-': eas3result=(tempResult - easnum3); break;
         case '*': eas3result=(tempResult * easnum3); break;
         case '/': eas3result=(tempResult / easnum3); break;        
     }

}