begin process at 2012 05 30 05:28:23
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

verification entrée cin


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

verification entrée cin

jeudi 1 septembre 2011 à 18:40:36 | verification entrée cin

fhoest

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:
Code C/C++ :
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include<vector>


int c,i,f;
char jouer;
std::vector<int>resultat;
/* 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<int> 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;
}
jeudi 1 septembre 2011 à 20:49:01 | Re : verification entrée cin

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
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:
Code C/C++ :
#include <iostream>
#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
Merci d'utiliser Réponse acceptée si un post répond à votre question
jeudi 1 septembre 2011 à 22:45:41 | Re : verification entrée cin

fhoest

Bonsoir,
merci beaucoup pour les conseils et correction de code,
je vais planché la dessus demain,pour comprendre l&#8217;entièreté des modifs,
encore merci.
Au plaisir.
vendredi 2 septembre 2011 à 14:02:21 | Re : verification entrée cin

fhoest

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.
vendredi 2 septembre 2011 à 15:42:04 | Re : verification entrée cin

LA_Tupac

Membre Club
Réponse acceptée !
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:
Code C/C++ :
void affiche(int i)
{
    std::cout<<"int:"<<i<<std::endl;
}

int main()
{
    affiche(12);
}

ex. fonction avec return:
Code C/C++ :
int aucarre(int i)
{
    return i * i;
}

int main()
{
    std::cout<<"carre:"<<aucarre(4)<<std::endl;
}
samedi 3 septembre 2011 à 12:05:31 | Re : verification entrée cin

fhoest

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:
Code C/C++ :
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.
samedi 3 septembre 2011 à 13:12:07 | Re : verification entrée cin

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !

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:
Code C/C++ :
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
Merci d'utiliser Réponse acceptée si un post répond à votre question
samedi 3 septembre 2011 à 22:32:30 | Re : verification entrée cin

fhoest

Bonsoir,
Très bien merci je pense avoir compris le fonctionnement du return
Au plaisir et bonne fin de weekend.


Cette discussion est classée dans : int, cout, std, entrée, beep


Répondre à ce message

Sujets en rapport avec ce message

Allocation statique ou dynamique [ par luhtor ] Bon alors, j'ai un exemple de programme. Mais je me pose la question de sa validité sachant que ce que vous allez voir. C'est correct dans certain lan Aide [ par Hellboy67 ] Voila j'ai un exo pour les cours de prog a faire dont le code source est le suivant:# include # include using std::cout;using std::cin;using std::end problème de "cout" [ par infinity7780 ] Bonjour,J'ai acheté et j'ai lu plusieurs chose sur le C++.Mais comme je débute, je doit surement me trompé.Alors voici ma question. est-ce normal que retour à la ligne [ par DarkC0 ] #include #include #include #include #include #include void retourLigne(int x, int y); void cadre_T(); void Color(int couleurDuTexte,int couleur Segfault bizarre sur un "cout" [ par Thunder255 ] Bonjour à tous, Voilà je fais face à un problème assez bizarre : [code=cpp]int main() { Graph g = Graph(5, 0.5); //g étant de type list > //rep exercice C++ [ par maina87 ] Bonjour, je suis débutante e C++ et j'ai eu a faire a un exercice, svp corrigez le moi: Voilà l'exercice: Donnez le résultat du code suivant: int [clos] bjr, pourriez vous m'aider a terminer ce progmme stp? [ par ley1805 ] #include #include #include #include struct noeud { struct noeud *gauche; int info; struct noeud *droite; }; typedef struct noeud *pnoeud; pno client web service gsoap [ par aymen87 ] Bonjour Je suis en train de développer un client webservice en utilisant l'outil gsoap. j'ai exécuté l'exec wsdl2h nomheader.h monfichier.wsdl ensuit c++ [ par yesoun1 ] je serai reconnaissant de votre aide ;) et merci d'avance[^^happy10] quel est le rôle de "*" ?? for(unsigned int i=0; i < hauteur; i++) { for probleme de debug [ par elhajjajireda ] si le vous plait j'ai placé un breakpoint sur ma fonction principale linge22 ou s'est écrit l'instruction " Image2.Load(argv[2]); sur Windows et avec


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales