Sunteți pe pagina 1din 6

Tema 1: Editorul de text

Liste. Stive. Cozi


Alexandra Maria Vieru
Facultatea de Automatic a s
,
i Calculatoare
17 martie 2014
1 Scopul temei
Scopul acestei teme este de a implementa un editor de text minimal fara interfat
,
a
graca avand o parte din funct
,
ionalitat
,
ile editorului vim. De asemenea, se
dores
,
te implementarea tuturor structurilor de date folosite (liste / stive / cozi)
pentru rezolvare.
2 Descriere
Interfat
,
a editorului va una text. Utilizatorul poate sa introduca text s
,
i comenzi
de la tastatura. Orice comanda are urmatorul format: ::<comanda> [param1]
[param2]
Se garanteaza faptul ca n textul introdus de utilizator nu se va ntalni
secvent
,
a ::. Toate comenzile vor urmate de o linie noua. La execut
,
ia pro-
gramului utilizatorul va capabil sa scrie n s
,
ierul al carui nume este primit ca
parametru n linia de comanda. Modicarile facute asupra textului trebuie sa
e salvate n s
,
ier doar n urma comenzii save sau la ecare 5 comenzi diferite
de save executate de utilizator. Editorul va avea un cursor care n mod obis
,
nuit
va pozit
,
ionat dupa ultimul caracter scris, dar el poate pozit
,
ionat cu ajutorul
unor comenzi la anumite pozit
,
ii din text. Atat liniile, cat s
,
i caracterele de pe
ecare linie se numeroteaza de la 1.
Lista comenzilor:
::u - undo (anuleaza rezultatul ultimei operat
,
ii efectuate)
::r - redo (anuleaza rezultatul ultimei operat
,
ii undo)
::s - save (salveaza documentul)
::q - quit (nchide editorul)
::b - backspace (s
,
terge caracterul de dinaintea cursorului)
1
::dl [nbr line] - delete line (s
,
terge linia specicata prin parametru.

In lipsa acestuia se va s
,
terge linia curenta.)
::gl nbr line - goto line (pozit
,
ioneaza cursorul la linia specicata prin
parametru, la nceputul acesteia)
::gc nbr char [nbr line] - goto character (pozit
,
ioneaza cursorul la
caracterul specicat prin parametrul 1 de pe linia indicata de parametrul
2. Al doilea parametru este opt
,
ional, n acest caz se va considera linia
curenta.)
::d [nbr chars] - delete (s
,
terge un numar de caractere de la pozit
,
ia
curenta a cursorului. Numarul de caractere este specicat prin primul
parametru, sau se considera a 1 daca acesta lipses
,
te.)
::re old word new word - replace (

Inlocuies
,
te prima aparit
,
ie de dupa
cursor a cuvantului old word cu textul new word. Se garanteaza ca nici-
unul dintre argumente nu va cont
,
ine spat
,
ii albe.)
3 Cerint
,
e
3.1 Cerint
,
a 1
Implementat
,
i comenzile urmatoare: save, quit, backspace, goto line, goto
character, delete line s
,
i delete.
3.2 Cerint
,
a 2
Implementat
,
i comenzile undo s
,
i redo (undo the undos) folosind o stiva care sa
poata sa e redimensionata dinamic, n funct
,
ie de necesitat
,
i. Comenzile undo s
,
i
redo se vor putea aplica asupra tuturor comenzilor implementate pe parcursul
temei (cu except
,
ia save s
,
i, desigur, quit). Aceste doua comenzi se pot executa
ori de cate ori dores
,
te utilizatorul sau pana cand nu mai exista nicio comanda
careia sa i se poata face undo/redo. Comanda redo se poate executa doar
atata timp cat ultima comanda executata a fost un undo. Daca este executata
comanda undo dupa introducerea unui text, atunci va s
,
ters tot textul de la
ultima comanda pana la caracterul curent.
4 Bonus
Implementat
,
i comanda replace conform specicat
,
iei de mai sus. Comenzile
undo s
,
i redo trebuie sa poata sa e executate inclusiv asupra acestei comenzi.
2
5 Detalii de implementare
Se cere utilizarea structurilor de date studiate la curs s
,
i implementate la labo-
rator: stive, cozi, structuri de date ciclice. Se pot folosi liste simplu nlant
,
uite,
liste dublu nlant
,
uite.
Sugestii:
folosirea unei structuri de date ciclice pentru ultimele n simboluri intro-
duse;
folosirea unei stive pentru operat
,
iile revocate cu ajutorul comenzii undo;
folosirea unei liste dublu nlant
,
uite accesata ca o stiva pentru ret
,
inerea
comenzilor.
6 Exemple
Se considera urmatoarea secvent
,
a de text s
,
i comenzi trimise editorului.
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
::gc 5 2
::gl 4
::dl
::u
::u
::dl
::u
::u
::r
xxxx
xxxx::s
:gl 6
yyyyyyyy
::q
Conform descrierii de mai sus a comenzilor, trebuie sa se petreaca urmatoarele:
1. Secvent
,
a
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
3
va adauga cele 5 linii de text s
,
i va muta cursorul pe prima pozit
,
ie de pe
linia 6.
2. Comanda ::gc 5 2 va muta cursorul pe pozit
,
ia a cincea de pe linia a
doua.
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
3. Comanda ::gl 4 va muta cursorul pe prima pozit
,
ie de pe linia a patra.
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
4. Comanda ::dl, deoarece nu primes
,
te un argument cu numarul liniei ce
va s
,
tearsa, elimina linia curenta (4) s
,
i muta cursorul la nceputul liniei
care i ia locul.
aaaaaaaa
bbbbbbbb
cccccccc
eeeeeeee
5. Comanda ::u va anula comanda anterioara (::dl).
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
6. Comanda ::u va anula comanda anterioara (::gl 4), iar acum cursorul
va repozit
,
ionat pe linia a doua, simbolul al cincilea:
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
7. Comanda ::dl va s
,
terge linia curenta.
aaaaaaaa
cccccccc
dddddddd
eeeeeeee
4
8. Cele doua comenzi undo vor anula atat comanda ::dl, cat s
,
i ::gc 5 2,
repozit
,
ionand cursorul pe linia a s
,
asea.
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
9. Comanda redo va reexecuta comanda ::gc 5 2:
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee
10. Secvent
,
a
xxxx
xxxx
va introduce textul ncepand cu pozit
,
ia a cincea de pe linia a doua:
aaaaaaaa
bbbbxxxx
xxxxbbbb
cccccccc
dddddddd
eeeeeeee
11. Comanda ::s salveaz a s
,
ierul pe disc cu numele primit ca argument n
linia de comanda.
12. Comanda :gl 6 s
,
i textul ce i urmeaza vor duce textul n urmatoarea
stare:
aaaaaaaa
bbbbxxxx
xxxxbbbb
cccccccc
dddddddd
yyyyyyyy
eeeeeeee
13. Comanda ::q va termina programul. Atent
,
ie, s
,
ierul trebuie sa nu salveze
modicarile ulterioare comenzii save.
5
7 Punctaj
Cerint
,
a 1 40 puncte
Cerint
,
a 2 50 puncte
Codying style, README, warninguri 10 puncte
Bonus 20 puncte
Tabela 1: Punctare
Se vor scadea puncte pentru implementarile care folosesc vectori n loc de liste
alocate dinamic sau daca acestea au dimensiune xa.
Temele vor punctate doar pentru testele care sunt trecute din vmchecker.
Nu lasat
,
i warning-urile nerezolvate, altfel vet
,
i depunctat
,
i.
Bonusul nu se puncteaza integral daca celelalte comenzi nu funct
,
ioneaza
perfect.
8 Arhiva temei
Temele trebuie sa e ncarcate pe vmchecker. Pe acest site trebuie folosite
credent
,
ialele de pe curs.cs.pub.ro pentru logare. NU se accepta teme trimise pe
email sau altfel decat prin intermediul vmchecker-ului.
O rezolvare consta ntr-o arhiva de tip zip care cont
,
ine toate s
,
ierele sursa
alaturi de un Makele ce va folosit pentru compilare s
,
i un s
,
ier README cu
detaliile implementarii. Trebuie respectate urmatoarele reguli:
Makele-ul trebuie sa aiba obligatoriu regulile pentru build s
,
i clean.
Regula build trebuie sa aiba ca efect compilarea surselor s
,
i crearea bina-
rului myVim.
Fis
,
ierele sursa trebuie sa e n radacina arhivei. Mai exact, nu facet
,
i un
director n care se aa toate sursele s
,
i arhivat
,
i directorul, ci selectat
,
i toate
sursele s
,
i facet
,
i arhiva din ele.
Arhiva trebuie sa aiba tipul zip s
,
i trebuie sa e numita astfel:
Nume Toate Prenumele GrupaSeria Tema1 SD.zip
Exemplu: Viziru S
,
tefan Andrei, grupa 312CC va trimite arhiva cu numele:
Viziru Stefan Andrei 312CC Tema1 SD.zip.
NU se vor puncta temele care nu respecta specicat
,
iile anterioare.
9 Precizari
Tema trebuie predata cel tarziu pe 6 aprilie 2014, ora 23:55. Deadline-ul
temei este hard.
Tema este individuala. Orice tentativa de copiere va sanct
,
ionata.
6