В данной задаче требуется реализовать калькулятор, который умеет выполнять инструкции (statements) двух видов:
Инструкция подается на вход либо в виде строки либо в виде специальной структуры. Калькулятор исполняет одну инструкцию за раз.
Как выглядят инструкции (очень условная вольная нотация, не отражающая приоритет операций):
:= |
:= =
:= | |
:=
:= | | | ( )
:= десятичное число с опициональной дробной частью
:= строка из латинских букв и цифр, начинается с буквы
:= \ ->
:=
:= | пустая строка
:= + | - | * | /
Приоритет операций:
Как можно заметить, операция применения функции к аргументу в рассматриваемом калькуляторе записывается без скобок, например
> f = \ x y -> x + y
> f 5 6
< 11
Подразумевается, что функции в данной задаче каррированные, т.е. могут быть применены только к одному аргументу за один раз. В таком случае функция с несколькими аргументами превращается в функцию от одного аргумента, которая возвращает другую функцию, имеющую на один аргумент меньше. См. https://ru.wikipedia.org/wiki/Каррирование.
При выполнении инструкций в калькуляторе кроме входящей строки также используется контекст, сохраняющийся по мере выполнения инструкций. Контекст представляет собой словарь, в котором различным именам ставится в соответствие какой-то объект (функция, константа). Когда калькулятор начинает свою работу, в его контексте присутствуют функции +, -, *, /, sin, cos. При этом функции +, -, *, / должны использовать как бинарные операторы в инфиксной форме (т.е. такая запись a + b, а не + a b). По мере выполнения инструкций присваивания в контексте будут появляться новые значения, либо будут изменяться старые.
В рассматриваемом калькуляторе функции являются объектами первого порядка, что означает, что их можно присваивать, передавать в качестве аргументов и использовать в качестве возвращаемого значения в других функциях и выражениях. См. https://ru.wikipedia.org/wiki/Функции_первого_класса
Примеры инструкций и ожидаемые результаты их выполнения можно посмотреть в проверяющем коде в файле main.cpp.
В процессе обработки входных данных или вычисления значений выражений могут возникать различные ошибки, связанные, как правило, с некорректным вводом данных на вход калькулятора. В данном задании нужно уметь обрабатывать ошибки следующих типов:
Все ошибки должны приводить к выбрасыванию исключений, при этом под каждый из перечисленных выше видов ошибок должен быть заведен отдельный
Есть еще файлы main.cpp с тестами, которые должно проходить задание и task.h с шаблоном
вск задание не влезло
| Гарантия на работу | 1 год |
| Средний балл | 4.53 |
| Стоимость | Назначаете сами |
| Эксперт | Выбираете сами |
| Уникальность работы | от 70% |