Académique Documents
Professionnel Documents
Culture Documents
GSEII-1
ENSAF 2023/2024
Exercice 1 :
Exercice 2 :
1) Définir la classe Point qui possède les variables x et y de type float et les méthodes
suivantes :
Un constructeur qui initialise x et y et qui possède les valeurs 0.f,0.f, par défaut.
Une méthode affiche() qui imprime les valeurs x et y.
Les accesseurs de x et de y, getX, setX, getY, setY.
2) Ecrire un programme Test qui instancie un point P1 avec les valeurs définies par
défaut, un point P2 (1.f,2.f) et qui affiche ces points.
Modifier les valeurs de P1 et de P2 par (3.f,4.f) et (5.f,6.f) et afficher de nouveau les
deux points.
3) Définir une variable PP1 de type Point * et l’initialiser avec l’opérateur new qui
prend comme argument le Point(10.f,20.f) , afficher ce point défini dynamiquement.
4) Se définir un tableau Ptab de points de dimension 5. Dans une boucle où x varie de
0.f à 1. et y de 1.f à 0.f , par pas de 0.25, initialiser les variables x et y des points du
tableau PTab.
5) Libérer la mémoire occupée par PP1 et par Ptab.
6) Créer un tableau de Point * dynamiquement, de dimension 2 et initialiser ce tableau
et chaque sous-tableau (selon votre imagination) de dimension 3.
Compléments de cours :
Le qualificatif const associé à une méthode.
Une méthode ne s’applique pas par défaut à un objet déclaré const.
Par exemple :
const Point P(1.f,2.f) ; // P déclaré constant.
L’appel P.affiche() implique une erreur de compilation.
Pour autoriser une méthode à s’appliquer à un objet constant, il faut dans son prototype et sa
définition utiliser le qualificatif const :
void affiche () const ; // Prototype défini dans Point.hxx
void Point ::affiche() const
{
….
}
Cette double déclaration peut sembler redondante mais elle est indispensable.
Exercice 4 :
Problématique des objets dynamiques, attributs d’une classe.
Définir la classe Vecteur qui possède les attributs suivants :
⚫ int N ( Dimension du vecteur)
⚫ float * Coor ( Composantes du vecteur )
Ecrire le constructeur usuel qui admet un entier (valeur par défaut 0) et un tableau de
float (float *, valeur par défaut NULL) comme arguments et le destructeur
correspondant.
Surdéfinir le constructeur par recopie.
Tester la classe Vecteur dans un programme Test qui instancie un vecteur V1 avec
toutes les valeurs par défauts, un vecteur V2 dont la dimension vaut 5 et les
composantes sont égales à zéro.
Vérifier que l’instruction Vecteur V3 = V2 implique l’appel au constructeur par
recopie.
Exercice 5 :
La classe Matrice.
Définir la classe Matrice qui possède les attributs suivants :
⚫ int N // Rang de la matrice carrée NxN
⚫ double * Coef // Tableau unidimensionnel de dimension NxN
⚫ double ** M // Tableau de pointeurs, double , tel que: M[i] = &Coef[i*N]
pour i = 0, N-1
Ecrire comme précédemment, le contructeur usuel, le destructeur, le constructeur par
recopie et surdéfinr l'opérateur d'affectation et l'opérateur [].
La classe prédéfinie en C++ qui gère les flots de sortie est la classe ostream.
De façon à pouvoir écrire cout << V1, on va surdéfinir l’opérateur << de la manière
suivante :
en-tête:
#include <iostream>
using namespace std;
ostream & operator << (ostream & sortie , const Vecteur & V)
{
for ( int i= 0 ; i < V.N ; i++)
sortie << V[I] ;
sortie << endl;
}
La classe prédéfinie en C++ qui gère les flots d’entrée est la classe istream.
De façon à pouvoir écrire le vecteur V1 à partir du terminal, on va surdéfinir l’opérateur
>> de la manière suivante :
istream & operator >> ( istream & entree , const Vecteur & V)
{
for ( int i= 0 ; i < V.N ; i++)
entree >> V[I];
}
Les opérateurs << et >> sont des fonctions indépendantes, déclarées amies de la classe
Vecteur.
Enfin écrire l’opérateur +, addition de 2 vecteurs.
Chaque attribut d’une classe est propre à un objet de cette classe. Cependant il est possible
de définir des variables communes à tous les objets de la classe avec le qualificatif static.
static int Count ;
Cette variable particulière sera initialisée dans le fichier .cpp, de la manière suivante :
int Vecteur::Count = 0 ;
A chaque construction d’objet de la classe Vecteur, cette variable sera incrémentée de 1, à
chaque destruction décrémentée de 1. Ainsi on peut compter le nombre d’instances d’une
classe.
De même, des fonctions membres de la classe peuvent être déclarées statiques et donc être
indépendantes d’un quelconque objet de la classe. Ces fonctions ne concerneront que des
données déclarées statiques.
Exemple la fonction qui retourne le nombre d’instances au moment de son appel.
static int NombreObjets() ;
int Vecteur::NombreObjets()
{
return Count ;
}
Cette fonction peut être appelée de la manière suivante :
cout << “nombre d’objets de la classe Vecteur : “ << Vecteur::NombreObjets() << endl ;
Donc peut être appeler indépendamment de l’existence d’un quelconque objet de la classe.
Les prototypes
déclarent des fonctions d'opérateur de cast surchargées qui peuvent convertir un objet de type
défini par l'utilisateur, ici MyClass, en un entier (i) ou en un objet de type défini par
l'utilisateur, ici OtherClass (ii), respectivement.
Exercice 6 :