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

Задача №112494. Постфиксная запись

08.02.2022, 11:02. Показов 7993. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Входные данные
На вход программы подаётся символьная строка, которая содержит запись арифметического выражения в постфиксной форме. Элементы постфиксной записи разделены пробелами.

Выходные данные
Программа должна вывести значение переданного ей выражения. Если выражение записано неверно, программа должна вывести слово 'ERROR'.

Примеры
входные данные
5 15 + 4 7 + 1 - /
выходные данные
2
входные данные
5 15 + 4 7 + 1 -
выходные данные
ERROR
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.02.2022, 11:02
Ответы с готовыми решениями:

Постфиксная запись
Условие: Напишите программу, которая вычисляет значение арифметического выражения, записанного в постфиксной форме. В выражении...

Постфиксная запись с переменными
Помогите плз. Как можно проще решить Напишите программу, которая вычисляет значение арифметического выражения, записанного в постфиксной...

Постфиксная запись
Всем доброго времени суток! Подскажите что нужно исправить в коде? Выдаёт ошибку в Функции Pop_Operation. Вот задача: Реализовать ...

26
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
08.02.2022, 12:11
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
def calc_postf_expr(s):
    lis = s.split()
    st  = []
    op = ''
    while lis:
        st.append( lis.pop(0) )
        if not st[-1].isdigit():
            if len(st) < 3:
                return False
            op = st.pop()
            R = int( st.pop() )
            L = int( st.pop() )
            match op:
                case '+':
                    st.append( L + R )
                case '-':
                    st.append( L - R )
                case '*':
                    st.append( L * R )
                case '/':
                    st.append( L / R )
                case _:
                    return False
    if len(st) != 1:
        return False
    return int( st.pop() )
#==============================================================================
s = input( 'Арифм. выражение в постфиксной записи: ' )
res = calc_postf_expr(s)
print('ERROR') if not res else print( res )
1
 Аватар для VistaSV30
987 / 331 / 79
Регистрация: 10.04.2012
Сообщений: 1,241
Записей в блоге: 4
08.02.2022, 12:20
Еще вариант
Python
1
2
3
4
5
6
7
8
9
10
11
12
a = '5 15 + 4 7 + 1 - /'
b, f = a.split(), ''
   
d = [i for i in b if i.isdigit()]  # Числа
s = [i for i in b if not i.isdigit()] + ['=']  # Знаки
 
if len(d) == len(s):
    for i,j in enumerate(d):
        f += j + s[i]
    print(f[:-1], '=', eval(f[:-1]))
else:
    print('ERROR')
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
08.02.2022, 13:01
VistaSV30, не вариант.
Контрпример: a = '4 2 + 1 2 + /'
0
 Аватар для VistaSV30
987 / 331 / 79
Регистрация: 10.04.2012
Сообщений: 1,241
Записей в блоге: 4
08.02.2022, 16:38
idealist, согласен.
Вот рабочий вариант, по хорошему бы сделать без try, но это уже как-нибудь в следующий раз
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
a = '5 15 + 4 7 + 1 - /'
a = '4 2 + 1 2 + /'
 
b, f = a.split(), ''
 
n = 0
for i,j in enumerate(b):  # знаки в конце строки
    if j.isdigit(): n = i+1
s2 = b[n:]
 
n, ns = 0, 0
try:
    while n < (len(b)-len(s2)):
        f += b[n]
        if (b[n].isdigit()) and (b[n+1].isdigit()):
            f += s2[ns]
            ns +=1
 
        n += 1
    print(f,'=', eval(f))
    
except Exception:
    print('ERROR')
Добавлено через 1 час 17 минут
А вот придет iSmokeJC он всё в две строки сделает
0
08.02.2022, 16:44

Не по теме:

Хм. С чего бы это?

0
 Аватар для VistaSV30
987 / 331 / 79
Регистрация: 10.04.2012
Сообщений: 1,241
Записей в блоге: 4
08.02.2022, 16:52
iSmokeJC, регулярным выражением можно найти положение последней цифры в строке?
Например, в строке '4 2 + 1 2 + /' это будет 9
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
08.02.2022, 16:58
Цитата Сообщение от VistaSV30 Посмотреть сообщение
Например, в строке '4 2 + 1 2 + /' это будет 9
Это как?

Добавлено через 43 секунды
Вообще логику не прослеживаю
0
 Аватар для VistaSV30
987 / 331 / 79
Регистрация: 10.04.2012
Сообщений: 1,241
Записей в блоге: 4
08.02.2022, 17:04
Определить положение последней цифры, встречающейся в строке. Здесь это цифра 3 на восьмой позиции.
Python
1
2
3
4
5
a = '4 2 + 1 3 + /'
for i,j in enumerate(a):
    if j.isdigit(): n = i
        
print(n,'-',a[n])
0
0 / 0 / 0
Регистрация: 08.02.2022
Сообщений: 11
08.02.2022, 17:06  [ТС]
idealist, Все работает, но не проходит тест по времени.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
08.02.2022, 17:06
VistaSV30, ну хорошо, нашли последнюю цифру и ее позицию. Дальше-то что?
0
 Аватар для VistaSV30
987 / 331 / 79
Регистрация: 10.04.2012
Сообщений: 1,241
Записей в блоге: 4
08.02.2022, 17:09
Потом разделяем строку по этой позиции на две части.
Далее вставляем знаки из второй части на места пропусков в первой части. То, что требуется по условию задачи
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
08.02.2022, 17:22
Какой-то лютый замут
Python
1
2
3
4
5
6
7
8
from re import findall as find
from itertools import zip_longest as zip
 
s = '5 15 + 4 7 + 1 - /' # input()
if len(find(r'\d+', s)) - 1 != len(find(r'[^\d\s]', s)):
    print('error')
else:
    print(eval(''.join(''.join(i) for i in zip(find(r'\d+', s), find(r'[^\d\s]', s), fillvalue=''))))
1
 Аватар для VistaSV30
987 / 331 / 79
Регистрация: 10.04.2012
Сообщений: 1,241
Записей в блоге: 4
08.02.2022, 17:26
iSmokeJC, где-то ошибка. 4/7 - это дробь, целочисленного ответа не может быть
0
0 / 0 / 0
Регистрация: 08.02.2022
Сообщений: 11
08.02.2022, 17:42  [ТС]
idealist, idealist, Не то посмотрел, с временем все норм. При тесте на сайте пишет "Ошибка во время выполнения программы."
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
08.02.2022, 17:45
Цитата Сообщение от VistaSV30 Посмотреть сообщение
4/7 - это дробь
Где ты тут увидел 4/7 ?
5 15 + 4 7 + 1 - / ==> 5 + 15 + 4 - 7 / 1
Кстати, можешь сравнить вывод со своим кодом - одинаково.
0
 Аватар для VistaSV30
987 / 331 / 79
Регистрация: 10.04.2012
Сообщений: 1,241
Записей в блоге: 4
08.02.2022, 18:02
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Кстати, можешь сравнить вывод со своим кодом - одинаково.
Да, в первом варианте решения у меня так и получалось
[i for i in b if not i.isdigit()]

find(r'[^\d\s]', s)

Тут в обоих вариантах получается, что знаки идут последовательно, как они встречаются в строке, а надо вставлять на место пропусков
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
08.02.2022, 18:18
Цитата Сообщение от VistaSV30 Посмотреть сообщение
а надо вставлять на место пропусков
Аааа, дошло

Добавлено через 1 минуту
Тогда не пойму, как вот тут
Цитата Сообщение от Sergey2872 Посмотреть сообщение
5 15 + 4 7 + 1 - /
получается
Цитата Сообщение от Sergey2872 Посмотреть сообщение
выходные данные
2
???
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
08.02.2022, 19:33
Цитата Сообщение от Sergey2872 Посмотреть сообщение
При тесте на сайте пишет "Ошибка во время выполнения программы."
А так:

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
33
34
35
36
37
38
39
40
41
42
43
def calc_postf_expr(s):
    #==========================================================================
    def is_op(symb):
        return symb in ops
    # ==========================================================================
    ops = ('+', '-', '*', '/')
    lis = s.split()
    st  = []
    
    while lis:
        symb = lis.pop(0)
        if not is_op(symb):
            try:
                num = float(symb)
            except:
                return False
            st.append( num )
        else:
            if len(st) < 2:
                return False
            R = st.pop()
            L = st.pop()
            match symb:
                case '+':
                    st.append( L + R )
                case '-':
                    st.append( L - R )
                case '*':
                    st.append( L * R )
                case '/':
                    try:
                        st.append( L / R )
                    except:
                        return False
                case _:
                    return False
    if len(st) != 1:
        return False
    return float( st.pop() )
#==============================================================================
s = input()
res = calc_postf_expr(s)
print('ERROR') if not res else print( res )
0
0 / 0 / 0
Регистрация: 08.02.2022
Сообщений: 11
08.02.2022, 20:10  [ТС]
idealist Та же проблема...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2022, 20:10
Помогаю со студенческими работами здесь

Постфиксная запись
Требуется разботать приложение, которое на вход получает арифметическое выражение в инфиксной форме. Приложение должно переводить выражение...

Постфиксная запись
В постфиксной записи (или обратной польской записи) операция записывается после двух операндов. Например, сумма двух чисел A и B...

Постфиксная запись
Добрый день, хотел бы получить помощь в данной задаче: ТЫК К сожалению не могу приложить свой код, потому что даже не знаю, с...

Постфиксная запись
В постфиксной записи (или обратной польской записи) операция записывается после двух операндов. Например, сумма двух чисел A и B...

Постфиксная запись)
короч надо написать программу которая будет инфиксную(обычную стандартную) запись выражения переделывать в постфиксную (когда все знаки...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru