Université Mohammed Ier Année universitaire 2020/2021
Faculté des Sciences Filière SMA (Semestre 5)
Département d’Informatique. Module : POO : C++
Oujda - MAROC -
Correction Série TP N° 2
EXERCICE 1
Soit le modèle de structure suivant : struct essai { int n ;
float x ; } ;
Écrire une fonction nommée raz permettant de remettre à zéro les deux champs d’une
structure de ce type transmise en argument :
a. par adresse ;
b. par référence.
Dans les deux cas, on écrira un petit programme d’essai de la fonction ; il affichera les valeurs
d’une structure de ce type, après appel de ladite fonction.
Solution 1
a. Avec une transmission d’adresse
#include <iostream>
using namespace std ;
struct essai
{ int n ;
float x ;
};
void raz (struct essai * ads)
{ ads->n = 0 ; // ou encore (*ads).n = 0 ;
ads->x = 0.0 ; // ou encore (*ads).x = 0.0 ;
}
main()
{ struct essai s ;
raz (&s) ;
cout << "valeurs après raz : " << s.n << " " << s.x ;
}
b. Avec une transmission par référence
#include <iostream>
using namespace std ;
struct essai
{ int n ;
float x ;
1
};
void raz (struct essai & s)
{ s.n = 0 ;
s.x = 0.0 ;
}
main()
{ struct essai s ;
raz (s) ; // notez bien s et non &s !
cout << "valeurs après raz : " << s.n << " " << s.x ;
}
EXERCICE 2
Réaliser une classe point permettant de manipuler un point d’un plan. On prévoira
• un constructeur recevant en arguments les coordonnées (float) d’un point ;
• une fonction membre deplace effectuant une translation définie par ses deux arguments
(float) ;
• une fonction membre affiche se contentant d’afficher les coordonnées cartésiennes du point.
Les coordonnées du point seront des membres données privés. On écrira:
• la déclaration de la classe ;
• sa définition.
Écrire, par ailleurs, un petit programme d’essai (main) déclarant un point, l’affichant, le
déplaçant et l’affichant à nouveau.
Solution 2
#include <iostream>
using namespace std ;
class point
{
float x, y ; // coordonnées (cartésiennes) du point
public :
point (float, float) ; // constructeur
void deplace (float, float) ; // déplacement
void affiche () ; // affichage
};
point::point (float abs, float ord)
{ x = abs ; y = ord ;
}
void point::deplace (float dx, float dy)
{ x = x + dx ; y = + dy ;
}
void point::affiche ()
2
{ cout << "Mes coordonnées cartésiennes sont " << x << " et " << y << "\n" ;
}
main ()
{
point p (1.25, 2.5) ; // construction d'un point de coordonnées 1.25 et 2.5
p.affiche () ; // affichage de ce point
p.deplace (2.1, 3.4) ; // déplacement de ce point
p.affiche () ; // nouvel affichage
system("PAUSE");
}
EXERCICE 3
Réaliser une classe point, analogue à celle de l’exercice 2, mais ne comportant pas de
fonction affiche. Prévoir deux fonctions membres publiques (nommées abscisse et ordonnee)
fournissant en retour l’abscisse et l’ordonnée d’un point. Adapter le petit programme d’essai
précédent (de l'exercice 2) pour qu’il fonctionne avec cette nouvelle classe.
Solution 3
#include <iostream>
using namespace std ;
class point
{
float x, y ; // coordonnées (cartésiennes) du point
public :
point (float, float) ; // constructeur
void deplace (float, float) ; // déplacement
float abscisse () ; // abscisse du point
float ordonnee () ; // ordonnée du point
};
point::point (float abs, float ord)
{ x = abs ; y = ord ;
}
void point::deplace (float dx, float dy)
{ x = x + dx ; y = + dy ;
}
float point::abscisse ()
{ return x ;
}
float point::ordonnee ()
3
{ return y ;
}
main ()
{
point p (1.25, 2.5) ; // construction
// affichage
cout << "Coordonnées cartésiennes : " << p.abscisse () << " " << p.ordonnee () << "\n" ;
p.deplace (2.1, 3.4) ; // déplacement
// affichage
cout << "Coordonnées cartésiennes : " << p.abscisse () << " " << p.ordonnee () << "\n" ;
system("PAUSE");
}
EXERCICE 4
On définit une classe point, elle contient :
deux données de type double x et y
deux méthodes membres distance qui calcule la distance entre ce point et un autre
point et milieu qui calcule le milieu du segment composé de ce point et d’un autre
point.
Solution 4
#include <iostream>
using namespace std ;
class point
{
public :
double x, y ;
double distance (const point &P) ;
point milieu (const point &P) ;
};
double point :: distance (const point &P)
{ double dx , dy ;
dx = x – P.x ;
dy = y – P.y ;
return sqrt ( dx*dx + dy*dy) ;
}
point point :: milieu (const point &P)
{ point M ;
M.x = (P.x + x)/2 ;
M.y = (P.y + y)/2 ;
return M ;
}
4
main()
{ point A , B , C ;
double d ;
cout << " Saisie du point A : " <<endl ;
cout << "Tapez l’abscisse : " ; cin >> A.x ;
cout << "Tapez l’ordonnee : " ; cin >> A.y ;
cout <<endl ;
cout << " Saisie du point B : " <<endl ;
cout << "Tapez l’abscisse : " ; cin >> B.x ;
cout << "Tapez l’ordonnee : " ; cin >> B.y ;
C = A.milieu(B) ;
D = A.distance(B) ;
cout <<endl ;
cout << " Milieu de AB : " << endl ;
cout << " l’abscisse vaut : " << C.x << endl ;
cout << " l’ordonnee vaut : " << C.y << endl ;
cout << endl ;
cout << " La distance AB vaut : " << d << endl ;
system(« PAUSE ») ;
}