计一个计算器应用程序,用于进行简单的加减乘除四则运算。要求能够对输入的算式判断运算符优先级,允许在表达式中出现常用的数学函数,如绝对值、取整、三角函数、倒数、平方根、平方、立方等。
时间: 2023-07-04 14:04:46 浏览: 240
用PHP实现的四则运算表达式计算实现代码
这是一个比较复杂的应用程序,需要涉及到四则运算、运算符优先级、数学函数等多个方面,下面是一个简单的实现:
```python
import math
# 定义支持的函数列表
functions = {
'abs': abs,
'ceil': math.ceil,
'floor': math.floor,
'sqrt': math.sqrt,
'sin': math.sin,
'cos': math.cos,
'tan': math.tan,
'asin': math.asin,
'acos': math.acos,
'atan': math.atan,
'log': math.log,
'log10': math.log10,
'exp': math.exp,
'pow': math.pow,
}
# 定义运算符优先级
precedence = {
'+': 1,
'-': 1,
'*': 2,
'/': 2,
'^': 3,
}
# 判断一个字符是否是数字
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
# 将中缀表达式转换为后缀表达式
def infix_to_postfix(expression):
result = []
stack = []
for token in expression.split():
if is_number(token):
result.append(float(token))
elif token in functions:
stack.append(token)
elif token == '(':
stack.append(token)
elif token == ')':
while stack[-1] != '(':
result.append(stack.pop())
stack.pop()
if len(stack) > 0 and stack[-1] in functions:
result.append(stack.pop())
else:
while len(stack) > 0 and stack[-1] != '(' and precedence[stack[-1]] >= precedence[token]:
result.append(stack.pop())
stack.append(token)
while len(stack) > 0:
result.append(stack.pop())
return result
# 计算后缀表达式的值
def evaluate_postfix(expression):
stack = []
for token in expression:
if isinstance(token, float):
stack.append(token)
elif token in functions:
if token == 'pow':
arg2 = stack.pop()
arg1 = stack.pop()
stack.append(functions[token](arg1, arg2))
else:
arg = stack.pop()
stack.append(functions[token](arg))
else:
arg2 = stack.pop()
arg1 = stack.pop()
if token == '+':
stack.append(arg1 + arg2)
elif token == '-':
stack.append(arg1 - arg2)
elif token == '*':
stack.append(arg1 * arg2)
elif token == '/':
stack.append(arg1 / arg2)
elif token == '^':
stack.append(math.pow(arg1, arg2))
return stack[0]
# 计算表达式的值
def evaluate(expression):
postfix = infix_to_postfix(expression)
value = evaluate_postfix(postfix)
return value
# 测试代码
expression = '1 + 2 * 3 - 4 / 2 ^ 2'
value = evaluate(expression)
print(expression, '=', value)
expression = 'sqrt(4) + 3 * abs(-2) - ceil(2.5)'
value = evaluate(expression)
print(expression, '=', value)
```
这段代码定义了一个 `functions` 字典,用于存储支持的函数,同时定义了一个 `precedence` 字典,用于存储运算符的优先级。然后,定义了 `infix_to_postfix` 函数,用于将中缀表达式转换为后缀表达式。该函数使用了一个栈来辅助转换,并利用 `precedence` 字典来判断运算符的优先级。接着,定义了 `evaluate_postfix` 函数,用于计算后缀表达式的值。该函数同样使用了一个栈来辅助计算,并利用 `functions` 字典来支持数学函数。最后,定义了 `evaluate` 函数,用于计算表达式的值。该函数调用了 `infix_to_postfix` 和 `evaluate_postfix` 两个函数,并返回计算结果。
可以通过运行测试代码来测试该计算器应用程序。第一个表达式 `1 + 2 * 3 - 4 / 2 ^ 2` 是一个简单的四则运算表达式,其结果应该为 6。第二个表达式 `sqrt(4) + 3 * abs(-2) - ceil(2.5)` 包含了多个数学函数,其结果应该为 7。
阅读全文