2 / 2 / 1
Регистрация: 25.09.2013
Сообщений: 13
|
||||||
1 | ||||||
Обратная Польская Запись26.10.2014, 15:29. Показов 12551. Ответов 9
Метки нет Все метки)
(
Сам вопрос:
Я написал программу, она работает, но препод по Структурам данных сломал ее в два счета. Я нашел ошибку, но как ее исправить я не понимаю. Если вводиться выражение, например, a+b*c-d, то верный ответ в постфиксной форме - это abc*+d-, а моя программа выдает abc*d-+. То есть когда у операторов одинаковые приоритеты, они должны выполняться слева направо, а у меня справа налево. В голову ничего не приходит, надеюсь на вашу помощь ![]()
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
1
|
|
26.10.2014, 15:29 | |
Ответы с готовыми решениями:
9
Обратная польская запись Обратная польская запись Обратная польская запись Обратная польская запись |
43 / 43 / 12
Регистрация: 06.10.2014
Сообщений: 135
|
||||||
26.10.2014, 17:58 | 2 | |||||
![]() Решение
Что будет, если по ошибке вызвать prior(3)? В Calc надо бы определиться что вам нужно double или int.
1
|
2 / 2 / 1
Регистрация: 25.09.2013
Сообщений: 13
|
|
27.10.2014, 08:03 [ТС] | 3 |
Спасибо, даже в голову не пришло, что нужно их все записывать
![]() А вот про я не совсем понял...
0
|
2 / 2 / 1
Регистрация: 25.09.2013
Сообщений: 13
|
|
27.10.2014, 08:21 [ТС] | 5 |
Как выше? У сложения и вычитания он 2, а у умножения и деления 3. Вроде все верно...
0
|
2 / 2 / 1
Регистрация: 25.09.2013
Сообщений: 13
|
||||||
27.10.2014, 09:22 [ТС] | 7 | |||||
Ах вон оно что, то есть должно быть вот так?
0
|
43 / 43 / 12
Регистрация: 06.10.2014
Сообщений: 135
|
|||||||||||
27.10.2014, 11:12 | 9 | ||||||||||
Не надо менять приоритет открывающей скобки на высший. Этот алгоритм так рассчитан, что скобки обрабатываются отдельно от операторов. В стек добавляется только открывающая скобка. При поступлении закрывающей скобки она никуда не добавляется, а выполняется извлечение содержимого стека в выходную строку, пока не будет встречена открывающая скобка. Сама открывающая скобка тоже извлекается со стека, но в выходную строку не добавляется.
Если поставить самый высокий приоритет для открывающей скобки, то она будет выталкиваться из стека каждый раз при обработке операторов в блоке else if (is_op...). Конкретно, вот здесь
В общем в этом алгоритме нужно назначать открывающей скобке самый низкий приоритет. Я это к тому, что у вас не все варианты возврата из функции в switch обрабатываются. Например, что вернет вызов prior(3) или prior(':')? Т.е. следует добавить default и что-то там сделать, если не подходящий параметр поступил. Например, если эта функция используется только в этой программе, то достаточно выдать сообщение в отладчное окно и вернуть что-нибудь. В вашем случае вполне сойдет:
![]()
1
|
2 / 2 / 1
Регистрация: 25.09.2013
Сообщений: 13
|
||||||
29.10.2014, 09:55 [ТС] | 10 | |||||
Слушай, а можно еще спросить?
Вот у меня такая загвоздка, если я введу в инфиксной a+a, то есть две одинаковые переменные, и он запросит эту переменную оба раза. А как сделать так, чтобы он запоминал значение этой переменной. Я думал сделать тремя массивами: массив с переменной, массив со значением и массив с флагами (используется переменная или нет), но это как то слишком мудрено...
0
|
29.10.2014, 09:55 | |
Помогаю со студенческими работами здесь
10
Обратная польская запись Обратная польская запись
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |