Язык Си в примерах/Калькулятор выражений в обратной польской нотации: различия между версиями

м
нет описания правки
мНет описания правки
мНет описания правки
==Что такое обратноая польская нотация?==
 
Рассмотрим запись арифметческих выражений, в которых сначала следуют два операнда арифметической операции,
сначала следуют два операнда арифметической операции,
а затем знак операции. Например:
 
|}
 
Это нотация записи выражений называется [[w:Обратная польская нотация|обратной польской нотацией (записью)]] (Reverse Polish Notation, RPN).
В теории языков программирования эта нотация называется ''постфиксной нотацией'. Обычная нотация называется алгебраической или ''инфиксной нотацией''.
(ин от англ. ''inside'', то есть между операндами). Есть также префиксная нотация, активно используемая в языке Си (сначала имя функции, а затем её аргументы), а также в языке [[:w:LISP]].
 
Заметьте, что скобки в обратной польской нотации не нужны. В частности, если во втором примере мы опустим скобки,
 
Транслятор RPN-выражений основан на [[w:Стек|стэке]]. Каждое следующее число
помещается в стэк. Если встречается знак операции (обозначим его <tt>*</tt>), то два числа из стэка извлекаются
(<tt>a = pop(), b = pop()</tt>), для них вычисляется значение соответствующей бинарной арифметической операции и результат помещается в стек ( <tt>push(a * b) </tt>).
 
 
 
=== Реализация калькулятора с явным определением операций со стеком ===
 
 
Введем операции работы со стеком в программу. Это повысит читаемость кода и облегчит понимание заложенной в программу логики.
Кроме защиты от дурака-пользователя необходима еще защита от дурака-программиста, который возьмет ваш код, решит его использовать и дорабатывать.
Точнее, нужно просто соблюдать некоторые правила, которые не позволили бы программисту, который включил ваш код в свой проект получить ошибки,
связанные с пересечением имён, испольуемых им в своих файлах и вами, в фалефайле <tt>stack.c</tt>.
 
В первую очередь, в принципе не рекомендуется объявлять глобальные переменные, особенно такие, которые не являются всеобщим достоянием, а относятся к вашим личным внутренним делам отдельного модуля (например, нашей программы, для работы со стеком).
 
TODO
В первую очередь, не рекомендуется объявлять глобальные переменные, которые не являются всеобщим достоянием, а относятся к вашим личным внутренним
делам.
481

правка