Вернуться на Страничку новостей.

29.07.2007

Недавно на полках нашего города появилась интересная книга:
"С++ мастер-класс" автор Мозговой М.В.

Вот какую задачу задает нам автор:

1.1 Математика на стеке

Вычисление формул без грамматического разбора.

Построение графика математической функции - задача важная и как упражнения по программированию предлагалась во все времена и во всех учебных заведениях. Основная проблема заключается в способе задания функции.

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

Возможный компромисс заключается в записи функций при помощи стековых операций (таб 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


Для распознавания вводимых с клавиатуры команд использовались символьные массивы (строки в старом стиле С). При неправильном вводе данных программа может давать неправильные результаты.

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

Hosted by uCoz