Faire une calculatrice : gérer les réponse

Résolu/Fermé
Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018 - Modifié par Dark_another le 20/10/2016 à 18:15
Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018 - 31 août 2017 à 13:21
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.



A voir également:

3 réponses

remsprogramm Messages postés 15 Date d'inscription samedi 8 octobre 2016 Statut Membre Dernière intervention 16 juillet 2017 2
15 juil. 2017 à 17:58
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.
0
Utilisateur anonyme
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.
0
Utilisateur anonyme
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
0
Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018 5
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.
0
Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018 5 > Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018
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
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
25 juil. 2017 à 17:12
Ç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
0
Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018 5
26 juil. 2017 à 13:52
En effet, j'avais oublié ça lorsque j'ai réécrit le programme, veuillez m'en excuser
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
Modifié le 27 juil. 2017 à 19:00
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.
0
Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018 5
1 août 2017 à 19:34
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'avoir
const char*pt = reponse.c_str();    const char* fin;
il y a
char* 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.
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018
2 août 2017 à 01:21
Quand le compilateur indique une erreur, il indique aussi la ligne et la position exacte de l'erreur. J'ai essayé le code qui est ok chez moi, on lit des données dans un buffer constant donc des pointeurs const sont adaptés, il faut la ligne où est l'erreur.
0
Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018 5 > Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023
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.
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
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 );
0
Dark_another Messages postés 366 Date d'inscription mardi 28 juin 2016 Statut Membre Dernière intervention 18 mars 2018 5 > Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023
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);
}
0