计算器,现在仅支持正负号、加减乘除、次方和模运算。

刚好要做计算器,然后网上查了一下,发现了以为大神封装了很好的类来计算。然后就直接拷贝了,不过还没来得及仔细研究。测试了一下,发现运算没有问题。大神只是在别人的问题下很慷慨的回复贴了自己的代码,所以为了方便自己以后查看,就把大神的代码拷贝过来了。点击打开链接另外我这里没有写界面,只是把这几个关键计算的类贴过来了。如果有大神封装的更好的,或者能有能完善的,求大神指教。

采用中缀转为后缀表达式方式进行计算。一共三个类,使用方式是获取用户输入的运算的字符串,然后调用Calculator的eval方法,如下。

  String str = "40944.0501-3.2*100";

        Calculator cal = new Calculator();

        double result = cal.eval(str);

三个类分别为

import java.util.Stack;

public class Calculator implements MathSymbol {

    /**
     * 计算中缀表达式
     * @param expression
     * @return
     */
    public double eval(String expression) {
        String str = infix2Suffix(expression);
        //System.out.println(" Infix Expression: " + expression);
        //System.out.println("Suffix Expression: " + str);
        if(str == null) {
            throw new IllegalArgumentException("Expression is null!");
        }
        String[] strs = str.split("\\s+");
        Stack<String> stack = new Stack<String>();
        for(int i = 0; i < strs.length; i++) {
            if(!Operator.isOperator(strs[i])) {
                stack.push(strs[i]);
            } else {
                Operator op = Operator.getInstance(strs[i]);
                double right = Double.parseDouble(stack.pop());
                double left = Double.parseDouble(stack.pop());
                double result = op.eval(left, right);
                stack.push(String.valueOf(result));
            }
        }
        return Double.parseDouble(stack.pop());
    }

    /**
     * 将中缀表达式转换为后缀表达式
     * @param expression
     * @return
     */
    public String infix2Suffix(String expression) {
        if(expression == null) {
            return null;
        }
        char[] chs = expression.toCharArray();
        Stack<Character> stack = new Stack<Character>();
        StringBuilder sb = new StringBuilder(chs.length);
        boolean appendSeparator = false;
        boolean sign = true;
        for(int i = 0; i < chs.length; i++) {
            char c = chs[i];
            if(c == BLANK) {
                continue;
            }
            // Next line is used output stack information.
            // System.out.printf("%-20s %s%n", stack, sb.toString());
            if(appendSeparator) {
                sb.append(SEPARATOR);
                appendSeparator = false;
            }
            if(isSign(c) && sign) {
                sb.append(c);
                continue;
            }
            if(isNumber(c)) {
                sign = false;
                sb.append(c);
                continue;
            }
            if(isLeftBracket(c)) {
                stack.push(c);
                continue;
            }
            if(isRightBracket(c)) {
                sign = false;
                while(stack.peek() != LEFT_BRACKET) {
                    sb.append(SEPARATOR);
                    sb.append(stack.pop());
                }
                stack.pop();
                continue;
            }
            appendSeparator = true;
            if(Operator.isOperator(c)) {
                sign = true;
                if(stack.isEmpty() || stack.peek() == LEFT_BRACKET) {
                    stack.push(c);
                    continue;
                }
                int precedence = Operator.getPrority(c);
                while(!stack.isEmpty() && Operator.getPrority(stack.peek()) >= precedence) {
                    sb.append(SEPARATOR);
                    sb.append(stack.pop());
                }
                stack.push(c);
            }
        }
        while(!stack.isEmpty()) {
            sb.append(SEPARATOR);
            sb.append(stack.pop());
        }
        return sb.toString();
    }

    /**
     * 判断某个字符是否是正号或者负号
     * @param c
     * @return
     */
    private boolean isSign(char c) {
        if(c == NEGATIVE_SIGN || c == POSITIVE_SIGN) {
            return true;
        }
        return false;
    }

    /**
     * 判断某个字符是否为数字或者小数点
     * @param c
     * @return
     */
    private boolean isNumber(char c) {
        if((c >= '0' && c <= '9') || c == DECIMAL_POINT) {
            return true;
        }
        return false;
    }

    /**
     * 判断某个字符是否为左括号
     * @param c
     * @return
     */
    private boolean isLeftBracket(char c) {
        return c == LEFT_BRACKET;
    }

    /**
     * 判断某个字符是否为右括号
     * @param c
     * @return
     */
    private boolean isRightBracket(char c) {
        return c == RIGHT_BRACKET;
    }
}

第二个

public interface MathSymbol {

    /**
     * 左括号
     */
    public final static char LEFT_BRACKET   = '(';

    /**
     * 右括号
     */
    public final static char RIGHT_BRACKET  = ')';

    /**
     * 中缀表达式中的空格,需要要忽略
     */
    public final static char BLANK          = ' ';

    /**
     * 小数点符号
     */
    public final static char DECIMAL_POINT  = '.';

    /**
     * 负号
     */
    public final static char NEGATIVE_SIGN  = '-';

    /**
     * 正号
     */
    public final static char POSITIVE_SIGN  = '+';

    /**
     * 后缀表达式的各段的分隔符
     */
    public final static char SEPARATOR      = ' ';
}


第三个类


import java.util.HashMap;
import java.util.Map;

public abstract class Operator {

    /**
     * 运算符
     */
    private char operator;

    /**
     * 运算符的优先级别,数字越大,优先级别越高
     */
    private int priority;

    private static Map<Character, Operator> operators = new HashMap<Character, Operator>();

    private Operator(char operator, int priority) {
        setOperator(operator);
        setPriority(priority);
        register(this);
    }

    private void register(Operator operator) {
        operators.put(operator.getOperator(), operator);
    }

    /**
     * 加法运算
     */
    public final static Operator ADITION = new Operator('+', 100) {
        public double eval(double left, double right) {
            return left + right;
        }
    };

    /**
     * 减法运算
     */
    public final static Operator SUBTRATION = new Operator('-', 100) {
        public double eval(double left, double right) {
            return left - right;
        }
    };

    /**
     * 乘法运算
     */
    public final static Operator MULTIPLICATION = new Operator('*', 200) {
        public double eval(double left, double right) {
            return left * right;
        }
    };

    /**
     * 除法运算
     */
    public final static Operator DIVITION = new Operator('/', 200) {
        public double eval(double left, double right) {
            return left / right;
        }
    };

    /**
     * 冪运算
     */
    public final static Operator EXPONENT = new Operator('^', 300) {
        public double eval(double left, double right) {
            return Math.pow(left, right);
        }
    };

    /**
     * 取模运算
     */
    public final static Operator MOD = new Operator('%', 200) {
        public double eval(double left, double right) {
            return left % right;
        }
    };

    public char getOperator() {
        return operator;
    }
    private void setOperator(char operator) {
        this.operator = operator;
    }
    public int getPriority() {
        return priority;
    }
    private void setPriority(int priority) {
        this.priority = priority;
    }

    /**
     * 根据某个运算符获得该运算符的优先级别
     * @param c
     * @return      运算符的优先级别
     */
    public static int getPrority(char c) {
        Operator op = operators.get(c);
        if(op != null) {
            return op.getPriority();
        }
        return 0;
    }

    /**
     * 工具方法,判断某个字符是否是运算符
     * @param c
     * @return      是运算符返回 true,否则返回 false
     */
    public static boolean isOperator(char c) {
        return getInstance(c) != null;
    }
    public static boolean isOperator(String str) {
        if(str.length() > 1) {
            return false;
        }
        return isOperator(str.charAt(0));
    }

    /**
     * 根据运算符获得 Operator 实例
     * @param c
     * @return      从注册中的 Operator 返回实例,尚未注册返回 null
     */
    public static Operator getInstance(char c) {
        return operators.get(c);
    }
    public static Operator getInstance(String str) {
        if(str.length() > 1) {
            return null;
        }
        return getInstance(str.charAt(0));
    }

    /**
     * 根据操作数进行计算
     * @param left    左操作数
     * @param right   右操作数
     * @return        计算结果
     */
    public abstract double eval(double left, double right);}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中实现连续运算计算器可以利用循环和条件语句来实现。以下是一个简单的示例: ```java import java.util.Scanner; public class Calculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double result = 0; // 保存计算结果 boolean keepCalculating = true; // 控制是否继续计算的变量 while (keepCalculating) { System.out.print("请输入第一个操作数:"); double num1 = scanner.nextDouble(); System.out.print("请输入运算符(+、-、*、/):"); String operator = scanner.next(); System.out.print("请输入第二个操作数:"); double num2 = scanner.nextDouble(); switch (operator) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": result = num1 / num2; break; default: System.out.println("无效的运算符!"); break; } System.out.println("计算结果:" + result); System.out.print("是否继续计算(y/n):"); String choice = scanner.next(); if (!choice.equalsIgnoreCase("y")) { keepCalculating = false; } } scanner.close(); } } ``` 上述代码通过使用while循环在每次计算结束后询问用户是否继续计算。如果用户输入的选择不是"y"(不区分大小写),则程序会退出循环,否则会继续进行下一次计算。在每次计算中,用户需要依次输入第一个操作数、运算符和第二个操作数。程序会根据运算符对两个操作数进行相应的计算,并在计算后显示计算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值