软件工程课堂讨论二

计算器实现

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('=')
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇