Скачиваний:
6
Добавлен:
10.11.2023
Размер:
4.31 Кб
Скачать
import os
import sys

class Stack:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return len(self.items) == 0

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()

    def peek(self):
        if not self.is_empty():
            return self.items[-1]

    def precedence(self, op):
        if op == '+' or op == '-':
            return 1
        elif op == '*' or op == '/':
            return 2
        return 0

def infix_to_postfix(infix_expression):
    stack = Stack()
    postfix_expression = []
    operators = "+-*/"

    for symbol in infix_expression:
        if symbol.isalnum() or '.' in symbol:
            postfix_expression.append(symbol)
        elif symbol in operators:
            while (not stack.is_empty() and
                   stack.precedence(stack.peek()) >= stack.precedence(symbol)):
                postfix_expression.append(stack.pop())
            stack.push(symbol)
        elif symbol == '(':
            stack.push(symbol)
        elif symbol == ')':
            while not stack.is_empty() and stack.peek() != '(':
                postfix_expression.append(stack.pop())
            stack.pop()

    while not stack.is_empty():
        postfix_expression.append(stack.pop())

    return "".join(postfix_expression)

def evaluate_postfix(postfix_expression, variables):
    stack = Stack()
    operators = "+-*/"

    for symbol in postfix_expression:
        if symbol.isalnum() or '.' in symbol:
            stack.push(symbol)
        elif symbol in operators:
            operand2 = stack.pop()
            operand1 = stack.pop()
            result = perform_operation(operand1, operand2, symbol, variables)
            stack.push(str(result))

    return stack.pop()

def perform_operation(operand1, operand2, operator, variables):
    operand1_value = get_operand_value(operand1, variables)
    operand2_value = get_operand_value(operand2, variables)

    if operator == '+':
        return operand1_value + operand2_value
    elif operator == '-':
        return operand1_value - operand2_value
    elif operator == '*':
        return operand1_value * operand2_value
    elif operator == '/':
        if operand2_value != 0:
            return operand1_value / operand2_value
        else:
            print(f"Ошибка: деление на ноль при операции {operand1} / {operand2}.")
            sys.exit(1)

def get_operand_value(operand, variables):
    try:
        return float(operand)
    except ValueError:
        if operand in variables:
            return variables[operand]
        else:
            print(f"Ошибка: переменная {operand} не определена.")
            sys.exit(1)

def restart_script():
    python = sys.executable
    os.execl(python, python, *sys.argv)

def main():
    while True:
        variables = {}

        infix_expression = input("Введите инфиксное выражение: ")

        # Предварительное определение переменных
        var_definition = input("Введите определение переменных (например, a=2 b=3): ")
        for definition in var_definition.split():
            var, value = definition.split('=')
            variables[var] = float(value)

        postfix_expression = infix_to_postfix(infix_expression)

        with open("output.txt", "w") as file:
            file.write(postfix_expression)

        print("Постфиксная форма: ", postfix_expression)

        result = evaluate_postfix(postfix_expression, variables)
        print("Результат вычисления: ", result)

        choice = input("Хотите ввести новое выражение? (yes/no): ")
        if choice.lower() != 'yes':
            break
        else:
            choice_restart = input("Хотите перезапустить программу? (yes/no): ")
            if choice_restart.lower() != 'yes':
                break
            else:
                restart_script()

if __name__ == "__main__":
    main()
Соседние файлы в папке Лабораторные 1-5 для Вариант 19