#python
Вопрос:
Я пытаюсь создать калькулятор RPN, который учитывает
3
3
*
4
4
*
=
и возвращает результат после =
ввода. До сих пор мне удавалось заставить его работать для отдельных выражений, т. Е.
3
3
*
=
и
4
4
*
=
но я изо всех сил пытаюсь заставить его пойти дальше, чем хранить результат первого выражения и вычислять второе, не говоря уже о том, чтобы объединить оба результата для получения конечного результата.
Я многое изменил, но текущая версия, которая у меня есть, выглядит так:
def user_inputs():
print("in inputs func:")
operators = {' ', '-', '*', '/', '%', '='}
inputs = [0]
print("initial inputs: ", inputs)
while True:
blank = input()
if blank == '=':
inputs.append(blank)
return inputs
elif blank not in operators: #if integer
inputs.append(int(blank))
print("inputs: ", inputs)
elif blank in operators: #if operator
inputs.append(blank)
print("op inputs: ", inputs)
checking = inputs[-3:]
print("checking: ", checking)
if type(checking[0]) is int and type(checking[1]) is int and checking[2] in operators:
return inputs
else:
print("Unrecognised operator or operand ", blank)
continue
def calculation(inputs):
inputs = inputs()
stack = []
for a in inputs:
stack.append(a)
continue
checking = stack[-3:]
operators = {' ', '-', '*', '/', '%', '='}
if type(checking[0]) is int and type(checking[1]) is int and checking[2] in operators:
stack.pop()
op2, op1 = stack[-1], stack[-2]
print("op1 and op2: ", op1, op2)
if ' ' in inputs: #code for addition
result = op1 op2
stack.append(result)
#user_inputs() position 1
elif '-' in inputs: #code for subtraction
result = op1 - op2
stack.append(result)
elif '/' in inputs: #code for division
if op2 == 0: #if division by 0 is attempted
print("Divide by 0.")
exit()#see how to leave the function so that it doesnt crash
else:
result = int(op1 / op2)
stack.append(result)
elif '*' in inputs: #code for multiplication
result = op1 * op2
stack.append(result)
elif '%' in inputs:
if op2 == 0:
print("Divide by 0.")
exit()
else:
result = op1 % op2
stack.append(result)
if stack[-1] >= 2147483647: # if above limit
return 2147483647
elif stack[-1] <= -2147483648: # if below limit
return -2147483648
else:
return stack[-1]
#user_inputs() position 2
while True:
print("nRESULT:", calculation(user_inputs), "n")
Я искал способы сделать это, но не нашел ничего, что я понимаю в использовании. Я подумывал позвонить user_input()
внутрь calculation()
, но потом не знаю, где бы это можно было разместить. Когда я попытался вызвать его в позиции 1, он позволил мне ввести вторую часть выражения, но не стал возвращаться и выполнять вычисления. Может быть, это из-за того, куда я его положил? Но я все еще даже не уверен, что этот подход верен/когда-либо сможет сделать то, что я хочу.
Есть ли способ снова получить входные данные и каким-то образом вернуться calculation()
в точку, где можно было бы выполнить любой из математических операторов?
Комментарии:
1. Во-первых, вы смотрите на верхнюю часть стека, чтобы определить, есть ли там оператор, а затем выбрасываете его. Вам нужно использовать этот оператор, чтобы знать, что делать с op1 и op2. Повторное сканирование входных данных вам не поможет, так как вы можете получить другого оператора.
2. Для RPN оператору никогда не нужно входить в стек. Числовые входные данные поступают в стек; ввод оператора-это сигнал для удаления соответствующего количества элементов из стека, применения к ним оператора, который вы только что прочитали, а затем помещаете результат в стек. Это
=
всего лишь сигнал для прекращения считывания входных данных и сообщения о верхней части стека в качестве конечного результата.3. @chepner, теперь проблема в том, что структура кода такова, что он должен переходить от входных данных к вычислению и обратно к входным данным.
4. Я попробовал from_calc.append(add ()), где add-это функция, которая добавляет, а from_calc-это место, где будут храниться результаты, но она не работает