Exos Sur Classes CPP
Exos Sur Classes CPP
Exos Sur Classes CPP
EXERCICE 1
Exemple 1 : Code source Cpp Exemple 2 : Code source Cpp
#include <iostream> #include <iostream>
using namespace std ; using namespace std ;
class Point class Complexe
{ private : { double re ;
double X , Y ; double im ;
public : public :
Point(double x = 0, double y = 0) ; Complexe( )
Point Add(Point pt) ; { re = im = 0.0 ; }
void Afficher( ) ; Complexe(double a, double b)
double GetX( ) ; { re = a ;
double GetY( ) ; im = b ; }
void SetX(double x) ; void addition(Complexe z)
void SetY(double y) ; { re = re + z.re ;
}; im = im + z.im ; }
Point :: Point(double x, double y) Complexe add(Complexe z)
{ X=x; Y=y; } { double a, b ;
Point Point :: Add(Point pt) a = re + z.re ;
{ Point result(pt.X + X, pt.Y + Y) ; b = im + z.im ;
return result ; } return Complexe(a,b) ; }
void Point :: Afficher( ) Complexe mul(Complexe z)
{ cout<< "(" << X << " ," << Y << " )" ; } { double a, b ;
double Point :: GetX( ) a = re*z.re - im*z.im ;
{ return X ; } b = re*z.im + im*z.re ;
double Point :: GetY( ) return Complexe(a,b) ; }
{ return Y ; } void Afficher( )
void Point :: SetX(double x) { cout<<"( " << re << " + i*" << im << " )" ;
{ X=x;} }
void Point :: SetY(double y) };
{ Y=y;} int main( )
int main( ) { cout << " #### TP2 sur les Classes #### " << endl ;
{ cout << " #### TP1 sur les Classes #### " << endl ; Complexe z1 ;
Point pt1(1,1) ; Complexe z2(2,3) ;
Point pt2,pt3 ; Complexe z3(3,4 );
pt2 = Point(3,1) ; cout<<endl<<" z1 = " ;
cout << "Position de pt1 : " ; z1.Afficher( ) ;
pt1.Afficher() ; cout<<endl<<" z2 = " ;
pt1.SetX( 2 ) ; pt1.SetY( 3 ) ; z2.Afficher( ) ;
cout << endl ; cout<<endl<<" z3 = " ;
cout << "Nouvelle position de pt1 : " ; z3.Afficher( ) ;
pt1.Afficher( ) ; Complexe z4 ;
cout << endl ; z4 = z2.add(z3) ;
cout << "Position de pt2 : " ; cout<<endl<<" z4 = z2 + z3 = " ;
pt2.Afficher( ) ; z4.Afficher( ) ;
pt3 = pt1.Add(pt2) ; Complexe z5 ;
cout << endl ; z5 = z2.mul(z3) ;
cout << "Position de pt3 : " ; cout<<endl<<" z5 = z2 * z3 = " ;
pt3.Afficher( ) ; z5.Afficher( ) ;
cout << endl ; }
return 0 ;
}
1- Analyser les deux codes sources ci-dessus (comprendre chaque ligne du code et les résultats obtenus).
2- Modifier la classe Point pour ajouter la fonction membre « Distance » qui calcule la distance entre deux points :
c'est- à-dire entre le point courant et un point passé en paramètre à la fonction. Tester cette méthode dans le
programme.
3- Modifier la classe Complexe pour ajouter la fonction membre « Module » qui calcule le module d’un nombre
complexe.
Page 1 sur 9
EXERCICE 2
Dans un programme C++, on retrouve la classe Student définie comme suit :
class Student
{ private :
string Nom, Prenom ;
int Notes[10] ;
public :
void saisie ( ) ;
float moyenne ( ) ;
void afficher ( ) ;
bool exae_quo (Student S);
};
EXERCICE 3
Dans un programme C++, on retrouve la classe Compte définie comme suit :
class Compte
{ private :
int solde = 0 ;
public :
void deposer (int montant) ;
void retirer (int montant) ;
void virerVers (int montant, Compte destination) ;
void afficher ( ) ;
};
EXERCICE 4
Ecrire un programme en C++ permettant de définir une classe Rectangle et de tester toutes ses méthodes. La
classe Rectangle dont le constructeur prend deux paramètres largeur et hauteur, offre les fonctions de calcul de
périmètre, calcul de surface, affichage, ainsi que les accesseurs et les mutateurs triviaux (lecture et modification de la
largeur et de la hauteur). Pour l’affichage du rectangle, il suffit d’afficher à l’aide d’astérisques (*) le pourtour du
rectangle. Par exemple avec largeur = 6 et hauteur = 3, on affichera : ******
* *
******
Page 2 sur 9
EXERCICE 5
1/ On voudrait gérer les étudiants d’une institution à l’aide d’une classe Etudiant définie par :
Les attributs suivants : - nom : nom d’un étudiant - prenom : prénom d’un étudiant
- tabnotes : tableau contenant les notes d’un étudiant, sachant qu’un étudiant a au total 10 notes.
Les méthodes suivantes :
- void saisie ( ), permettant la saisie d’un étudiant - void affichage ( ), permettant l’affichage d’un étudiant
- float moyenne ( ), retourne comme résultat la moyenne des notes d’un étudiant
- int admis ( ), retourne comme résultat la valeur 1, si un étudiant est admis et la valeur 0, sinon. Un étudiant
est considéré comme étant admis lorsque la moyenne de ses notes est supérieure ou égale à 10.
- int exae_quo (Etudiant E), retourne comme résultat la valeur 1, si deux étudiants ont la même moyenne et
la valeur 0, sinon.
a) Ecrire la classe Etudiant dans le langage C++.
b) Définir également les différentes méthodes de cette classe.
2/ On voudrait maintenant représenter, à l’aide d’une nouvelle classe Etudiant_en_Maitrise, certains étudiants
particuliers dans cette institution qui sont les étudiants en dernière année d’études. Ces étudiants possèdent en effet
un attribut supplémentaire : note_memoire, qui représente la note de leur mémoire de fin d’études. Les méthodes à
associer à cette classe sont les suivantes :
- void saisie ( ), permettant la saisie d’un étudiant en maîtrise
- void affichage ( ), permettant l’affichage d’un étudiant en maîtrise
- float moyenne ( ), retourne comme résultat la moyenne des notes d’un étudiant en maîtrise
- int admis ( ), retourne comme résultat la valeur 1, si un étudiant est admis et la valeur 0, sinon. Un étudiant
en maîtrise est considéré comme étant admis lorsque, d’une part, la moyenne de ses notes est supérieure ou
égale à 10 et d’autre part la note obtenue pour son mémoire de fin d’études est supérieure ou égale à 10.
- int exae_quo (Etudiant_en_Maitrise E), retourne comme résultat la valeur 1, si deux étudiants ont d’une
part la même moyenne et d’autre part, la même note de mémoire et retourne la valeur 0, sinon.
a) Quelles sont les méthodes qui sont à redéfinir dans la classe Etudiant_en_Maitrise ?
b) Ecrire la classe Etudiant_en_Maitrise dans le langage C++.
c) Ecrire également les différentes méthodes de cette classe à redéfinir.
3/ Expliquer la ligne d’instruction suivante et proposer une autre façon d’obtenir le même résultat.
Heure = ( h >= 0 && h <= 23 ) ? h : 0 ;
EXERCICE 6
On définit la classe Horaire suivante :
class Horaire
{ private :
int heure ; // de 0 à 23
int minute ; // de 0 à 59
int seconde ; // de 0 à 59
public :
Horaire( ) ;
Horaire (int = 0, int = 0, int = 0);
void SetHoraire(int, int, int) ;
void SetHeure(int) ;
void SetMinute(int) ;
void SetSeconde(int) ;
int GetHeure( ) ;
int GetMinute( ) ;
int GetSeconde( ) ;
void AfficherMode12h( ) ;
void AfficherMode24h( ) ;
};
1) Ecrire chacune des méthodes définies dans la classe Horaire.
2) Ecrire une méthode bool Egal ( Horaire h ) qui retourne un booléen en cas d’égalité des heures, minutes et
secondes.
3) Ecrire une méthode Horaire HeureSuivante ( ) qui retourne l’heure qu’il fera 1 heure après.
Page 3 sur 9
EXERCICE 7
On voudrait écrire un programme qui permet de :
A-) Créer une classe de base nommée Vehicule. Un Vehicule possède trois membres protégés :
Annee_achat de type int ;
prix_achat et prix_courant de type double ;
et les méthodes publiques :
affiche( ) permet d’afficher les trois membres Annee_achat, prix_achat et prix_courant ;
calculePrix permet de calculer le membre prix_courant d’un Vehicule à l’aide de la formule :
prix_courant = ( 1.0 – ( 2021 – Annee_achat ) * 0.01 ) * prix_achat ;
Vehicule( int Annee, double prix ) qui joue le rôle de constructeur de la classe.
B-) Réaliser ensuite une classe nommée Camion dérivée publiquement de la classe Vehicule. Cette classe fille
comprend le membre protégé : Volume de type int ; et les méthodes publiques :
affiche( ) afin que l ’affichage donne également le membre Volume ;
calculePrix permet de calculer le membre prix_courant d’un Camion à l’aide de la formule :
prix_courant = ( 1 – ( 0.1 * Volume / 1000 ) ) * prix_achat ;
Camion( int Annee, double prix, int Vol ) B-) Réaliser ensuite une classe nommée Camion dérivée
publiquement de la classe Vehicule. Cette classe fille comprend le membre protégé : Volume de type int ; et les
méthodes publiques :
affiche( ) afin que l ’affichage donne également le membre Volume ;
calculePrix permet de calculer le membre prix_courant d’un Camion à l’aide de la formule :
prix_courant = ( 1 – ( 0.1 * Volume / 1000 ) ) * prix_achat ;
Camion( int Annee, double prix, int Vol ) qui joue le rôle de constructeur.
C-) De plus, définir une classe nommée Voiture dérivée publiquement de la classe mère Vehicule. Cette sous
classe contient trois membres protégés :
nombre_portes de type int ;
puissance et kilometrage de type double.
Elle va également redéfinir les méthodes suivantes :
affiche( ) afin que l ’affichage donne également les trois membres nombre_portes, puissance et
kilometrage ;
calculePrix permet de calculer le membre prix_courant d’une Voiture à l’aide de la formule :
prix_courant = ( 1 – [ ( 2021 – Annee_achat ) * 0.02 + 0.05 * kilometrage / 10000 ] ) * prix_achat ;
Voiture( int Annee, double prix, int portes, double cv, double km ) qui joue le rôle de constructeur.
D-) Enfin, écrire le programme principal qui permet d’appeler :
Un objet de type Vehicule
Deux objets de type Voiture
Trois objets de type Camion
Pour chaque objet, le programme principal va appliquer les méthodes affiche( ) et calculePrix( ).
EXERCICE 8
Ecrire un programme C++ qui permet de tester une classe modélisant l’heure (heures, minutes et secondes). La classe
sera appelée Time et devra déclarer tous ses attributs comme étant privés et toutes ses méthodes publiques suivantes :
Un constructeur avec des valeurs par défaut pour chacun des attributs
Un constructeur avec comme paramètre une chaine de caractères, qui contient l’heure sous la forme :
"hh:mm:ss" (exemples : "05:38:59" ou encore "23:07:09").
Un constructeur par copie
Des getters (un pour chacun des attributs)
Des setters (un pour chacun des attributs)
Une méthode afficheTime qui affiche l’heure sous la forme "hh:mm:ss" avec un 0 devant lorsque l’attribut
concerné est inférieur à 10.
Une fonction amie compare qui permet de comparer deux objets Time et de retourner un entier égal à -1 si le
premier objet en paramètre est le plus grand, 0 si les deux objets sont égaux et 1 si le second objet en paramètre
est le plus grand
Une méthode changeTime permettant d’incrémenter ou de décrémenter un objet en secondes (seul paramètre
de la méthode). L’opération doit gérer les cas de dépassement de valeurs pour l’un des attributs de l’objet.
Page 4 sur 9
Par exemple :
Exemple 1 : Time t(0,26,53) ; t.changeTime(50) ; // t deviendra 00:27:43
Exemple 2 : Time t(0,26,53) ; t.changeTime(-56) ; // t deviendra 00:25:57
Une méthode addTime permettant d’additionner deux objets et de ranger le résultat dans un troisième objet
(on fera aussi attention au dépassement de valeurs dans certains cas).
EXERCICE 9
Soit la classe abstraite Personne permettant de représenter un être humain suivant les caractéristiques suivantes : nom
(chaîne de caractères), prenom (chaîne de caractères), age (nombre entier). Cette classe doit aussi posséder les méthodes
suivantes :
Un constructeur permettant d’initialiser chacun des attributs de la classe
Un constructeur par copie
Un getter pour chaque attribut
Un setter pour chaque attribut
Une méthode afficher pour afficher toutes les informations d’une personne.
Soient Etudiant et Salarie deux classes qui héritent de la classe abstraite Personne.
La classe Etudiant possède un attribut matricule de type chaîne de caractères, ainsi que les méthodes suivantes :
Un constructeur permettant d’initialiser chacun des attributs de la classe
Un constructeur par copie
Un getter pour le matricule
Un setter pour le matricule
Une méthode afficher pour afficher toutes les informations d’une personne (redéfinition de la classe mère).
La classe Salarie possède un attribut salaire de type réel, ainsi que les méthodes suivantes :
Un constructeur permettant d’initialiser chacun des attributs de la classe
Un constructeur par copie
Un getter pour le salaire
Un setter pour le salaire
Une méthode afficher pour afficher toutes les informations d’une personne (redéfinition de la classe mère).
Réaliser un programme C++ permettant d’implémenter les trois classes définies précédemment, avec une fonction
principale main dans laquelle vous créerez des instances des classes Etudiant et Salarie et vous afficherez leurs
contenus.
TEST N° 1
40) Quelle ligne placer dans les … pour faire fonctionner ce programme ?
Page 8 sur 9
41) Quelle est la sortie du code suivant ?
#include <iostream>
using namespace std ;
class Cercle { A- Volume boite1 : 200
double rayon ;
public : B- Volume boite1 : 314.28
Cercle( double r ) : rayon( r ) { }
double aire( ) { return rayon*rayon*22/7 ; } C- Volume boite1 : 6285.71
};
class Cylindre { D- Autre réponse à préciser.
Cercle base ;
double hauteur ;
public :
Cylindre( double r, double h ) : base( r ), hauteur( h ) { }
double volume( ) { return base.aire( ) * hauteur ; }
};
int main( ) {
Cylindre boite1( 10 , 20 ) ;
cout<< “Volume boite1 : ”<<boite1.volume ( )” <<endl ;
return 0 ;
}
Page 9 sur 9