Verification entrée cin

Résolu
fhoest Messages postés 40 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 6 août 2013 - 1 sept. 2011 à 18:40
fhoest Messages postés 40 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 6 août 2013 - 3 sept. 2011 à 22:32
Bonjour,
je voudrai faire une vérification sur une entrée std::cin mon problème est que si je met par exemple ll et ensuite je valide par la touche "return" j'ai un problème de double affichage au niveau de la vérification ,ensuite si je met lO cela me prend en compte le O et je valide alors mon entrée alors qu'elle est fausse,un deuxième problème dans mon code est que si par hasard lors d'un résultat de calcul je met * ma vérification pour fausse réponse par en boucle jusque l'infini,
j'espère ne pas avoir été brouillon dans l'explication du problème (pas facile d'expliquer)
PS: je suis un débutant mais vous l'avez sans doute remarqué.

Merci beaucoup d'avance:
Voici le code:
#include <cstdlib>
#include 
#include <windows.h>
#include<vector>


int c,i,f;
char jouer;
std::vectorresultat;
/* declarartion des variables en dehors de la portée pour
 faire en sorte qu"elle soit + ou - public
*/
int son()
{
Beep(523,50); 
Beep(587,50);
Beep(659,50);
Beep(698,50);
Beep(784,500);
}
int son1()
{
for(int i=0;i<20;++i)
{
Beep(100*i,50); 
}
}
//-----------------------------------------------------------------------------

int Affichagedescendant()

{
    std::cout<<"Choix de la table dans la liste suivante:"<<std::endl;
    for(i=10;i>0;Sleep(500),--i)
  {
    std::cout<< i <<"\a";
    
    if(i!=1){
    std::cout << " |  " ;
    
    }
}
std::cout<<std::endl;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------


int calcultable()

{
     int k;                       
     
     std::cout<<"Calcul de la table de: ";
     std::cin>> k;  
 
     std::vector resultat;
     for(int i=1;i<11;++i)     
     {
        resultat.push_back(k*i);
     }

return k;
}


void jeu()
 
{
  int r;
  for(i=1;i<11;++i)
 
 {
  
 
  do
  
  { 
   
  std::cout<< c ;
  std::cout<<" x "; 
  std::cout<< i ;
  std::cout<<" = ";
  Beep(1000,50);
  std::cin>> r;
 
  if(r!=((c)*i))
  {
  std::cout<<"Mauvaise reponse\n";
son();
f++;
  }
  }while (r!=(c*i));
}    
} 

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------



int main(int argc, char *argv[])
{   
     
     std::cout << "Jeu de calcul\n";
     std::cout << "Voulez vous commencer le jeu (O ou N) " ;
     std::cin  >> jouer;  
     std::cout << std::endl;
  //------------------------------
      
  bool sortie;
  
do  
    {
               switch(jouer)
        { 
           
    case 'N' :
           
            std::cout << "Vous avez choisi de ne pas jouer\n"<<"Au revoir et a bientot!!\n";
            son1();
            sortie = true;
            system ("pause");
            return 0;
            break;
      
    case 'O' :
           
           std::cout << "Vous avez choisi de jouer tres bien !! \n";
           Affichagedescendant();
           c = calcultable();
           sortie = true; 
           std::cout << std::endl;
           break;
    
    default:
             std::cout << "Tapez O ou N : ";
             sortie = false;
             std::cin >> jouer;  
             break;
        }
    
    } 

while(!sortie);
     
     if(jouer=='O')
    
    {
    std::cout << "entre les reponse puis valide par entree" <<std::endl;
    };
   std::cout<<"Es-tu pret pour commencer ?\n";
   son();
   jeu();  
   std::cout<<std::endl;
   std::cout<<"note : ";
   std::cout<< 10-f;
   son1();
   std::cout<<"/10";
   std::cout<<std::endl; 
   system ("pause");
   return 0;
}

7 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
1 sept. 2011 à 20:49
Beaucoup de soucis dans ton code. J'ai retiré les choses inutiles.
- Évite absolument les variables globales !
- Inutile de faire des std::cout de partout. Un seul suffit, et tu mets tout ce que tu as à mettre directement à le suite.
- Tu peux déclarer tes variables au moment où tu les utilises (très pratique pour les boucles).
- Inutile de faire un tableau pour stocker des valeurs que tu connais déjà.
- Découpe ton code en petite fonction. On évite de mettre beaucoup de chose dans un main.

- Si tu poses une question, et qu'une lettre est attendue, c'est plus sympas de ne pas prendre en compte la casse (minuscule ou majuscule).
- Enfin, pourquoi demander à un utilisateur s'il veut jouer ? S'il lance l'exécutable c'est qu'il le veut, inutile de lui redemander à chaque fois.

Pour ton bug, il vient du fait que la sortie est bufferisée. Il faut donc la nettoyer sinon elle garde tout en mémoire et retente en boucle de faire passer les valeurs entrées.
Il suffit d'appeler .clear() puis .ignore(). Je t'ai fais une fonction clear() a appeler après std::cin pour garantir que ce comportement ne se fera plus.

Correction:
#include 
#include <limits>

void clear(std::istream& in)
{
  in.clear();
  in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

void son()
{
  // Beep(523,50);
  // Beep(587,50);
  // Beep(659,50);
  // Beep(698,50);
  // Beep(784,500);
}

void son1()
{
  for(int i = 0; i < 20; ++i)
  {
    // Beep(100*i,50);
  }
}

void afficher()
{
  std::cout << "Choix de la table dans la liste suivante:" << std::endl;
  for (int i = 10; i > 0; --i)
  {
    std::cout << i;
    if (i != 1)
      std::cout << " |  " ;
  }
  std::cout << std::endl;
}

int jeu(int c)
{
  int res;
  int faute = 0;
  for (int i = 1; i <= 10; ++i)
  {
    do
    {
      std::cout << c << " x " << i << " = ";
      // Beep(1000,50);
      std::cin >> res;
      clear(std::cin);

      if (res != c * i)
      {
std::cout << "Mauvaise reponse\n";
son();
++faute;
      }
    }
    while (res != c * i);
  }

  return faute;
}

int askTable()
{
  int table = 0;
  while (table < 1 || table > 10)
  {
    std::cout << "Entrez la table:";
    std::cin >> table;
    clear(std::cin);

    if (table < 1 || table > 10)
      std::cout << "La table doit être comprise entre 1 et 10" << std::endl;
  }

  return table;
}

void jouer()
{
  std::cout << "Entre les reponse puis valide par entree" << std::endl
    << "Es-tu pret pour commencer ?\n";
  son();
  int table = askTable();
  int faute = jeu(table);

  std::cout << std::endl << "note : " << 10 - faute << "/10" << std::endl;
  son1();
}

bool menuJouer()
{
  char c;
  std::cout << "Jeu de calcul\nVoulez vous commencer le jeu (O ou N) ";
  std::cin >> c;
  clear(std::cin);

  while (true)
  {
    switch (c)
    {

      case 'N':
      case 'n':
std::cout << "Vous avez choisi de ne pas jouer\nAu revoir et a bientot!!\n";
son1();
return false;

      case 'O':
      case 'o':
std::cout << "Vous avez choisi de jouer tres bien !! \n";
return true;

      default:
std::cout << "Tapez O ou N : ";
std::cin >> c;
clear(std::cin);
break;
    }
  }
}

int main()
{
  // Je retirerais cela, très ennuyant pour un utilisateur.
  if (!menuJouer())
    return 1;

  jouer();
  // system ("pause");

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cs_LA_Tupac Messages postés 305 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 18 janvier 2012 1
2 sept. 2011 à 15:42
Les return des fonctions?
C'est tout simple, quand tu crée une fonction, soit elle agit puis se ferme (type void), soit elles agissent et retournent un résultat à la fonction qui a appelé cette dernière...
ex. fonction void:
void affiche(int i)
{
    std::cout<<"int:"<<i<<std::endl;
}

int main()
{
    affiche(12);
}

ex. fonction avec return:
int aucarre(int i)
{
    return i * i;
}

int main()
{
    std::cout<<"carre:"<<aucarre(4)<<std::endl;
}
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
3 sept. 2011 à 13:12
vous voulez dire que le return retourne ici dans l'exemple 16 par le biais de la variable i

Une fonction retourne une valeur via return, peu importe ce qui se passe dans la fonction.
Exemple le plus basique possible:
int fonction()
{
  return 42;
}

int main()
{
  int i = fonction();

  return 0;
}

Pour plus d'exemple, relire le post de LA_Tupac.

le int c est donc égale a false ??

Le int c donné en argument ? C'est simple, "c" vaut ce que tu lui donnes. Il ne vaut donc pas "false" mais un nombre (dans ton cas compris entre 1 et 10).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
fhoest Messages postés 40 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 6 août 2013
1 sept. 2011 à 22:45
Bonsoir,
merci beaucoup pour les conseils et correction de code,
je vais planché la dessus demain,pour comprendre l’entièreté des modifs,
encore merci.
Au plaisir.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fhoest Messages postés 40 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 6 août 2013
2 sept. 2011 à 14:02
Re bonjour,
serait il possible de m'explique exactement en fonction du code ci dessus( version corrigé de Mr cptpingu.)
comment fonctionne les return ... des fonctions SVP.
sinon c'est super vous êtes au top
merci d'avance.
0
fhoest Messages postés 40 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 6 août 2013
3 sept. 2011 à 12:05
Bonjour et merci pour les explications
bien que j'ai un peu de mal,
vous voulez dire que le return retourne ici dans l'exemple 16 par le biais de la variable i
c'est bien ça?
et pour l'exemple ci dessous:
int jeu(int c)
{
  int res;
  int faute = 0;
  for (int i = 1; i <= 10; ++i)
  {
    do
    {
      std::cout << c << " x " << i << " = ";
      // Beep(1000,50);
      std::cin >> res;
      clear(std::cin);

      if (res != c * i)
      {
std::cout << "Mauvaise reponse\n";
son();
++faute;
      }
    }
    while (res != c * i);
  }

  return faute;
}

le int c est donc égale a false ?? en fait j'ai un peu de mal a comprendre
désolé d'insister je suis un gros débutant en c++.
merci et bon weekend.
0
fhoest Messages postés 40 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 6 août 2013
3 sept. 2011 à 22:32
Bonsoir,
Très bien merci je pense avoir compris le fonctionnement du return
Au plaisir et bonne fin de weekend.
0
Rejoignez-nous