Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите пожалуйста написать код

Aleksander Klimanov Ученик (93), на голосовании 3 дня назад
Напишите программу на питоне, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки «+», «-», «*» и «/»). Выражение вводится как символьная строка, все числа целые. Операция «/» выполняется как целочисленное деление.
Пример:
Введите выражение:
12*3+45
Ответ: 81
Функцию eval и методы split и replace не использовать!
Голосование за лучший ответ
Максим Квидов Гуру (2629) 1 месяц назад
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)
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (273462) 1 месяц назад
Вариант с постфиксным преобразованием (можно использовать круглые скобки), например: 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
Андрей Высший разум (481879) 1 месяц назад
 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]))
Похожие вопросы