请用Python3编写一个计算器的控制台程序,支持加减乘除、乘方、括号、小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算。
时间: 2024-02-13 15:05:11 浏览: 142
好的,以下是一个简单的Python3计算器控制台程序的示例代码:
```python
# 定义计算函数
def calculate(expression):
# 将表达式转换成逆波兰表达式
rpn = to_rpn(expression)
# 创建一个栈用于计算
stack = []
# 遍历逆波兰表达式
for token in rpn:
# 如果是数字,入栈
if is_number(token):
stack.append(float(token))
# 如果是运算符,从栈中弹出相应数量的操作数进行计算
elif token in operators:
if token == '+':
b = stack.pop()
a = stack.pop()
stack.append(a + b)
elif token == '-':
b = stack.pop()
a = stack.pop()
stack.append(a - b)
elif token == '*':
b = stack.pop()
a = stack.pop()
stack.append(a * b)
elif token == '/':
b = stack.pop()
a = stack.pop()
stack.append(a / b)
elif token == '^':
b = stack.pop()
a = stack.pop()
stack.append(a ** b)
# 返回计算结果
return stack.pop()
# 定义函数判断一个字符串是否为数字
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
# 定义运算符优先级
precedence = {'(': 0, ')': 0, '+': 1, '-': 1, '*': 2, '/': 2, '^': 3}
# 定义运算符集合
operators = ('+', '-', '*', '/', '^')
# 定义函数将中缀表达式转换成逆波兰表达式
def to_rpn(expression):
rpn = []
stack = []
for token in expression.split():
if is_number(token):
rpn.append(token)
elif token == '(':
stack.append(token)
elif token == ')':
while stack[-1] != '(':
rpn.append(stack.pop())
stack.pop()
elif token in operators:
while stack and precedence[stack[-1]] >= precedence[token]:
rpn.append(stack.pop())
stack.append(token)
while stack:
rpn.append(stack.pop())
return rpn
# 主程序
while True:
expression = input('请输入表达式(输入q退出):')
if expression == 'q':
break
try:
result = calculate(expression)
print('{} = {}'.format(expression, result))
except:
print('表达式错误,请重新输入!')
```
这个程序的运行方式是在控制台中输入表达式,程序会计算并输出结果,如果表达式格式不正确,程序会提示错误并要求重新输入。可以使用`q`命令退出程序。
阅读全文