Vous êtes sur la page 1sur 24

Université de Tunis El Manar

Faculté des Sciences de Tunis

Cours P.O.O.

Programmation C++

x 10
4

Mohamed Anouar Ben Messaoud -2

0
0 0.5 1 1.5 2 2.5 3 3.5 4

2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
1/39 x 10
4
(a) 1
Plan

Exercices:

1- Rectangle

2- Chaîne

3- Point
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

4- Compteur 0

2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

5- Etudiant 0

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Rectangle
Ecrire un programme utilisant une classe rectangle dont le constructeur prend deux paramètres,
largeur et hauteur et qui offre les fonctions suivantes avec cpp
calcul du périmètre
calcul de la surface
affichage
ainsi que les accesseurs et mutateurs triviaux (lecture et modification de la largeur et de la
hauteur).

x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Chaîne
Définir une classe chaine permettant de créer et de manipuler une chaîne de caractères:
données:
- longueur de la chaine (entier)
- adresse d’une zône allouée dynamiquement (inutile d’y ranger la constante \0)

méthodes:
- constructeur chaine() initialise une chaîne vide
- constructeur chaine(char *) initialise avec la chaîne passée en argument

x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Point
un point est définit par ses coordonnées x et y (des membres privés)

• un constructeur (vous pouvez également implémenter les trois types de constructeur)

• une fonction membre déplace effectuant une translation définie par ses deux arguments dx
et dy (double)

• une fonction membre affiche se contentant d'afficher les coordonnées cartésiennes du point.

• une fonction membre saisir se contentant de saisir les coordonnées cartésiennes du point.

• une fonction membre distance effectuant calculant la distance entre deux point.
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
• une fonction membre milieu donnant le milieu d'un segment. -2

2
on écrira séparément: x 10
4
(c)
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

• un ficher source constituant la déclaration et la définition de la classe. 0

2
x 10 (b)
4
x 10
• un petit programme d'essai (main) gérant la classe point. 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2

2
x 10 (a)
4
Ex : Compteur
On souhaite implémenter une classe représentant un compteur entier. Un tel objet se caractérise
par :

• Une valeur entière, positive ou nulle, nulle à l'origine.

• Le fait qu'il ne peut varier que par pas de 1 (incrémentation ou décrémentation). On convient
qu'une décrémentation d'un compteur nul est sans effet.
Il s'agit de créer une classe Compteur pour rendre le service demandé. On écrira en outre un
petit programme de test qui :

1. créera un compteur et affichera sa valeur;


2. l'incrémentera 10 fois, puis affichera à nouveau sa valeur;
3. le décrémentera 20 fois, puis affichera une troisième fois sa valeur x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

• La sortie de ce programme doit donner (quelque chose comme) "0 10 0" 0

2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Etudiant
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
- prénom: 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. x 10
4

- int exae_quo (Etudiant E), retourne comme résultat la valeur 1, si deux étudiants ont -2
0 0.5
la1 même
1.5 2 2.5 3 3.5 4

moyenne et la valeur 0, sinon. 0

2
x 10 (c)
4
x 10
Ecrire la classe Etudiant dans le langage C++. 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Etudiant
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 0
étudiants
0.5 1 1.5 2 2.5 3 3.5
x 10
4
4
ont d’une part la même moyenne et d’autre part, la même note de mémoire et retourne la valeur
-2

0, sinon. 0

2
x 10 (c)
4
x 10
4

a) Quelles sont les méthodes qui sont à redéfinir dans la classe Etudiant_en_Maitrise
-2
0 0.5? 1 1.5 2 2.5 3 3.5 4

b) Ecrire la classe Etudiant_en_Maitrise dans le langage C++. 2


x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Correction Exercices

Correction Exercices:

1- Chaîne

2- Rectangle

3- Etudiant 2
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Chaîne
Définir une classe chaine permettant de créer et de manipuler une chaîne de caractères:
données:
- longueur de la chaine (entier)
- adresse d’une zône allouée dynamiquement (inutile d’y ranger la constante \0)

méthodes:
- constructeur chaine() initialise une chaîne vide
- constructeur chaine(char *) initialise avec la chaîne passée en argument

x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Chaîne
class chaine // Implémente une chaîne de caractère.
{
char * s; // Le pointeur sur la chaîne de caractère.
public:
chaine(void); // Le constructeur par défaut.
chaine(unsigned int); // Le constructeur avec argument
~chaine(void); // Le destructeur.
};

chaine::chaine(void)
{
s=NULL; // La chaîne est initialisée avec le pointeur nul.
return ;
}
//chaine s1; // Instancie une chaîne de caractères non initialisée.
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2
chaine::chaine(unsigned int Taille)
0
{s = new char[Taille+1]; // Alloue de la mémoire pour la chaîne.
2
s[0]='\0'; // Initialise la chaîne à "". x 10
4
(c)
x 10
return; 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2
}
0
chaine::~chaine(void)
2
{if (s!=NULL) delete s; // Restitue la mémoire utilisée si nécessaire. x 10
4
(b)
x 10
4

return;} -2
0 0.5 1 1.5 2 2.5 3 3.5 4

//chaine s2(200); // Instancie une chaîne de caractères de 200 caractères. 0

2
x 10 (a)
4
Ex : Rectangle
Ecrire un programme utilisant une classe rectangle dont le constructeur prend deux paramètres,
largeur et hauteur et qui offre les fonctions suivantes avec cpp
calcul du périmètre
calcul de la surface
affichage
ainsi que les accesseurs et mutateurs triviaux (lecture et modification de la largeur et de la
hauteur).

x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Rectangle
#include<iostream>
#include <cstdlib>
class Rectangle
{
public:
Rectangle(unsigned int initLargeur, unsigned int initHauteur);
~Rectangle();
unsigned int getLargeur() const { return largeur; };
unsigned int getHauteur() const { return hauteur; };
unsigned int perimetre() const { return 2*(largeur+hauteur); };
unsigned int surface() const { return largeur * hauteur; };
void setLargeur(unsigned int newLargeur) { largeur = newLargeur; };
void setHauteur(unsigned int newHauteur) { hauteur = newHauteur; };
void afficher();
private:
x 10
unsigned int largeur; 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2
unsigned int hauteur;
0
};
2
Rectangle::Rectangle(unsigned int initLargeur, unsigned int initHauteur) x 10
4
(c)
x 10
{ 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2
largeur = initLargeur;
0
hauteur = initHauteur;
2
} x 10
4
(b)
x 10
4

Rectangle::~Rectangle() -2
0 0.5 1 1.5 2 2.5 3 3.5 4

{} 0

2
x 10 (a)
4
Ex : Rectangle
void Rectangle::afficher()
{
for(unsigned int i=0; i < hauteur; i++)
{
for(unsigned int j=0; j < largeur; j++)
cout << "*";
cout << endl;
}
}

int main()
{
Rectangle monRectangle(0,0);
char choix = '0';
unsigned int value;
x 10
while(true) 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2
{ do
0
{ cout << " Rectangle - Menu" << endl;
2
cout << "1 - Modifier largeur du rectangle" << endl; x 10
4
(c)
x 10
cout << "2 - Modifier hauteur du rectangle" << endl; 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2
cout << "3 - Calculer les propriétés du rectangle" << endl;
0
cout << "4 - Afficher le rectangle" << endl;
2
cout << "5 - Quitter" << endl; x 10
4
(b)
x 10
4

cin >> choix; -2


0 0.5 1 1.5 2 2.5 3 3.5 4

}while(choix < '1' || choix > '5'); 0

2
x 10 (a)
4
Ex : Rectangle
switch(choix)
{ case '1':
cout << "Nouvelle largeur : ";
cin >> value;
monRectangle.setLargeur(value);
break;
case '2':
cout << "Nouvelle hauteur : ";
cin >> value;
monRectangle.setHauteur(value);
break;
case '3':
cout << "Périmètre : " << monRectangle.perimetre() << endl;
cout << "Surface : " << monRectangle.surface() << endl;
break;
x 10
case '4': 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2
monRectangle.afficher();
0
break;
2
case '5': x 10
4
(c)
x 10
exit(0); 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2
break;
0
default:
2
cout << "Erreur ! Choix invalide." << endl; x 10
4
(b)
x 10
4

exit(1); } } -2
0 0.5 1 1.5 2 2.5 3 3.5 4

return 2; } 0

2
x 10 (a)
4
Ex : Etudiant 2
Créer une classe Etudiant qui permet de gérer les notes.
Les attributs suivants :
• matricule: l’identifiant de l’étudiant (auto incrémenté)
• nom: nom d’un étudiant
• nbrNotes: le nombre de notes de l’étudiant
• *tabNotes: tableau contenant les notes d’un étudiant (allocation
dynamique).

Les méthodes suivantes :


• Un constructeur d’initialisation
• Un constructeur avec arguments -2
0 0.5 1 1.5 2 2.5 3 3.5
x 10
4
4

• Un destructeur ~Etudiant () 0

• Un constructeur de recopie Etudiant (const Etudiant &) 2


x 10
4
(c)
x 10
4

• Les getters et setters -2


0 0.5 1 1.5 2 2.5 3 3.5 4

• Les fonctions sont : saisie( ); affichage(); moyenne(); admis();


0

2
x 10
comparer() 4
(b)
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Etudiant 2
#include<iostream>
class Etudiant
{
int matricule;
string nom;
int nbrNotes;
float *tabNotes;
static int n; //nbre d’etudiants

x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Etudiant 2
//Constructeur sans argument
public: Etudiant :: Etudiant()
{
matricule=0;
nom="";
nbrNotes=0;
tabNotes=new float[nbrNotes];
}

//Constructeur avec argument


public: Etudiant(string nome,int nb) x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
{ -2

0
n++; 2
x 10 (c)
matricule=n; 4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2
nom=nome;
0

nbrNotes=nb; 2
x 10 (b)
4

tabNotes=new float[nbrNotes]; 0 0.5 1 1.5 2 2.5 3 3.5


x 10
4
4
-2
} 0

2
x 10 (a)
4
Ex : Etudiant 2
//Constructeur par recopie
Etudiant(const Etudiant & E)
{
matricule=E.matricule;
nom=E.nom;
nbrNotes=E.nbrNotes;
tabNotes=new float[nbrNotes];
for(int i=0;i<nbrNotes;i++)
{ tabNotes[i]=E.tabNotes[i]; }

//for(float p=tabNotes; p<tabNotes+nbrNotes; p++) x 10


4
0 0.5 1 1.5 2 2.5 3 3.5 4
//{ tabNotes[p] = E.*p]; } -2

0
} 2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2
// Destructeur
0

~Etudiant() 2
x 10 (b)
4

{ Delete [ ] tabNotes; } 0 0.5 1 1.5 2 2.5 3 3.5


x 10
4
4
-2

2
x 10 (a)
4
Ex : Etudiant 2
// Les getters
int getMatricule()
{ return matricule; }

string getNom()
{return nom; }

int getNbNotes()
{ return nbrNotes; }

// Les setters x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
void setNom(const string & n) -2

0
{ nom = n; } 2
x 10 (c)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2
void setNbNotes(int &nbnot)
0

{ nbrNotes = nbnot; } 2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Etudiant 2
// void saisie () : permettant la saisie des notes d’un étudiant
void saisie()
{ cout << "Saisie des notes : " << endl;
for(int i=0;i<nbrNotes;i++)
{ cout << "Donner la note " << i+1 << " : ";
cin>>tabNotes[i];
}
}
// void affichage () : permettant l’affichage des informations d’un étudiant
void affichage()
{
cout << "- Matricule : " << matricule << endl 0 0.5 1 1.5 2 2.5 3 3.5
x 10
4
4
-2
<< "- Nom : " << nom << endl 0

<< "- Nombre de notes : " << nbrNotes << endl 2


x 10
4
(c)
x 10
<< "- Notes : " << endl; 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2

for(int i=0;i<nbrNotes;i++) 0

{ cout << tabNotes[i] << "\t"; } 2


x 10
4
(b)
x 10
cout << endl; -2
0 0.5 1 1.5 2 2.5 3 3.5
4
4

} 0

2
x 10 (a)
4
Ex : Etudiant 2
// float moyenne () : retourne comme résultat la moyenne des notes de l’étudiant.
float moyenne()
{ float s=0;
for(int i=0;i<nbrNotes;i++)
s = s + tabNotes[i];
return s / nbrNotes;
}

// bool admis () : retourne comme résultat la valeur true, si un étudiant est admis et
la valeur false, sinon. Un étudiant est considéré comme étant admis lorsque la
moyenne de ses notes est supérieure ou égale à 10.
int admis()
x 10
4

{ return (moyenne()>=10); } -2
0 0.5 1 1.5 2 2.5 3 3.5 4

2
// bool comparer(): qui compare la moyenne des deux étudiants, retourne comme x 10
4
(c)
x 10
4

résultat la valeur true, si deux étudiants ont la même moyenne et la valeur false,
-2
0 0.5 1 1.5 2 2.5 3 3.5 4

sinon. 0

int comparer(Etudiant E) 2
x 10
4
(b)
x 10

{ return (moyenne()==E.moyenne()); }
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

}; 0

2
x 10 (a)
4
Ex : Etudiant 2
// Programme principal

//Intialisation du membre statique


int Etudiant::n = 0; 4

int main()
{ Etudiant E("etud1",3);
cout << "Creation d'un objet Etudiant E avec 3 notes" << endl;
E.saisie();
cout << "Affichage de l'etudiant E:" << endl;
E.affichage();
cout << endl;
cout << "Copie de l'etudiant E dans E1" << endl;
x 10
Etudiant E1(E); 0 0.5 1 1.5 2 2.5 3 3.5
4
4
-2
cout<<"L'affichage de l'etudiant E1:"<<endl; 0

E1.affichage(); 2
x 10 (c)
cout << endl; 4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (b)
4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4
Ex : Etudiant 2
Etudiant E2("etud2",2);
cout << "Creation d'un objet Etudiant E2 avec 2 notes" << endl;
E2.saisie();
cout << endl << "Appel des getters :" << endl;
cout<<"Le matricule de l'etudiant E2 : " << E2.getMatricule() << endl;
cout<<"Le nom de l'etudiant E2 : " << E2.getNom() << endl;
cout<<"Le nombre de notes de l'etudiant E2 : " << E2.getNbNotes() << endl;
cout << endl <<"La moyenne de l'etudiant E est : " << E.moyenne() << endl;

if(E.admis())
{ cout<<"l'etudiant E est admis "<<endl; }
else { cout<<"l'etudiant E n'est pas admis "<<endl; }
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2
if(E.comparer(E2)) { cout<<"Les Etudiants E et E2 ont la meme moyenne "<<endl; }
0
else 2
x 10 (c)
{ cout<<"Les Etudiants E et E2 n'ont pas la meme moyenne "<<endl; } 4
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

return 0; 0

2
} x 10
4
(b)
x 10
4
0 0.5 1 1.5 2 2.5 3 3.5 4
-2

2
x 10 (a)
4

Vous aimerez peut-être aussi