M1102 – TP5 – Exercice 3 (Supplémentaire)

Reprenez le premier exercice (peu importe l’approche : mot / mot ou caractère : caractère), mais cette fois-ci, vous devez compter les mots en cherchant les fin de mots.
En conséquence vous devez effectuer un parcours de la fin de la chaine vers le début.

Ecrivez une fonction de test à l’aide de easyassert.

N’oublier de faire des tests avec des chaines vides.

M1102 – TP5 Corrigés

#include <iostream>
#include <cctype> //islower (), isupper (), isdigit ()

#include "EasyAssert.h"

using namespace std;

bool EstCarDeMot (const char & Car)
{
return islower (Car) || isupper (Car) || isdigit (Car) || '_' == Car;
}

//Exo 1 Mot / Mot
unsigned CompterMotE1V1 (const string & Chaine)
{
unsigned Cpt (0);
unsigned i (0);
while (true)
{
//on passe tous ls caractères qui ne sont pas des caractères de mots
while (i < Chaine.size() && !EstCarDeMot(Chaine[i]))
{
i = i + 1;
}
if (Chaine.size () == i) return Cpt;
//si on ne sort pas => début d'un mot
Cpt = Cpt + 1;
//on passe tous ls caractères qui sont des caractères de mots
while (i < Chaine.size() && EstCarDeMot(Chaine[i]))
{
i = i + 1;
}
}
}//CompterMotE1V1 ()

unsigned CompterMotE1V1Compact (const string & Chaine)
{
unsigned Cpt (0);

for (unsigned i (0); i < Chaine.size(); )
{
//on passe tous ls caractères qui ne sont pas des caractères de mots
for (;i < Chaine.size() && !EstCarDeMot(Chaine[i]); ++i);
if (Chaine.size () == i) break;
//si on ne sort pas => début d'un mot
++Cpt;
//on passe tous ls caractères qui sont des caractères de mots
for (;i < Chaine.size() && EstCarDeMot(Chaine[i]); ++i);
}
//le return est placé à l'exterieur de la boucle pour éviter un warning.
return Cpt;
}//CompterMotE1V1Compact ()

//Exo 1 caractere / caractere
unsigned CompterMotE1V2 (const string & Chaine)
{
unsigned Cpt (0);
bool EstDansMot (false);
for (unsigned i (0); i < Chaine.size(); i = i + 1)
{
if (!EstDansMot && EstCarDeMot (Chaine[i]))
{
Cpt = Cpt + 1;
EstDansMot = true;
}
else if (EstDansMot && !EstCarDeMot (Chaine[i]))
{
EstDansMot = false;
}
}
return Cpt;
}//CompterMotE1V2 ()

void TestCompterMotE1 ()
{
string Chaine ("aaa,?\t!#_BB8");
EASY_ASSERT (CompterMotE1V1 (Chaine) == 2);
EASY_ASSERT (CompterMotE1V1 (Chaine) == CompterMotE1V1Compact (Chaine));
EASY_ASSERT (CompterMotE1V1 (Chaine) == CompterMotE1V2 (Chaine));
Chaine = "aaa,?\t!#_B_B8,___";
EASY_ASSERT (CompterMotE1V1 (Chaine) == 3);
EASY_ASSERT (CompterMotE1V1 (Chaine) == CompterMotE1V1Compact (Chaine));
EASY_ASSERT (CompterMotE1V1 (Chaine) == CompterMotE1V2 (Chaine));
Chaine = "";
EASY_ASSERT (CompterMotE1V1 (Chaine) == 0);
EASY_ASSERT (CompterMotE1V1 (Chaine) == CompterMotE1V1Compact (Chaine));
EASY_ASSERT (CompterMotE1V1 (Chaine) == CompterMotE1V2 (Chaine));
}// TestCompterMotV1V2 ()

//Exo 2
bool EstDebutDeMot (const char & Car)
{
return islower (Car) || isupper (Car);
}// EstDebutDeMot ()

//Exo 2 Mot / Mot
unsigned CompterMotE2V1 (const string & Chaine)
{
unsigned Cpt (0);
unsigned i (0);
while (true)
{
//on passe tous ls caractères qui ne sont pas des caractères de debut de mot
while (i < Chaine.size() && !EstDebutDeMot (Chaine[i]))
{
i = i + 1;
}
if (Chaine.size () == i) return Cpt;
//si on ne sort pas => début d'un mot
Cpt = Cpt + 1;
//on passe tous ls caractères qui sont des caractères de mots
while (i < Chaine.size () && EstCarDeMot (Chaine[i]))
{
i = i + 1;
}
}
}//CompterMotE2V1 ()

unsigned CompterMotE2V1Compact (const string & Chaine)
{
unsigned Cpt (0);

for (unsigned i (0); i < Chaine.size (); )
{
//on passe tous ls caractères qui ne sont pas des caractères de debut de mot
for (;i < Chaine.size () && !EstDebutDeMot (Chaine[i]); ++i);
if (Chaine.size () == i) break;
//si on ne sort pas => début d'un mot
++Cpt;
//on passe tous ls caractères qui sont des caractères de mots
for (;i < Chaine.size () && EstCarDeMot (Chaine[i]); ++i);
}
//le return est placé à l'exterieur de la boucle pour éviter un warning.
return Cpt;
}//CompterMotE2V1Compact ()

//Exo 2 caractere / caractere
unsigned CompterMotE2V2 (const string & Chaine)
{
unsigned Cpt (0);
bool EstDansMot (false);
for (unsigned i (0); i < Chaine.size (); i = i + 1)
{
if (!EstDansMot && EstDebutDeMot (Chaine[i]))
{
Cpt = Cpt + 1;
EstDansMot = true;
}
else if (EstDansMot && !EstCarDeMot (Chaine[i]))
{
EstDansMot = false;
}
}
return Cpt;
}//CompterMotE2V2 ()

void TestCompterMotE2 ()
{
string Chaine ("aaa,?\t!#_BB8");
EASY_ASSERT (CompterMotE2V1 (Chaine) == 2);
EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V1Compact (Chaine));
EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V2 (Chaine));
Chaine = "aaa,?\t!#_B_B8,___";
EASY_ASSERT (CompterMotE2V1 (Chaine) == 2);
EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V1Compact (Chaine));
EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V2 (Chaine));
Chaine = "";
EASY_ASSERT (CompterMotE2V1 (Chaine) == 0);
EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V1Compact (Chaine));
EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V2 (Chaine));
}// TestCompterMotV1V2 ()

//approche mot / mot
unsigned CompterMotE3V1 (const string & Chaine)
{
if (0 == Chaine.size()) return 0;
unsigned Cpt (0);
unsigned i (Chaine.size () - 1);
while (true)
{
//on passe tous ls caractères qui ne sont pas des caractères de debut de mot
while (i > 0 && !EstCarDeMot (Chaine[i]))
{
i = i - 1;
}
if (0 == i && !EstCarDeMot (Chaine [i])) break;
//si on ne sort pas => début d'un mot
Cpt = Cpt + 1;
//on passe tous ls caractères qui sont des caractères de mots
while (i > 0 && EstCarDeMot (Chaine[i]))
{
i = i - 1 ;
}
if (0 == i && EstCarDeMot (Chaine[i])) break;
}
return Cpt;
}//CompterMotE2V1 ()

void TestCompterMotE3 ()
{
string Chaine ("aaa,?\t!#_BB8");
EASY_ASSERT (CompterMotE3V1 (Chaine) == 2);
//EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V1Compact (Chaine));
//EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V2 (Chaine));
Chaine = "aaa,?\t!#_B_B8,___";
EASY_ASSERT (CompterMotE3V1 (Chaine) == 3);
//EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V1Compact (Chaine));
//EASY_ASSERT (CompterMotE2V1 (Chaine) == CompterMotE2V2 (Chaine));
Chaine = "";
EASY_ASSERT (CompterMotE3V1 (Chaine) == 0);
}// TestCompterMotE3 ()

int main()
{
//TestCompterMotE1 ();
//TestCompterMotE2 ();
TestCompterMotE3 ();
return 0;
}