Test de rattrapage de C++ n° 1
(Jeudi 16 mars 2000 - durée : 2h)

© D. Mathieu     mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique
Créé le 18/03/2000 - Dernière mise à jour : 22/03/2000

Tout document autorisé

    Sujet : L’objectif de ces exercices est de développer une classe CHistogramme. Il s'agit de comptabiliser des entiers naturels (>= 0) qui appartiennent à la même classe d'équivalence. On appellera "étendue de la classe" le nombre N de valeurs entières différentes d'une même classe. On posera que les entiers 0 à N-1 inclus appartiennent à la première classe (classe 0), que les entiers N à 2N-1  inclus appartiennent à la deuxième classe (classe 1), etc... On peut par exemple faire l'histogramme des notes (entières) de test en prenant une étendue de classe de 2. Le nombre de notes égales à 0 ou à 1 est comptabilisé dans la première classe (classe 0), le nombre de notes égales à 2 ou à 3 est comptabilisé dans la deuxième classe (classe 1), etc... Le nombre de notes comptabilisées dans une classe i est l'effectif de cette classe.

Sommaire

Classe CVEffectifs
Classe CHistogramme
Fonction Ajouter()
Fonction Supprimer()
Opérateur <<
Opérateur =
Opérateur +
Opérateur +
Exceptions

Remarque préliminaire : par souci de simplification, tout le code sera écrit dans le même fichier, CHistogr.h, supposé pouvoir être inclus dans d'autres fichiers (pas de .hxx, pas de .cxx). Ne perdez pas votre temps à faire l'entête du fichier. N'oubliez cependant aucune des directives nécessaires au préprocesseur.

    En annexes sont fournis, pour la plupart des exercices, des extraits d'un programme de test correspondant, afin de vous montrer comment la classe doit pouvoir être utilisée.
 

Classe CVEffectifs

    Les effectifs des différentes classes seront stockées dans un vecteur (vector) d'entiers non signés. Définissez la classe CVEffectifs par instanciation de la classe vector.

Voir corrigé.

Sommaire

Classe CHistogramme

    Ecrire la déclaration de la classe CHistogramme qui doit posséder : Voir annexe 2.

Voir corrigé.

Sommaire

Fonction Ajouter ()

    A la classe CHistogramme, ajouter la fonction Ajouter() de profil suivant :
 
void Ajouter (const unsigned int Nbre) throw ();

    qui comptabilise Nbre dans sa classe d'équivalence (ajoute 1 au compteur correspondant). Attention : il peut être nécessaire de rallonger le vecteur si la classe d'équivalence de Nbre est au-delà des classes déjà utilisées (au début, le vecteur m_Effectif est de taille nulle). Si vous pensez que c'est nécessaire, initialisez les nouveaux effectifs.

Voir annexe 3.

Voir corrigé.

Sommaire

Fonction Supprimer ()

    A la classe CHistogramme, ajouter la fonction Supprimer() de profil suivant :
 
void Supprimer (const unsigned int Nbre) throw ();

qui décrémente de 1 le compteur de la classe d'équivalence de Nbre. Attention : si son effectif devient nul, il peut être nécessaire de réduire la taille du vecteur des effectifs (voir remarque plus haut).

Voir annexe 4.

Voir corrigé.

Sommaire

Opérateur <<

    Ecrire la surcharge de l'opérateur << : voir annexe 5.

Voir corrigé.

Sommaire

Opérateur =

    A la classe CHistogramme, ajouter la surcharge de l'opérateur = (affectation) : voir annexe 6.

Voir corrigé.

Sommaire

Opérateur +

    A la classe CHistogramme, ajouter la surcharge de l'opérateur + de profil :
 
CHistogramme & operator + (const unsigned int Nbre) throw ();

qui joue le même rôle que la fonction Ajouter () : voir annexe 7.

Voir corrigé.

Sommaire

Opérateur +

    A la classe CHistogramme, ajouter la surcharge de l'opérateur + de profil :
 
CHistogramme & operator + (const CHistogramme & Histogramme) throw ();

qui fait la somme des deux histogrammes : voir annexe 8.

Voir corrigé.

Sommaire

Exceptions

    Sans programmer, indiquer à quel(s) endroits il faudrait effectuer des validations et lever éventuellement des exceptions.

Sommaire

Annexes

Annexe 2

    CHistogr Hist1 (3);
    CHistogr Hist2;
    CHistogr Hist3 (Hist1);

    cout << "Hist1 - "; Hist1.Afficher (); cout << endl;
    cout << "Hist2 - "; Hist2.Afficher (); cout << endl;
    cout << "Hist3 - "; Hist3.Afficher (); cout << endl;

Sommaire

Annexe 3

    Hist1.Ajouter (10);
    Hist1.Ajouter (3);
    Hist1.Ajouter (16);
    for (int i = 0; i < 5; ++i) Hist1.Ajouter (10);

    cout << "Hist1 - "; Hist1.Afficher(); cout << endl;

Sommaire

Annexe 4

    Hist1.Supprimer (10);
    Hist1.Supprimer (16);
    Hist1.Supprimer (10);
    Hist1.Supprimer (3);

    cout << "Hist1 - "; Hist1.Afficher(); cout << endl;

Sommaire

Annexe 5

cout << "Hist1 - " << Hist1 << endl;

Sommaire

Annexe 6

    Hist2 = Hist2 = Hist1 = Hist1;

Sommaire

Annexe 7

    Hist1 = Hist1 + 2;
    Hist1 = Hist1 + 2;

    cout << "Hist1 - " << Hist1 << endl;

Sommaire

Annexe 8

    cout << "Hist1 + Hist2 - " << Hist1 + Hist2 << endl;

Sommaire

© D. Mathieu     mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique