С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 01.11.2022
Сообщений: 28

Задача Калькулятор

09.01.2023, 18:31. Показов 4943. Ответов 5

Студворк — интернет-сервис помощи студентам
Добрый день!
Пытаюсь решить задачу Калькулятор:

Задание связано с обратной польской нотацией. Она используется для парсинга арифметических выражений. Еще её иногда называют постфиксной нотацией.

Для вычисления значения выражения, записанного в обратной польской нотации, нужно считывать выражение слева направо и придерживаться следующих шагов:

Обработка входного символа:
Если на вход подан операнд, он помещается на вершину стека.
Если на вход подан знак операции, то эта операция выполняется над требуемым количеством значений, взятых из стека в порядке добавления. Результат выполненной операции помещается на вершину стека.
Если входной набор символов обработан не полностью, перейти к шагу 1.
После полной обработки входного набора символов результат вычисления выражения находится в вершине стека. Если в стеке осталось несколько чисел, то надо вывести только верхний элемент.
Замечание про отрицательные числа и деление: в этой задаче под делением понимается математическое целочисленное деление. Это значит, что округление всегда происходит вниз. А именно: если a / b = c, то b ⋅ c — это наибольшее число, которое не превосходит a и одновременно делится без остатка на b.


В текущей задаче гарантируется, что деления на отрицательное число нет.

Формат ввода
В единственной строке дано выражение, записанное в обратной польской нотации. Числа и арифметические операции записаны через пробел.

На вход могут подаваться операции: +, -, *, / и числа, по модулю не превосходящие 10000.

Гарантируется, что значение промежуточных выражений в тестовых данных по модулю не больше 50000.

Формат вывода
Выведите единственное число — значение выражения.


Так вот, у меня тест падает когда:
1) Во входящих данных вообще нет какого-либо оператора + - / *.
2) При входных данных 4 13 5 / +
ошибка одна:
Code
1
2
3
4
5
6
Traceback (most recent call last):
  File "e46624b2-e85c-42cc-96dc-a387e78b884c", line 32, in <module>
    func(x)
  File "e46624b2-e85c-42cc-96dc-a387e78b884c", line 10, in func
    if x[i] == '+':
IndexError: list index out of range
3) При данных 0 10 * -8 10 / + -9 4 / -10 5 * - * 1 0 - 6 -3 * - 7 3 / 10 -6 - - - /
ошибка
Python
1
2
3
4
Traceback (most recent call last):
  File "b7271c29-ec80-4d7a-98de-249b39ba8544", line 14, in <module>
    a.insert(i - 2, int(a[i - 2]) * int(a[i - 1]))
ValueError: invalid literal for int() with base 10: '+'
Для данных при отсутствии знака какого-то я пробовал то, что закоменчено, но это не правильно..
Что добавить для ситуации, когда нет операторов? Мне не догадаться... (должна выводится последняя введенная цифра)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def func(step):
    i = 0
    
    # if '+' or '-' or '*' or '/' not in x:
    #     print(x[-1])
    #     return
 
    while len(x) > 1:
        
        if x[i] == '+':
            x.insert(i - 2, int(x[i - 2]) + int(x[i - 1]))
            del x[i - 1: i + 2]
            i -= 2
        elif x[i] == '-':
            x.insert(i - 2, int(x[i - 2]) - int(x[i - 1]))
            del x[i - 1: i + 2]
            i -= 2
        elif x[i] == '*':
            x.insert(i - 2, int(x[i - 2]) * int(x[i - 1]))
            del x[i - 1: i + 2]
            i -= 2
        elif x[i] == '/':
            x.insert(i - 2, int(x[i - 2]) // int(x[i - 1]))
            del x[i - 1: i + 2]
        else:
            i += 1
 
    return print(x[0])
 
x = input().split()
 
func(x)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2023, 18:31
Ответы с готовыми решениями:

Задача 1. «Калькулятор»
Задание: Написать приложение с графическим интерфейсом «Калькулятор». Оно должно содержать: индикатор вывода результата, четыре кнопки с...

Задача 2. «Калькулятор+»
Задание: Добавить в приложение «Калькулятор» дополнительные кнопки: (код=8730), (код=177), (код=8592), (код=247). Примечание. В...

Егэ задача про калькулятор
сказали что неправильно решена, на как такое возможно?

5
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
09.01.2023, 19:16
Лучший ответ Сообщение было отмечено eltimc как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def parse(lst):
    operands = {
        '+': lambda x,y: x+y,
        '-': lambda x,y: y-x,
        '*': lambda x,y: x*y,
        '/': lambda x,y: y//x
    }
    stack = []
    for step in lst:
        if step in operands:
            stack.append(operands[step](stack.pop(),stack.pop()))
        else:
            stack.append(int(step))
    return stack.pop()
 
print(parse(input().split()))
3
0 / 0 / 0
Регистрация: 01.11.2022
Сообщений: 28
09.01.2023, 20:16  [ТС]
Red white socks, Да, это решение прошло, спасибо! Буду разбираться.. Но я бы хотел что-то, из моего кода сделать, тк тут какое-то серьезное...
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
09.01.2023, 21:47
Цитата Сообщение от eltimc Посмотреть сообщение
Но я бы хотел что-то, из моего кода сделать
Ваш код плох тем, что реализуя стек, вы используете операции для списка (обращение по индексу).
Поэтому код непрозрачен и как следствие, нечитабелен, негибок и небезопасен (в плане возможных ошибок)
У стека должно быть только 2 операции:
1. push (добавить элемент). В реализации через список: list.append
2. pop(взять элемент). list.pop

Добавлено через 30 минут
Ох, только сейчас заметил, что вы смешали стек с распарсиваемой последовательностью. Неудивительно, что и запутались...
3
0 / 0 / 0
Регистрация: 01.11.2022
Сообщений: 28
09.01.2023, 22:23  [ТС]
Red white socks, Большое вам спасибо! Надеюсь, когда-нибудь научусь также код писать..
0
0 / 0 / 0
Регистрация: 01.11.2022
Сообщений: 28
10.01.2023, 11:33  [ТС]
Red white socks, Можно задать вопрос по этому коду?
Я почти разобрался, но возник вопрос - stack.append(operands[step](stack.pop(),stack.pop())).
Почему когда делаем append тут 2 раза stack.pop()?

А я понял теперь, это для lambda 2 посл значения..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2023, 11:33
Помогаю со студенческими работами здесь

Задача "Калькулятор с восстановлением ответа"
Имеется калькулятор, который выполняет три операции: Прибавить к числу X единицу. Умножить число X на 2. Умножить число X на 3. ...

Задача «Калькулятор»
Долго не могу решить, и ничего годного нигде не нашёл. Имеется калькулятор, который выполняет три операции: прибавить к числу

Задача по Python Текстовый калькулятор
Прошу помощи в задаче, начал решение, но совершенно не знаю как выполнить до конца её. Заранее спасибо! with open('calc.txt') as f: ...

Задача калькулятор и две команды: Прибавить и умножить
У исполнителя Калькулятор две команды, которым присвоены номера: 1. прибавь 2, 2. умножь на 5. Первая из них увеличивает число на...

Задача "Калькулятор"
Имеется калькулятор, который выполняет три операции: прибавить к числу X единицу; умножить число X на 2; умножить число X на 3. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru