Ученик (106), решён 1 неделю назад
Помогите пожалуйста написать код
Напишите программу на питоне, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки «+», «-», «*» и «/»). Выражение вводится как символьная строка, все числа целые. Операция «/» выполняется как целочисленное деление. Пример: Введите выражение: 12*3+45 Ответ: 81 Функцию eval и методы split и replace не использовать!Лучший ответ
def calculate_expression(expression):
# Функция для выполнения операции
def apply_operation(a, b, op):
if op == '+':
return a + b
elif op == '-':
return a - b
elif op == '*':
return a * b
elif op == '/':
return a // b # Целочисленное деление
else:
raise ValueError("Неизвестная операция")
# Функция для определения приоритета операции
def precedence(op):
if op in ('+', '-'):
return 1
if op in ('*', '/'):
return 2
return 0
# Разбор выражения
i = 0
numbers = []
operators = []
while i < len(expression):
if expression[i].isdigit():
num = 0
while i < len(expression) and expression[i].isdigit():
num = num * 10 + int(expression[i])
i += 1
numbers.append(num)
elif expression[i] in ('+', '-', '*', '/'):
while (operators and precedence(operators[-1]) >= precedence(expression[i])):
b = numbers.pop()
a = numbers.pop()
op = operators.pop()
numbers.append(apply_operation(a, b, op))
operators.append(expression[i])
i += 1
else:
i += 1
# Выполнение оставшихся операций
while operators:
b = numbers.pop()
a = numbers.pop()
op = operators.pop()
numbers.append(apply_operation(a, b, op))
return numbers[0]
# Ввод выражения
expression = input("Введите выражение: ")
# Вычисление и вывод результата
result = calculate_expression(expression)
print("Ответ:", result)
Остальные ответы
Вариант с постфиксным преобразованием (можно использовать круглые скобки), например: 2*(3+3)/6-1
import re
def infix_to_postfix(expression):
precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 0, ')': 0}
output = []
operators = []
tokens = re.findall(r'\d+|[+\-*/()]', expression)
for token in tokens:
if token.isdigit():
output.append(token)
elif token == '(':
operators.append(token)
elif token == ')':
while operators and operators[-1] != '(':
output.append(operators.pop())
operators.pop()
else:
while (operators and precedence[operators[-1]] >= precedence[token]):
output.append(operators.pop())
operators.append(token)
while operators:
output.append(operators.pop())
return output
def evaluate_postfix(postfix):
stack = []
for token in postfix:
if token.isdigit():
stack.append(int(token))
else:
b, a = stack.pop(), stack.pop()
if token == '+': stack.append(a + b)
elif token == '-': stack.append(a - b)
elif token == '*': stack.append(a * b)
elif token == '/': stack.append(a / b)
return stack[0]
def main():
while True:
expr = input("Введите выражение (или 'exit' для выхода): ").replace(' ', '')
if expr.lower() == 'exit':
break
try:
postfix = infix_to_postfix(expr)
result = evaluate_postfix(postfix)
print("Результат:", result)
except Exception as e:
print("Ошибка в выражении:", e)
if __name__ == "__main__":
main()
Введите выражение (или 'exit' для выхода): 2*(3+3)/6-1
Результат: 1.0 def calc(op, a, b): # вычисление одной арифметической операции
return {'+': a.__add__, '-': a.__sub__, '*': a.__mul__, '/': a.__floordiv__}[op](b)
d, o, s = [], '', ''
for ch in input() + '@': # получение чисел и операций
if ch.isdigit(): # цифру добавляем к текущему числу
s += ch
else: # не цифру добавляем в операции, а текущее число запоминаем
d.append(int(s))
o +=ch
s = ''
if o[0] in '+-' and o[1] in '*/': # вторая операция выполняется первой
print(calc(o[0], d[0], calc(o[1], d[1], d[2])))
else: # операции выполняются в порядке появления
print(calc(o[1], calc(o[0], d[0], d[1]), d[2]))
Все вопросы
Категории
Избранные