
Добавил:
protege121
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лаба 1 Создание арифмитических выражений
.py 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()
# Функция для предварительной обработки выражений
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()