Table of Contents

= Tema 4 - Calculator de buzunar =

* Responsabili: Adriana Drăghici și Adrian Iosif * Deadline: 14.01.2015 23:55 * Data publicării: 17.12.2013 * Data ultimei modificări: 17.12.2014 * Data tester-ului: 06.01.2014 16:45

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

* 80 puncte - acordate de vmchecker pentru execuţia cu succes a suitei de teste * 10 puncte - existența și calitatea javadocurilor, comentariilor și readme-ului * 10 puncte - calitatea implementarii, respectarea principiilor OOP * -5 puncte - absența readme-ului * -5 puncte - absența javadoc-ului

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: * sursele (clasele date in schelet trebuie sa fie in default package, alte clase pot fi) * readme-ul * javadoc sau un script de generare javadoc

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ă: * java Tester test_file results_reference_file debug_mode

* fișierul Tester.class, și cele de test și test_ref trebuie să fie în același director cu .class-urile voastre.

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

Resurse

* Schelet temă * Tester * PDF enunț temă

Referințe

* Abstract syntax tree * Algoritm constructie arbore de parsare