Copy of https://perso.isima.fr/loic/cpp/exo_dictionnaire.php
tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue
  • Responsable des contrats pros ingénieur
  • Référent entrepreneuriat
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
Institut d'informatique ISIMA
  • twitter
  • linkedin
  • viadeo

[C++] Dictionnaire

 Cette page commence à dater. Son contenu n'est peut-être plus à jour. Contactez-moi si c'est le cas!

Date de première publication : 2013/11/21

Exercice : un dictionnaire

Nous voulons coder un programme permettant de gérer un dictionnaire : une liste de lettres avec la liste de mots commençant par cette lettre. Nous vous proposons le diagramme UML suivant :

UML de l'exercice

Manipulation d'une liste chaînée

Nous voulons fournir une classe ListeMotsTries qui contient des listes de mots (std::string) triés. C'est une simple encapsulation de std::list<std::string>. Les méthodes seront donc très rapides à écrire et on essaiera d'utiliser le plus possible la bibliothèque standard.

Voici un extrait de fichier de tests :

TEST_CASE ( "ListeMT1" ) {
  ListeMotsTries liste;

  REQUIRE( 0 == liste.getNbMots() );
  liste.ajouterMot("inserer");
  REQUIRE( 1 == liste.getNbMots() );
  liste.ajouterMot("effacer");
  REQUIRE( 2 == liste.getNbMots() );
  liste.ajouterMot("ajout");
  REQUIRE( 3 == liste.getNbMots() );


  ListeMotsTries::const_iterator it = liste.debut();

  REQUIRE( *it == "ajout" ); 
  ++it;
  REQUIRE( *it == "effacer" );
  ++it;
  REQUIRE( *it ==  "inserer" );
  ++it;
  REQUIRE( it == liste.fin() );

  liste.enleverMot("effacer");
  REQUIRE( 2 == liste.getNbMots() );
  liste.enleverMot("inserer");
  REQUIRE( 1 == liste.getNbMots() );
  liste.enleverMot("ajout");
  REQUIRE( 0 == liste.getNbMots() );

  REQUIRE( liste.debut() == liste.fin() );
}

TEST_CASE ( "ListeMT2" ) {
  ListeMotsTries liste1, liste2;

  liste1.ajouterMot("essai 1 a");
  liste1.ajouterMot("essai 1 b");
  liste2.inserer(liste1.debut(), liste1.fin());

  ListeMotsTries liste3;
  liste3.ajouterMot("essai 1 b");
  liste3.ajouterMot("essai 2 a");
  liste3.ajouterMot("essai 2 c");
  liste2.inserer(liste3.debut(), liste3.fin());
}
TEST ( TestListeMT, LMT1 ) {
  ListeMotsTries liste;

  EXPECT_EQ( liste.getNbMots(), 0 );
  liste.ajouterMot("inserer");
  EXPECT_EQ( liste.getNbMots(), 1);
  liste.ajouterMot("effacer");
  EXPECT_EQ( liste.getNbMots(), 2 );
  liste.ajouterMot("ajout");
  EXPECT_EQ( liste.getNbMots(), 3 );


  ListeMotsTries::const_iterator it = liste.debut();

  EXPECT_STREQ(it->c_str(), "ajout");
  ++it;
  EXPECT_STREQ(it->c_str(), "effacer");
  ++it;
  EXPECT_STREQ(it->c_str(), "inserer");
  ++it;
  EXPECT_EQ(it, liste.fin());

  liste.enleverMot("effacer");
  EXPECT_EQ(liste.getNbMots(), 2);
  liste.enleverMot("inserer");
  EXPECT_EQ(liste.getNbMots(), 1);
  liste.enleverMot("ajout");
  EXPECT_EQ(liste.getNbMots(), 0);

  EXPECT_EQ(liste.debut(), liste.fin());
}

TEST ( TestListeMT, LMT2 ) {
  ListeMotsTries liste1, liste2;

  liste1.ajouterMot("essai 1 a");
  liste1.ajouterMot("essai 1 b");
  liste2.inserer(liste1.debut(), liste1.fin());

  ListeMotsTries liste3;
  liste3.ajouterMot("essai 1 b");
  liste3.ajouterMot("essai 2 a");
  liste3.ajouterMot("essai 2 c");
  liste2.inserer(liste3.debut(), liste3.fin());
}

Manipulation d'un tableau associatif

La classe Dictionnaire est composée d’une instance de std::map<char,ListeMotsTries>. Le premier champ est la clé, il s’agit de la première lettre d’un mot. La valeur qui lui est associée est une liste de mots (instance de ListeMotsTries) qui stocke par ordre alphabétique tous les mots commençant par la dite lettre.

Vérifiez à présent le bon fonctionnement de votre dictionnaire :