Sunteți pe pagina 1din 4

Tema 4 - Calculator de buzunar

Responsabili: Adriana Drghici i Adrian Iosif


Deadline: 14.01.2015 23:55
Data publicrii: 17.12.2013
Data ultimei modificri: 17.12.2014
Data tester-ului: 06.01.2014 16:45

Obiective

familiarizarea cu structurarea aplicaiei prin aplicarea de design patterns


folosirea design pattern-ului Visitor
familiarizarea cu conceptele de parsare lexical i semantic

Descriere i cerine
Implementai un program care parseaz i evalueaz expresii matematice. Este obligatoriu s
structurai codul folosind pattern-ul Visitor.

Sintaxa expresiilor

Expresiile conin doar numere de tip Float, operatori i paranteze, toate separate prin unul sau mai
multe spaii.
Operaiile suportate sunt:
binare: +, -, *, /, ^ (ridicarea la putere), n ordine, de la cel mai puin prioritar:
+, *, /
^ (atenie, spre deosebire de cei de mai sus, este doar asociativ dreapta: 2 ^ 3 ^ 4 = 2 ^ (3 ^
4))
funcii unare: log (log in baza 10), sqrt (radical), sin, cos, - (minus unar, pentru numere
negative)
au prioritate mai mare decat ceilali operatori
minusul unar poate aprea doar la nceputul expresiei, sau imediat dup o parantez
deschis (cu alte cuvinte, nu vei avea expresii de tipul 1 + - 2)
operatorul - unar aplicat unei funcii trebuie separat prin spaiu:
- sqrt ( 2 ), nu -sqrt ( 2 )
Expresiile pot conine paranteze (, ), n orice combinaii
Trebuie verificat corectitudinea sintactic a expresiilor, iar dac se ntlnete o eroare de
sintax (operator invalid, numr neparsabil etc), se va arunca o excepie user-defined, numit
SyntacticException, iar parsarea expresiei se va termina.

Exemple expresii:

1 + 2 - 3 * ( 4 + 5 ) / log ( 10 * sqrt ( 100 ) )


- 2 * sin ( -5 + 2 ) + 4

Rezultatul parsrii unei expresii l reprezint rdcina unui arbore, care va fi apoi parcurs n partea
de evaluare. Mai jos observai un arbore de parsare pentru exemplul primei expresii.
+
/ \
1

/ \
2

/
/ \
*

log

/ \
3

\
+

/ \
4

/ \
5 10 sqrt
|
100

Putei folosi funcii standard Java de parsare a numerelor (Float.ParseFloat(String)) sau


funcii standard de operare pe String-uri, care v pot simplifica generarea arborelui. Nu sunt
permise dect funcionaliti Java standard, precum cele menionate anterior sau framework-ul
Collections.

Evaluarea expresiilor

Expresiile se evalueaz n funcie de paranteze i de prioritatea operaiilor. Arborele de parsare pe


care l generai va fi punctul de plecare n calculul rezultatului.
Trebuie verificat corectitudinea semantic a expresiilor o dat cu parcurgerea structurii, iar
dac se ntlnete o eroare, se va arunca o excepie user-defined, numit EvaluatorException,
iar evaluarea expresiei se va termina. Va trebui s tratai erorile de calcul matematic:
mparirea la 0
log(x) unde x <= 0
sqrt(x) unde x < 0

Implementare
Scheletul de cod al temei impune implementarea metodei eval din clasa ExpressionParser. Aceasta
metod primete ca argument expresia ce trebuie parsat i ntoarce rezultatul acesteia.
Expresia este dat ca un ir de caractere, care trebuie desprit n tokens (separate prin spaii)
pentru fiecare element al expresiei (numr, operator sau parantez). Dup parsare, expresia va fi
reprezentat ca un arbore binar ca n exemplul din seciunea anterioar, i aceast structur de date
va fi parcurs de ctre vizitatori. Un exemplu de algoritm pentru construcia arborelui gsii n

seciunea Referine.
Folosii tipul double la parsare i la evaluarea rezultatelor intermediare, i facei un cast napoi la
float la ultimul rezultat.

Precizri
Notare

80 puncte - acordate de vmchecker pentru execuia cu succes a suitei de teste


10 puncte - existena i calitatea javadocurilor, comentariilor i readme-ului
10 puncte - calitatea implementarii, respectarea principiilor OOP
-5 puncte - absena readme-ului
-5 puncte - absena javadoc-ului

Pentru notare se va folosi checker-ul disponibil n seciunea Resurse, toate testele fiind publice.
Gsii n fiierul 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
soluiei, atunci acesta va fi punctajul final al implementrii temei.
Arhiva trimis trebuie s conin n radcina 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 cerinele temei - nu e


implementat folosind pattern-ul Visitor.

Toate soluiile vor fi verificate folosind un tool de detectare a plagiatului. n cazul detectrii unui
astfel de caz, att plagiatorul ct i autorul original vor primi punctaj 0 pe tem i nu li se va permite
intrarea n examen.
Pentru fiecare zi de ntrziere se vor scdea cte 5/100 puncte. Dup 7 zile de la trecerea termenului
nu se vor mai putea ncrca arhive pe site.

Testare
Pentru a v testa implementarea, rulai n consol:

java Tester test_file results_reference_file debug_mode


test_file - fiierul de test
results_reference_file - fiierul cu valorile rezultat
debug_mode - false pentru a afia doar mesajul checkerului, true pentru a afia i alte informaii,
cum ar fi lista expresiilor i a rezultatelor. n programul vostru putei folosi variabila
Tester.debug.
fiierul Tester.class, i cele de test i test_ref trebuie s fie n acelai 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

Referine

Abstract syntax tree


Algoritm constructie arbore de parsare

From:
http://elf.cs.pub.ro/poo/ - Programare Orientat pe Obiecte
Permanent link:
http://elf.cs.pub.ro/poo/teme/tema4
Last update: 2014/12/17 15:36

S-ar putea să vă placă și