Table of Contents

Tema 4 - Calculator cu numere romane

Obiectivele temei

Cerințele temei

Toate interfețele trebuie implementate și toate implementările utilizate, într-un fel sau altul, la rezolvarea temei. Nu aveți voie să modificați interfețele în niciun fel. O temă care nu respectă acest aspect nu va fi punctată.
Stiva și/sau coada de operatori/operanzi trebuie să fie privată în cadrul clasei Server și să conțină elemente de tip IToken (ex. Stack<IToken> myStack). O temă care nu respectă acest aspect nu va fi punctată.
Este interzisă folosirea operatorului instanceof. O temă care nu respectă acest aspect nu va fi punctată.

Va trebui să implementați un calculator, care va primi ca input operații matematice scrise în numere romane, să calculați valoarea transformând în numere arabe [2] și să afișați răspunsul în format roman [3]. În calcularea valorii trebuie să țineți cont de ordinea operațiilor iar pentru acest lucru o să folosiți forma poloneză [1].

Implementările pentru IServer, IBracketsFactory, IOperatorsFactory și IOperandsFactory trebuie să fie singleton. O temă care nu respectă acest aspect nu va fi punctată.
Implementările pentru IBracketsFactory, IOperatorsFactory și IOperandsFactory trebuie să respecte pattern-ul Factory. O temă care nu respectă acest aspect nu va fi punctată.

Descrierea scheletului

Scheletul de cod (directorul src) conține următoarele:

În cadrul fiecărui fișier de interfață veți găsi, în comentarii, o explicare laborioasă a fiecărei metode și a fiecărui câmp.

Puteți să aruncați o privire la cum este scris checker-ul ca să vă faceți o idee atât despre cum trebuie scrisă tema cât și despre bonus

În rădăcina directorului src se află și punctul de intrare al aplicației, clasa Main. În această metodă se inițializează Evaluator-ul și se deschid fișierele de input, output, referință și subscriberi. După care Evaluator-ul face următoarele 3 acțiuni, pe instanța singleton a IServer:

Descrierea fișierelor de intrare

Rularea se face în felul următor: $ java Main subscribers_file input_file output_file reference_file

Pentru operațiile ce nu se pot executa (fișierul de subscriberi nu suportă un tip de operație, împărțirea la zero), se va scrie mesajul IMPOSSIBRU

Exemplu

sub42
+
-
*
/
log
in42
I + II
( XX - X ) + [ V - I ]
[ ( MMM - M ) + sqrt IV ]
II ^ IV
I + II + II + log IV
III / ( I - I )
ref42
III
XIV
IMPOSSIBRU
IMPOSSIBRU
VII
IMPOSSIBRU

Precizări

1 5 10 50 100 500 1000
I V X L C D M
0 1 2 3
+, - *, / ^ sqrt, log
NU exista 0 în sistemul de calcul roman însă acesta poate apărea în momentul calcului (rezultat parțial) însă niciodată nu va apărea în rezultatul final.
În cazul în care un delimitator este la începutul șirului, acesta nu va avea un spațiu înainte. În cazul în care un delimitator este la sfârșitul șirului, acesta nu va avea un spațiu după.
În cazul funcțiilor log și sqrt, rezultatul parțial este de tip double (ex. log 4 = 1.38629436112) iar rezultatul final va fi întotdeauna un număr întreg și se va rotunji inferior pentru a se păstra numai partea întreagă (ex. 1.38629436112 → I (unu în format roman) și -1.38629436112 → - II (pentru că -2 < -1.38629436112 < -1)).
În cazul în care un rezultat final este mai mic decât 0, numărul în format roman se va afișa astfel: - XX.

Punctare

Nu este necesară exportarea de documente Javadoc deoarece toate interfețele din schelet sunt documentate.
Pentru a fi eligibil de bonus, tema trebuie să treacă testul de coding-style executat de Checkstyle [4] însă dacă este picat și numărul de erori depistate depășește 30 (o treime din punctajul obținut pe testele publice), atunci se vor scădea din nota finală iar dacă punctajul este negativ, acesta se trunchiază la 0.

Exemple:

  • punctaj_total = 100 și nr_erori = 200nota_finala = 0
  • punctaj_total = 100 și nr_erori = 99nota_finala = 1
  • punctaj_total = 80 și nr_erori = 30nota_finala = 80
  • punctaj_total = 80 și nr_erori = 31nota_finala = 49
Temele vor fi testate împotriva plagiatului. Orice tentativă de copiere va duce la anularea punctajului de pe parcursul semestrului şi repetarea materiei atât pentru sursă(e) cât şi pentru destinație(ii), fără excepție.

You shall indeed not pass !!

Structura arhivei

Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:

Nu încărcați fișierele de test, checker-ul sau documente generate cu JavaDoc.

Resurse

Changelog

Linkuri utile