Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
14. Programare genericã <strong>în</strong> C<br />
Colectii de date generice<br />
O colectie de date (numitã si structurã de date) grupeazã mai multe componente,<br />
numite si elemente ale colectiei. Componentele unei colectii sunt fie valori individuale<br />
(numere, siruri de caractere, sau alte tipuri de date), fie perechi cheie-valoare, fie alte<br />
colectii sau referinte (pointeri) la date sau la colectii.<br />
O multime poate contine valori numerice de diferite tipuri si lungimi sau siruri de<br />
caractere sau alte tipuri de date agregat (structuri), sau pointeri (adrese). Ideal ar fi ca<br />
operatiile cu un anumit tip de colectie sã poatã fi scrise ca functii generale, adaptabile<br />
pentru fiecare tip de date ce va face parte din colectie. Acest obiectiv este de dorit mai<br />
ales pentru operatii care necesitã algoritmi mai complicati (operatii cu arbori binari<br />
echilibrati sau cu tabele de dispersie, de ex.), pentru a evita rescrierea functiilor pentru<br />
fiecare nou tip de date folosit.<br />
Realizarea unei colectii generice <strong>în</strong> C se poate face <strong>în</strong> douã moduri, dar nici unul<br />
complet satisfãcãtor:<br />
- Prin utilizarea de tipuri generice (neprecizate) pentru elementele colectiei <strong>în</strong><br />
subprogramele ce realizeazã operatii cu colectia. La utilizarea acestor subprograme<br />
adaptarea lor la un tip precis, cerut de o aplicatie, se face partial de cãtre compilator<br />
(prin macro-substitutie) si partial de cãtre programator (care trebuie sã dispunã de<br />
forma sursã pentru aceste subprograme).<br />
- Prin utilizarea unor colectii de pointeri la un tip neprecizat (void * <strong>în</strong> C) si a unor<br />
argumente de acest tip <strong>în</strong> subprograme, urmând ca <strong>în</strong>locuirea cu un alt tip de pointer<br />
(la date specifice aplicatiei) sã se facã la executie. Utilizarea unor astfel de<br />
subprograme este mai dificilã, dar utilizatorul nu trebuie sã intervinã <strong>în</strong> textul sursã al<br />
subprogramelor.<br />
Utilizarea de tipuri neprecizate<br />
Primul exemplu aratã cum se defineste o multime vector cu componente de un tip<br />
neprecizat <strong>în</strong> subprograme, dar precizat <strong>în</strong> programul care foloseste multimea :<br />
// multimi de elemente de tipul T<br />
typedef int T; // tip componente multime<br />
typedef struct {<br />
T m[M]; // multime de intregi<br />
int n; // dimensiune multime<br />
} Set;<br />
// operatii cu o multime<br />
int findS ( Set a, T x) { // cauta pe x in multimea a<br />
int j=0;<br />
while ( j < a.n && x != a.m[j] )<br />
++j;