Programare: Tema 4

Prelucrări de texte

Problema T1 Scrieți un program care citește de la intrare un text, presupus a reprezenta un program C, și îl afișează, mai puțin comentariile (scrise după regulile limbajului C).

Problema T2 În sistemul de preparare a documentelor LaTeX, documentele (exemplu) pot conține pe lângă text obișnuit și comenzi \numecomandă care încep cu caracterul \ și pot avea opțional argumente: \numecomandă{arg1}{arg2} etc.


Scrieți un program care citește de la intrare un text, presupus a reprezenta un document LaTeX, și îl afișează din el doar textul obișnuit și argumentele comenzilor, dar nu și comenzile. Opțional, filtrați din text și comentariile, care încep cu caracterul % și se termină la sfârșit de linie.

Problema T3 Scrieți un program care citește de la intrare un text și verifică dacă parantezele ( ) [ ] { } care apar în el sunt bine împerecheate (pot fi încuibate dar nu intercalate).
Soluție

Recursivitate și arbori

Un arbore binar e fie arborele vid, fie un nod rădăcină, cu un subarbore stâng și un subarbore drept. Un arbore binar ordonat e un arbore în care fiecare nod conține o valoare (de exemplu întreagă), iar subarborii sunt de asemenea arbori binari ordonați: toate valorile din subarborele stâng sunt mai mici decât cea din rădăcină, și toate valorile din subarborele drept sunt mai mari.

Rezolvați următoarele probleme, în pseudocod, într-un limbaj de nivel înalt care permite definirea facilă de arbori, sau în C (se dau biblioteca inttree.c și antetul inttree.h cu funcțiile necesare).

Problema A1 Scrieți o funcție care ia ca parametru un arbore binar ordonat și un număr x și returnează cea mai mare valoare din arbore care nu depășește pe x (sau raportează o eroare dacă nu există).

Problema A2 Scrieți o funcție care ia ca parametru un arbore binar ordonat și un număr nenegativ n și returnează a n-a valoare (în ordine crescătoare) din arbore (sau raportează o eroare dacă nu există).
O soluție posibilă: se creează un șir parcurgând arborele în inordine și se ia elementul al n-lea din șir. Altă soluție: se calculează dimensiunile subarborilor pentru a determina în care se află valoarea căutată. Ambele soluții au elemente utile, dar pot face prelucrări inutile. Găsiți o soluțîe mai bună.

Logică: condiții complexe și testarea programelor

Când testăm programe cu decizii complexe, dorim să evidențiem faptul că fiecare condiție individuală poate afecta rezultatul deciziei, pentru anumite valori (păstrate constante) ale celorlalte condiții. (Acest criteriu de testare se numește multiple condition/decision coverage.)
De exemplu, pentru condiția a || b, alegând a = F și modificând b de la F la T, rezultatul se modifică de la F la T, și simetric, alegând pe b=F, modificarea lui a schimbă rezultatul. Pe ansamblu, alegând cele 3 teste (1) a = F, b = F, (2) a = F, b = T, (3) a = T, b = F arătăm că rezultatul poate fi influențat modificând doar pe b (perechea (1, 2)), și doar pe b (perechea (1,3)).
De exemplu, pentru expresia a && (b || c) && (d || e) un astfel de set de teste e:
   a b c d e Rez
   -------------
1  F F T F T  F		a: (1, 3)
2  T F F F T  F		b: (2, 3)
3  T F T F T  T		c: (2, 4)
4  T T F F T  T
5  T F T F F  F         d: (3, 5)
6  T F T T F  T         e: (5, 6)
Concepeți un algoritm care, pornind de la o expresie booleană complexă cu operatorii AND și OR, și variabile presupuse distincte, produce o multime de teste care arată (printr-o pereche de teste din mulțime) că fiecare variabilă poate influența independent rezultatul expresiei. Încercați să găsiți o soluție cu număr minim de teste.
Marius Minea
Last modified: Fri Oct 29 11:15:00 EET 2010