Petit problème lors de la récupération de donnée.

Petit problème lors de la récupération de donnée. - C++ - Programmation

Marsh Posté le 26-06-2006 à 14:28:35    

Salut à tous,
 
Voilà, je débute le C++, et je me suis lancé dans un logiciel assez basique, une petite calculette en ligne de commande.
Mais, je rencontre un petit problème.
 
Voici mon code :

Code :
  1. #include <iostream>
  2. using namespace std;
  3. char GetCalcType(void); // Declaring GetCalcType
  4. int main(int argc, char *argv[])
  5. {
  6. cout << "Calculette basique en C++." << endl << endl; //Hello world :)
  7. cout << "Que voulez vous faire ?" << endl <<
  8.   " Une addition : +" << endl <<
  9.   " Une soustraction : -" << endl <<
  10.   " Une multiplication : *" << endl <<
  11.   " Une Division : /";
  12. char iOperator = GetCalcType();
  13. cout << "Debug : je récupère ça : " << iOperator << endl;
  14. return 0;
  15. }
  16. char GetCalcType(void) // Cette fonction récupère et retourne l'opérateur pour le calcul.
  17. {
  18. char cReturn;
  19. while (1) // Boucle infinie
  20. {
  21.  cout << endl << "Entrez une valeur : ";
  22.  cin >> cReturn;
  23.  if ((cReturn == '+') || (cReturn == '-') || (cReturn = '/') || (cReturn ='*'))
  24.   return cReturn;
  25.  if ((cReturn = 'q') || (cReturn = 27))
  26.   return 'q';
  27. }
  28. }


 
Voilà, ce problème n'est pas terminé car j'ai un bug.
Dans GetCalcType(), j'ai une boucle infinie, qui normalement doit s'executer tant qu'elle n'est pas quittée.
Or, quand je lance le programme, et si je met une autre valeur que "+" ou "-", il me retourne "/"  :heink: (et la boucle est quittée)
 
Donc ma question : où est le bug ? car moi je ne le vois pas. (le C++ ne s'aurait t'il pas gérer plus d'un seul ou ?)
 
Je vous remercie.

Reply

Marsh Posté le 26-06-2006 à 14:28:35   

Reply

Marsh Posté le 26-06-2006 à 14:36:11    

Reply

Marsh Posté le 26-06-2006 à 14:43:52    

cReturn = '/') || (cReturn ='*')) ...

Reply

Marsh Posté le 26-06-2006 à 14:51:12    


 
Très subtil.
 
Taz, quel est le problème avec ça : cReturn = '/') || (cReturn ='*')) ?
 
(Je débute excusez moi, je découvre)

Reply

Marsh Posté le 26-06-2006 à 14:56:56    

Ben essaye avec
(cReturn == '/') || (cReturn =='*'))
 
car cReturn ='/' est toujours vrai donc il sort et te return "/"
 
[:azka]


Message édité par turn3r le 26-06-2006 à 14:59:37
Reply

Marsh Posté le 26-06-2006 à 15:00:56    

Merci turn3r, en effet j'ai fait une erreur de prog, et je n'ai pas encore assez d'expérience pour voir ce genre de problème à la con.
 
Maintenant, un autre petit problème, quand je ne met rien et que je fais la touche entrer, ça part dans une boucle infinie, une idée pour contrer ça ?

Reply

Marsh Posté le 26-06-2006 à 15:02:57    

Ben passe ton debugger déjà pour voir où ca te mène dans ton programme, ca t'aidera :)

Reply

Marsh Posté le 26-06-2006 à 15:10:17    

Willits a écrit :

Merci turn3r, en effet j'ai fait une erreur de prog, et je n'ai pas encore assez d'expérience pour voir ce genre de problème à la con.


 
ce genre d'erreur peut s'eviter en evitant de mettre une l-value comme opérande de gauche

Code :
  1. ('/' = cReturn) // erreur a la compilation

Reply

Marsh Posté le 26-06-2006 à 15:18:04    

Ok, merci skelter, je retien.
 
Par contre j'ai compris pour le problème de la boucle infinie, ce n'est pas un blem de boucle infinie. C'est juste cin qui bloque tant qu'il n'a pas reçu de valeur. Il n'y a pas un moyen pour que quand l'utilisateur fasse la touche Entrer sans aucun caractère, qu'il n'y ai pas de saut de ligne ou alors que le texte réapparaise ("Entrez une valeur : " ) ?


Message édité par Willits le 26-06-2006 à 15:18:32
Reply

Marsh Posté le 26-06-2006 à 15:34:06    

tu prompt, comme un shell par exemple
 

Code :
  1. const string prompt = "Entrez une valeur : ";
  2. cout << prompt;
  3. string line;
  4. while( getline(cin, line) )
  5. {
  6. /*
  7. traitement de ce qu'il y a dans line
  8. avec un std::istringstream par exemple
  9. */
  10. cout << prompt;
  11. }


Message édité par skelter le 26-06-2006 à 19:18:00
Reply

Marsh Posté le 26-06-2006 à 15:34:06   

Reply

Marsh Posté le 26-06-2006 à 16:23:58    

pas la peine de flusher là, on est en C++, on est pas de baltringues, cin et cout son tie'd

Reply

Marsh Posté le 26-06-2006 à 16:57:32    

Taz a écrit :

pas la peine de flusher là, on est en C++, on est pas de baltringues, cin et cout son tie'd


 
?

Reply

Marsh Posté le 26-06-2006 à 19:17:44    

Taz a écrit :

pas la peine de flusher là, on est en C++, on est pas de baltringues, cin et cout son tie'd


 
a ouai le con, merci  :jap:  j'ai edité

Reply

Marsh Posté le 26-06-2006 à 19:29:11    

mais à part les =, le code initial fonctionne très bien.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed