Signaler

Faire une calculatrice : gérer les réponse [Résolu/Fermé]

Posez votre question Dark_another 357Messages postés mardi 28 juin 2016Date d'inscription 8 octobre 2017 Dernière intervention - Dernière réponse le 31 août 2017 à 13:21 par Dark_another
Bonjour, bonsoir,

Je fais une calculatrice en console et je voudrais gérer les réponse utilisateur (du genre qu'il doit écrire"5" au lieu de ce qu'il marque (comme "lol"). Donc je voudrais gerer ça. J'accepterais les réponses et vous remercie d'avance.



Utile
+0
plus moins
Bonjour,

Tu dois faire une condition en vérifiant que ce qu'à écrit l'utilisateur est compris entre tel ou tel nombre, comme ça, s'il met des lettre, la condition sera fausse et tu affichera un message avec un else.

En espérant t'avoir aider, je te souhaite une bonne fin de journée.
Help-Jason 1635Messages postés mardi 28 juin 2011Date d'inscription 17 octobre 2017 Dernière intervention - 16 juil. 2017 à 12:55
Le problème est que le programme plantera si l'utilisateur entre une chaîne de caractère car il est impossible de faire une comparaison entre des entiers et des chaînes de caractères.
Répondre
Whismeril 10119Messages postés mardi 11 mars 2003Date d'inscription ContributeurStatut 17 octobre 2017 Dernière intervention - 16 juil. 2017 à 13:02
Bonjour

En espérant t'avoir aider,

Il y a 9 mois peut être, mais j'espère pour lui(elle), qu'il a trouvé une solution depuis
Répondre
Dark_another 357Messages postés mardi 28 juin 2016Date d'inscription 8 octobre 2017 Dernière intervention - 25 juil. 2017 à 15:21
Excusez de mon retard à répondre,

Whimeri : non, malheureusement ...


remsprogramm : j'ai essayé ce que vous m'avez dis de faire, mais le problème est que ça ne marche pas


exemple :

#include <iostream>
using namespace std;

int main(){

int Op;
cin>>Op;
if (Op >=1 && <= 15){

cout<<"c'est ok !"<<endl;
}

else {
cout<<"c'est pas ok"<<endl;
}


return 0;
}


Et ça ne sort rien de ce que j'ai demandé, ça fait juste appel à ce qu'il trouve dans le programme.
Répondre
Dark_another 357Messages postés mardi 28 juin 2016Date d'inscription 8 octobre 2017 Dernière intervention - 27 juil. 2017 à 16:13
je précise aussi par le fait que lorsqu'il fait appel à l'une des fonctions du programme, il le fait en boucle, chose qui n'est pas prévu à la base


code *corrigé par rapport à la ligne*

#include <iostream>
using namespace std;


void aide(){
cout <<"aide"<<endl;
}



int main(){

int Op;
cin>>Op;
if (Op >=1 && Op<= 15){

cout<<"c'est ok !"<<endl;
}

else if (Op == 16) {
  aide();
}

else{
cout<<"c'est pas ok"<<endl;
}

return 0;
}


ce que va rentré l'utilisateur + la sortie

test
aide
aide
aide
aide
aide
aide
aide
aide
aide
aide
aide
aide
aide
aide

indéfiniment.

Donc comment peut t'on régler ça pour que ça sorte :

test
c'est pas ok
Répondre
Donnez votre avis
Utile
+0
plus moins
Ça c'est un code erroné qui ne compile pas. Il faut remplacer la ligne :
if (Op >=1 && <= 15){
// qui n'a pas de sens par :
if ( Op >= 1  &&  Op <= 15 ) {
// qui effectue le bon test
Dark_another 357Messages postés mardi 28 juin 2016Date d'inscription 8 octobre 2017 Dernière intervention - 26 juil. 2017 à 13:52
En effet, j'avais oublié ça lorsque j'ai réécrit le programme, veuillez m'en excuser
Répondre
Donnez votre avis
Utile
+0
plus moins
Pour vérifier qu'une saisie est bien un nombre entier valide.
On doit
// commencer par lire toute la ligne sous forme d'une chaîne de caractères
   std::string reponse;
   std::getline( std::cin , reponse );
// puis on analyse la chaîne pour vérifier si elle ne contient que des chiffres
   const char* pt = reponse.c_str();
   while ( std::isspace( *pt ) ) {
      ++pt;    // ne pas lire d'éventuels espaces au début
   }
   if ( *pt == '\0' ) {
      std::cout << "la ligne est vide\n";
   }
   else if ( *pt < '0'  ||  *pt > '9' ) {
      std::cout << "ça n'est pas un nombre\n";
   }
   else {
// ensuite on convertit la chaîne en nombre
      const char* fin;
      unsigned nombre = std::strtoul( pt , &fin , 10 ); // essai de lecture
      while ( std::isspace( *fin ) ) {
         ++fin;    // ne pas lire d'éventuels espaces à la fin
      }
      if ( *fin != '\0') {
         std::cout << "il y du texte après le nombre\n";
      }
      else {
// pour finalement tester si elle est dans les limites attendues
         if ( nombre < minimumAttendu ) {
            std::cout << "le nombre est plus petit que " << minimumAttendu << "\n";
         }
         else if ( nombre > maximumAttendu ) {
            std::cout << "le nombre est plus grand que " << maximumAttendu << "\n";
         }
         else {
            std::cout << "c'est ok !" << std::endl;
         }
      }
   }
Le mieux est de mettre tout cela dans une fonction.
Dark_another 357Messages postés mardi 28 juin 2016Date d'inscription 8 octobre 2017 Dernière intervention - 2 août 2017 à 14:15
Le compilateur me donnait au début cette ligne là :

unsigned nombre = strtoul( pt , &fin , 10 ); // essai de lecture
avec ce message :
error: invalid conversion from 'const char**' to 'char**' [-fpermissive]        note: initializing argument 2 of 'long unsigned int strtoul(const char*, char**, int)
J'ai cru comprendre qu'en général, les erreurs "fpermissive" de code::bocks sont à cause de constantes qui peuvent être modifiées, donc j'ai modifié les lignes indiqué au dessus.
Répondre
Dalfab 269Messages postés dimanche 7 février 2016Date d'inscription 9 octobre 2017 Dernière intervention - 2 août 2017 à 20:40
En effet, la norme donne le prototype
unsigned long      strtoul( const char *str, char **str_end, int base );
curieux en C++ (car
*str_end
sera mis à jour à partir de
str
qui est
const char*
), surement dû au fait que c'est en réalité une fonction C.
ici il faudrait contourner par
unsigned nombre = strtoul( pt , const_cast<char**>(&fin) , 10 );
Répondre
Dark_another 357Messages postés mardi 28 juin 2016Date d'inscription 8 octobre 2017 Dernière intervention - 3 août 2017 à 20:15
Cela règle certes le problème, mais si on fait une fonction contenant ça, va comprendre pourquoi le compilateur bug, en me disant que bool x est créé mais pas utilisé, alors que un peu plus loin il y a
x == true;
. De plus, en essayant de régler le problème, j'ai vu un autre bug empêchant l'utilisateur d'entrer des chiffres et des nombres, ça dit <<ce n'est pas un nombre>> ou encore <<la ligne est vide !>>. J'ai donc cherché une autre solution et j'ai trouvé plus simple :
if (!(cin, x)){
cout<<Merci de bien mettre un CHIFFRE ou un NOMBRE, PAS une LETTRE ou un MOT !\n";
cin.clear();
cin.ignore(1);
}
Répondre
Dalfab 269Messages postés dimanche 7 février 2016Date d'inscription 9 octobre 2017 Dernière intervention - 4 août 2017 à 00:23
Ça m'étonnerait fortement que le compilateur ne sache pas qu'une variable est utilisée alors qu'elle l'est plus loin. Le compilateur doit mieux comprendre le C++ que toi (par exemple, c'est dans une portion de code inatteignable ou il y a deux variables de même nom ou semble utilisé dans une expression sans résultat telle que
x==true;
ou autre raison)!
Quand au code
if (!(cin, x))
, il peut se simplifier en
if (!x)
, ici
cin
est inutilisé dans l'expression!
Répondre
Dark_another 357Messages postés mardi 28 juin 2016Date d'inscription 8 octobre 2017 Dernière intervention - 31 août 2017 à 13:21
Peut-être bien, mais je ne m'en souviens pas très bien. Sinon, merci beaucoup pour tes réponses
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !