Sunteți pe pagina 1din 16

C++ _Functii si clase generice_ aplicatii rezolvate

1) Sa se construiasca o functie generica (template) care sa poata determina valoarea maxima a elementelor unui array numeric, oricare ar fi tipul standard al elementelor acestuia. Sa se scrie functia main() care sa apeleze functia construita, pentru 2 array-uri, de tipuri diferite. Elmentele arrayurilor vor fi citite de la tastatura in tehnica OOP (rezolvare...)

2) Sa se construiasca o functie generica (template) care sa poata determina suma elementelor unui array numeric, oricare ar fi tipul standard al elementelor acestuia. Sa se scrie functia main() care sa apeleze functia construita, pentru 2 array-uri, de tipuri diferite. Elmentele arrayurilor vor fi citite de la tastatura in tehnica OOP (rezolvare...)

3) Sa se construiasca o functie generica ce inverseaza ntre ele valorile celor doua variabile cu care este apelata (rezolvare...)

4) Sa se construiasca un program care creeaza o functie generica cu doua tipuri generice (rezolvare...)

5) Sa se construiasca o functie generica ce inverseaza ntre ele valorile celor doua variabile cu care este apelata, folosind suprancarcarea explicita a unei functii generice (rezolvare...)

6) Sa se realizeze o clasa generica pentru lucrul cu stiva statica (rezolvare...)

7) Se va dezvolta o aplicatie pentru implementarea unei liste nlantuite cu elemente fiind numere ntregi. Cerinta este a adapta aceasta aplicatie astfel nct tipul de date al elementelor listei sa fie unul universal (rezolvare...)

Rezolvari 1) Sa se construiasca o functie generica (template) care sa poata determina valoarea maxima a elementelor unui array numeric, oricare ar fi tipul standard al elementelor acestuia. Sa se scrie functia main() care sa apeleze functia construita, pentru 2 array-uri, de tipuri diferite. Elmentele array-urilor vor fi citite de la tastatura in tehnica OOP. #include<iostream> using namespace std;

template<class T>

void citire(T a[], int* n, char c) { cout<<"Citim sirul "<<c<<endl; cout<<"\tdati dimensiunea: "; cin>>*n; cout<<"\tintroduceti elementele:\n"; for(int i=0;i<*n;i++) { cout<<"\t\telementul ["<<i+1<<"]= "; cin>>a[i]; } }

template<class T> void afisare(T a[], int n, char c) { cout<<"Sirul "<<c<<" este: "; for(int i=0;i<n;i++) cout<<a[i]<<' '; cout<<endl; }

template<class T> T maxim(T a[], int n) { T max; max=a[0]; for(int i=1;i<n;i++) if(a[i]>max) max=a[i];

return max; }

void main() { int a[20]; double b[20]; int m,n;

citire(a,&m,'A'); citire(b,&n,'B');

afisare(a,m,'A'); afisare(b,n,'B');

cout<<"\nMaximul sirului A este: "<<maxim(a,m); cout<<"\nMaximul sirului B este: "<<maxim(b,n);

int var; cin>>var; }

2) Sa se construiasca o functie generica (template) care sa poata determina suma elementelor unui array numeric, oricare ar fi tipul standard al elementelor acestuia. Sa se scrie functia main() care sa apeleze functia construita, pentru 2 array-uri, de tipuri diferite. Elmentele array-urilor vor fi citite de la tastatura in tehnica OOP. #include<iostream> using namespace std;

template<class T> void citire(T a[], int* n, char c)

{ cout<<"Citim sirul "<<c<<endl; cout<<"\tdati dimensiunea: "; cin>>*n; cout<<"\tintroduceti elementele:\n"; for(int i=0;i<*n;i++) { cout<<"\t\telementul ["<<i+1<<"]= "; cin>>a[i]; } }

template<class T> void afisare(T a[], int n, char c) { cout<<"Sirul "<<c<<" este: "; for(int i=0;i<n;i++) cout<<a[i]<<' '; cout<<endl; }

template<class T> T suma(T a[], int n) { T sum; sum=0; for(int i=0;i<n;i++) { sum=a[i]+sum; }

return sum; }

void main() { int a[20]; double b[20]; int m,n;

citire(a,&m,'A'); citire(b,&n,'B');

afisare(a,m,'A'); afisare(b,n,'B');

cout<<"\nSuma sirului A este: "<<suma(a,m); cout<<"\nSuma sirului B este: "<<suma(b,n);

int var; cin>>var; }

3) Sa se construiasca o functie generica ce inverseaza ntre ele valorile celor doua variabile cu care este apelata. //Exemplu de functie sablon

#include<iostream> using namespace std;

template <class X> void schimba(X &a, X &b)

{ X temp; temp=a; a=b; b=temp; } void main() { int i=0, j=10; float x=10.3, y=4.8; char a='A', b='B';

cout<<"Valorile intregi originale :"<<i<<' '<<j<<endl; schimba(i,j); //inverseaza intregii cout<<"Valorile intregi inversate :"<<i<<' '<<j<<endl<<endl; cout<<"Valorile reale originale :"<<x<<' '<<y<<endl; schimba(x,y); //inverseaza float cout<<"Valorile reale inversate :"<<x<<' '<<y<<endl<<endl; cout<<"Valorile caracter originale :"<<a<<' '<<b<<endl; schimba(a,b); //inverseaza intregii cout<<"Valorile caracter inversate :"<<a<<' '<<b<<endl<<endl;

int var; cin>>var; }

4) Sa se construiasca un program care creeaza o functie generica cu doua tipuri generice. #include<iostream> using namespace std;

template <class tip1, class tip2>

void f (tip1 x, tip2 y) //merge si pe doua linii cu conditia ca intre aceste doua linii sa fie trecuta vreo instructiune { cout<<x<<' '<<y<<endl; }

void main() { f(10, "hi"); f(0.3, 12L);

int var; cin>>var; }

5) Sa se construiasca o functie generica ce inverseaza ntre ele valorile celor doua variabile cu care este apelata, folosind suprancarcarea explicita a unei functii generice. #include<iostream> using namespace std;

//Exemplu de functie sablon

template <class X> void schimba(X &a, X &b) { X temp; temp=a; a=b; b=temp;

void schimba(int &a, int &b) { int temp; temp=a; a=b; b=temp+1; cout<<"Functie suprascrisa."<<endl; }

void main() { int i=0, j=10; float x=10.3, y=4.8; char a='A', b='B'; cout<<"Valorile intregi originale :"<<i<<' '<<j<<endl; schimba(i,j); //inverseaza intregii cout<<"Valorile intregi inversate :"<<i<<' '<<j<<endl<<endl; cout<<"Valorile reale originale :"<<x<<' '<<y<<endl; schimba(x,y); //inverseaza float cout<<"Valorile reale inversate :"<<x<<' '<<y<<endl<<endl; cout<<"Valorile caracter originale :"<<a<<' '<<b<<endl; schimba(a,b); //inverseaza intregii cout<<"Valorile caracter inversate :"<<a<<' '<<b<<endl<<endl;

int var; cin>>var; }

6) Sa se realizeze o clasa generica pentru lucrul cu stiva statica. #include<iostream> using namespace std;

template <class X> class Stiva_Vector { X *memorie; int dimensiune; int vf; public: Stiva_Vector(int); ~Stiva_Vector(){delete memorie;} virtual int push(X); virtual int pop(X&); virtual int varf(X&); virtual int goala() { vf=-1; return vf; } virtual int plina() { vf=dimensiune-1; return vf; } }; template <class X> Stiva_Vector<X>::Stiva_Vector(int dim) { dimensiune=dim; memorie=new X[dimensiune]; vf=-1;

} template <class X> int Stiva_Vector<X>::push(X v) { if(vf<dimensiune-1) { memorie[++vf]=v; return 1; } else return 0; } template <class X> int Stiva_Vector<X>::pop(X& v) { if(vf!=-1) { v=memorie[vf--]; return 1; } else return 0; } template <class X> int Stiva_Vector<X>::varf(X& t) { if(vf!=-1) { t=memorie[vf]; return 1; } else return 0; } void main() {

int c; Stiva_Vector<int>*a=new Stiva_Vector<int>(255); cout<<"Introduceti un numar (-1 face oprirea): "; cin>>c; while(c!=-1) { a->push(c); cout<<"Introduceti un numar (-1 face oprirea): "; cin>>c; } cout<<endl; while(a->pop(c)) { cout<<c<<" "; } cout<<endl; delete a;

int var; cin>>var; }

7) Se va dezvolta o aplicatie pentru implementarea unei liste nlantuite cu elemente fiind numere ntregi. Cerinta este a adapta aceasta aplicatie astfel nct tipul de date al elementelor listei sa fie unul universal. #include<iostream> using namespace std; #include<stdio.h> #include<conio.h>

struct nod {

int inf; struct nod* next; };

typedef struct nod nod; class stiva { nod *vf; public: stiva(); ~stiva(); void init(int); void push(int); //adaugarea unui element in stiva void afisare(); int pop(); //extragerea unui element din stiva int goala(); };

stiva::stiva() { vf=NULL; } void stiva::init(int val) { vf=new nod; vf->next=NULL; vf->inf=val; } void stiva::push(int val) {

nod* aux=new nod; aux->inf=val; aux->next=vf; vf=aux; } int stiva::pop() { nod *aux=vf; int n; if (vf) { n=vf->inf; vf=vf->next; delete(aux); } else cout<<"Lista goala!"; return n; } void stiva::afisare() { nod *aux=vf; while(aux) { cout<<aux->inf<<" "; aux=aux->next; } cout<<endl; } stiva::~stiva() {

nod *aux=vf; while(vf) { aux=vf; vf=vf->next; delete(aux); } } int stiva::goala() { if(vf!=NULL) return 1; else return 0; } void optiune() { getch(); cout<<"1.Initializare 4.Afisare stiva"<<endl; cout<<"2.Introducere element 5.Distrugere stiva"<<endl; cout<<"3.Scoatere element 0.STOP"<<endl; cout<<endl<<endl<<"Introduceti optiunea: "; } void main() { stiva s,s1; cout<<"Acest program foloseste lista pe post de stiva, implementand "; cout<<"operatiile de baza de pe stiva."; optiune(); int opt,initVal; cin>>opt; while (opt)

{ switch(opt) { case 0:break;

case 1:cout<<"Dati o valoare:"; cin>>initVal; s.init(initVal); break;

case 2:cout<<"Dati noul element:"; cin>>initVal; s.push(initVal); break;

case 3:cout<<"Elementul din varf a fost:"<<s.pop(); getch(); break;

case 4:cout<<"Elementele aflate in stiva sunt:"; s.afisare(); getch(); break;

case 5:s.~stiva(); cout<<"Lista a fost distrusa!"; getch(); break;

default:cout<<"OPTIUNE GRESIT ALEASA!";

getch(); } optiune(); cin>>opt; }

cout<<"La revedere."; getch();

int var; cin>>var; }

Copyright 2013 IToyo

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