`

一个表达式计算工具

 
阅读更多
可以计算: 加减乘除,余数,括号 , 结果为整数,操作数全部为整数。
中间应该有考虑不周的地方,请给我留言。附上计算表达式。
转载,请注明本地址
测试:

public static void main(String[] args) throws Exception {
        String exp = "-1*((24+8)/(6+2)*5-10)/2*2+10/2+200";
        // exp = "(9/2-1)/2*2-1+9-8%2";
       //  exp = "(120-4/2/1*20)/8-1";
       //  exp="100-(1+100)";
       //  exp="-20-20*4/(2+2)*1+100/4";
      //  exp="-100/2*100";
       // exp="-10+100/2";
        exp="-2*(3-4)";
       
        int v = Jisuanqi.cal(exp);
        System.out.println(exp + "=" + v);
    }


/**
*
* @author jeffay.jiang
*/
public class Jisuanqi {

    public static String getFirstNumber(String exp, int pos,boolean bSub) {
        String v = "";
        if(bSub && exp.charAt(pos)=='-'){
            pos++;
            v="-";
        }
        char c = exp.charAt(pos);
        while (c >= '0' && c <= '9' || c == '.') {
            v = v + c;
            pos++;
            if (pos >= exp.length()) {
                break;
            }
            c = exp.charAt(pos);
        }
        return v;
    }

    public static String getKuhaoExp(String exp, int pos) {
        String v = "";
        char c;
        int k = 1;
        int to = pos;
        for (int i = pos; i < exp.length(); i++) {
            if (exp.charAt(i) == '(') {
                k++;
            }
            if (exp.charAt(i) == ')') {
                k--;
            }
            if (k == 0) {
                to = i;
                break;
            }
        }
        v = exp.substring(pos, to);
        //System.out.println("---exp=" + exp + ",Pos=" + pos + ",One=" + v);

        return v;
    }

    public static int cal(String exp) throws Exception {

//        System.out.println("=================" + exp);
       
        if (exp == null || exp.length() == 0) {
            return 0;
        }

        boolean bSub = false;
        String ops = "+-"; //计算加号

        int index = 0;
        while (index < exp.length()) {
            if (exp.charAt(index) == '-') {
                if (bSub) {
                    bSub = false;
                } else {
                    bSub = true;
                }
            }
            if (ops.indexOf(exp.charAt(index)) >= 0) {
                exp = exp.substring(1); //去掉前面的 +- 符号
            } else {
                break;
            }
        }

        int v = 0;
        String kha = "(";
        int k = exp.indexOf(kha);
        if (k >= 0) { //先处理括号
            String exp1 = exp.substring(0, k);
            String exp2 = getKuhaoExp(exp, k + 1);//从k+1起,到匹配的 )
            String exp3 = exp.substring(k + exp2.length() + 2);
            int vp = cal(exp2);
            if (bSub) {
                if(exp1.length()==0){
                    vp=(-1)*vp;
                }else{
                    exp1 = "-" + exp1;
                }
            }
          //  System.out.println("&&&&&&&&&&&&&&&&&& exp1="+exp1 +",vp="+vp+", exp2="+exp2+",v="+vp+", sub="+bSub);           
            String expn=exp1 + String.valueOf(vp) + exp3;
         //   System.out.println("::::::::::::::::::::::::::new exp="+expn +", have-sub="+bSub);
            v = cal(expn);
            return v;
        }

        ops = "*/%";    //先算乘除
        index = 0;
        while (index < exp.length()) {
            if (ops.indexOf(exp.charAt(index)) >= 0) {
                exp = exp.substring(1); //去掉前面的 */% 符号
            } else {
                break;
            }
        }
        for (int i = 0; i < exp.length(); i++) {
            if (ops.indexOf(exp.charAt(i)) >= 0) { //有 乘除符号
                String exp1 = exp.substring(0, i);
                char op = exp.charAt(i);
                String exp2 = exp.substring(i + 1);
                if (bSub) {
                    exp1 = "-" + exp1;
                }
                return chengchu(exp1, op, exp2);
            }
        }

        ops = "+-"; //计算加号 , 在算加减
        for (int i = 0; i < exp.length(); i++) {
            if (ops.indexOf(exp.charAt(i)) >= 0) { //有 乘除符号
                String exp1 = exp.substring(0, i);
                char op = exp.charAt(i);
                String exp2 = exp.substring(i + 1);
                if (bSub) {
                    exp1 = "-" + exp1;
                }
                return jiajian(exp1, op, exp2);
            }
        }


        v = Integer.parseInt(exp);
        if(bSub){
            v=(-1)*v;
        }
        return v;
    }

    private static int chengchu(String exp1, char op, String exp2) throws Exception {
       
      //  System.out.println("**********chengchu*******" + exp1 + "," + op + "," + exp2+"]");
       
        if (exp2.length() == 0) {
            return Integer.parseInt(exp1);
        }
       
        String last = getLastNumber(exp1);
        String next = getFirstNumber(exp2, 0,true);
        String left = exp2.substring(next.length());
        
        exp1 = exp1.substring(0, exp1.length() - last.length());
       
      //  System.out.println("          ******pre=" + exp1 + ", last=" + last + ", next=" + next + ", left=" + left);

        int v = 0;
        if (op == '*') {
            v = Integer.parseInt(last) * Integer.parseInt(next);
        }
        if (op == '/') {
            v = Integer.parseInt(last) / Integer.parseInt(next);
        }
        if (op == '%') {
            v = Integer.parseInt(last) % Integer.parseInt(next);
        }

        if (left.length() > 0 || exp1.length() > 0) {
      //      System.out.println("          ******pre=" + exp1 + ", v=" + v + ", left=" + left);
            v = cal(exp1 + String.valueOf(v) + left);
        }
       
        return v;
    }

    public static String getLastNumber(String exp) {
        String s = "";
        int i = exp.length();
        char c;
        while (i > 0) {
            c = exp.charAt(i - 1);
            i--;
            if (c >= '0' && c <= '9') {
                s = c + s;
            } else {
                break;
            }
        }
        return s;
    }

    private static int jiajian(String exp1, char op, String exp2) throws Exception {
       
       // System.out.println("+++++++++++++++++" + exp1 + "," + op + "," + exp2);

        if (exp2.length() == 0) {
            return Integer.parseInt(exp1);
        }
        String next = getFirstNumber(exp2, 0,false);
        String left = exp2.substring(next.length());
        int v = 0;
        if (op == '+') {
            v = Integer.parseInt(exp1) + Integer.parseInt(next);
        }
        if (op == '-') {
            v = Integer.parseInt(exp1) - Integer.parseInt(next);
        }

        if (left.length() > 0) {
            v = cal(String.valueOf(v) + left);
        }

        return v;
    }
}
0
0
分享到:
评论

相关推荐

    表达式的计算工具.rar

    作为一个表达式计算工具,它的核心任务是接受用户的输入,这个输入可以是一个简单的数学公式,如2+2,也可以是复杂的复杂数学表达式,如sin(x^2) + cos(y^3)。工具会将这些表达式解析成计算机可理解的形式,然后执行...

    VC实现的数学表达式计算工具

    1、VC实现的数学表达式计算工具。该工具可以计算复杂表达式,支持开方,幂运算等; 2、程序中将表达式计算模块化封装成动态库,使用时可以方便的将表达式计算功能加入到自己的程序中。

    VC++函数表达式计算工具

    本文将深入探讨一款由德国开发者设计的,基于VC++的免费开源函数表达式计算工具,它能够处理多种数学运算,包括四则运算、括号管理和三角函数等,是程序员和数学爱好者理想的计算辅助软件。 首先,我们要理解的是...

    算术表达式计算工具

    vs2012实现的一个控制台小程序,用于算术表达式计算功能。

    Delphi表达式计算(用了这么多这个比较好)

    在Delphi中处理表达式计算是一项常见的任务,尤其是当你需要动态地根据某些条件来评估数学或逻辑表达式时。标题提到的“Delphi表达式计算”是指在Delphi程序中实现对用户输入或程序内部生成的表达式的求值。 Delphi...

    Delphi 表达式计算控件formula最新版,支持很多数学函数

    为了简化这一过程,存在专门的控件,如Formula,它是一个高效且功能丰富的表达式计算组件。Formula控件能够帮助开发者处理各种数学函数,并且具有较高的计算效率。 Formula控件的主要特点在于其强大的表达式解析和...

    Java算术表达式计算类库 ExpressionJ

    **Java算术表达式计算类库 ExpressionJ** ExpressionJ是一个强大的Java库,专门设计用于解析和计算数学算术表达式。这个库对于那些在应用程序中需要动态计算复杂数学表达式的开发者来说,是一个非常有用的工具。它...

    易语言表达式计算公式解析

    在易语言中,表达式计算公式解析是编程过程中一个重要的环节,它涉及到对数学表达式的处理、计算以及错误检查等复杂任务。 表达式计算公式解析的核心在于解析器,这个解析器会将用户输入的字符串形式的表达式转化为...

    计算器,支持表达式计算

    总的来说,这款“计算器,支持表达式计算”项目不仅是一个实用的工具,也是一个学习Win32编程和表达式计算的好例子。无论是对于初学者还是有一定经验的开发者,都能从中获取有价值的知识和实践经验。

    c# 表达式计算 .net 2008

    总的来说,C#提供了强大的工具来处理表达式计算,无论是简单的算术运算还是复杂的动态表达式。了解并熟练运用这些概念对于开发高效、灵活的.NET应用程序至关重要。通过不断的实践和学习,你将能够更好地掌握C#表达式...

    C语言表达式计算原代码详解

    本文将深入解析一个C语言实现的表达式计算代码,该代码能够处理基本的算术运算(包括加、减、乘、除)以及括号运算,甚至支持对特定常量如π的识别。 #### 关键技术点 1. **使用栈结构管理运算符和操作数:** ...

    数学表达式计算c++

    在C++编程中,实现数学表达式计算是一个常见的需求,特别是在科学计算、工程应用和游戏开发等领域。这个项目显然旨在创建一个能够解析和求解包含常见数学函数的数学表达式的库。下面我们将深入探讨实现这样的功能所...

    Java 工具类, 计算字符串表达式, 支持 +,-,*,/,%. ()

    自己写的一个计算字符串表达式工具类; Java 工具类, 计算字符串表达式, 支持 +,-,*,/,%. ()

    数字电路逻辑表达式计算.zip_逻辑表达式计算

    本压缩包文件“数字电路逻辑表达式计算.zip”提供了一个用于计算逻辑表达式值的工具,包括源代码“数字电路逻辑表达式计算.cpp”和编译后的可执行文件“数字电路逻辑表达式计算.exe”。 **布尔代数**: 布尔代数,...

    真人发音新计算器4.1.0多功能、多行、表达式计算工具.rar

    真人发音新计算器4.1.0多功能、多行、表达式计算工具,最简单易用的多功能、多行、表达式计算工具,操作就如计事本软件,不用学就会用,好象是你在一张白纸上写计算式,电脑自动填入结果,而且每次的计算都还保留着...

    中缀表达式计算C++实现

    - 在中缀表达式计算中,我们用一个栈存储运算符,另一个栈存储中间结果。 2. **算法步骤**: - 从左到右扫描中缀表达式。 - 遇到数字时,将其压入结果栈。 - 遇到运算符时,比较其优先级与栈顶运算符的优先级:...

    C语言表达式计算

    总的来说,C语言表达式计算是一个涵盖广泛的话题,包括运算符优先级、结合性、内建函数的使用、字符串表达式的解析等。理解这些概念对于编写高效和准确的C语言代码至关重要。在实际项目中,开发者需要根据需求选择...

    IOS Swift 表达式计算机

    本项目"Swift 表达式计算机"就是利用Swift实现的一个功能完备的计算工具,它特别采用了逆波兰表示法(Reverse Polish Notation, RPN)以及栈数据结构来解析和计算数学表达式。以下是对这个项目的详细解析: 1. **逆...

    VC 函数表达式计算源码实例及截图.rar

    总的来说,这个"VC 函数表达式计算源码实例"是一个很好的学习资源,可以帮助开发者提升在算法设计、数据结构和C++编程方面的技能。通过阅读和理解源代码,你可以深入了解表达式计算的内部机制,并将其应用到自己的...

Global site tag (gtag.js) - Google Analytics