树的运用-计算器

实验要求

树的应用:计算器

要求:计算器需要实现所有单击版计算器所具有的功能,并要用到树结构。

代码实现

import re
from tkinter import *

from lark import Lark

grammar = """
    ?start: sum
    ?sum: product
        | sum "+" product   -> add
        | sum "-" product   -> sub
    ?product: atom
        | product "*" atom  -> mul
        | product "÷" atom  -> div
    ?atom: NUMBER           -> number
        | "-" atom         -> neg
        | "(" sum ")"
        | atom "%"          -> percentage
    %import common.CNAME
    %import common.NUMBER
    %import common.WS
    %ignore WS
"""


class Calculator:
    def __init__(self, master):
        self.master = master
        master.title("Calculator")

        self.parser = Lark(grammar, start='start')

        self.display = Entry(master, width=25, font=('Arial', 16))
        self.display.grid(row=0, column=0, columnspan=4, padx=5, pady=5)

        self.display_result = Entry(master, width=25, font=('Arial', 16))
        self.display_result.grid(row=1, column=0, columnspan=4, padx=5, pady=5)

        buttons = [['C', '↼', '^', '÷'],
                   ['7', '8', '9', '*'],
                   ['4', '5', '6', '-'],
                   ['1', '2', '3', '+'],
                   ['%', '0', '.', '='], ]

        for i in range(len(buttons)):
            for j in range(len(buttons[i])):
                self.create_button(buttons[i][j], i + 2, j)

    def create_button(self, text, row, column):
        button = Button(self.master, text=text, width=5, height=2, font=('Arial', 16),
                        command=lambda: self.click(text))
        button.grid(row=row, column=column, padx=5, pady=5)

    def click(self, key):
        if key == '=':
            try:
                expression = self.display.get()
                if re.search(r'\^', expression):
                    result = eval(expression)
                else:
                    tree = self.parser.parse(expression)
                    result = self.evaluate(tree)
                self.display_result.delete(0, END)
                self.display_result.insert(END, result)
            except:
                self.display_result.delete(0, END)
                self.display_result.insert(END, 'Error')
        elif key == 'C':
            self.display.delete(0, END)
            self.display_result.delete(0, END)
        elif key == '↼':
            last_index = self.display.index(END) - 1
            self.display.delete(last_index)
        else:
            self.display.insert(END, key)

    def evaluate(self, tree):
        if tree.data == 'number':
            return float(tree.children[0])
        elif tree.data == 'add':
            return self.evaluate(tree.children[0]) + self.evaluate(tree.children[1])
        elif tree.data == 'sub':
            return self.evaluate(tree.children[0]) - self.evaluate(tree.children[1])
        elif tree.data == 'mul':
            return self.evaluate(tree.children[0]) * self.evaluate(tree.children[1])
        elif tree.data == 'div':
            return self.evaluate(tree.children[0]) / self.evaluate(tree.children[1])
        elif tree.data == 'neg':
            return -self.evaluate(tree.children[0])
        elif tree.data == 'percentage':
            return self.evaluate(tree.children[0]) / 100.0


root = Tk()
calculator = Calculator(root)
root.mainloop()

说明

上述代码是一个简单的计算器应用程序。它使用了Python的Tkinter库来创建一个图形用户界面(GUI),并实现了基本的计算功能。

代码定义了一个Calculator类,它包含了一个窗口(由Tkinter的Tk类创建),一个文本框用于显示输入和输出,以及一组按钮用于输入操作符和数字。

计算器支持基本的四则运算(加法、减法、乘法和除法),同时还支持百分比计算。计算器通过解析用户输入的表达式,使用Lark库构建语法树,并通过递归地评估语法树来计算结果。

用户可以通过点击按钮来输入表达式和操作符,并通过点击"=“按钮来获取计算结果。如果输入的表达式不符合语法规则或者计算过程中出现错误,计算器会显示"Error”。

用户还可以通过点击"C"按钮清除输入和输出,以及通过点击"↼"按钮删除最后一个字符。

总之,这段代码实现了一个简单的图形界面计算器,可以执行基本的四则运算和百分比计算。

你可能感兴趣的:(python,python,算法,机器学习)