Você está na página 1de 9

Travaux pratiques C++

GL/S4 : Srie N : 3
Les Classes, Lhritage
DEVELOPPER LES EXERCICES SUIVANTS AVEC C++

EXERCICE 1:
Crer une classepersonnel comprenant 3 donnes membres (nom, position,
salaire),un constructeur initialisant les donnes membres et une fonction
affiche_personnelqui affiche les informations sur le personnel.
Crer une classe patrondrivantpubliquement de la classepersonnel et ayant
2donnes membres (bonus_annuel, marque de voiture de fonction), un
constructeurinitialisant les donnes membres et une fonction affiche_patron qui
affiche lesinformations sur le patron (entant que membre du personnel et patron).
Crer un programme permettant de tester ces classes.
EXERCICE 2 : Dfinition dune classe drive, droits daccs

On dispose de la classe suivante :


class Point {
public void initialise (int x, int y) { this.x = x ; this.y = y ; }
public void deplace (int dx, int dy) { x += dx ; y += dy ; }
public int getX() { return x ; }
public int getY() { return y ; }
private int x, y ;
}
a) Raliser une classe PointA, drive de Point disposant dune mthode
afficheaffichant (en fentre console) les coordonnes dun point. Ecrire un petit
programme utilisant les deux classes Point et PointA.
b) Que se passerait-il si la classe Point ne disposait pas des mthodes getX et getY ?
EXERCICE 3 : Dfinition dune classe drive, droits daccs
On dispose de la classe suivante (disposant cette fois dun constructeur) :
class Point
{ public Point (int x, int y) { this.x = x ; this.y = y ; }
public void affCoord()
{ System.out.println ("Coordonnees : " + x + " " + y) ;
}
private int x, y ;
}
Page 1

Raliser une classe PointNom, drive de Point permettant de manipuler des points
dfinispar leurs coordonnes (entires) et un nom (caractre). On y prvoira les
mthodessuivantes :
constructeur pour dfinir les coordonnes et le nom dun objet de type PointNom,
affCoordNom pour afficher les coordonnes et le nom dun objet de type PointNom.
crire un petit programme utilisant la classe PointNom.
EXERCICE 4: Redfinition
On dispose de la classe suivante :
class Point
{ public Point (int x, int y) { this.x = x ; this.y = y ; }
public void affiche()
{ System.out.println ("Coordonnees : " + x + " " + y) ;
}
private int x, y ;
}
Raliser une classe PointNom, drive de Point permettant de manipuler des points
dfinispar leurs coordonnes et un nom (caractre). On y prvoira les mthodes
suivantes :
constructeur pour dfinir les coordonnes et le nom dun objet de type PointNom,
affiche pour afficher les coordonnes et le nom dun objet de type PointNom
EXERCICE 5 : Hritage, polymorphisme
Crer une classe Etudiant ayant les mmes caractristiques qu'une Personne plus
une liste de matires suivies et un ensemble de notes. On doit pouvoir obtenir la liste
des matires, affecter une note, calculer la moyenne.
Crer une classe Enseignant ayant les mmes caractristiques qu'une Personne plus
une liste de matires enseignes, un nombre d'heures par matire et un tarif horaire.
On doit pouvoir obtenir les matires, faire un calcul du nombre d'heures total et
dterminer le cot de l'enseignant. Les fonctions membres de Etudiant et de
Enseignant doivent pouvoir manipulerdirectement les donnes de la classe Personne.
Modifier en consquence cette classe.
Crer un tableau d'Etudiant et un tableau d'Enseignant. Les initialiser. Crer
untableau de pointeurs de Personne et affecter selon votre choix ces personnes
soitun tudiant soit un enseignant. Afficher l'ensemble des caractristiques de
cespersonnes "polymorphes". Les dtruire.

Page 2

SOLUTIONS
EXERCICE 1 :
#include <iostream.h>
#include <string.h>
#include <conio.h>
class personnel{
char *nom;
char *position;
int salaire;
public:
personnel(char *nm, char *pos, int sal);
void affiche_personnel();
};
class patron:public personnel{
int bonus_annuel;
char* marque_voiture;
public :
patron(int b_a, char* m_v,char *nm, char *pos, int sal);
void affiche_patron();
};
personnel::personnel(char *nm, char *pos, int sal){
cout<<"constructeur"<<endl;
salaire=sal;
nom=nm;
position=pos;
}
void personnel::affiche_personnel(){
cout<<"Nom : "<<nom<<endl;
cout<<"Position : "<<position<<endl;
cout<<"Salaire : "<<salaire<<endl;
}
patron::patron(int b_a, char* m_v,char *nm, char *pos, int sal):personnel(nm, pos,sal)
{
bonus_annuel=b_a;
marque_voiture=m_v;
}
void patron::affiche_patron(){
affiche_personnel(); //pas oublier
cout<<"bonus annuel = "<<bonus_annuel<<endl;
cout<<"Marque de voiture = "<<marque_voiture<<endl;
}
int main(){
personnel b("gerald","gerant",1250);
patron a(500,"BMW","fallon","PDG",2000);
b.affiche_personnel();

Page 3

a.affiche_patron();
getch();
}

EXERCICE 2 :
#include <iostream.h>
#include <conio.h>
using namespace std ;
/* Dclaration de la classe point */
class Point{
/* dclaration des membres privs */
private:
int x ;
int y ;
/* dclaration des membres publics */
public :
void initialise (int, int) ;
void deplace (int, int) ;
void affiche () ;
};
//Dfinition des fonctions membres de la classe
void Point::initialise(int a, int b)
{int x = a; int y = b; }
void Point::deplace(int dx, int dy)
{ x += dx; y += dy; }
/* Dclaration et dfinition de la classe pointcol */
class pointA : public Point // pointcol drive de point
{
public:
void affiche() {
cout << "je suis en x = " << x << endl;
cout << "je suis en y = " << y << endl;
}
private:
int x ;
int y ;
};
main()
{
pointA p ;
p.initialise (3,10) ;
p.affiche () ;
p.deplace (20,14) ;
p.affiche () ;
getch();
}

EXERCICE 3 :
#include <iostream.h>
#include <conio.h>

Page 4

using namespace std ;


class TsPointN
{
private:
int x, y ;
public:
// Dclaration et dfinition des fonctions
void setPoint (int a, int b)
{x=a;y=b;}
void deplace (int dx, int dy) { x += dx ; y += dy ; }
void affCoord (){ cout<<"Coordonnees : " <<x <<" " <<y <<"\n" ;}
};
/* Dclaration et dfinition de la classe TsPointN */
class PointNom: public TsPointN
{
public:
void setPointNom (int x, int y, char nom)
{ setPoint (x, y) ;}
public:
void setNom(char nom)
{ nom = nom ;}
public:
void affCoordNom()
{ cout<<"Point de nom " <<nom <<" " ;
affCoord() ;
}
private:
char nom ;
};
main()
{
TsPointN p ;
p.setPoint (2, 5) ;
p.affCoord() ;
PointNom pn1;
pn1.setPointNom (1, 7, 'A') ; // methode de PointNom
pn1.affCoordNom() ; // methode de PointNom
pn1.deplace (9, 3) ; // methode de Point
pn1.affCoordNom() ; // methode de PointNom
PointNom pn2;
pn2.setPoint (4, 3) ; // methode de Point
pn2.setNom ('B') ; // methode de PointNom
pn2.affCoordNom() ; // methode de PointNom
pn2.affCoord() ; // methode de Point
getch();
}

EXERCICE 4 :
cette fois, les deux classes disposent dun constructeur.
Celui de la classe drive PointNom doit prendre en charge la construction de lintgralit de lobjet correspondant, quitte
sappuyer pour cela sur le constructeur de la classe de base (ce qui est indispensable ici puisque la classe Point ne dispose pas
de mthodes daccs).
Rappelons que lappel du constructeur de la classe de base (fait laide du mot cl super) doit constituer la premire instruction
du constructeur de la classe drive.

Page 5

En dfinitive, voici ce que pourrait tre la dfinition de notre classe PointNom :


#include <iostream.h>
#include <conio.h>
using namespace std ;
/* Dclaration de la classe point */
class Point
{ /* dclaration des membres privs */
private:
int x ;
int y ;
/* dclaration des membres publics */
public :
void setPoint (int, int) ;
char setNom(char nom);
void deplace (int, int) ;
void affCoord () { cout<<"Coordonnees : " << x << " " << y<<"\n" ; }
};
//Dfinition des fonctions membres de la classe
void Point::setPoint(int a, int b)
{x = a; y = b; }
void Point::deplace(int dx, int dy)
{ x += dx; y += dy; }
char Point::setNom(char nom)
{char n=nom; return n; }
/* Dclaration et dfinition de la classe pointcol */
class TsPointN : public Point // TsPointN drive de Point
{
public:
void setPointNom (int x, int y, char nom)
{ setPoint (x, y), setNom (nom);} //faitappel a deux fonctions
void affCoordNom()
{ cout<<"Point de nom "<<nom << " " ;
affCoord() ;
}
private:
char nom ;
};
main()
{
Point p;
p.setPoint (2, 5) ; // initialisation de a et b de classe Point
p.affCoord() ;
//affichage de a et b, methode de Point
cout<<"===================================="<<"\n";
TsPointN pn1;
pn1.setPointNom (1, 7, 'A') ; // methode de TsPointN
pn1.affCoordNom() ; // methode de TsPointN
pn1.deplace (9, 3) ; // methode de Point
pn1.affCoordNom() ; // methode de PointNom
TsPointN pn2;
pn2.setPoint (4, 3) ; // methode de Point
pn2.setNom ('B') ; // methode de PointNom

Page 6

pn2.affCoordNom() ; // methode de PointNom


pn2.affCoord() ; // methode de Point
getch();
}

EXERCICE 5 :
#include <iostream.h>
#include <string.h>
void menu_etudiant();
void menu_enseignant();
class personne {
char nom[20];
char prenom[20];
int age;
public:
personne(char n[20]="",char p[20]="",int a=0) {
strcpy(nom,n);
strcpy(prenom,p);
age=a;
}
void identification() {
cout<<"Entrez le nom de la personne : ";
cin>>nom;
cout<<"Entrez le prenom de la personne : ";
cin>>prenom;
cout<<"Entrez l'age de la personne : ";
cin>>age;
}
void affiche() {
cout<<"Nom : "<<nom<<endl;
cout<<"Prenom : "<<prenom<<endl;
cout<<"Age : "<<age<<endl;
}
};
class etudiant:personne {
char cours[5];
int *notes;
public:
etudiant(char n[20],char p[20],int a,char c[5],int *no):personne(n,p,a){
strcpy(cours,c);
notes=new int [5];
}
void affect_etudiant() {
personne::identification();
menu_etudiant();
for(int i=0;i<5;i++) {
cout<<"Quelle est la matiere ? ";
cin>>cours[i];
if(cours[i]=='x') break;
cout<<"Notes obtenues ? ";
cin>>notes[i];
}

Page 7

}
void affiche() {
float moy=0;
personne::affiche();
cout<<"Cours suivis et notes : "<<endl;
for(int i=0;i<5;i++) {
if(cours[i]=='p')
cout<<"Programmation"<<" "<<notes[i]<<endl;
if(cours[i]=='e') cout<<"Elearning"<<" "<<notes[i]<<endl;
if(cours[i]=='r') cout<<"Reseau"<<" "<<notes[i]<<endl;
if(cours[i]=='t')
cout<<"Technologie des composants electroniques"<<" "<<notes[i]<<endl;
if(cours[i]=='x') break;
moy=moy+notes[i];
}
cout<<"Moyenne de l'etudiant : "<<moy/4<<endl;
}
};
class enseignant:public personne {
char matieres[5];
int *nbre_heure;
int tarif_horraire;
public:
enseignant(char n[20],char p[20],int a,char mat[5],int *heures,int
tarif):personne(n,p,a) {
strcpy(matieres,mat);
nbre_heure=new int [5];
tarif_horraire=tarif;
}
void affect_enseignant() {
personne::identification();
menu_enseignant();
for(int i=0;i<5;i++) {
cout<<"Une matiere enseignee : ";
cin>>matieres[i];
if(matieres[i]=='x') break;
cout<<"Nombre d'heures pour ce cours : ";
cin>>nbre_heure[i];
}
cout<<"Tarif horraire de cet enseignant : ";
cin>>tarif_horraire;
}
void affiche() {
int total_heure=0,total_salaire=0;
personne::affiche();
cout<<"Cours donnes et nombre d'heures : "<<endl;
for(int i=0;i<5;i++) {
if(matieres[i]=='p') cout<<"Programmation"<<""<<nbre_heure[i]<<endl;
if(matieres[i]=='e') cout<<"elearning"<<""<<nbre_heure[i]<<endl;
if(matieres[i]=='r') cout<<"Reseau"<<""<<nbre_heure[i]<<endl;
if(matieres[i]=='t') cout<<"Technologie des composants electroniques"<<" "<<nbre_heure[i]<<endl;
if(matieres[i]=='m') cout<<"Laboratoire de micro controlleur"<<" "<<nbre_heure[i]<<endl;
if(matieres[i]=='o') cout<<"Micro ordinateur"<<" "<<nbre_heure[i]<<endl;
if(matieres[i]=='x') break;
total_heure=total_heure+nbre_heure[i];
}

Page 8

total_salaire = total_heure * tarif_horraire;


cout<<"Nombre d'heures donnees par l'enseignant :"<<total_heure<<endl;
cout<<"Salaire de l'enseignant : "<<total_salaire<<endl;
}
};
int main() {
cout<<"Etudiant : "<<endl;
etudiant etu1("Touijrat","Abdel",29,"pe",0);
etu1.affect_etudiant();
etu1.etudiant::affiche();
cout<<"Enseignant : "<<endl;
enseignant ens1("Dedecker","Jeff",45,"e",0,13);
ens1.affect_enseignant();
ens1.enseignant::affiche();
}
void menu_etudiant() {
cout<<"Entrez 'p' pour programmation"<<endl;
cout<<"Entrez 'e' pour elearning"<<endl;
cout<<"Entrez 't' pour base dd"<<endl;
cout<<"Entrez 'r' pour reseau"<<endl;
cout<<"Pour arreter, tappez x"<<endl;
}
void menu_enseignant() {
cout<<"Entrez 'p' pour programmation"<<endl;
cout<<"Entrez 'e' pour elearning"<<endl;
cout<<"Entrez 'b' pour base dd"<<endl;
cout<<"Entrez 'r' pour reseau"<<endl;
cout<<"Entrez 'm' pour laboratoire de microcontrolleur"<<endl;
cout<<"Entrez 'o' pour micro ordinateur"<<endl;
cout<<"Pour arreter, tappez x"<<endl;
}

Page 9

Você também pode gostar