编写java代码实现由用户输入一个简单的四则运算表达式,求出其计算结果后显示。2)允许在表达式中出现常用的数学函数,如绝对值、取整、三角函数、倒数、平方根、平方、立方等。
时间: 2023-07-10 21:18:36 浏览: 52
下面是一个简单的Java代码实现,可以实现输入一个四则运算表达式并求出计算结果,同时还支持常用的数学函数:
```java
import java.util.Scanner;
import java.lang.Math;
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个表达式:");
String expression = scanner.nextLine();
double result = calculate(expression);
System.out.println("计算结果为:" + result);
}
// 计算表达式的值
public static double calculate(String expression) {
// 去除空格
expression = expression.replaceAll(" ", "");
// 如果表达式以负号开头,加上一个0
if (expression.startsWith("-")) {
expression = "0" + expression;
}
// 定义一个栈来存储数字和运算符
Stack<Double> numbers = new Stack<>();
Stack<Character> operators = new Stack<>();
// 遍历表达式,处理数字和运算符
for (int i = 0; i < expression.length(); i++) {
char ch = expression.charAt(i);
if (Character.isDigit(ch)) {
// 处理数字
int j = i;
while (j < expression.length() && (Character.isDigit(expression.charAt(j)) || expression.charAt(j) == '.')) {
j++;
}
double number = Double.parseDouble(expression.substring(i, j));
numbers.push(number);
i = j - 1;
} else if (isOperator(ch)) {
// 处理运算符
while (!operators.isEmpty() && compare(operators.peek(), ch)) {
double b = numbers.pop();
double a = numbers.pop();
char op = operators.pop();
numbers.push(calculate(a, b, op));
}
operators.push(ch);
} else if (ch == '(') {
// 处理左括号
operators.push(ch);
} else if (ch == ')') {
// 处理右括号
while (operators.peek() != '(') {
double b = numbers.pop();
double a = numbers.pop();
char op = operators.pop();
numbers.push(calculate(a, b, op));
}
operators.pop();
} else if (Character.isLetter(ch)) {
// 处理函数
int j = i;
while (j < expression.length() && Character.isLetter(expression.charAt(j))) {
j++;
}
String functionName = expression.substring(i, j);
if (functionName.equals("abs")) {
double number = numbers.pop();
numbers.push(Math.abs(number));
} else if (functionName.equals("floor")) {
double number = numbers.pop();
numbers.push(Math.floor(number));
} else if (functionName.equals("ceil")) {
double number = numbers.pop();
numbers.push(Math.ceil(number));
} else if (functionName.equals("sin")) {
double number = numbers.pop();
numbers.push(Math.sin(number));
} else if (functionName.equals("cos")) {
double number = numbers.pop();
numbers.push(Math.cos(number));
} else if (functionName.equals("tan")) {
double number = numbers.pop();
numbers.push(Math.tan(number));
} else if (functionName.equals("sqrt")) {
double number = numbers.pop();
numbers.push(Math.sqrt(number));
} else if (functionName.equals("pow")) {
double b = numbers.pop();
double a = numbers.pop();
numbers.push(Math.pow(a, b));
}
i = j - 1;
}
}
// 处理剩余的运算符
while (!operators.isEmpty()) {
double b = numbers.pop();
double a = numbers.pop();
char op = operators.pop();
numbers.push(calculate(a, b, op));
}
// 返回最终结果
return numbers.pop();
}
// 判断是否为运算符
public static boolean isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
// 比较运算符优先级
public static boolean compare(char op1, char op2) {
if (op1 == '(' || op1 == ')') {
return false;
} else if ((op1 == '+' || op1 == '-') && (op2 == '*' || op2 == '/')) {
return false;
} else {
return true;
}
}
// 计算两个数的运算结果
public static double calculate(double a, double b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
throw new IllegalArgumentException("非法运算符:" + op);
}
}
}
```
在上面的代码中,我们使用了栈来存储数字和运算符,并使用了逆波兰表达式的计算方式来计算表达式的值。同时,我们还支持了常用的数学函数,包括绝对值、取整、三角函数、平方根、平方、立方等。
注意,在使用Java的Math库中的数学函数时,需要先将数字从栈中弹出,然后将计算结果再压入栈中。同时,需要注意一些特殊情况,比如表达式以负号开头、运算符优先级等。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)