Недавно на полках нашего города появилась интересная книга:

"С++ мастер-класс" автор Мозговой М.В.

 

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

 

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