С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 25.01.2024
Сообщений: 10

Ошибка: Постфиксная запись

10.02.2024, 14:07. Показов 1145. Ответов 10

Студворк — интернет-сервис помощи студентам
Добрый день! Укажите, пожалуйста, на ошибку в коде. Не проходит 2 теста из 22.

Условие задачи
Напишите программу, которая вычисляет значение арифметического выражения, записанного в постфиксной форме. В выражении используются только целые числа и знаки арифметических операций. Знак '/' обозначает целочисленное деление.

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

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

Примеры
входные данные
5 15 + 4 7 + 1 - /
выходные данные
2

входные данные
5 15 + 4 7 + 1 -
выходные данные
ERROR

C++
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include <string>
#include <stack>
#include <sstream>
using namespace std;
 
int main()
{
    string s;
    getline(cin, s);
    
    istringstream ssin(s);
    
    stack <int> stek;
    int a, b;
    string elem;
    bool err = false;
    
    while (ssin >> elem)
    {
        if (elem == "+")
        {
            if (stek.size() >= 2)
            {
                a = stek.top(); stek.pop();
                b = stek.top(); stek.pop();
                stek.push(a + b);
            }
            else
            {
                err = true;
                break;
            }
        }
        
        else if (elem == "-")
        {
            if (stek.size() >= 2)
            {
                a = stek.top(); stek.pop();
                b = stek.top(); stek.pop();
                stek.push(b - a);
            }
            else
            {
                err = true;
                break;
            }
        }
 
        else if (elem == "*")
        {
            if (stek.size() >= 2)
            {
                a = stek.top(); stek.pop();
                b = stek.top(); stek.pop();
                stek.push(a * b);
            }
            else
            {
                err = true;
                break;
            }
        }
        
        else if (elem == "/")
        {
            if (stek.size() >= 2 && stek.top() != 0)
            {
                a = stek.top(); stek.pop();
                b = stek.top(); stek.pop();
                stek.push(b / a);
            }
            else
            {
                err = true;
                break;
            }
        }
            
        else stek.push(atoi(elem.c_str()));
    }
    
    if (stek.size() != 1 || err) cout << "ERROR";
    else cout << stek.top();
       
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2024, 14:07
Ответы с готовыми решениями:

Не могу разобраться в чём ошибка(инфиксная и постфиксная запись выражения)
на вход для простоты подаю коротенько выражение меньше 10 символов цифры во входе тоже от 0 до 10 при выводе строки otvet ничег оне...

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

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

10
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,237
10.02.2024, 14:16
Я не понял почему в 1-ом примере в конце -(минус) и /(поделить). Как думаю я? 5+15=20. Дальше: 20+4+7=31. Дальше: 31-1=30. И это окончательный ответ. Зачем /(поделить) в конце, непонятно?

Добавлено через 1 минуту
Почему-то во 2-ом примере вывело ошибку. И какая там ошибка?
0
0 / 0 / 0
Регистрация: 25.01.2024
Сообщений: 10
10.02.2024, 14:24  [ТС]
Добрый день! Инфиксная форма выражения выглядит следующим образом: (5 + 15) / (4 + 7 - 1).
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,010
10.02.2024, 17:58
Так инфиксная или постфиксная форма используется? Либо вообще префиксная?
Судя по примеру, больше похоже на постфиксную: http://aliev.me/runestone/Basi... sions.html.
Но тут я не сильно разбираюсь.

Добавлено через 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
from pythonds.basic.stack import Stack
 
def postfixEval(postfixExpr):
    operandStack = Stack()
    tokenList = postfixExpr.split()
 
    for token in tokenList:
        if token in "0123456789":
            operandStack.push(int(token))
        else:
            operand2 = operandStack.pop()
            operand1 = operandStack.pop()
            result = doMath(token,operand1,operand2)
            operandStack.push(result)
    return operandStack.pop()
 
def doMath(op, op1, op2):
    if op == "*":
        return op1 * op2
    elif op == "/":
        return op1 / op2
    elif op == "+":
        return op1 + op2
    else:
        return op1 - op2
 
print(postfixEval('7 8 + 3 2 + /'))
Добавлено через 6 минут
Или можно посмотреть Постфиксная запись.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.02.2024, 02:05
Цитата Сообщение от RaphisGunn Посмотреть сообщение
stek.push(b / a);
Мне казалось, что я видел чей-то коммент о том, что нет проверки деления на ноль.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
11.02.2024, 07:45
Ну а в чём проблема то? Первое выражение правильное и соответствует (5 + 15) / (4 + 7 - 1). Второе (без знака деления в конце) соответствует (5 + 15) (4 + 7 - 1), что очевидно является ошибкой с точки зрения арифметики.
Миниатюры
Ошибка: Постфиксная запись  
0
11.02.2024, 13:29

Не по теме:

Цитата Сообщение от alexu_007 Посмотреть сообщение
Ну а в чём проблема то?
Проблема эта на нашем форуме давно известна и всеми "любимая" :
Хочу трактор в котором я бы мог летать и что бы он помещался мне в карман.
-"Но я ничего не знаю ни о тракторах, ни о полетах. Но об этом я конечно никому не скажу."-
Плюс ещё тупой копипастинг. Скопировали, а что, куда и зачем - забыли.
Опять же, если это человек еще. Судя по связности и частоте ответов ТС-ов некоторых тем, в этом есть сомнения.

0
0 / 0 / 0
Регистрация: 25.01.2024
Сообщений: 10
12.02.2024, 07:03  [ТС]
Добрый день, lemegeton! У меня есть проверка деления на ноль.

Добавлено через 9 минут
Добрый день, gunslinger! В задаче нужно проверить постфиксную форму выражения. Я не понимаю, почему данный код выдает неправильный ответ, хотя на Python проблем не было.

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
exp = list(input().split())
 
err = False
 
stack = []
for c in exp:
    
    if c.isdigit():
        stack.append(int(c))
        
    elif c == '+':
        if len(stack) >= 2:
            stack[-2] += stack[-1]
            stack.pop()
        else:
            err = True
            break
 
    elif c == '-':
        if len(stack) >= 2:
            stack[-2] -= stack[-1]
            stack.pop()
        else:
            err = True
            break
 
    elif c == '*':
        if len(stack) >= 2:
            stack[-2] *= stack[-1]
            stack.pop()
        else:
            err = True
            break
 
    elif c == '/':
        if len(stack) >= 2 and stack[-1] != 0:
            stack[-2] //= stack[-1]
            stack.pop()
        else:
            err = True
            break
 
if len(stack) != 1:
    err = True
    
if err:
    print("ERROR")
else:
    print(stack[0])
0
Заблокирован
12.02.2024, 13:49
Цитата Сообщение от RaphisGunn Посмотреть сообщение
хотя на Python
Вам сюда >====О https://www.cyberforum.ru/python-beginners/
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.02.2024, 14:48
Цитата Сообщение от RaphisGunn Посмотреть сообщение
Добрый день, lemegeton! У меня есть проверка деления на ноль
Хм. Действтительно.
Не вижу сходу проблемы.
Погадаем?
Индея -- переполнение инта. Попробуйте long long int. )
2
Заблокирован
12.02.2024, 15:41
lemegeton, зачеееем, это же так скучччччно, писать по правилам, давайте будем писать как хотим.
Ну мы так и делаем, только предварително изучив ЯП(язык программирования)
))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2024, 15:41
Помогаю со студенческими работами здесь

Префиксная и постфиксная запись инкремента
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;rus&quot;); int х = 1; int a = 0;

постфиксная перегрузка поная запись
Здарова! создал класс Int2 как бы моделирующий int в нем решил перегрузить все операторы которые токо есть с вызовом в короткой форме...

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru