Les fonctions génériques et les classes en C++ - Applications résolues


1) Construire une fonction generique (template) qui puisse determiner la valeur maximum des elements d’une array numerique, indiferement du type standard de ses elements.
Ecrire la fonction main() qui appelle la fonction construite, pour 2 array-uri, de types differentes.
Les elements des array seront lus du clavier en technique OOP.
#include<iostream>
using namespace std;
 
template<class T>
void lire(T a[], int* n, char c)
{
  cout<<"Lire la chaine "<<c<<endl;
  cout<<"\tdonnez la dimension: ";
  cin>>*n;
  cout<<"\tintroduire les elements:\n";
  for(int i=0;i<*n;i++)
  {
    cout<<"\t\telement ["<<i+1<<"]= ";
    cin>>a[i];
  }
}
 
template<class T>
void afficher(T a[], int n, char c)
{
  cout<<"Chaine "<<c<<" est: ";
  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;
 
 lire(a,&m,'A');
 lire(b,&n,'B');
 
 afficher(a,m,'A');
 afficher(b,n,'B');
 
 cout<<"\nMaximum de la chaine A est: "<<maxim(a,m);
 cout<<"\nMaximum sde la chaine B est: "<<maxim(b,n);
 
 int var;
 cin>>var;
}

2) Construire une fonction generique (template) qui puisse determiner la somme des elements d’un array numerique, indiferement du type standard de ses elements.
Ecrire la fonction main() qui appelle la fonction construite, pour 2 array-uri, de differents types.
Les elements des array seront lus du clavier en technique OOP.
#include<iostream>
using namespace std;
 
 
template<class T>
void lire(T a[], int* n, char c)
{
  cout<<"Lire la chaine "<<c<<endl;
  cout<<"\tdonner la dimension: ";
  cin>>*n;
  cout<<"\tintroduire les elements:\n";
  for(int i=0;i<*n;i++)
  {
    cout<<"\t\telement ["<<i+1<<"]= ";
    cin>>a[i];
  }
}
 
template<class T>
void afficher(T a[], int n, char c)
{
  cout<<"Chaine "<<c<<" est: ";
  for(int i=0;i<n;i++)
    cout<<a[i]<<' ';
  cout<<endl;
}
 
template<class T>
T somme(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;
 
 lire(a,&m,'A');
 lire(b,&n,'B');
 
 afficher(a,m,'A');
 afficher(b,n,'B');
 
 cout<<"\nSomme de la chaine A est: "<<somme(a,m);
 cout<<"\nSomme de la chaine B est: "<<somme(b,n);
 
 int var;
 cin>>var;
}

3) Construire une fonctgion generique qui inverse les valeurs de deux variables qu’on appelle.
//Exemple de fonction modele

#include<iostream>
using namespace std;
 
template <class X>
void changer(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<<"Valeurs entiers originales :"<<i<<' '<<j<<endl;
changer(i,j); 
cout<<"Valeurs entiers inverses :"<<i<<' '<<j<<endl<<endl;
cout<<"Valeurs reelles originales :"<<x<<' '<<y<<endl;
changer(x,y); //renverse float
cout<<"Valeurs reelles inverses :"<<x<<' '<<y<<endl<<endl;
cout<<"Valeurs caractere originales :"<<a<<' '<<b<<endl;
changer(a,b);
cout<<"Valeurs caractere inverses :"<<a<<' '<<b<<endl<<endl;
 
 int var;
 cin>>var;
}

4) Construire un programme pour creer une fonction generique avec deux types generiques.
#include<iostream>
using namespace std;
 
template <class tip1, class tip2>
 
void f (tip1 x, tip2 y)
//on peut aussi sur deux lignes, separés pas une instruction
 {
	cout<<x<<' '<<y<<endl;
}
 
void main()
{
	f(10, "hi");
	f(0.3, 12L);
 
	int var;
	cin>>var;
}

5) Construire une fonction generique pour renverser les valeurs de deux variables qu’on appelle, en utilisant surcharge explicite d’une fonction generique.
#include<iostream>
using namespace std;
 
//Exemple fonction modele

template <class X> void changer(X &a, X &b)
{
	X temp;
	temp=a;
	a=b;
	b=temp;
}
 
void changer(int &a, int &b)
{
	int temp;
	temp=a;
	a=b;
	b=temp+1;
	cout<<"Fonction sur-ecrite."<<endl;
}
 
void main()
{
	int i=0, j=10;
	float x=10.3, y=4.8;
	char a='A', b='B';
	cout<<"Valeurs entiers originales :"<<i<<' '<<j<<endl; changer(i,j); 
	cout<<"Valeurs entiers inverses :"<<i<<' '<<j<<endl<<endl;
	cout<<"Valeurs reelles originales :"<<x<<' '<<y<<endl; changer(x,y); 
	cout<<"Valeurs reelles inverses :"<<x<<' '<<y<<endl<<endl;
	cout<<"Valeurs caracthere originales :"<<a<<' '<<b<<endl; changer(a,b); 
	cout<<"Valeurs caracthere inverses :"<<a<<' '<<b<<endl<<endl;
 
	int var;
	cin>>var;
}

6) Realiser une classe generique pour travail avec la stive statique.
#include<iostream>
using namespace std;
 
 
template <class X>
class Empilez_vecteur
{
	X *memoire;
	int dimension;
	int haut;
	public:
	Empilez_vecteur(int);
	~Empilez_vecteur(){delete memoire;}
	virtual int push(X);
	virtual int pop(X&);
	virtual int top(X&);
	virtual int vide()
	{
		haut=-1;
		return haut;
	}
	virtual int plina()
	{
		haut=dimension-1;
		return haut;
	}
};
template <class X> Empilez_vecteur<X>::Empilez_vecteur(int dim)
{
	dimension=dim;
	memoire=new X[dimension];
	haut=-1;
}
template <class X> int Empilez_vecteur<X>::push(X v)
{
	if(haut<dimension-1)
	{
		memoire[++haut]=v;
		return 1;
	}
	else return 0;
}
template <class X> int Empilez_vecteur<X>::pop(X& v)
{
	if(haut!=-1)
	{
		v=memoire[haut--];
		return 1;
	}
	else return 0;
}
template <class X> int Empilez_vecteur<X>::top(X& t)
{
	if(haut!=-1)
	{
		t=memoire[haut];
		return 1;
	}
	else return 0;
}
void main()
{
	int c;
	Empilez_vecteur<int>*a=new Empilez_vecteur<int>(255);
	cout<<"Introduire un nombre (-1 l’arrete): ";
	cin>>c;
	while(c!=-1)
	{
		a->push(c);
		cout<<"Introduire un nombre(-1 l’arret): ";
		cin>>c;
	}
	cout<<endl;
	while(a->pop(c))
	{
		cout<<c<<" ";
	}
	cout<<endl;
	delete a;
 
	int var;
	cin>>var;
}

7) Developper une application pour implementer une liste enchainee avec des elements nombres entiers. Adapter cette application que le type de dates soit universel.
#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 *haut;
	public:
	stiva();
	~stiva();
	void init(int);
	void push(int); //ajouter un element dans la stive
	void afficher();
	int pop(); //extraire un element de la stive
	int vide();
};
 
stiva::stiva()
{
	haut=NULL;
}
void stiva::init(int val)
{
	haut=new nod;
	haut->next=NULL;
	haut->inf=val;
}
void stiva::push(int val)
{
	nod* aux=new nod;
	aux->inf=val;
	aux->next=haut;
	haut=aux;
}
int stiva::pop()
{
	nod *aux=haut;
	int n;
	if (haut)
	{
		n=haut->inf;
		haut=haut->next;
		delete(aux);
	}
	else cout<<"Liste vide!";
	return n;
}
void stiva::afficher()
{
	nod *aux=haut;
	while(aux)
	{
		cout<<aux->inf<<" ";
		aux=aux->next;
	}
	cout<<endl;
}
stiva::~stiva()
{
	nod *aux=haut;
	while(haut)
	{
		aux=haut;
		haut=haut->next;
		delete(aux);
	}
}
int stiva::vide()
{
	if(haut!=NULL) return 1;
	else return 0;
}
void option()
{
	getch();
	cout<<"1.Initializtion 4.Affichage stive"<<endl;
	cout<<"2.Introduire element 5.Detruire stive"<<endl;
	cout<<"3.Enlever element 0.STOP"<<endl;
	cout<<endl<<endl<<"Introduire l’option: ";
}
void main()
{
	stiva s,s1;
cout<<"dans ce programme la liste est une stive, implementer ";
	cout<<"operations de base sur la stive.";
	option();
	int opt,initVal;
	cin>>opt;
	while (opt)
	{
		switch(opt)
		{
			case 0:break;
 
			case 1:cout<<"Donner une valeur:";
			cin>>initVal;
			s.init(initVal);
			break;
 
			case 2:cout<<"Donner le nouveau element:";
			cin>>initVal;
			s.push(initVal);
			break;
 
			case 3:cout<<"L’eklement du top est:"<<s.pop();
			getch();
			break;
 
			case 4:cout<<"Les elements de la stive sont:";
			s.afficher();
			getch();
			break;
 
			case 5:s.~stiva();
			cout<<"Liste detruite!";
			getch();
			break;
 
			default:cout<<"Mal option!";
			getch();
		}
		option();
		cin>>opt;
	}
 
	cout<<"Au revoire.";
	getch();
 
	int var;
	cin>>var;
}
Cookies help us deliver our services. By using our services, you agree to our use of cookies.