29.07.2007
Недавно на полках нашего города появилась интересная книга:
"С++ мастер-класс" автор Мозговой М.В.
Вот какую задачу задает нам автор:
Вычисление формул без грамматического разбора.
Построение графика математической функции - задача важная и как упражнения по программированию предлагалась во все времена и во всех учебных заведениях. Основная проблема заключается в способе задания функции.
Если функцию жестко задать в коде, то практическая польза от такой программы будет минимальной: для смены функции потребуется повторная компиляция. Если же разрешить пользователю вводить функцию с клавиатуры, то придется писать процедуру грамматического разбора выражений. Когда речь не идет об одном из интерпретируемых языков, поддерживающих вычисление заданных в виде строк выражений, процедура разбора превосходит по сложности сам алгоритм построения графика и давать такую задачу в качестве учебного упражнения нецелесообразно. Разумеется, если целью является написание программного продукта, а не выполнение упражнения, скачать готовую библиотеку разбора выражений из интернета нетрудно.
Возможный компромисс заключается в записи функций при помощи стековых операций (таб 1.1)
Таб 1.1 Примерный набор операций на стеке
Операция | Назначение |
DUP | Копировать верхний объект стека (A->AA) |
MUL | Перемножить два верхних элемента стека (5 2 -> 10) |
SWAP | Поменять местами два верхних элемента стека (AB->BA) |
ADD | Сложить два верхних элемента стека (5 2 -> 7) |
OVER | Скопировать второй сверху объект стека на вершину (AB -> BAB) |
SIN | Заменить верхний объект стека на его синус (3.14 -> 0) |
COS | Заменить верхний объект стека на его косинус (3.14 -> -1) |
На стек кладется значение аргумента функции, затем имитируется работа стековой машины для получения результата. Результат считывается с вершины стека. Так если положить на стек некоторое значение X, а затем выполнить инструкции:
DUP
SIN
SWAP
COS
ADD
на вершине стека окажется значение sin(X) + cos(X).
Таким образом осталось написать программу, которая запрашивает у пользователя некоторую функцию одного аргумента( в виде последовательности стековых операций), а затем строит ее график на экране.
Решение этой задачи смотрите в исходном коде программы в рубрике "Язык С++"
"Математика на стеке".
В этой программе используется параметризированный класс стека.
Параметризованные классы, в том числе и класс стека, замечательно описаны
в книге Герберта Шилдта "Теория и практика С++". Собственно программа простого
калькулятора, использующего параметризированный класс стека, опубликованная в этой книге
на стр 59 и послужила основой для решения данной задачи.
Эта программа выполняет 9 команд. И задачу из главы 1.1 Математика на стеке из книги
Мозгового С++ Мастер-класс Можно считать решенной.
Один из выводов программы:
Текущее значение в вершине стека : 0.3
:DUP
:SIN
:SWAP
:COS
:ADD
1.25086
Для распознавания вводимых с клавиатуры команд использовались символьные массивы (строки в старом стиле С). При неправильном вводе данных программа может давать неправильные результаты.
При корректном вводе данных можно получать результаты самых разных математических функций.