如何制作高效的表达式计算器?

时间:2013-12-24 13:19:21

标签: java

如何使代码读取用户输入的表达式中的多个操作数。

如果我必须阅读它们如何找到不同的运算符和操作数这里是由我制作的基本表达式计算器的代码,它能够读取表达式并仅计算一个操作数和两个运算符

e.g。的 如果输入是2 + 3 它会给我5.0作为结果
但是 如果输入是2 + 3,即空间,则根本没有输出,即使在有空格的情况下如何使其正常工作。

import java.util.Scanner;

public class Calc {

public static void main(String args[]){

    int j=0;

    float op1=0,op2=0,result=0;

    Scanner inp=new Scanner(System.in);

     System.out.println("Sir,Please enter the expression");

     String exp1=inp.next();

     String exp = exp1.replaceAll(" ","");

      for(int i=0;i<exp.length();i++){

         if(exp.charAt(i)=='+'||exp.charAt(i)=='-'||exp.charAt(i)=='*'||exp.charAt(i)=='/'){

           if(exp.charAt(i)=='+'){

                   i=j;

                   op1=Float.parseFloat(exp.substring(0, j+1));

                   op2=Float.parseFloat(exp.substring(j+2,exp.length()));

                   result=op1+op2;

                   System.out.println(result);

                   break;
             }

             if(exp.charAt(i)=='*'){

                   i=j;

                   op1=Float.parseFloat(exp.substring(0, j+1));

                   op2=Float.parseFloat(exp.substring(j+2,exp.length()));

                   result=op1*op2;

                   System.out.println(result);

                   break;

             }

             if(exp.charAt(i)=='-'){

                   i=j;

                   op1=Float.parseFloat(exp.substring(0, j+1));

                   op2=Float.parseFloat(exp.substring(j+2,exp.length()));

                   result=op1-op2;

                   System.out.println(result);

                   break;
             }

             if(exp.charAt(i)=='/'){

                   i=j;

                   op1=Float.parseFloat(exp.substring(0, j+1));

                   op2=Float.parseFloat(exp.substring(j+2,exp.length()));

                   if(op2==0){

                       System.err.println("Division by zero is not possible");

                       break;

                   }

                   else{

                      result=op1/op2;

                      System.out.println(result);

                      break; 
                   }

             }
         }


     }

}

}

3 个答案:

答案 0 :(得分:0)

如果您只想阻止空间干扰您的评估,请将它们删除:

实施例

String expression = "2 + 2";
String parsedExpression = expression.replaceAll(" ", "");

// Evaluate.

为了pedant-ism而编辑

Scanner s = new Scanner(System.in);
System.out.print("Enter an expression and hit enter: "); 
String expression = s.readLine();

String parsedExpression = expression.replaceAll(" ", "");

答案 1 :(得分:0)

如果您要对具有多个运算符和操作数(如“2 + 3-5 * 4 + 2 * sin(45)”)的字符串执行计算,那么您需要研究将中缀解析为RPN(反向抛光表示法) )

分流码算法是通过有效解析实现复杂计算的一种方法。

我无法找到与java相关的材料,因为我是一名c#开发人员。但是,我已经在我的一个Windows手机项目中实现了相同的功能。

此时我可以为您提供很少的链接。

Java Expression Parser & Calculator Shunting Yard Algorithm

http://en.wikipedia.org/wiki/Shunting-yard_algorithm

http://andreinc.net/2010/10/05/converting-infix-to-rpn-shunting-yard-algorithm/

有了这个,我在c#中附加了一些运算符及其优先级规则 请参阅我上面提到的堆栈溢出链接,然后研究我在下面写的内容。

            OPERATORS.Add("+", new int[] { 0, LEFT_ASSOC });
            OPERATORS.Add("-", new int[] { 0, LEFT_ASSOC });
            OPERATORS.Add("*", new int[] { 5, LEFT_ASSOC });
            OPERATORS.Add("/", new int[] { 5, LEFT_ASSOC });
            OPERATORS.Add("%", new int[] { 5, LEFT_ASSOC });
            OPERATORS.Add("^", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Sin", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Cosh", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Sinh", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Tanh", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Cos", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Tan", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Log", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("ln", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Sqrt", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Floor", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Ceil", new int[] { 10, RIGHT_ASSOC });
            OPERATORS.Add("Square", new int[] { 10, RIGHT_ASSOC });

答案 2 :(得分:0)

嘿Chris理想情况下现在应该可以正常工作但现在仍然不能正常工作你能告诉我该做什么我已经修改了replacAll语句你可以看一下吗。

import java.util.Scanner;

public class Calc {

public static void main(String args []){

int j=0;

float op1=0,op2=0,result=0;

Scanner inp=new Scanner(System.in);

 System.out.println("Sir,Please enter the expression");

 String exp1=inp.next();

 String exp = exp1.replaceAll("\\s","");    //It will replace all the spaces from the string

  for(int i=0;i<exp.length();i++){

     if(exp.charAt(i)=='+'||exp.charAt(i)=='-'||exp.charAt(i)=='*'||exp.charAt(i)=='/'){

       if(exp.charAt(i)=='+'){

               i=j;

               op1=Float.parseFloat(exp.substring(0, j+1));

               op2=Float.parseFloat(exp.substring(j+2,exp.length()));

               result=op1+op2;

               System.out.println(result);

               break;
         }

         if(exp.charAt(i)=='*'){

               i=j;

               op1=Float.parseFloat(exp.substring(0, j+1));

               op2=Float.parseFloat(exp.substring(j+2,exp.length()));

               result=op1*op2;

               System.out.println(result);

               break;

         }

         if(exp.charAt(i)=='-'){

               i=j;

               op1=Float.parseFloat(exp.substring(0, j+1));

               op2=Float.parseFloat(exp.substring(j+2,exp.length()));

               result=op1-op2;

               System.out.println(result);

               break;
         }

         if(exp.charAt(i)=='/'){

               i=j;

               op1=Float.parseFloat(exp.substring(0, j+1));

               op2=Float.parseFloat(exp.substring(j+2,exp.length()));

               if(op2==0){

                   System.err.println("Division by zero is not possible");

                   break;

               }

               else{

                  result=op1/op2;

                  System.out.println(result);

                  break; 
               }

         }
     }


 }

}

}