= Tema 4 - Calculator cu numere romane =

  • Deadline soft: 14.01.2017 23:55
  • Deadline hard: 20.01.2017 23:55
  • Versiune tester: v03-01-2017
  • Data publicării: 17.12.2016 00:00
  • Data ultimei modificări: 15.01.2017 00:19
Obiectivele temei
  • Integrarea cu un mod arhitectural de a rezolva o problemă reală
  • Aprofundarea noțiunilor de Design Patterns:
  • Aprofundarea noțiunilor de moștenire, agregare și interfațare în contextul implementării unei aplicații reale
  • Aprofundarea noțiunilor din cursul de Structuri de Date - forma poloneză a ecuațiilor matematice [1]
  • Respectarea unui coding-style adecvat
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:

  • checker/fileIO - conține logica de I/O și de comparare cu fișierele de referință
  • checker/checkstyle - conține utilitarul și regulile de verificare de coding-style
  • checker/resources - conține fișierele de input și referință
  • homework/interfaces - conține interfețele pe care trebuie să le implementați

Î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:

  • Apelează metoda subscribe pentru fiecare operator (linie) din fișierul de subscriberi
  • Apelează metoda publish pentru fiecare comandă (linie) din fișierul de input
  • Apelează metoda getResults și compară cu liniile din fișierul de referință
Descrierea fișierelor de intrare

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

  • subscribers_file - fișierul de operații suportate de testul curent, cu câte un operator pe linie
  • input_file - fișierul de intrare cu operațiile matematice în format roman, cu câte o operație pe linie
  • output_file - fișierul de ieșire, cu câte un rezultat în format roman pe linie
  • reference_file - fișierul de referință, cu câte un rezultat corect în format roman pe linie

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
  • Operațiile suportate pentru acest test sunt: adunare, scădere, înmulțire, împărțire și logaritm
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
  • Linia 3 nu se poate executa deoarece scăderea și radicalul nu sunt suportate
  • Linia 4 nu se poate executa deoarece ridicarea la putere nu este suportată
  • Linia 6 nu se poate executa deoarece împărțirea la zero nu este acceptată
Precizări
  • Alfabetul folosit este următorul:
1 5 10 50 100 500 1000
I V X L C D M
  • Prioritățile operatorilor sunt următoarele:
0 1 2 3
+, - *, / ^ sqrt, log
  • cel mai mare număr care poate fi scris în numere romane este 3999 iar cel mai mic număr este -3999
  • niciun rezultat final de la o operație nu va sări de 3999 respectiv -3999
  • toate intrările din fișierele de text le veți presupune valide din punct de vedere sintactic

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.

  • operații posibile: + (adunare), - (scădere), * (înmulțire), / (împărțire), ^ (ridicare la putere), sqrt (radical), log (logaritm natural)
  • delimitarii posibili pentru forma poloneză sunt: (, ) (paranteze rotunde), [, ] (paranteze pătrate), {, } (acolade)
  • înainte și după fiecare delimitator va fi un spațiu: ”( 2 + 3 )”

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

  • fiecare operator are spațiu între operanzi: “2 + 3”
  • operatorii sqrt și log au un singur operand: “sqrt 4”
  • operatorul log reprezintă logaritmul natural

Î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)).

  • se asigură că parametrul funcțiilor log și sqrt este întotdeauna pozitiv
  • se asigură că rezultatul funcțiilor log și sqrt este întotdeauna pozitiv
  • în cazul împărțirii inexacte între întregi, se calculează rezultatul exact (ex. 5 / 2 = 2.5)

Î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
  • 100p = 90p teste publice + 10p README
  • 50p
    • numele fișierelor ( ref)
    • organizarea fișierelor ( ref)
    • indentarea pe verticală și orizontală ( ref)
    • declarațiile și inițializările ( ref)
    • numirea claselor, variabilelor, metodelor, etc. ( ref)
    • tratarea cazurilor speciale ( ref)
    • respectarea unui coding style (nu neapărat acesta, important este să fiți consistenți și consecvenți)

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

  • fișierul README
  • fișierul Main.java modificat (apelarea metodei run din Evaluator)
  • directorul homework cu interfețele din schelet și implementarea voastră

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

Resurse
Changelog
  • 27.12.2016
    • [Cerințe] Adăugare Nu aveți voie să modificați interfețele în niciun fel
    • [Checker] Testul 09, linia 1, parantezele pătrate nu erau închise corespunzător
    • [Precizări] Adăugare tabel cu priorități
    • [Checker] Testul 12/13, linia 4, parantezele rotunde nu erau închise corespunzător
  • 28.12.2016
    • [Checker] Verificarea și scoaterea caracterului \r (CR - carriage return)
    • [Schelet] Modificarea semnăturilor metodelor din interfețele de tip factory
    • [Cerințe] Adăugare nouă cerință legat de stiva/coada de operatori/operanzi
    • [Punctaj] Adăugare precizare test bonus
  • 29.12.2016
    • [Checker] Rezolvare test bonus
    • [Punctaj] Clarificare precizare test bonus
  • 03.01.2017
    • [Precizări] Adăugare clarificare despre păstrarea părții întregi
    • [Checker] Testul 10, linia 1, parantezele pătrate nu erau închise corespunzător
  • 15.01.2017
    • [Precizări] Adăugare dată deadline hard
Linkuri utile
poo-ca-cd/arhiva/teme/2016/tema4.txt · Last modified: 2020/07/28 23:08 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0