V tomto bonusovém úkolu máte možnost navázat na minulý, a svůj evaluátor matematických výrazů rozšířit o podporu funkcí a o detekci chyb.
Vstup již může obsahovat víceméně arbitrární znaky a vaším úkolem je ho nejenom
vyhodnotit, ale i detekovat chyby. Stále platí, že čísla používají dekadický
zápis, operátory jsou stejné jako minule a funkce jsou definovány jako sekvence
alfanumerických znaků, začínající písmenem a následována levou závorkou
(“(
”). Funkce jsou podporovány pouze tři, sin
, cos
, log
.
Předpokládejte, že argumenty pro sin
a cos
jsou v radiánech.
Hlášení chyb probíhá pomocí výjimek. V expr.hpp
je předdefinovaná rodina
výjimek, domain_exception
, unknown_function_exception
,
invalid_expression_exception
a jejich společný předek, math_exception
.
Jak název napovídá, unknown_function_exception
slouží k hlášení výrazů ve
kterých se vyskytuje neznámá funkce a domain_exception
slouží k hlášení
špatného vstupu do funkcí, které mají omezený definiční obor (v našem případě
log
). invalid_expression_exception
pak slouží k hlášení všech ostatních
chyb.
Potřebné hlavičkové soubory a testy jsou ke stažení zde.
Vstup | Výsledek/Výjimka | Poznámka |
---|---|---|
“1 + 2” | 3 | — |
“(1)” | 1 | — |
“)(” | invalid_expression_exception | — |
“2 % 3” | invalid_expression_exception | modulo není podporováno |
“sin 2” | invalid_expression_exception | sin není následován ( |
“log log(1)” | invalid_expression_exception | první log není následován ( |
“sin(1)” | 0.841… | — |
“f1(2)” | unknown_function_exception | f1 je následováno ( , ale není to známá funkce |
“3 33” | invalid_expression_exception | chybí operátor mezi čísly |
“3 33 +” | invalid_expression_exception | operátor je až za čísly |
“2sin(2)” | invalid_expression_exception | implicitní násobení nepodporujeme |
“log(-1)” | invalid_expression_exception | unární mínus nepodporujeme |
“log(0-1)” | domain_exception | log je definován pouze pro x > 0 |
“sin(1, 2)” | invalid_expression_exception | sin je unární funkce, není možné ji předat 2 argumenty |
Všechny soubory, které implementují vaší část úlohy, specificky pokud jste
přidali další .hpp soubory, pak je nezapomeňte též odevzdat. Naopak ale
neodevzdávejte expr.hpp
, ani žádné testovací soubory.
Stále platí, že operátor pro výpis do proudu (<<
) netestujeme.
Pokud nevíte kde s kontrolou začít, poradíme vám pár pravidel
Doporučujeme stejné hlavičky ze standardní knihovny jako v minulém úkolu.