Indicații: Exemple sunt funcțiile de bibliotecă bsearch si qsort (pentru care se solicită implementarea de variante în primele două probleme). Pentru a funcționa, acestea au nevoie de:
int intcmp1(const void *p, const void *q) { return *(int *)p - *(int *)q; }Deoarece intenționăm să o folosim în sortarea unui tablou de întregi, știm că într-un apel, cei doi pointeri dați ca argumente de implementarea funcției qsort vor fi de fapt pointeri la întregi, și îi folosim ca atare, dereferențiindu-i cu operatorul * doar după ce au fost convertiți la tipul int *. (Dereferențierea directă a unui void * nu este permisă deoarece nu știm spre ce tip indică el de fapt). Putem atunci apela
int intcmp2(const int *p, const int *q) { return *p - *q; }Putem folosi pointerii direct, fără a mai fi necesară conversia de tip. Dar tipul funcției (mai precis, al argumentelor ei) nu mai corespunde exact cu cel cerut de qsort. Deci trebuie convertit pointerul intcmp2 la apel:
În implementarea unor astfel de funcții e necesară determinarea adresei unui element de tablou, calculând deplasamentul în octeți față de adresa de început a tabloului. Putem aduna un număr de octeți la un pointer forțându-l întâi la tipul char *, și știind că adunarea cu un întreg are efectul deplasării adresei cu numărul indicat de obiecte, iar dimensiunea unui char e tocmai un octet.
Problema 1: Scrieți o funcție care efectuează căutarea binară a
unei valori într-un tablou ordonat crescător. Funcția va returna adresa din
tablou a elementului găsit, sau NULL dacă acesta nu există.
Unul din parametrii va fi un pointer la o funcție care ia ca parametri doi
pointeri la elemente de tablou și returnează rezultatul comparației între
cele două elemente.
Testați funcția căutând un număr real citit de la intrare într-un tablou
de reali dați ca argumente pe linia de comandă.
Obs: Prin căutare binară se înțelege o cautare cu înjumătățirea intervalului
în funcție de comparația cu valoarea de la mijlocul acestuia (vezi exemplul
de la cursul 1).
Problema 2: Scrieți o funcție care sortează un tablou. Unul din
parametrii va fi un pointer la o funcție care ia ca parametri doi pointeri
la elemente de tablou și returnează rezultatul comparației între cele două
elemente.
Testați funcția sortând crescător șirul realilor dați ca argumente pe linia
de comandă a programului.
Problema 3: Scrieți o funcție care prelucrează succesiv toate elementele
unui tablou. Funcția va lua ca argumente adresa tabloului, numărul de elemente,
un șir de max. 2 caractere care indică tipul elementelor de tablou, după
convențiile folosite la intrarea/ieșirea formatată (c, d, hd, ld, u, hu, lu, f, lf) și un pointer la o funcție care efectuează prelucrarea unui element de tablou, indicat prin adresa sa.
Testați funcția citind de la intrare și apoi tipărind un tablou. Numărul de
elemente din tablou și tipul lor se solicită de la intrare.