Tema 2

Responsabili

Depunctare întârziere după depășirea deadline-ului soft: -10p/zi

Deadline soft: 25 aprilie, ora 23:55

Deadline hard: 28 aprilie, ora 23:55

Modificări și actualizări

  • 7 aprilie update checker public
  • 11 aprilie modificat semnatura functiei GetText in char* + adaugat verificare cu valgrind
  • 23 aprilie amanare deadline cu 2 zile

Obiective

În urma realizării acestei teme studentul:

  • va fi capabil să implementeze și să foloseasca o listă
  • isi va îmbunatați abilitatea de lucru cu stive
  • va folosi structurile de date pentru a implementa o posibilia aplicatie reala

Gigel este absolvent al Facultăii de Automatică si Calculatoare. Înca de la primul laborator de USO Gigel folosește editorul vim, în mare parte pentru că nu știe cum să iasă din el. Acum că a absolvit, Gigel s-a gândit că e momentul să-și implementeze singur propriul editor. Însa cum acesta nu are destulă experiența cu editoarele, s-a lovit de cateva probleme.

Motivație

Gigel s-a pus pe lucru si in scurt timp a scris interfata cu utilizatorul pentru editorul sau. Si-a dat seama insa ca functionalitatile editorului sunt mai greu de implementat decat credea, asa ca a decis ca are nevoie de ajutorul unor profesionisti. Ca sa fie sigur, Gigel s-a decis sa ceara tuturor studentilor sa implementeze cate o versiune a functionalitatilor.

Astfel, editorul text se alcatuieste din partea scrisa de Gigel - care reprezinta interfata cu utilizatorul (front-end) - si partea scrisa de fiecare student in parte - care reprezinta functionalitatile (back-end). Astfel ca, fiecare dintre voi, are de implementat doar functionalitatea efectiva a editorului de text (operatiile cut, copy, paste, undo, redo, add, getText).

Cum funcționează

Editorul lui Gigel este special. Din motive de simplitate (sau plictiseala) tanarul absolvent s-a gandit ca ar fi o idee buna daca editorul sau ar avea ca unitate de baza cuvantul si nu litera. Asta inseamna ca cea mai mica unitate pe care o poti adauga sau sterge este un cuvant.

Cuvantul se defineste ca fiind orice insiruire de caractere alfanumerice (fara orice fel de caractere speciale) urmate de un spatiu. Astfel, odata adaugat un cuvant acesta nu mai poate fi modificat, doar sters.

Intrucat comportamentul editorului sau nu este mereu cel mai intuitiv, Gigel s-a gandit ca este bine sa aiba specificatii mai clare legate de implementarea back-end-ului.

Interfata bibliotecii

Schelet de cod

Schelet

  • void Backend::Cut(const int start, const int stop):
    • taie cuvintele cuprinse integral intre start si stop
    • start si stop sunt indecsi din text, nu cuvinte, deci va trebui sa verificati ce cuvinte se gasesc integral (inclusiv cu spatiul de dupa ele) intre cei doi indecsi.
  • void Backend::Copy(const int start, const int stop):
    • copiaza cuvintele cuprinse integral intre start si stop in clipboard
  • void Backend::Paste(const int start):
    • lipeste textul din clipboard la sfarsitul cuvantului indicat de start
    • daca indexul nu este valid cuvintele sunt adaugate la primul index valid de dupa start
  • void Backend::Undo():
    • aduce editorul in starea in care se afla inainte de ultima operatie efectuata
  • void Backend::Redo():
    • aduce editorul in starea in care se afla inainte de ultimul 'Undo()'
  • void Backend::Add(const int index, const char *word):
    • adauga cuvantul “word” la pozitia indicata de index
    • daca indexul nu este valid (se gaseste in mijlocului unui alt cuvant), “word” este adaugat la primul index valid de dupa index
  • char *Backend::GetText():
    • intoarce textul pe care il aveti in memoria back-end-ului

Precizari:

  • Dupa fiecare operatie este apelata metoda GetText(), pentru a mentine o sincronizare intre textul afisat de editor si cel din memoria back-end-ului.
  • char * returnat de metoda GetText este eliberata in checker
  • Clipboard-ul este intern back-end-ului si este diferit de cel al sistemului de operare.

Cerințe

Sa se implementeze o biblioteca shared object care sa expuna un obiect ce contine functiile prezentate. Un schelet de cod de la care sa plecati este disponibil in arhiva, in directorul backend_src.

Scopul temei este acela de a implementa functionalitatile bibliotecii.

Indicatii de implementare

  • Textul se va retine sub forma unei liste inlantuite, avand fiecare nod un cuvant. Intrucat interfata lucreaza cu indecsi din textul original, va trebui sa determinati exact pozitiile din lista in care trebuie sa inserati / taiati / lipiti cuvinte.
  • Veti avea nevoie de un clipboard in care veti retine ultimul text copiat/taiat. Clipboardul se va updata la fiecare operatie cut/copy.
  • Veti avea nevoie de cate o stiva pentru operatiile de undo si redo.
  • Functia getText() se va apela dupa apelul oricarei alte operatii.

Teste publice

Reguli pentru trimitere

Temele vor trebui trimise pe vmchecker. Atenție! Temele trebuie trimise în secțiunea Structuri de Date (CA).

Arhiva trebuie să conțină:

  • sursele voastre
  • fisier README care să conțină detalii despre implementarea temei

Punctaj

  • 80 puncte obținute pe testele de pe vmchecker
  • 10 puncte: coding style
  • 10 puncte: README + alte eventuale penalizări
  • Bonus 10 puncte pentru soluțiile ce nu au memory leak-uri.
  • TOTAL: 100 puncte (+10 bonus)

Coding style-ul trebuie sa fie consistent și ușor de citit. Ca ghid vă recomandăm:

sau

Citiți cu atenție Regulamentul General de Trimitere a Temelor.

Nu copiați! Toate soluțiile vor fi verificate folosind o unealtă de detectare a plagiatului. În cazul detectării unui astfel de caz, atât plagiatorul cât și autorul original (nu contează cine care e) vor primi punctaj 0 pe temele incepand de la prima si aceasta inclusiv. Heed my warning!

De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/grupuri etc.

FAQ

Q: Se poate folosi STL?

A: Se poate folosi clasa string din STL. Folosirea oricărei alte clase din STL nu este permisă

Resurse

sd-ca/teme/teme-02.txt · Last modified: 2015/04/23 13:49 by dragos.dimitriu
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