Sunteți pe pagina 1din 5

LUCRARE DE LABORATOR Nr.

Tema: Prelucrarea datelor la nivel de funcții și clase template

Scopul lucrării:
1. Prezentarea situațiilor de aplicare a programării generice;
2. Elaborarea funcțiilor template;
3. Utilizarea claselor template conform specificațiilor propuse;
4. Elaborarea, translarea și implimentarea algoritmilor pentru funcții și clase template în
limbajul de programare;
5. Validarea corectitudinii alcătuirii programelor C în soluţionarea problemelor propuse.

Condiţia lucrării:
(Conditia lucrării este dată în anexa conform variantei date)

Conţinutul raportului
1. Scopul lucrării;
2. Condiţia lucrării (formularea problemei conform variantei date);
3. Textul programului în limbajul C (listingul);
4. Schema bloc a programului respectiv;
5. Rezultatele obţinute în urma execuţiei programului;
6. Concluziile referitor la îndeplinirea lucrării.

Noţiuni teoretice
Să luăm un exemplu: o funcție care adună două numere:
int suma (int a, intb) { return a+b;}

Dacă vrem să adunăm două variabile de tip float sau double funcția nu este bună, căci
aplică conversii implicite pentru adaptarea la prototip, pierzând zecimalele ce asigură precizia
numărului; astfel, apelată sub forma:
cout<<suma(12.5, 2.5);
valoarea afișată este 14, nu 15 cum ne-am fi așteptat.
O soluție, nu tocmai eficientă, este să scriem doar funcția ce lucrează pe tipul cel mai
puternic (double); este de altfel și soluția pentru care s-a optat pentru majoritatea funcțiilor din
biblioteca matematică.
Este posibilă ca timpul necesar conversiilor, durata mare a calculelor pe double, să facă
total ineficientă această soluție.
Alteori scrierea acelorași funcții lucrând pe tipuri diferite de date devine obligatorie. Să
luăm un exemplu: o funcție care interschimbă două numere:
void schimb (int &, int &);
Suntem obligați să facem transferul prin referință sau prin adresă pentru ca interschimbul să fie
efectiv(real, concret), altfel am interschimba doar copiile parametrilor de intrare. Constatăm
imediat că pentru referințe și adrese nu mai sunt operate conversii implicite și deci funcția int &
nu poate fi folosită pentru interschimb pe double.
Deci există multe situații în care trebuie să scriem variante ale aceleași funcții, dar care
lucrează pe tipuri diferite de date.

Facilitatea template(șablon) permite să dăm un model după care sunt scrise


automat mai multe funcții. Un șablon de funcție este un tipar din care compilatorul C++
construiește funcții pentru diferite tipuri de variabile.
#include<iostream.h>
#include <string.h> {double x=1.1, y=2.2 ;
template <class tip> schimb(x,y) ;
void schimb (tip &a, tip &b) cout<<x<<y<<endl ;
{ tip aux; aux=a; a=b; b=aux;} int a=1 ; int b=2 ; schimb(a,b) ;
void main() cout<<x<<y<<endl ; }
Cuvîntul template informează compilatorului C++ că instrucțiunile care urmează nu
este o funcție propriu-zisă, ci un model (șablon) după care va fi generat cod sursă pentru mai
multe funcții similare.
Simbolul
<class tip> care urmează după cuvîntul cheie template specifică un simbol care
reprezintă tipul funcției sau tipul parametrilor funcției.
Exemplele de mai sus construiesc funcții template care lucrează pe tipuri de bază.
Putem să construim și funcții care lucrează și cu tipuri definite de utilizatori (clase)
class persoana
{public :
char nume [50];
persoana(char *n) { strcpy(nume,n);}
};
Putem adăuga acum în main() fără probleme, apelul:
persoana p1(”unu”), p2(”doi”);
schimb(p1,p2) ;
cout<<p1<<p2<<endl ; }

Clasa persoana folosită de funcția template nu este o clasă template, ci o clasă


obișnuită, deoarice în interiorul ei toți membrii au tipul cunoscut.
Următoarele instrucțiuni crează un șablon pentru funcția average_value.
template <class T> T average_value (T *array, int num_elements)
{ T sum=0;
for (int i=0; i<num_elements; i++)
sum+=array[i];
return (sum/num_elements); }
Să presupunem că fiecare apariție a lui T va fi sustitută prin tipul float. Antetul de
funcție va fi atunci :
float average_value(float *array, int num_elements)
Analog, dacă T va fi sustituit cu int, antetul de funcție devine :
int average_value(int *array, int num_elements)
Pentru ca C++ să cunoască tipul funcțiilor ce urmează a fi create, se pot specifica
prototipuri de funcții imediat după definiția șablonului, ca mai jos :
int average_value(int *, int )
float average_value(float *, int )
În acest caz, compilatorul C++ va crea automat funcții pentru tipul int și float.

Pe lîngă folosirea prototipurilor, programul poate folosi direct funcția, transferînd


acesteia parametrii ai căror tipuri determină tipurile corespunzătoare de funcții.
#include<iostream.h>
template <class T> T average_value (T *array, int num_elements)
{ T sum=0;
for (int i=0; i<num_elements; i++)
sum+=array[i];
return (sum/num_elements); }
int average_value(int *, int )
float average_value(float *, int )
void main()
{ int values [ ]= {1,2,3,4,5};
float prices [ ]= {1.1, 2.2, 3.3, 4.4, 5.5};
cout<< "Media intregi este "<<average_values(values,5)<<endl ;
cout<< "Media float este "<<average_values(prices,5)<<endl ;
}
La compilare și execuție va apărea
Media intregi este 3
Media float este 3.3

Dacă noi vom îndepărta prototipurile funcțiilor, la compilare va determina corect


tipurile pentru șablon, în funcție de parametrii transferați funcției.
#include<iostream.h>
template <class T> T average_value (T *array, int num_elements)
{ T sum=0;
for (int i=0; i<num_elements; i++)
sum+=array[i];
return (sum/num_elements); }
void main()
{ int values [ ]= {1,2,3,4,5};
float prices [ ]= {1.1, 2.2, 3.3, 4.4, 5.5};
cout<< "Media intregi este "<<average_value(values,5)<<endl ;
cout<< "Media float este "<<average_value(prices,5)<<endl ;
}
Putem să mai declarăm și următoarea declarație de tablou
long distances [ ]= {1000000L,2000000L,3000000L};
Respectiv pentru a calcula valoarea medie a tabloului
cout<< "Media long este "<<average_value(distances,3)<<endl ;

Exemplu:
Crează și folosește șabloane pentru funcțiile max_value și min_value pentru elementele
unui tablou.

#include<iostream.h>
template <class T> T max_value (T *array, int num_elements)
{ T max= array[0];;
for (int i=0; i<num_elements; i++)
if (max< array[i])
max=array[i];
return (max); }
template <class T> T min_value (T *array, int num_elements)
{ T min= array[0];;
for (int i=0; i<num_elements; i++)
if (min> array[i])
min=array[i];
return (min); }
float max_value(float *, int);
int max_value(int *, int);
float min_value(float *, int);
int min_value(int *, int);
void main()
{ int values [ ]= {5, 1, 6, 12, 7};
float prices [ ]= {1.1, 2.2, 3.3, 4.4, 5.5};
cout<< "Max intregi este "<<max_value(values,5)<<endl ;
cout<< "Max float este "<<max_value(prices,5)<<endl ;
cout<< "Min intregi este "<<min_value(values,5)<<endl ;
cout<< "Min float este "<<min_value(prices,5)<<endl ;

La compilare și execuție va apărea


Max intregi este 12
Max float este 5.5
Min intregi este 1
Min float este 1.1

ANEXĂ

Probleme propuse spre rezolvare independentă

1. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon (template) de
ordonare crescătoare a oricărui tip de vector (int, float, double). Se va folosi metoda bubblesort.

2. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon (template) de
determinare a mediei elementelor a trei vectori cu elemente de diferite tipuri (int, float, double).

3. Să se construiască o funcție șablon (template) care determină suma elementelor unui vector
numeric, oricare ar fi tipul standard al elementelor acestuia. Să se scrie funcția main() care să
apeleze funcția construită, pentru 2 vectori, de tipuri diferite.

4. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon (template) de
determinare a mediei elementelor unei linii (întrodusă de către utilizator de la tastatură) dintr-un
tablou bidimensional. Să se scrie funcția main() care să apeleze funcția construită, pentru 2
tablouri bidimensionale, de tipuri diferite.

5. Să se construiască o funcție șablon (template) care determină numărul elementelor negative


unui vector numeric, oricare ar fi tipul standard al elementelor acestuia. Să se scrie funcția
main() care să apeleze funcția construită, pentru 2 vectori, de tipuri diferite.

6. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon (template) de
interschimbare a elementelor egal depărtate de capetele unui vector. Să se scrie funcția main()
care să apeleze funcția construită, pentru 2 vectori, de tipuri diferite.

7. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon (template) de
determinare a sumei elementelor unei coloane (întrodusă de către utilizator de la tastatură) dintr-
un tablou bidimensional. Să se scrie funcția main() care să apeleze funcția construită, pentru 2
tablouri bidimensionale, de tipuri diferite.

8. Să se construiască o funcție șablon (template) care determină numărul elementelor pozitive


unui vector numeric, oricare ar fi tipul standard al elementelor acestuia. Să se scrie funcția
main() care să apeleze funcția construită, pentru 2 vectori, de tipuri diferite.

9. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon (template) de
interschimbare a primului element cu ultimul a unui vector. Să se scrie funcția main() care să
apeleze funcția construită, pentru 2 vectori, de tipuri diferite.

10. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon
(template) de ordonare descrescătoare a oricărui tip de vector (int, float, double). Se va folosi
metoda bubblesort.

11. Să se construiască o funcție șablon (template) care determină suma elementelor pozitive
unui vector numeric, oricare ar fi tipul standard al elementelor acestuia. Să se scrie funcția
main() care să apeleze funcția construită, pentru 2 vectori, de tipuri diferite.
12. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon
(template) de schimbare a elementelor pozitive cu zero și cele negative cu unu a unui vector. Să
se scrie funcția main() care să apeleze funcția construită, pentru 2 vectori, de tipuri diferite.

13. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon
(template) de ordonare crescătoare a oricărui tip de vector (int, float, double). Se va folosi
metoda inserției.

14. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon
(template) de determinare a produsului elementelor unui tablou bidimensional. Să se scrie funcția
main() care să apeleze funcția construită, pentru 2 tablouri bidimensionale, de tipuri diferite.

15. Să se scrie un program prin care să se exemplifice utilizarea unei funcții șablon
(template) de determinare a mediei elementelor dintr-un tablou bidimensional. Să se scrie funcția
main() care să apeleze funcția construită, pentru 2 tablouri bidimensionale, de tipuri diferite.

S-ar putea să vă placă și