• Aucun résultat trouvé

Université de Nice-Sophia Antipolis POLYTECH

N/A
N/A
Protected

Academic year: 2022

Partager "Université de Nice-Sophia Antipolis POLYTECH"

Copied!
2
0
0

Texte intégral

(1)

Université de Nice-Sophia Antipolis POLYTECH

ELEC4 2020–2021

Examen de Programmation C++

Durée : 1h

Aucun document autorisé

Mobiles interdits Nom : Prénom :

On souhaite représenter des triangles dans le plan cartésien. Pour cela, on souhaite d’abord définir la classePointsuivante :

c l a s s Point { p r i v a t e:

double x, y;

p u b l i c:

Point (c o n s t double a=0, c o n s t double b=0) : x(a), y(b) {}

double getX () c o n s t; double getY () c o n s t; void setX (c o n s t double x);

void setY (c o n s t double y);

double distance (c o n s t Point &p) c o n s t; bool Point :: egal (c o n s t Point &p) c o n s t; std :: string toString ();

f r i e n d std :: ostream &operator<<( std :: ostream &f, c o n s t Point &p);

};

I1. Écrivez les méthodesdistance,egaletoperator<<comme elles doivent être écrites dans le fichierPoint.cpp.

Programmation des méthodes dans le fichier Point.cpp /*

* Rôle : renvoie la distance entre

* le Point courant et le Point p

double*/ Point :: distance (c o n s t Point &p) c o n s t { double dx = p. getX ()-t h i s-> getX ();

double dy = p. getY ()-t h i s-> getY ();

r e t u r n sqrt (dx*dx+dy*dy );

} /*

* Rôle : teste si le Point courant et le Point p

* sont égaux à un epsilon près .

*/bool Point :: egal (c o n s t Point &p) c o n s t { c o n s t double eps = 1e -10; // précission des calculs r e t u r n fabs (t h i s-> getX ()-p. getX ()) < eps &&

fabs (t h i s-> getY ()-p. getY ()) < eps;

1

} /*

* Rôle : renvoie la représentation sous forme de std: string

* du Point courant

std :: string Point :: toString ()*/ c o n s t { r e t u r n "(" + std :: to_string (t h i s-> getX ())

+ "," + std :: to_string (t h i s-> getY ()) + ")";

} /*

* Rôle : surcharge de l’opérateur << pour écrire le Point p

* sur l’ostream f

*/

std :: ostream & operator<< (std :: ostream & f, c o n s t Point &p) { r e t u r n f << p. toString ();

}

. . . . I 2. On veut maintenant définir la classeTriangle. Écrivez cette classe qui com-

porte :

— les 3 sommets du triangle sous forme d’un tableau de3 pointeurssur Point;

— un constructeur qui prend en paramètres 3 pointeurs surPoint. Vous vérifierez que les 3 sommets sont distincts ;

— une méthode qui renvoie le périmètre du triangle ;

— la surcharge de l’opérateur<<. Vous programmerez les méthodes demandées.

Déclaration de la classeTriangledans le le fichier Triangle.hpp.

c l a s s Triangle { p r i v a t e:

Point ** sommets ; p u b l i c:

// le constructeur

Triangle ( Point *a, Point *b, Point *c) : sommets (new Point *[3]) { assert (!a-> egal (*b) && !a-> egal (*c) && !b-> egal (*c));

// dupliquer les Points.

// Note : le constructeur de copie (par défaut) de Point // est appliqué

sommets [0] = new Point (*a);

sommets [1] = new Point (*b);

sommets [2] = new Point (*c);

}

2

(2)

double perimetre () c o n s t; std :: string toString () c o n s t;

f r i e n d std :: ostream &operator<<( std :: ostream &f, c o n s t Triangle &t);

};

Programmation des méthodes dans le fichier Triangle.cpp /*

* Rôle : renvoie le périmètre du triagle courant

*/

double Triangle :: perimetre () c o n s t {

r e t u r n t h i s-> sommets [0]-> distance (* sommets [1]) + t h i s-> sommets [1]-> distance (* sommets [2]) + t h i s-> sommets [2]-> distance (* sommets [0]);

} /*

* Rôle : renvoie la représentation sous forme de std: string

* du Triangle courant

*/

std :: string Triangle :: toString () c o n s t { r e t u r n "[" +

t h i s-> sommets [0]-> toString () + "," + t h i s-> sommets [1]-> toString () + "," + t h i s-> sommets [2]-> toString () +

"]";

}/*

* Rôle : surcharge de l’opérateur << pour écrire le Triangle t

* sur l’ostream f

*/

std :: ostream & operator<<( std :: ostream &f, c o n s t Triangle &t) { r e t u r n f << t. toString ();

}

. . . . I3. Est-ce qu’il est nécessaire d’écrire un destructeur et un constructeur de copie

pour la classeTriangle? Si oui, expliquez pourquoi et programmez-les.

Il est nécessaire d’écrire un destructeur pour libérer explicitement la mémoire occupée par le tableau et les 3 points du triangle alloués dynamiquement. De même, le constructeur de copie est nécessaire pour la copie de même tableau et ces mêmes points.

// constructeur de copie

Triangle (c o n s t Triangle &t) { // allouer le tableau sommets

t h i s-> sommets = new Point *[3];

// dupliquer les 3 sommets f o r (i n t i=0; i <3; i++)

3

t h i s-> sommets [i] =

new Point (t. sommets [i]-> getX (), t. sommets [i]-> getY ());

// destructeur}

~ Triangle () {

// désallouer les 3 sommets

f o r (i n t i=0; i <3; i++) d e l e t e t h i s-> sommets [i];

// désallouer le tableau d e l e t e [] t h i s-> sommets ; }

. . . . I 4. Écrivez la fonctionmainqui :

— déclare un triangletformé des 3 points (1,1), (2,2) et (0,2) ;

— écrit sur la sortie standard le triangle et son périmètre ; L’exécution de cette fonctionmainpourra produire :

t = [(1.000000,1.000000),(2.000000,2.000000),(0.000000,2.000000)]

périmètre de t : 4.82843

#i n c l u d e <cstdlib >

#i n c l u d e <iostream >

#i n c l u d e " Triangle .hpp"

i n t main () {

Triangle t = Triangle (new Point (1 ,1) , new Point (2 ,2) , new Point (0 ,2));

std :: cout << "t = " << t << std :: endl ;

std :: cout << " périmètre de t : " << t. perimetre () << std :: endl ; r e t u r n EXIT_SUCCESS ;

}

. . . .

4

Références

Documents relatifs

Avec la notation de pointeur, écrivez en C la fonction somme qui prend en paramètre une chaîne de caractères qui représente un entier naturel et qui renvoie la somme de ses

Écrivez de façon itérative la fonction itos qui renvoie la conversion d’un entier positif ou nul passé en paramètre, en sa représentation sous forme d’une chaîne de

Écrivez un programme qui lit sur l’entrée standard une opération arithmétique formée de 2 entiers et d’un caractère ( ’+’ , ’-’ , ’*’ ou ’/’ ) et qui écrit sur

Écrivez la fonction creerFichDates qui lit un fichier de texte contenant la suites d’entiers, et qui crée un fichier de dates valides (de type Date ).. Sans l’écrire, vous

Lors d’un appel de fonction ou de procédure, la transmission par valeur consiste à affecter, après évaluation, la valeur du pa- ramètre effectif à son paramètre formel

Au lieu de retirer, à chaque itération, 1 diviseur au dividende et d’incrémenter de 1 le quotient, le diviseur est multiplié successivement par 2 pour trouver son plus grand

qui prend en paramètre une chaîne de caractères, et qui remplace chaque chiffre par le caractère ’_’ dans celle-ci.. La fonction renvoie un pointeur sur le 1er caractère de

En utilisant, la classe std::ifstream et ses méthodes is_open , get , eof et close , écrivez la classe FileInputStream qui permet de lire un fichier d’octets (et uniquement