17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

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;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!