Tema 2: SD Editor 2014

Responsabili

Deadline soft: 8 aprilie, ora 23:55

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

Deadline hard: 11 aprilie, ora 23:55

Modificări și actualizări

  • 28 martie update arhiva
  • 31 martie update checker

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 învața cum se diferențiază într-un proiect partea de back-end de cea de front-end
  • va învața cum lucreaza cu biblioteci partajate
  • 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).

Pentru a putea lucra in continuare la front-end si pentru a putea testa diverse implementari ale functionalitatilor editorului fara a modifica partea lui din aplicatie, Gigel a conceput o interfata prin care cele doua parti ale aplicatiei pot sa comunice, adica o descriere a operatiilor pe care back-end-ul stie sa le faca si front-end-ul le poate folosi.

Back-end-ul se leaga la aplicatia lui Gigel sub forma unei biblioteci partajate (shared object), iar pentru testare Gigel poate schimba bibliotecile intre ele fara a modifica partea sa din aplicatie.

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. La fiecare apasare a tastei “space” editorul trimite la back-end ultimul cuvant cuprins intre doua spatii pornind de la pozitia curenta a cursorului. Astfel, odata adaugat un cuvant acesta nu mai poate fi modificat, doar sters.

Cuvintele pot fi sterse apasand tasta “backspace”. Daca cuvantul pe care incercam sa-l stergem a fost deja trimis la back-end (are spatiu dupa el) atunci prima apasare selecteaza cuvantul, iar urmatoarea apasare il sterge. Cuvintele ce nu au fost inca trimise (nu au spatiu dupa ele) poti fi sterse litera cu litera (cum se intampla in mod normal in editoare).

Dupa fiecare operatie a editorului se face o actualizare a textului afisat, astfel incat sa nu existe neconcordante intre textul afisat de editor si cel aflat in back-end.

Butoanele cut / copy / paste au efect asupra textului selectat cu mouse-ul.

Atentie la modificarile pe care le faceti in editor. Acestea nu se transmit neaparat si back-end-ului. De exemplu cut / copy / paste folosind tastele, butonul de Delete si suprascrierea unui text selectat nu se transmit back-end-ului. Acestea vor ramane vizibile pana la urmatorul update al textului pe front-end.

Update-ul textului se face dupa fiecare operatie. Aceasta operatie presupune inlocuirea intregului text de pe ecran cu cel continut de back-end.

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

  • 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
    • se apeleaza automat la fiecare apasare de “space”
  • const 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.
  • 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. Front-end-ul va este pus la dispozitie pentru a avea un mijloc intuitiv de testare a functionalitatilor implementate. Testarea temelor nu se va face cu acest front-end, ci cu testele publice descrise in sectiunea corespunzatoare de mai jos

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.

Cum se compileaza

Descarcati arhiva

O să aveți nevoie de biblioteca libqt4-dev

sudo apt-get install libqt4-dev

Extrageți arhiva si rulați qmake în rădăcina arhivei (acolo unde se afla Conf.pro).

Mutați-vă in backend_src si rulați make. Se va genera lib-backend.so care este necesară pentru front-end.

Mutați-vă înapoi în rădăcina arhivei și rulați make. Se va genera executabilul sd_editor.

./sd_editor

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
  • Makefile cu target 'build' si 'clean' care sa genereze un shared object denumit 'lib-backend.so'
  • fisier README care să conțină detalii despre implementarea temei

Pentru a putea genera un shared object este nevoie ca sursele sa fie compilate cu flag-ul '-fPIC'. Pentru un exemplu, inspectati Makefile-ul din backend_src

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 toate temele!

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/2014/teme/teme-02.txt · Last modified: 2015/03/01 23:39 by andrei.vasiliu2211
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