Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба 1 Создание арифмитических выражений

.py
Скачиваний:
1
Добавлен:
08.12.2024
Размер:
6 Кб
Скачать
import re

# Функция для предварительной обработки выражений
def preprocess_expression(expression):
    """
    Обрабатывает выражение, добавляя пробелы вокруг операторов и скобок.
    """
    # Добавление пробелов вокруг операторов и скобок
    expression = re.sub(r"([+\-*/()])", r" \1 ", expression)
    # Удаление лишних пробелов
    return ' '.join(expression.split())

# Функция для задания приоритетов операторов
def get_precedence(op):
    if op in ('+', '-'):
        return 1
    if op in ('*', '/'):
        return 2
    return 0

# Проверка, является ли символ оператором
def is_operator(c):
    return c in ('+', '-', '*', '/')

# Перевод из инфиксной в постфиксную форму
def infix_to_postfix(expression):
    stack = []
    postfix = []
    for char in expression.split():
        if char.isdigit():  # Если операнд
            postfix.append(char)
        elif char == '(':  # Если открывающая скобка
            stack.append(char)
        elif char == ')':  # Если закрывающая скобка
            while stack and stack[-1] != '(':
                postfix.append(stack.pop())
            stack.pop()  # Удаляем '('
        elif is_operator(char):  # Если оператор
            while stack and get_precedence(stack[-1]) >= get_precedence(char):
                postfix.append(stack.pop())
            stack.append(char)
    while stack:  # Добавляем оставшиеся операторы
        postfix.append(stack.pop())
    return ' '.join(postfix)

# Вычисление выражения в постфиксной форме
def evaluate_postfix(expression):
    stack = []
    for char in expression.split():
        # Проверяем, является ли символ числом
        try:
            stack.append(float(char))  # Всегда преобразуем в float
        except ValueError:
            if is_operator(char):  # Если символ — оператор
                if len(stack) < 2:  # Проверка на достаточное количество операндов
                    raise ValueError("Некорректное постфиксное выражение. Недостаточно операндов для операции.")
                b = stack.pop()
                a = stack.pop()
                if char == '+':
                    stack.append(a + b)
                elif char == '-':
                    stack.append(a - b)
                elif char == '*':
                    stack.append(a * b)
                elif char == '/':
                    if b == 0:
                        raise ZeroDivisionError("Деление на ноль невозможно.")
                    stack.append(a / b)  # Используем обычное деление
            else:
                raise ValueError(f"Некорректный символ: {char}")
    if len(stack) != 1:  # В конце должен остаться один результат
        raise ValueError("Некорректное постфиксное выражение. Проверьте ввод.")
    return stack[0]


# Вычисление выражения в инфиксной форме
def evaluate_infix(expression):
    postfix = infix_to_postfix(expression)
    return evaluate_postfix(postfix)

# Главное меню
def main():
    while True:
        print("\nМеню:")
        print("1. Посчитать выражение в инфиксном виде.")
        print("2. Посчитать выражение в постфиксном виде.")
        print("3. Перевести выражение из инфиксного в постфиксный вид.")
        print("4. Выход.")
        choice = input("Выберите опцию: ")
        
        if choice == '1':
            expr = input("Введите выражение в инфиксной форме (например, (35+100)*24): ")
            expr = preprocess_expression(expr)  # Обработка ввода
            try:
                result = evaluate_infix(expr)
                print(f"Результат: {result}")
            except Exception as e:
                print(f"Ошибка: {e}")
        
        elif choice == '2':
            expr = input("Введите выражение в постфиксной форме (например, 35 100 + 24 *): ")
            try:
                result = evaluate_postfix(expr)
                print(f"Результат: {result}")
            except Exception as e:
                print(f"Ошибка: {e}")
        
        elif choice == '3':
            expr = input("Введите выражение в инфиксной форме (например, (35+100)*24): ")
            expr = preprocess_expression(expr)  # Обработка ввода
            try:
                postfix = infix_to_postfix(expr)
                print(f"Постфиксная форма: {postfix}")
            except Exception as e:
                print(f"Ошибка: {e}")
        
        elif choice == '4':
            print("Выход из программы.")
            break
        else:
            print("Неверный выбор. Попробуйте снова.")

if __name__ == "__main__":
    main()