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

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

09.01.2023, 18:31. Показов 4991. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru