UPC 2 - Probleme suplimentare
Prelucrări de texte și lucru cu fișiere
Fiecare din programele de mai jos (dacă nu se precizează altfel) va citi
textul de prelucrat de la intrare dacă e rulat fără parametri, și din
fișierul cu numele dat pe linia de comandă, dacă se dă un argument.
-
Scrieți un program care numără cuvintele și frazele dintr-un text.
Un cuvânt e un șir de caractere alfanumerice consecutive. O frază
e o secvență de caractere care conține cel puțin un cuvânt și e încheiată
printr-unul din caracterele ! . ?
-
Scrieți un program care elimină spatiile albe inutile dintr-un text,
definite în felul următor:
- spații albe înaintea semnelor de punctuație ! , . : ; ?
- spatii albe la început sau la sfârșit de linie
- două sau mai multe spații albe consecutive pe aceeași linie
(înlocuite cu unul singur)
- mai mult de două caractere de linie nouă consecutive (înlocuite cu două)
Implementați una sau mai multe din prelucrările de mai sus.
-
Scrieți un program care citește de la intrare o expresie aritmetică fără
paranteze conținând numere nenegative și operatorii + și - și calculează
valoarea ei.
- Rezolvați aceeași problemă pentru numere întregi (posibil negative).
- Rezolvați aceeași problemă pentru operatorii * și /
-
Implementați programul UNIX grep care caută un cuvânt dat ca prim
argument pe linia de comandă în fiecare din fișierele cu numele date ca
următoarele argumente (sau în intrarea standard, fără alte argumente).
Programul va tipări fiecare linie în care apare cuvântul respectiv.
Ca variante, implementați una sau mai multe din opțiunile (specificate
pe linia de comandă înainte de cuvântul dat):
- -n tipărește înainte de fiecare linie care conține cuvântul numărul liniei
în fișier
- -v tipărește liniile care NU conțin cuvântul dat
- -w recunoaște cuvântul doar dacă e separat prin spații albe în cadrul liniei
-
Implementați programul UNIX uniq care elimină liniile duplicate
(identice) consecutive dintr-un fișier, înlocuindu-le cu câte un singur exemplar.
Prelucrări pe liste
Pentru toate problemele de mai jos, încercați atât o abordare iterativă
cât și una recursivă.
-
Scrieți o funcție care ia ca parametri două liste de același tip
(de ex. de întregi) și o concatenează pe a doua la prima.
-
Scrieți o funcție care ia ca parametri două liste de același tip (de ex.
de întregi), o inversează pe prima și o concatenează la ea pe a doua.
-
Scrieți o funcție care ia ca parametru o listă de liste de același tip
(de ex. de întregi), și creează o listă care conține toate elementele
listelor, puse cap la cap.
-
Scrieți o funcție care ia ca parametri o listă de întregi și (un pointer
la) o funcție void (fără rezultat) cu parametru întreg, și apelează pe
rând funcția pentru fiecare element din listă.
-
Scrieți o funcție care ia ca parametri o listă de întregi și un întreg,
și îl adună pe acesta la fiecare element al listei.
-
Scrieți o funcție care ia ca parametru o listă de întregi și (un pointer la)
o funcție întreagă de parametru întreg, apelează pe rând funcția cu toate
elementele listei, returnând o listă cu rezultatele.
-
Scrieți o funcție care ia ca parametru o listă de întregi, și parcurge lista
de la cap la coadă, interschimbând două elemente daca primul este mai mare
decât al doilea. (Variantă: implementați funcția eficient, rupând și refăcând
legăturile doar când s-a găsit locul potrivit pentru elementul curent).
Folosiți în mod repetat funcția scrisă pentru a sorta lista cu bubblesort.
Marius Minea
Last modified: Thu Apr 8 07:51:50 EEST 2004