Faire une calculatrice : gérer les réponse
Résolu
Dark_another
Messages postés
393
Statut
Membre
-
Dark_another Messages postés 393 Statut Membre -
Dark_another Messages postés 393 Statut Membre -
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.
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.
3 réponses
-
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.
-
-
-
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.- 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
-
-
Ç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 -
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.-
Bonjour, désolé pour le temps d'attente.
Je te remercie pour le code que tu as mis mais le problème est que çane se compile pas et ça indique : error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
J'ai tout d'abord pensé à un problème de constante, donc au lieu d'avoirconst char*pt = reponse.c_str(); const char* fin;
il y achar* pt = reponse.c_str(); char* fin;
mais ça indique le même message d'erreur. serai-ce à cause de c_str(); qui est constant ? Je vous remercie de bien vouloir m'éclairer là-dessus. -
-
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. -
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 destr
qui estconst char*
), surement dû au fait que c'est en réalité une fonction C.
ici il faudrait contourner parunsigned nombre = strtoul( pt , const_cast<char**>(&fin) , 10 );
-
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);
}
-