Verification entrée cin [Résolu]

Messages postés
40
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
6 août 2013
- - Dernière réponse : 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;
}
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012
3
Merci
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;
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_LA_Tupac
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
40
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
6 août 2013
0
Merci
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.
Commenter la réponse de fhoest
Messages postés
40
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
6 août 2013
0
Merci
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.
Commenter la réponse de fhoest
Messages postés
40
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
6 août 2013
0
Merci
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.
Commenter la réponse de fhoest
Messages postés
40
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
6 août 2013
0
Merci
Bonsoir,
Très bien merci je pense avoir compris le fonctionnement du return
Au plaisir et bonne fin de weekend.
Commenter la réponse de fhoest