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

Постфиксная запись с переменными

26.10.2020, 10:30. Показов 7453. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите плз. Как можно проще решить
Напишите программу, которая вычисляет значение арифметического выражения, записанного в постфиксной форме. В выражении используются только целые числа, имена переменных, знаки арифметических операций и вызовы функций abs, sin, cos и sqrt . Знак '/' обозначает обычное деление (результат – вещественное число).

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

<имя переменной>=<значение>

Каждое имя переменной состоят из одной строчной буквы латинского алфавита.

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

Примеры

входные данные
5 c sqrt + 4 sin z cos sqrt + 1 - / abs
c=15
z=7
выходные данные
9.986

входные данные
5 sin c cos + 4 z sqrt + 1 -
c=15
z=7
выходные данные
ERROR
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.10.2020, 10:30
Ответы с готовыми решениями:

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

Задача №112494. Постфиксная запись
Входные данные На вход программы подаётся символьная строка, которая содержит запись арифметического выражения в постфиксной форме....

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

16
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38193 / 21126 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
26.10.2020, 13:36
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from math import sin,cos,exp,log,sqrt
import sys
 
def post_calc(expr,vartab):
    stack=[]
    try:
        for token in expr.split(" "):
            if  '9'>=token[0]>='0':
                stack=[float(token)]+stack
            elif token in ("sin","cos","exp","abs","log","sqrt"):
                r=stack.pop(0)
                v=eval(token+"("+str(r)+")")
                stack=[v]+stack
            elif token=="+":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1+a2]+stack
            elif token=="-":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1-a2]+stack
            elif token=="*":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1*a2]+stack
            elif token=="/":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1/a2]+stack
            else:
                v=vartab[token]
                stack=[v]+stack
        if len(stack) != 1:
            print("Error")
            return None
        else:
            return stack[0]
    except ZeroDivisionError:
        print("Zero Division!")
    except IndexError:
        print("Error")
 
def task():
    vartab={}
    i=0
    for stri in sys.stdin:
        if i==0:
            expr=stri.strip()
        else:
            tmp=stri.strip()
            if len(tmp)>0:
                tmp=tmp.split("=")
                vartab[tmp[0]]=float(tmp[1])
        i+=1    
    return post_calc(expr,vartab)
    
print(task())
2
0 / 0 / 0
Регистрация: 24.10.2020
Сообщений: 4
26.10.2020, 20:11  [ТС]
Ответ не верный неверный
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38193 / 21126 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
26.10.2020, 20:35
Code_Hunter, ответ верный: 9.986171357830505 просто я его не округлял. Это - давай сам. Или даже это слабО?
0
0 / 0 / 0
Регистрация: 24.10.2020
Сообщений: 4
26.10.2020, 21:29  [ТС]
Ответ неверный, так как при запуске программы она даёт только бесконечный ввод, но не вывод результата
Миниатюры
Постфиксная запись с переменными  
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
26.10.2020, 22:47
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from math import sin,cos,exp,log,sqrt
import sys
 
def post_calc(expr,vartab):
    stack=[]
    try:
        for token in expr.split(" "):
            if  '9'>=token[0]>='0':
                stack=[float(token)]+stack
            elif token in ("sin","cos","exp","abs","log","sqrt"):
                r=stack.pop(0)
                v=eval(token+"("+str(r)+")")
                stack=[v]+stack
            elif token=="+":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1+a2]+stack
            elif token=="-":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1-a2]+stack
            elif token=="*":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1*a2]+stack
            elif token=="/":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1/a2]+stack
            else:
                v=vartab[token]
                stack=[v]+stack
        if len(stack) != 1:
            print("Error")
            return None
        else:
            return stack[0]
    except ZeroDivisionError:
        print("Zero Division!")
    except IndexError:
        print("Error")
 
def task():
    vartab={}
    variables_count = 0
    i=0
    for stri in sys.stdin:
        if i==0:
            expr=stri.strip()
            for token in expr.split():
                if token.isalpha() and len(token) == 1:
                    vartab[token] = 0.0
            variables_count = len(vartab)
            if variables_count == 0:
                break
        else:
            tmp=stri.strip()
            if len(tmp)>0:
                tmp=tmp.split("=")
                vartab[tmp[0].strip()]=float(tmp[1].strip())
            if i==variables_count:
                break
        i+=1    
    return post_calc(expr,vartab)
 
answer = task()
if answer is not None:
    print("{:.3f}".format(answer))
2
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,332
26.10.2020, 22:47
Цитата Сообщение от Code_Hunter Посмотреть сообщение
Примеры
входные данные
5 c sqrt + 4 sin z cos sqrt + 1 - / abs
входные данные
5 sin c cos + 4 z sqrt + 1 -
Можно корректную запись ввода, корень квадратный берется из какого выражения берется, sin чего, абсолютное значение какого выражения? Бред какой то получается.
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
26.10.2020, 22:55
isaak, в первом примере первый корень берется из значения переменной c, второй корень берется из значения косинуса z, синус берется из четырех, абсолютное значение берется для всего выражения в целом. Все просто.
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,332
26.10.2020, 23:22
КулХацкеръ, А 5 и 1 какие действия, тогда выполняют? Не въезжаю?
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
26.10.2020, 23:37
Выражение в постфиксной форме:

5 c sqrt + 4 sin z cos sqrt + 1 - / abs

эквивалентно выражению в инфиксной форме:

abs((sqrt(c) + 5) / (sqrt(cos(z)) + sin(4) - 1))

т.е. 5 - слагаемое, 1 - вычитаемое.
1
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,332
26.10.2020, 23:42
Как тогда будет в в инфиксной форме: 5 sin c cos + 4 z sqrt + 1 -?
0
 Аватар для vpArth
48 / 43 / 10
Регистрация: 20.10.2020
Сообщений: 99
27.10.2020, 00:18
Это некорректное выражение, в процессе его вычисления в стеке останутся 2 результата:
sin(5) + cos(c) и 4 + sqrt(z) - 1
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38193 / 21126 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
27.10.2020, 07:05
Code_Hunter, смотри https://onlinegdb.com/SyCS2zHOD
0
 Аватар для vpArth
48 / 43 / 10
Регистрация: 20.10.2020
Сообщений: 99
27.10.2020, 11:17
Раз уж начали evalить, можно и бинарные операторы туда же)

Python
1
2
3
4
5
            elif token in ("+", "-", "*", "/"):
                a2=stack.pop(0)
                a1=stack.pop(0)
                v=eval('{}{}{}'.format(a1, token, a2))                
                stack=[v]+stack
1
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,332
27.10.2020, 23:23
Catstail, ваша программа:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from math import sin,cos,exp,log,sqrt
import sys
 
def post_calc(expr,vartab):
    stack=[]
    try:
        for token in expr.split(" "):
            if  '9'>=token[0]>='0':
                stack=[float(token)]+stack
            elif token in ("sin","cos","exp","abs","log","sqrt"):
                r=stack.pop(0)
                v=eval(token+"("+str(r)+")")
                stack=[v]+stack
            elif token=="+":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1+a2]+stack
            elif token=="-":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1-a2]+stack
            elif token=="*":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1*a2]+stack
            elif token=="/":
                a2=stack.pop(0)
                a1=stack.pop(0)
                stack=[a1/a2]+stack
            else:
                v=vartab[token]
                stack=[v]+stack
        if len(stack) != 1:
            print("Error")
            return None
        else:
            return stack[0]
    except ZeroDivisionError:
        print("Zero Division!")
    except IndexError:
        print("Error")
 
def task():
    vartab={}
    i=0
    for stri in sys.stdin:
        if i==0:
            expr=stri.strip()
        else:
            tmp=stri.strip()
            if len(tmp)>0:
                tmp=tmp.split("=")
                vartab[tmp[0]]=float(tmp[1])
        i+=1    
    return post_calc(expr,vartab)
    
print(task())
реально даёт только бесконечный ввод, но не вывод результата.
Миниатюры
Постфиксная запись с переменными  
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
28.10.2020, 05:13
isaak, ctrl+d. Или перепиши цикл ввода. Чтобы читала построчно
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38193 / 21126 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
28.10.2020, 08:49
isaak, У ТС, понятное дело, спрашивать бессмысленно. Но в условии задачи не оговорено, чем завершается ввод таблицы переменных. Вот поэтому я и сделал чтение входного потока до конца. А как Вы предполагаете закончить ввод таблицы переменных? Рыжий Лис все объяснил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2020, 08:49
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru