Java 计算器类,在单个输入行中解析和处理多个操作
我正在学习一个计算器类,以便更好地理解Java。下面是我的代码的一个框架,给你一个想法。目前,它只能处理简单的命令,例如Java 计算器类,在单个输入行中解析和处理多个操作,java,parsing,operator-precedence,Java,Parsing,Operator Precedence,我正在学习一个计算器类,以便更好地理解Java。下面是我的代码的一个框架,给你一个想法。目前,它只能处理简单的命令,例如2+2,2/2,2^2,等等 有人能就如何从这里开始提供指导或示例吗 如何调整解析器以理解更复杂的命令,例如(2+(2*2^2))/2?另外,如何调整方法以接受任意数量的参数?我使用数组来存储我的值和运算符。也许我可以使用ArrayList,这样它就可以处理任意数量的元素/参数 如何建立通用指南和操作顺序(PEMDAS)来指导我的程序的计算 谢谢你的帮助 import
2+2
,2/2
,2^2
,等等
有人能就如何从这里开始提供指导或示例吗
(2+(2*2^2))/2
?另外,如何调整方法以接受任意数量的参数?我使用数组来存储我的值和运算符。也许我可以使用ArrayList,这样它就可以处理任意数量的元素/参数 import java.util.Scanner;
public abstract class Calc
{
private static double num1, num2;
public static void start()
{
System.out.println("Calculator. Type \"exit\" to quit.");
System.out.print("> ");
Scanner scan = new Scanner(System.in);
String entry = scan.nextLine();
while (! (entry.equals("exit")))
{
String [] operands = entry.replaceAll("\\s+", "").split("[\\+\\-\\/\\*\\%\\^]");
String operator = entry.replaceAll("(\\s+|\\d+|\\.)", "");
Double [] numbers = new Double[operands.length];
for (int i = 0; i < operands.length; i++)
{
numbers[i] = new Double(operands[i]);
}
num1 = numbers[0];
num2 = numbers[1];
double result = 0;
switch (operator)
{
case "+":
result = Calc.add(num1, num2);
break;
case "-":
...
case "*":
...
case "/":
...
case "^":
...
case "%":
...
default:
System.out.println("Not valid.");
}
System.out.println(result);
System.out.print("> ");
entry = scan.nextLine();
}
}
public static double add(double num1, double num2)
{
double sum = num1 + num2;
return sum;
}
public static double subtract(double num1, double num2)
{
...
}
public static double multiply(double num1, double num2)
{
...
}
public static double divide(double num1, double num2)
{
...
}
public static double exponentiate(double num1, double num2)
{
...
}
public static double modulus(double num1, double num2)
{
...
}
}
import java.util.Scanner;
公共抽象类计算
{
专用静态双num1,num2;
公共静态void start()
{
System.out.println(“Calculator.Type\'exit\'toquit.”);
系统输出打印(“>”);
扫描仪扫描=新扫描仪(System.in);
String entry=scan.nextLine();
而(!(entry.equals(“exit”))
{
字符串[]操作数=entry.replaceAll(“\\s+”,”).split(“[\+\-\\/\*\\%\^]”);
字符串运算符=entry.replaceAll(“(\\s+\\\d+\\”,”);
Double[]number=新的双精度[operands.length];
for(int i=0;i”);
entry=scan.nextLine();
}
}
公共静态双加(双num1,双num2)
{
双和=num1+num2;
回报金额;
}
公共静态双减法(双num1,双num2)
{
...
}
公共静态双乘法(双num1,双num2)
{
...
}
公共静态双除法(双num1,双num2)
{
...
}
公共静态双指数(双num1,双num2)
{
...
}
公共静态双模量(双num1,双num2)
{
...
}
}
一个非常简单的方法是多次运行它。
假设你有下面的表达式
2+2*2^2/2
首先运行并执行指数运算。你只剩下
2+2*4/2
然后运行和到乘法/除法
2+4
然后是加减法
6
塔达
您可能希望将表达式存储为字符串,并对正在查找的运算符进行解析。然后得到相邻的数字,把整个数字压缩成一个数字。圆括号有点难,但是可以用递归的方法完成。只需在括号的每个级别上执行上述方法。一个非常简单的方法是多次运行它。 假设你有下面的表达式
2+2*2^2/2
首先运行并执行指数运算。你只剩下
2+2*4/2
然后运行和到乘法/除法
2+4
然后是加减法
6
塔达
您可能希望将表达式存储为字符串,并对正在查找的运算符进行解析。然后得到相邻的数字,把整个数字压缩成一个数字。圆括号有点难,但是可以用递归的方法完成。只需在括号的每个级别上执行上述方法。查看解析数学表达式算法,如,然后计算表达式。这不是您要求的-但您可能希望使用
BigDecimal
而不是double/double
。否则,当你计算0.1+0.2
时,你可能会得到一个严重的惊喜。然后按下所有左括号,直到找到右括号,然后我就可以开始弹出了。@LuiggiMendoza谢谢,我会看看的@戴维德瓦尔斯:好主意。我以前没有使用过BigDecimal,但我知道它的用法。您知道如何调整我的方法(add()、subtract()、exponentiate()等)以接受BigDecimal参数并返回BigDecimal对象吗?请查看类似的解析数学表达式算法,然后对表达式求值。这不是您要求的-但您可能希望使用BigDecimal
而不是double/double
。否则,当你计算0.1+0.2
时,你可能会得到一个严重的惊喜。然后按下所有左括号,直到找到右括号,然后我就可以开始弹出了。@LuiggiMendoza谢谢,我会看看的@戴维德瓦尔斯:好主意。我以前没有使用过BigDecimal,但我知道它的用法。您知道如何调整我的方法(add()、subtract()、exponentiate()等)以接受BigDecimal参数并返回BigDecimal对象吗?这个问题