Fonction avec 2 test

Signaler
Messages postés
88
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
30 août 2012
-
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
-
Bonjour,

Je voudrais faire une fonction qui contient 2 conditions (2 test à faire), je vous explique:

Une fonction test qui va vérifier que la saisie utilisateur est correct, celle-ci vérifie dans 1 premier temps si les caractères voulue sont bien saisie ( par exemple aeiouy):

for (i=0; i<longueurMot; i++){ //boucle pour extraire chaque caractère 1 à 1
string extrait= mot.substr(i,1);
if (extrait != "a" & extrait != "e" & extrait != "i"& extrait != "o" & extrait != "u"& extrait != "y"){ //compare chaque caractère pour vérifier la saisie
cout<<"erreur de saisie"<<endl;
return true; //si erreur
}
}return false;

j'ai donc réussi a faire cela , mais maintenant je voudrais inclure dans ma fonction test un deuxieme test qui va vérifier que l'utilisateur ne rentre pas 2 fois la même lettre...et a la fin je voudrais avoir return(bool); de l'ensemble de la fontion.

jespere que vous comprendrez ce que je veux dire...
merci à ceux qui vont m'aider !

1 réponse

Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Ouch horrible !
Ta fonction n'est particulièrement pas optimisé. Tu recopies une sous-chaines de taille 1 à chaque itération. Il te suffit juste de regarde le caractère courant.
De plus le symbole "ET" est "&&" et non "&" (qui a un sens légèrement différent).

Voilà une amélioration de ton code.
#include 

bool stringContains(const std::string& s, char c)
{
  const int size = s.length();

  for (int i = 0; i < size; ++i)
    if (c == s[i])
      return true;

  return false;
}

bool letterIsUnique(const std::string& s)
{
  const int size = s.length();

  for (int i = 0; i < size - 1; ++i)
    for (int j = i + 1; j < size; ++j)
      if (s[j] == s[i])
return false;

  return true;
}

bool test(const std::string& chaine, const std::string& whiteList)
{
  const int size = chaine.length();

  // Vérifier que le caractère en cours n'est pas interdit
  for (int i = 0; i < size; ++i)
    if (!stringContains(whiteList, chaine[i]))
      return false;

  // Maintenant on vérifie qu'aucune lettre n'est en double
  return letterIsUnique(chaine);
}

int main()
{
  std::cout << test("Tete", "aeiouy") << std::endl;
  std::cout << test("eayi", "aeiouy") << std::endl;
  std::cout << test("eau", "aeiouy") << std::endl;
  std::cout << test("eaau", "aeiouy") << std::endl;
  std::cout << test("", "aeiouy") << std::endl;

  return 0;
}