L’héritage en programmation C++

Exercice 1 :
Créer une classe personnel comprenant 3 données membres (nom, position, salaire),
un constructeur initialisant les données membres et une fonction affiche_personnel
qui affiche les informations sur le personnel.
Créer une classe patron dérivant publiquement de la classe personnel et ayant 2
données membres (bonus_annuel, marque de voiture de fonction) , un constructeur
initialisant les données membres et une fonction affiche_patron qui affiche les
informations sur le patron (entant que membre du personnel et patron).
Créer un programme permettant de tester ces classes.
Solution:
#include <iostream.h>
#include <string.h>
class personnel{
char *nom;
char *position;
int salaire;
public:
personnel(char *nm, char *pos, int sal);
void affiche_personnel();
};
class patron:public personnel{/*class sousClasse: droit superClasse{};*/
int bonus_annuel;
char* marque_voiture;
public :
//constructeur
//sousClasse(liste des paramètres (avec ceux de la super classe); //déclaration
//sousClasse::sousClasse(liste de paramètres) : superClasse(paramètres pour
superClasse){} //définition
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;
}
void main(){
personnel b("gerald","gérant",1250);
patron a(500,"BMW","fallon","PDG",2000);
b.affiche_personnel();
a.affiche_patron();
}

Exercice 2 :
a) Modifier les classes définies dans l’exercice 1 en utilisant la fonction affiche dans
la classe de base et la classe dérivée.
Modifier le programme pour tester les modifications.
b) Créer dans le programme principal un pointeur sur la classe personnel et un objet
de la classe patron. Le pointeur sur la classe de base contient l’adresse de la classe
dérivée. Appeler la fonction affiche en utilisant le pointeur sur la classe de base (il
faut qu’elle affiche les informations sur la classe dérivée).
Solution:
#include <iostream.h>
#include <string.h>
class personnel{
char *nom;
char *position;
int salaire;
public:
personnel(char *nm, char *pos, int sal);
void affiche();
};
class patron:public personnel{/*class sousClasse: droit superClasse{};*/
int bonus_annuel;
char* marque_voiture;
public :
//constructeur
//sousClasse(liste des paramètres (avec ceux de la super classe); //déclaration
//sousClasse::sousClasse(liste de paramètres) : superClasse(paramètres pour
superClasse){} //définition
patron(int b_a, char* m_v,char *nm, char *pos, int sal);
void affiche();
};
personnel::personnel(char *nm, char *pos, int sal){
cout<<"constructeur"<<endl;
salaire=sal;
nom=nm;
position=pos;
}
void personnel::affiche(){
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(){
//cout<<"Nom : "<<nom<<endl;
//cout<<"Position : "<<position<<endl;
//cout<<"Salaire : "<<salaire<<endl;
personnel::affiche();
// si on ne veut pas utiliser la résolution de portée
//on mets nos données en mode protected
cout<<"bonus annuel = "<<bonus_annuel<<endl;
cout<<"Marque de voiture = "<<marque_voiture<<endl;
}
void main(){
/*
personnel b("gerald","gérant",1250);
patron a(500,"BMW","fallon","PDG",2000);
b.affiche();
a.affiche();
*/
personnel *pe=new personnel("Fallon","PDG",2000);
peà affiche();
patron *pa=new patron(500,"PORSCHE","Toujirat","HautPDG",2250);
paàaffiche();
}
Exercice 3 :
Créer une classe animal, puis des classes dérivées à poils et à plumes où vous dérivez
les particularités respectives de chaque animal. Dans la classe de base, implémentez
sous forme de méthodes virtuelles les fonctions qui concernent l’animal en général
mais s’appliquent différemment selon le type d’animal.
Solution:
#include <iostream.h>
#include <string.h>
class animal{
protected:
char nom[20];
public:
animal(char n[20]="");
virtual void manger();
};
class poils:public animal{
int pattes;
public:
poils(int pt=0,char n[20]="");
void manger();
};
class plumes:public animal{
int pattes;
public:
plumes(int pt=0, char n[20]="");
void manger();
};
animal::animal(char n[20]){
strcpy(nom,n);
}
void animal::manger(){
cout<<" l'animal suivant : "<<nom<<" a besoin de manger pour
survivre"<<endl;
}
poils::poils(int pt,char n[20]):animal(n){
pattes=pt;
}
void poils::manger(){
cout<<"l'animal suivant : "<<nom<<" est carnivore"<<endl;
}
plumes ::plumes(int pt,char n[20]):animal(n){
pattes=pt;
}
void plumes::manger(){
cout<<"l'animal suivant :"<<nom<<" n'est pas carnivore et aime les
graines"<<endl;
}
void main(){
animal p("tortue");
p.manger();
poils q(4,"chat");
q.manger();
plumes s(2,"pigeon");
s.manger();
animal *r;
r=&s;
r->manger();
}

Exercice 4 :
Créer une classe nombre formée d’une unique variable entière et d’une méthode
affiche_nombre, puis définir 3 classes dérivées afin d’afficher la variable aux formats
hexadécimal, octal et décimal à l’aide d’une méthode affiche_nombre.
Solution:
#include <iostream.h>
class nombre{
protected:
int entier;
public:
nombre(int ent);
virtual void affiche_nombre();
};
class hexa:public nombre{
public:
hexa(int ent);
void affiche_nombre();
};
class octal:nombre{
public:
octal(int ent);
void affiche_nombre();
};
class decimal:nombre{
public:
decimal(int ent);
void affiche_nombre();
};
nombre::nombre(int ent){
entier=ent;
}
void nombre::affiche_nombre(){
cout<<"voici le nombre : "<<entier<<endl;
}
hexa::hexa(int ent):nombre(ent){}
void hexa::affiche_nombre(){
cout <<" le nombre en hexa est de : "<<hex<<entier<<endl;
}
octal::octal(int ent):nombre(ent){}
void octal::affiche_nombre(){
cout <<" le nombre en octal est de : "<<oct<<entier<<endl;
}
decimal::decimal(int ent):nombre(ent){}
void decimal::affiche_nombre(){
cout <<" le nombre en décimal est de : "<<dec<<entier<<endl;
}
void main(){
nombre a(12);
a.affiche_nombre();
decimal b(12);
b.affiche_nombre();
octal c(12);
c.affiche_nombre();
hexa d(12);
d.affiche_nombre();
}

Exercice 5 :
a) Créer une classe Date ayant 3 paramètres jour, mois, année.
Elle contient un constructeur initialisant les données membres.
Elle contient les fonctions getDay(), getMonth(), getYear(), setDay(), setMonth(),
setYear() et DateToString()
Le constructeur attend en paramètre l'année, le mois puis le numéro de jour et les affecte dans l'espace de données privé de l'objet.
Les méthodes accesseurs permettent respectivement de récupérer le jour, le mois ou l'année sous forme d'un entier (méthodes getxxx) et de changer ces mêmes propriétés (méthodes setxxx). La méthode DateToString retourne une chaîne de caractères représentant la date de l'objet sur lequel a été invoquée cette méthode au format américain.
b) Nous voyons que le constructeur et la méthode DateToString travaillent sur le format américain. Comme cette classe est intégrée dans les librairies d'un environnement de développement, il n'est pas possible de la modifier. Quelle technique nous offre la programmation orientée objet pour pouvoir gérer nos dates au format français tout en utilisant cette classe existante qui offre en outre un ensemble d'autres services ? Ecrire le code correspondant pour gérer un constructeur et une méthode retournant une chaîne au format français.
Solution:
#include <iostream.h>
#include <string>
#include <stdlib.h>
using namespace std;
class date{
protected:
int jour;
int mois;
int annee;
public:
date(int jr=0, int ms=0, int an=0);
void getday();
void getmonth();
void getyear();
void setday();
void setmonth();
void setyear();
virtual string datetostring();
};
class datefr:public date{
public:
datefr(int jr=0, int ms=0, int an=0);
string datetostring();
};
datefr::datefr(int jr, int ms, int an):date(jr,ms,an){}
string datefr::datetostring(){
char tab1[60]="";
char tab2[20]="";
char tab3[20]="";
cout<<"date en version europeenne"<<endl;
itoa(jour,tab1,10);
itoa(mois,tab2,10);
itoa(annee,tab3,10);
strcat(tab1,tab2);
//cout<<tab1<<endl;
strcat(tab1,tab3);
//cout<<tab1<<endl;
return tab1;
}
date::date(int jr, int ms, int an){
jour=jr;
mois=ms;
annee=an;
}
void date::getday(){
cout<<"Jour :"<<jour;
}
void date::getmonth(){
cout<<"Mois :"<<mois;
}
void date::getyear(){
cout<<"Annee :"<<annee<<endl;
}
void date::setday(){
cout<<"Entrer le jour"<<endl;
cin>>jour;
}
void date::setmonth(){
cout<<"Entrer le mois"<<endl;
cin>>mois;
}
void date::setyear(){
cout<<"Entrer l' annee"<<endl;
cin>>annee;
}
string date::datetostring(){
char tab1[60]="";
char tab2[20]="";
char tab3[20]="";
itoa(annee,tab1,10);
itoa(mois,tab2,10);
itoa(jour,tab3,10);
strcat(tab1,tab2);
//cout<<tab1<<endl;
strcat(tab1,tab3);
//cout<<tab1<<endl;
return tab1;
}
void main(){
date a;
a.setday();
a.setmonth();
a.setyear();
a.getday();
a.getmonth();
a.getyear();
string tab= a.datetostring();
for(int i=0;i<20;i++)
cout<<tab[i];
cout<<endl;
datefr b(22,9,81);
string tab1=b.datetostring();
for(int j=0;j<20;j++)
cout<<tab1[j];
cout<<endl;
}

Exercice 6 :
Créer une classe Etudiant ayant les mêmes caractéristiques qu'une Personne plus une liste de matières suivies et un ensemble de notes. On doit pouvoir obtenir la liste des matières, affecter une note, calculer la moyenne.
Créer une classe Enseignant ayant les mêmes caractéristiques qu'une Personne plus une liste de matières enseignées, un nombre d'heures par matière et un tarif horaire. On doit pouvoir obtenir les matières, faire un calcul du nombre d'heures total et déterminer le coût de l'enseignant. Les fonctions membres de Etudiant et de Enseignant doivent pouvoir manipuler
directement les données de la classe Personne. Modifier en conséquence cette classe.
Créer un tableau d'Etudiant et un tableau d'Enseignant. Les initialiser. Créer un
tableau de pointeurs de Personne et affecter selon votre choix à ces personnes soit
un étudiant soit un enseignant. Afficher l'ensemble des caractéristiques de ces
personnes "polymorphées". Les détruire.

Solution:
#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];
}
}
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<<"Electronique"<<" "<<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<<"Electronique"<<"
"<<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];
}
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;
}
};
void 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 electronique"<<endl;
cout<<"Entrez 't' pour tce"<<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 electronique"<<endl;
cout<<"Entrez 't' pour tce"<<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;
}
Suivant
« Précédent
Précédent
Suivant »

ConversionConversion EmoticonEmoticon

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.