Pages

jeudi 6 février 2014

Exercices corrigés c++ : La surcharge des opérateurs en langage C++

Exercice 1 :

Définir une classe permettant d’additionner, de soustraire, de multiplier, de diviser et de donner l’opposé (-) des fractions (rationnels comprenant numérateur et dénominateur) en utilisant la surcharge de ces opérateurs.
Créer un programme permettant de tester cette classe.            

Correction exercice 1 :

#include <iostream.h>
class operation{
float num;
float deno;
public:
operation(float numerateur=1, float denominateur=1);
friend operation operator+(operation fct1, operation fct2);
friend operation operator-(operation fct1, operation fct2);
friend operation operator* (operation fct1, operation fct2);
friend operation operator/(operation f1, operation f2);
void affiche();
};
operation::operation (float numerateur, float denominateur){
num= numerateur;
deno=denominateur;
}
operation operator+ (operation fct1, operation fct2){ //ressemble a constructeur par
copie
operation res;
res.deno= fct1.deno*fct2.deno;
res.num=(fct1.num*fct2.deno)+(fct2.num*fct1.deno);
return res;
}
operation operator- (operation fct1, operation fct2){ //ressemble a constructeur par
copie
operation res;
res.deno= fct1.deno*fct2.deno;
res.num=(fct1.num*fct2.deno)-(fct2.num*fct1.deno);
return res;
}
operation operator* (operation fct1, operation fct2){ //ressemble a constructeur par
copie
operation res;
res.deno= fct1.deno*fct2.deno;
res.num=fct1.num*fct2.num;
return res;
}
operation operator/(operation f1, operation f2) {
operation res;
if(f2.num == 0) {
res.num = 0;
res.deno = 1;
cout << "division par 0 pas possible" << endl;
}
else {
res.deno = f1.deno * f2.num;
res.num = f1.num * f2.deno;
}
return res;
}
// opposé ???????
void operation::affiche(){
cout<<num<<" / "<<deno<<endl;
}
void main(){
operation a(2,3);
operation b(1,2);
operation c;
c=a+b;
c.affiche();
c=a-b;
c.affiche();
c=a*b;
c.affiche();
c=a/b;
c.affiche();
}

Exercice 2 :

Soit la classe vecteur 3d qui contient les coordonnées du vecteur (float), un constructeur initialisant les données membres avec des valeurs par défaut à 0.
Il faut définir l’opérateur + pour qu’il fournisse la somme de deux vecteurs et l’opérateur binaire * pour qu’il fournisse le produit scalaire de deux vecteurs.
Créer un programme permettant de tester cette classe.

Correction exercice 2 :

#include <iostream.h>
class vecteur3d{
float x;
float y;
float z;
public:
vecteur3d(float x1=0, float y1=0, float z1=0);
friend vecteur3d operator+(vecteur3d vect1, vecteur3d vect2);
friend vecteur3d operator*(vecteur3d vect1, vecteur3d vect2);
void affiche();
};
vecteur3d::vecteur3d(float x1, float y1, float z1){
x=x1;
y=y1;
z=z1;
}
vecteur3d operator+(vecteur3d vect1, vecteur3d vect2){
vecteur3d result;
result.x=vect1.x+vect2.x;
result.y=vect1.y+vect2.y;
result.z=vect1.z+vect2.z;
return result;}
vecteur3d operator*(vecteur3d vect1, vecteur3d vect2){
vecteur3d result;
result.x=vect1.x*vect2.x;
result.y=vect1.y*vect2.y;
result.z=vect1.z*vect2.z;
return result;}
void vecteur3d::affiche(){
cout<<"("<<x<<","<<y<<","<<z<<")";
}
void main(){
vecteur3d a(2,3,4);
vecteur3d b(1,2,5);
vecteur3d c;
c=a+b;
c.affiche();
c=a*b;
c.affiche();
}

Exercice 3 :

Créer une classe permettant d’additionner (surcharge de +), de soustraire(surcharge de -), de lire et d’afficher des dates simples au format jj/mm (ne pas prendre en compte les années bissextiles).

Correction exercice 3:

#include <iostream.h>
class date{
int jj;
int mm;
public:
date(int jour=0, int mois=0); // pas oublier d'initialiser sinon ca pose probleme
friend date operator-(date d1, date d2);
friend date operator+(date d1,date d2);
void lire();
void affiche();
};
date::date(int jour, int mois){
jj=jour;
mm=mois;
}
date operator+(date d1, date d2){
date result;
result.jj=d1.jj+d2.jj;
result.mm=d1.mm+d2.mm;
return result;
}
date operator-(date d1, date d2){
date result;
result.jj=d1.jj-d2.jj;
result.mm=d1.mm-d2.mm;
return result;
}
void date::lire(){
cout<<"Entrer le jour : "<<endl;
cin>>jj;
cout<<"Entrer la date : "<<endl;
cin>>mm;
}
void date::affiche(){
cout<<" le resultat de l'operation sur les dates "<<endl;
cout<<jj<<" / "<<mm<<endl;
}
void main(){
date a;
date b;
date c;
a.lire();
b.lire();
c=a+b;
c.affiche();
c=a-b;
c.affiche();
}

Exercice 4 :

Implémenter dans la classe de l’exercice 3 :
- une surcharge de >> permettant d’entrer le jour et le mois
- une surcharge de << permettant d’afficher le jour et le mois (2 chiffres pour
chaque)
- une surcharge de ++ qui incrémente la date d’un jour
- une surcharge de - - qui décrémente la date d’un jour
- une surcharge de == permettant de comparer 2 dates

Correction exercice 4:

#include <iostream.h>
class date{
int jj;
int mm;
public:
date(int jour=0, int mois=0); // pas oublier d'initialiser sinon ca pose probleme
friend date operator-(date d1, date d2);
friend date operator+(date d1,date d2);
friend istream& operator>>(istream& tmp,date& d);
friend ostream& operator<<(ostream& tmp,date d);
date operator --(int);
date& operator --();
date operator ++(int);
date& operator ++();
void lire();
void affiche();
};
date::date(int jour, int mois){
jj=jour;
mm=mois;
}
date operator+(date d1, date d2){
date result;
result.jj=d1.jj+d2.jj;
result.mm=d1.mm+d2.mm;
return result;
}
date operator-(date d1, date d2){
date result;
result.jj=d1.jj-d2.jj;
result.mm=d1.mm-d2.mm;
return result;
}
istream& operator>>(istream& tmp,date& d){
cout<<"Entrez la date svp"<<endl;
tmp>>d.jj;
tmp>>d.mm;
return tmp;
}
ostream& operator<<(ostream& tmp,date d){
cout<<endl;
cout<<"Voici la date"<<endl;
tmp<<d.jj;
cout<<" / ";
tmp<<d.mm;
return tmp;
}
date date ::operator--(int){// attention au placement du ::
date tmp=*this;
tmp.jj--;
tmp.mm--;
return tmp;
}
date& date::operator --(){
jj--;
mm--;
return *this;
}
date date ::operator++(int){// attention au placement du ::
date tmp=*this;
tmp.jj++;
tmp.mm++;
return tmp;
}
date& date::operator ++(){
jj++;
mm++;
return *this;
}
void date::lire(){
cout<<"Entrer le jour : "<<endl;
cin>>jj;
cout<<"Entrer la date : "<<endl;
cin>>mm;
}
void date::affiche(){
cout<<" le resultat de l'operation sur les dates "<<endl;
cout<<jj<<" / "<<mm<<endl;
}
void main(){
date a;
date b;
date c;
a.lire();
//b.lire();
cin>>b;
c=a+b;
c.affiche();
c=a-b;
cout<<c;
c--;
--c;
c.affiche();
++c; // on utilisera cette operation
c++;
c.affiche();
}

Exercice 5 :

Implémenter dans la classe de l’exercice 2 :
- une surcharge de l’opérateur d’affectation
- une surcharge de +=
- une surcharge de ==
- une surcharge de – qui décrémente les coordonnées du vecteur de 1
- une surcharge de >> qui permet d’entrer les composantes du vecteur
- une surcharge de << qui permet d’afficher les composantes du vecteur.
- une surcharge de l’opérateur d’indexation qui retourne la coordonnée suivant x
ou suivant y ou suivant z selon l’indice passé en paramètre.

Correction exercice 5:

#include <iostream.h>
#include <string.h>
class vecteur3d{
/*float taille;
float *adresse;
*/
float x; // en public pour mon operateur d'indexation
float y;
float z;
float adr[3];
public:
vecteur3d(float x1=0, float y1=0, float z1=0);
friend vecteur3d/*valeur de retour */ operator+(vecteur3d vect1, vecteur3d
vect2);
friend vecteur3d/*valeur de retour */ operator-(vecteur3d vect1, vecteur3d
vect2);
friend vecteur3d operator*(vecteur3d vect1, vecteur3d vect2);
friend ostream& operator<<(ostream& tmp , vecteur3d v);
friend istream& operator>>(istream& tmp, vecteur3d& v);
float& operator[] (int i);
vecteur3d& operator +=(vecteur3d& v);
friend bool operator==(vecteur3d v1,vecteur3d v2);
vecteur3d& operator=(vecteur3d v);
void affiche();
~vecteur3d();
};
vecteur3d::vecteur3d(float x1, float y1, float z1){
x=x1;
y=y1;
z=z1;;
adr[0]=x;
adr[1]=y;
adr[2]=z;
}
vecteur3d::~vecteur3d(){
}
float& vecteur3d::operator[] (int i){
return adr[i];
}
vecteur3d operator+(vecteur3d vect1, vecteur3d vect2){
vecteur3d result;
result.x=vect1.x+vect2.x;
result.y=vect1.y+vect2.y;
result.z=vect1.z+vect2.z;
return result;}
vecteur3d operator-(vecteur3d vect1, vecteur3d vect2){
vecteur3d result;
result.x=vect1.x-vect2.x;
result.y=vect1.y-vect2.y;
result.z=vect1.z-vect2.z;
return result;}
vecteur3d operator*(vecteur3d vect1, vecteur3d vect2){
vecteur3d result;
result.x=vect1.x*vect2.x;
result.y=vect1.y*vect2.y;
result.z=vect1.z*vect2.z;
return result;}
vecteur3d& vecteur3d::operator +=(vecteur3d& v){
x+=v.x;
y+=v.y;
z+=v.z;
return *this;
}
bool operator==(vecteur3d v1,vecteur3d v2){
if((v1.x==v2.x) && (v1.y==v2.y) && (v1.z==v2.z)) return true;
else return false;
}
vecteur3d& vecteur3d::operator=(vecteur3d v){
x=v.x;
y=v.y;
z=v.z;
return *this;
}
ostream& operator<<(ostream& tmp, vecteur3d v){
tmp<<"X = "<<v.x<<", Y= "<<v.y<<", Z= "<<v.z<<endl;
return tmp;
}
istream& operator>>(istream& tmp, vecteur3d& v){
//pas de vecteur3d::
cout<< " Entrer les valeurs de x,y,z"<<endl;
tmp>>v.x;
tmp>>v.y;
tmp>>v.z;
return tmp;
}
void vecteur3d::affiche(){
cout<<"("<<x<<","<<y<<","<<z<<")";
}
void main(){
//vecteur3d a(2,3,4);
vecteur3d a;
vecteur3d b;
vecteur3d d(1,1,1);
vecteur3d c;
/* a.x=a[0];
a.y=a[1];
a.z=a[2];
for (i=0;i<3;i++){
cin>>a[i];
}
for (i=0;i<3;i++){
cout<<a[i]<<endl;
}
*/
cin>>a;
cout<<a;
cin>>b;
if(a==b){
cout<<"Valeurs identiques"<<endl;
}
else{
cout<<"Valeurs différentes"<<endl;
}
c=b-d;
//c.affiche();
cout<<c;
c=a+b;
c.affiche();
c=a*b;
c.affiche();
a+=b;
a.affiche();
a=b;
a.affiche();
vecteur3d k(1,1,2);
for (float i=0;i<3;i++){
cout<<k[i]<<endl;
}
}

Exercice 6 :

Implémenter dans la classe de l’exercice 1 :
- une surcharge des opérateurs de pré et post incrémentation
- une surcharge de l’opérateur de conversion en float
- une surcharge de l’opérateur d’exponentiation sous la forme
rationnel operator ^(rationnel&, unsigned &) . Exemple : si x=2/5 alors x^4
retourne le rationnel 16/625
- une surcharge de l’opérateur d’exponentiation sous la forme
rationnel operator ^(rationnel&, int &) . Exemple : si x=2/5 alors x^-4
retourne le rationnel 625/16
- une surcharge de l’opérateur << qui permet d’afficher le numérateur et le
dénominateur

Correction exercice 6:

#include <iostream.h>
#include <math.h>
class operation{
float num;
float deno;
public:
operation(float numerateur=1, float denominateur=1);
friend operation operator+(operation fct1, operation fct2);
friend operation operator-(operation fct1, operation fct2);
friend operation operator* (operation fct1, operation fct2);
friend operation operator/(operation f1, operation f2);
friend operation operator~(operation f);
operation operator++(int); //post
operation& operator++(); //pré
operator float();
friend operation operator^(operation op,unsigned &);
friend operation operator^(operation op, int& ex);
void affiche();
};
operation::operation (float numerateur, float denominateur){
num= numerateur;
deno=denominateur;
}
operation operator+ (operation fct1, operation fct2){ //ressemble a constructeur par
copie
operation res;
res.deno= fct1.deno*fct2.deno;
res.num=(fct1.num*fct2.deno)+(fct2.num*fct1.deno);
return res;
}
operation operator- (operation fct1, operation fct2){ //ressemble a constructeur par
copie
operation res;
res.deno= fct1.deno*fct2.deno;
res.num=(fct1.num*fct2.deno)-(fct2.num*fct1.deno);
return res;
}
operation operator* (operation fct1, operation fct2){ //ressemble a constructeur par
copie
operation res;
res.deno= fct1.deno*fct2.deno;
res.num=fct1.num*fct2.num;
return res;
}
operation operator/(operation f1, operation f2) {
operation res;
if(f2.num == 0) {
res.num = 0;
res.deno = 1;
cout << "division par 0 pas possible" << endl;
}
else {
res.deno = f1.deno * f2.num;
res.num = f1.num * f2.deno;
}
return res;
}
operation operator~(operation f){
operation res;
res.num=-f.num;
res.deno=f.deno;
return res;
}
operation& operation::operator ++(){
num++;
deno++;
return *this;
}
operation operation::operator ++(int){
operation tmp=*this;
tmp.num++;
tmp.deno++;
return tmp;
}
operation::operator float(){
float res=num/deno;
return res;
}
operation operator^(operation op, unsigned& ex){
operation tmp;
tmp.num=pow(op.num,ex);
tmp.deno=pow(op.deno,ex);
return tmp;
}
operation operator^(operation op, int& ex){
operation tmp;
tmp.num=pow(op.num,ex);
tmp.deno=pow(op.deno,ex);
return tmp;
}
void operation::affiche(){
cout<<num<<" / "<<deno<<endl;
}
// surcharge de l'opérateur << --> voir les exo précédents
void main(){
operation a(2,3);
operation b(2,5);
operation c;
c=a+b;
c.affiche();
c=a-b;
c.affiche();
c=a*b;
c.affiche();
c=a/b;
c.affiche();
c=~a;
c.affiche();
c=a++;
c.affiche();
a.affiche();
c=++a;
c.affiche();
a.affiche();
float h;
h=float(a);
cout<<"conversion "<<h<<endl;
unsigned int g=4;
c=operator^(b,g);
c.affiche();
int j=(-4);
c=operator^(b,j);
c.affiche();
}

Exercice 7 :

Créer une classe matrice qui permet de gérer des matrices à 2 dimensions. Elle
comprend les données membres privées : nombre de ligne, nombre de colonne et une
gestion dynamique pour stocker les éléments (doubles) de la matrice.
Elle comprend un constructeur et un destructeur.
Elle comprend la surcharge de l’opérateur <<, de l’opérateur(), de l’opérateur new et
de l’opérateur delete .
L’opérateur () devra être utilisé pour stocker les éléments dans la matrice.
Créer un programme permettant de tester la classe matrice.

Correction exercice 7:

#include <iostream.h>
#include<stddef.h> // utile pour size_t
#include<stdlib.h>
class matrice{
int nbres_lg;
int nbres_cl;
int *tab;
public:
matrice(int nblg,int nbcl);
friend ostream& operator<<( ostream& tmp,matrice d);
int* operator()(matrice& d);
void * operator new (size_t);
void operator delete(void *p);
void affiche();
};
matrice::matrice(int nblg,int nbcl){
nbres_lg=nblg;
nbres_cl=nbcl;
tab=new int[nbres_lg*nbres_cl];
for (int i=0;i<nbres_lg*nbres_cl;i++) tab[i]=0;
}
ostream& operator<<(ostream& tmp, matrice d){
for (int i=0; i<d.nbres_lg;i++){
for(int j=0;j<d.nbres_cl;j++){
tmp<<"tab["<<i<<"]["<<j<<"]="<<d.tab[(2*i*(d.nbres_cl-
1))+j]<<endl;
//voir cours de Mr Wilfart
//sur l'allocation des tableaux
}
}
return tmp;
}
int* matrice::operator ()(matrice& d){
for (int l=0;l<d.nbres_lg;l++)
{
for(int c=0;c<d.nbres_cl;c++)
{
cout<<"entrez la valeur que vous desirez pour la
matrice["<<l<<";"<<c<<"]:"<<endl;
cin>>d.tab[(2*l*(d.nbres_cl-1))+c];
}
}
return d.tab;
}
void * matrice::operator new(size_t sz){
cout<<"appel new"<<endl;
return malloc(sz);}
void matrice::operator delete(void *p){
free(p);
cout<<"appel delete\n";
}
void matrice::affiche(){
for (int l=0;l<nbres_lg;l++)
{
for(int c=0;c<nbres_cl;c++)
{
cout<<tab[(2*l*(nbres_cl-1))+c]<<endl;
}
}
}
void main(){
matrice a(2,2);
a(a);
a.affiche();
cout<<a;
matrice *b=new matrice(a); // en paramètre de ou il va chercher sa reference
// c a d d'une autre matrice
cout<<a;
delete b;
}

Exercice 8 :

Écrire une classe vecteur comportant :
- en membres donnée privés : trois composantes de type double
- un constructeur qui initialise les valeurs des composantes
- une surcharge de * permettant de multiplier les composantes par une valeur
- une surcharge de = = permettant de comparer 2 vecteurs
- une surcharge des opérateurs >> et <<.
Créer un programme permettant de tester la classe vecteur.

Correction exercice 8:

#include <iostream.h>
class vecteur{
double x;
double y;
double z;
public:
vecteur(double x1=0, double y1=0, double z1=0); //ATTENTION;-)
friend vecteur operator*(vecteur v1, vecteur v2);
friend bool operator==(vecteur v1, vecteur v2);
friend ostream& operator<<(ostream& tmp,vecteur v);
friend istream& operator>>(istream& tmp,vecteur& v);
};
vecteur::vecteur(double x1, double y1, double z1){
x=x1;
y=y1;
z=z1;
}
vecteur operator*(vecteur v1, vecteur v2){
vecteur tmp;
tmp.x=v1.x*v2.x;
tmp.y=v1.y*v2.y;
tmp.z=v1.z*v2.y;
return tmp;
}
ostream& operator<<(ostream& tmp,vecteur v){
tmp<<"X = "<<v.x<<"Y = "<<v.y<<"Z = "<<v.z<<endl;
return tmp;
}
istream& operator>>(istream& tmp,vecteur& v){
cout<<" Entrez les valeurs de x,y et z"<<endl;
tmp>>v.x;
tmp>>v.y;
tmp>>v.z;
return tmp;
}
bool operator==(vecteur v1, vecteur v2){
if ((v1.x==v2.x)&&(v1.y==v2.y)&&(v1.z==v2.z)) return true;
else return false;
}
void main(){
vecteur a(2,3,4);
vecteur b(2.2,3.3,4);
vecteur c;
c=a*b;
vecteur d;
cin>>d;
cout<<d;
if (a==d) cout<<"valeurs identiques"<<endl;
else cout<<"valeurs différentes"<<endl;
}


Aucun commentaire:

Enregistrer un commentaire

Partenaires

Computers Blogs

Contactez-nous

Nom

E-mail *

Message *

Tous droits resérvés-www.exercices-corriges.com Seo Blogger Templates