Table of Contents

Tema 4 - Calculator de buzunar

Obiective

Descriere și cerințe

Implementați un program care parsează și evaluează expresii matematice. Este obligatoriu să structurați codul folosind pattern-ul Visitor.

Sintaxa expresiilor

Exemple expresii:

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.

Evaluarea expresiilor

Implementare

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.

Precizări

Notare

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ă.

Corectare

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:

Tema nu va primi punctajul acordat de vmchecker dacă nu respectă cerințele temei - nu e implementată folosind pattern-ul Visitor.
Toate soluțiile vor fi verificate folosind un tool de detectare a plagiatului. În cazul detectării unui astfel de caz, atât plagiatorul cât și autorul original vor primi punctaj 0 pe temă și nu li se va permite intrarea în examen.

Pentru fiecare zi de întârziere se vor scădea câte 5/100 puncte. După 7 zile de la trecerea termenului nu se vor mai putea încărca arhive pe site.

Testare

Pentru a vă testa implementarea, rulați în consolă:

Rezultatul unui test se consideră incorect dacă Abs(rez_vostru - rez_ref) > 0.001.

Resurse

Referințe