计算器实现
class Calculator:
def __init__(self):
self.queue = [] # 用于存储输入的计算表达式
def press_key(self, key):
if self.is_valid_key(key):
if key == '=':
result = self.calculate()
if result is not None:
self.just_clear()
# for ch in str(result):
# self.add_to_queue(ch) # 将结果添加到队列中
print(result)
elif key == 'AC':
self.clear()
elif key == '+/-':
self.toggle_sign()
elif key == '%':
self.percent()
else:
self.add_to_queue(key)
def is_valid_key(self, key):
valid_keys = {'AC', '+/-', '%', '/', '*', '-', '+', '=', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
return key in valid_keys
def add_to_queue(self, key):
if key.isdigit():
# 处理数字输入
if len(self.queue) == 0 and key == '0':
return # 避免添加无意义的0
if len(self.queue) > 0 and self.queue[-1].isdigit() and self.queue[-1] == '0':
self.queue.pop() # 删除之前的无意义0
self.queue.append(key)
elif key == '.':
# 检查队列中是否已有小数点,确保只能在数字后添加小数点
if len(self.queue) > 0 and self.queue[-1].isdigit():
# 遍历队列,确保在最近的运算符前没有小数点
for i in range(len(self.queue) - 1, -1, -1):
if self.queue[i] in {'+', '-', '*', '/'}:
break # 遇到运算符停止
if '.' in self.queue[i]:
return # 如果在数字中已经有小数点,忽略输入
self.queue[-1] += '.' # 将小数点添加到最后的数字
else:
if len(self.queue) == 0: # 如果队列为空,不允许直接输入运算符
return
last_key = self.queue[-1]
# 不允许连续运算符
if last_key in {'+', '-', '*', '/'} and key in {'+', '-', '*', '/'}:
return
self.queue.append(key)
def clear(self):
self.queue = []
print("Calculator cleared.")
def just_clear(self):
self.queue = []
def toggle_sign(self):
if len(self.queue) > 0 and self.queue[-1].replace('.', '', 1).isdigit(): # 处理数字或小数
number = str(-float(self.queue[-1]))
self.queue[-1] = number
print(f"Toggled sign: {number}")
def percent(self):
if len(self.queue) > 0 and self.queue[-1].replace('.', '', 1).isdigit(): # 处理数字或小数
number = str(float(self.queue[-1]) / 100)
self.queue[-1] = number
print(f"Percent: {number}")
def calculate(self):
expression = ''.join(self.queue)
print(expression,end='=')
try:
result = eval(expression)
return result
except Exception as e:
print(f"Error\n{e}")
self.clear()
return None
# 示例用法
calculator = Calculator()
calculator.press_key('1')
calculator.press_key('0')
calculator.press_key('+')
calculator.press_key('5')
calculator.press_key('=')
calculator.press_key('AC')
calculator.press_key('0')
calculator.press_key('2')
calculator.press_key('*')
calculator.press_key('.')
calculator.press_key('5') # 形成小数0.5
calculator.press_key('=')
calculator.press_key('3')
calculator.press_key('.')
calculator.press_key('3')
calculator.press_key('+')
calculator.press_key('2')
calculator.press_key('.')
calculator.press_key('1')
calculator.press_key('=')
calculator.press_key('3')
calculator.press_key('.')
calculator.press_key('3')
calculator.press_key('+')
calculator.press_key('.')
calculator.press_key('2')
calculator.press_key('.')
calculator.press_key('1')
calculator.press_key('.')
calculator.press_key('5')
calculator.press_key('=')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('.')
calculator.press_key('3')
calculator.press_key('0')
calculator.press_key('+')
calculator.press_key('.')
calculator.press_key('0')
calculator.press_key('2')
calculator.press_key('1')
calculator.press_key('=')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('3')
calculator.press_key('0')
calculator.press_key('+')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('.')
calculator.press_key('2')
calculator.press_key('1')
calculator.press_key('=')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('3')
calculator.press_key('0')
calculator.press_key('+')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('0')
calculator.press_key('.')
calculator.press_key('2')
calculator.press_key('1')
calculator.press_key('=')