Test de C++ (et listes) n° 4 : (6 mai 2000 – durée : 2h)

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

Tout document autorisé

Sommaire

Fonctions génériques
Fonctions génériques - (suite)
Fonction ForEach() de la classe CListe utilisant un "crochet"
Fonction ForEach() de la classe CListe utilisant un functor générique

Fonctions génériques

    Considérons les trois déclarations suivantes :
 
template <class T>       T  Min1 (const T  a, const T  b);
template <class T>       T  Min2 (const T& a, const T& b);
template <class T> const T& Min3 (const T& a, const T& b);

qui renvoient le plus petit des deux arguments, a ou b. La première a été donnée comme exemple dans le cours polycopié sur la généricité. La dernière est extraite de la norme ANSI du C++.

  1. Quel est l'avantage de Min2() par rapport à Min1() ?
  2. L'avantage de Min3() par rapport à Min2() est de nécessiter une méthode (fonction membre ou opérateur membre) de moins. Laquelle ?
  3. Quel est le rôle de const devant le type de retour de Min3() ?
  4. Quelle est la méthode que le type T doit absolument posséder pour les trois fonctions ?
  5. Ecrire le corps de la fonction Min3().
  6. Peut-on appeler les trois fonctions min() ? Pourquoi ?
Corrigé

Sommaire

Fonctions génériques - (suite)

  1. Ecrire la fonction générique MinVect() qui renvoie la référence à l'élément minimal d'un vector (supposé non vide).
  2. Peut-on l'appeler min() ? Pourquoi ?
Corrigé

Sommaire

Fonction ForEach() de la classe CListe utilisant un "crochet"

    De façon analogue à la fonction Exo_04() du TP 10 (annexe 1), qui cumule les fréquences d'apparition des identificateurs dans une liste de CCptIdent au moyen de la fonction Cumuler(),  écrire, dans le fichier Exo_04Bis.hxx, la fonction Exo_04Bis() qui cherche les éléments de fréquence minimale et maximale dans une liste de CCptIdent au moyen de la fonction MinMax(), que vous devez aussi écrire. En sortie de la recherche, afficher les fréquences minimale et maximale trouvées. On rappelle que la classe CCptIdent dispose de l'opérateur <. Le fichier standard <climits> contient les constantes INT_MIN et INT_MAX. Les fonctions génériques standard min() et max() sont dans le fichier <algorithm>.

Corrigé

Sommaire

Fonction ForEach() de la classe CListe utilisant un functor générique

    De façon analogue à la fonction Exo_06() du TP 10 (annexe 2), écrire la fonction Exo_06Bis() qui cherche les éléments de fréquence minimale et maximale dans une liste de CCptIdent en utilisant un functor générique. En sortie de la recherche, afficher les fréquences minimale et maximale trouvées.

Corrigé

Sommaire

Annexes

Annexe 1

/**
 *
 * @File : Exo_04.hxx
 *
**/
#if !defined __EXO_04_HXX__
#define      __EXO_04_HXX__

#include <iostream>

#include "CListe.h"
#include "CCptIdent.h"

namespace
{
    struct S
    {
        int Numero;
        int FrequenceCumulee;
    };

    void Cumuler (CCptIdent & Element, S * Param)
    {
        cout << '('
             << Param->Numero++    << ", "
             << Element.GetValue () << ", "
             << Element.GetFreq  () << ",  "
             << (Param->FrequenceCumulee += Element.GetFreq()) << "); "
             << endl;
    }

    inline void Exo_04 (void)
    {
        cout << "Exo_04 : \n\n";

        typedef CListe <CCptIdent> CListeIdent;

        CListeIdent UneListe;

        // Initialisation et affichage de la liste
        // ...

        S Compteur = {1, 0};
        UneListe.ForEach ((CListeIdent::Fct2_t) Cumuler, &Compteur);
        cout << "Nombre d'identificateurs : "
             << Compteur.FrequenceCumulee << endl;

    } // Exo_04()

} // namespace

#endif // __EXO_04_HXX__

Sommaire

Annexe 2

/**
 *
 * @File : Exo_06.hxx
 *
 **/
#if !defined __EXO_06_HXX__
#define      __EXO_06_HXX__

#include <iostream>

#include "CListe.h"
#include "CCptIdent.h"
#include "CFunctorGen.h"

namespace
{
    class CEditor : public CFunctor1Param <CCptIdent>
    {
      public :
        virtual void operator () (CCptIdent & Element)
        {
            cout << '(' << Element.GetValue () << ", "
                 << Element.GetFreq  () << "); " << endl;
        }

    }; // CEditor

    inline void Exo_06 (void)
    {
        cout << "Exo_06 : \n\n";

        typedef CListe <CCptIdent> CListeIdent;

        CListeIdent UneListe;

        // Initialisation et affichage de la liste
        // ...

        CEditor Editor;
        UneListe.ForEach (Editor);

    } // Exo_06()

} // namespace

#endif // __EXO_06_HXX__

Sommaire

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