Implementați un program care parsează și evaluează expresii matematice. Este obligatoriu să structurați codul folosind pattern-ul Visitor.
+, -, *, /, ^
(ridicarea la putere), în ordine, de la cel mai puțin prioritar:+, -
*, /
^
(atenție, spre deosebire de cei de mai sus, este doar asociativ dreapta: 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4))log
(log in baza 10), sqrt
(radical), sin
, cos
, -
(minus unar, pentru numere negative)-
unar aplicat unei funcții trebuie separat prin spațiu: - sqrt ( 2 )
, nu -sqrt ( 2 )
(
, )
, în orice combinațiiSyntacticException
, iar parsarea expresiei se va termina.Exemple expresii:
1 + 2 - 3 * ( 4 + 5 ) / log ( 10 * sqrt ( 100 ) )
- 2 * sin ( -5 + 2 ) + 4
Rezultatul parsării unei expresii îl reprezintă rădăcina unui arbore, care va fi apoi parcurs în partea de evaluare. Mai jos observați un arbore de parsare pentru exemplul primei expresii.
+ / \ 1 - / \ 2 / / \ * log / \ \ 3 + * / \ / \ 4 5 10 sqrt | 100
Puteți folosi funcții standard Java de parsare a numerelor (Float.ParseFloat(String)
) sau funcții standard de operare pe String-uri, care vă pot simplifica generarea arborelui. Nu sunt permise decât funcționalități Java standard, precum cele menționate anterior sau framework-ul Collections
.
EvaluatorException
, iar evaluarea expresiei se va termina. Va trebui să tratați erorile de calcul matematic:
Scheletul de cod al temei impune implementarea metodei eval
din clasa ExpressionParser. Aceasta metodă primește ca argument expresia ce trebuie parsată și întoarce rezultatul acesteia.
Expresia este dată ca un șir de caractere, care trebuie despărțit în tokens (separate prin spații) pentru fiecare element al expresiei (număr, operator sau paranteză). După parsare, expresia va fi reprezentată ca un arbore binar ca în exemplul din secțiunea anterioară, și această structură de date va fi parcursă de către vizitatori. Un exemplu de algoritm pentru construcția arborelui găsiți în secțiunea Referințe.
Folosiți tipul double la parsare și la evaluarea rezultatelor intermediare, și faceți un cast înapoi la float la ultimul rezultat.
Pentru notare se va folosi checker-ul disponibil în secțiunea Resurse, toate testele fiind publice. Găsiți în fișierul README din arhivă detalii de utilizare. Expresiile de test au pondere egală.
Tema se va corecta folosind platforma vmchecker. Dacă platforma de testare nu acordă niciun punct soluției, atunci acesta va fi punctajul final al implementării temei.
Arhiva trimisă trebuie să conțină în radăcina sa:
Pentru fiecare zi de întârziere se vor scădea câte 5/100 puncte. După 14 zile de la trecerea termenului nu se vor mai putea încărca arhive pe site.
Pentru a vă testa implementarea, rulați în consolă:
java Tester test_file results_reference_file debug_mode
Rezultatul unui test se consideră incorect dacă Abs(rez_vostru - rez_ref) > 0.001.