Partage
  • Partager sur Facebook
  • Partager sur Twitter

Contrariétés avec une calculatrice réticente

Sujet résolu
    18 janvier 2020 à 11:52:16

    Bonjour a tous,

    Je débute en C en je veux pour m'améliorer créer une mini calculatrice par mes propres moyens, pour m'entrainer.

    Voila mon programme (+; -; *; pour l'instant), je ne comprend pas pourquoi le résultat est égal a 0.

    #define _CRT_SECURE_NO_WARNINGS
    #define _CRT_SECURE_NO_DEPRECATE  
    #define _CRT_NONSTDC_NO_DEPRECATE
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        printf("Saisissez un premier nombre : "); // premier nombre
        int premierNombre = 0, secondNombre = 0, resultat = 0; // on déclare les variables
        scanf("%d", &premierNombre);
        printf("Saisissez un second nombre : "); // second nombre
        scanf("%d", &secondNombre);
        printf("Saisissez une operation : "); // signe opération
        int operation = 'qqch';
        scanf("%d", &operation);
            if (operation=='+'); //si le signe est +
            {
                int resultat=premierNombre + secondNombre;
            }
            if (operation == '-');// si le signe est -
            {
                int resultat=premierNombre - secondNombre;
            }
            if (operation == '*');// si le signe est *
            {
                int resultat=premierNombre * secondNombre;
            }
          
            printf("Le resultat est %d", resultat);
    
        return 0;
    }



    Voila si ça inspire quelqu’un :)

    Merci !

    -
    Edité par CodeLearner1 18 janvier 2020 à 12:01:30

    • Partager sur Facebook
    • Partager sur Twitter
      18 janvier 2020 à 11:54:25

      Bonjour,

      Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

      Mauvais titre

      Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

      Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

      De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

      Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

      Pour modifier votre titre, éditez le premier message de votre sujet.

      (titre originel : Probleme calculatrice)

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        18 janvier 2020 à 12:09:20

        Bonjour ! L'erreur est simple : tu confonds

        int resultat=premierNombre + secondNombre;

        avec

        resultat=premierNombre + secondNombre;

        Est-ce que tu saisis la différence ?

        (La ligne que tu as écrit déclare une variable appelée 'resultat'. Or tu en as déjà déclarée une plus haut (ligne 10). Du coup ce n'est pas la même, c'est une nouvelle variable 'resultat', qui n'existe que dans le bloc où elle est déclarée − le bloc est la zone délimitée par des accolades. En sortie du if, ce deuxième 'resultat', qui contient le résultat de l'opération, est effacé (puisqu'on sort du bloc). Quant à l'affichage final (ligne 30), il affiche la valeur de 'resultat' : le premier 'resultat', celui que tu as initialisé à 0 et qui n'a pas été modifié.)

        -
        Edité par robun 18 janvier 2020 à 12:10:33

        • Partager sur Facebook
        • Partager sur Twitter
          18 janvier 2020 à 15:23:33

          Salut,
          Ça fait longtemps que je n'ai pas vu cela.
          Avant 1999, il fallait déclarer comme 'local' les variables déclarées localement dans un bloc.
          J'ai gardé presque à 100% mes vieilles habitudes de tout déclarer au début avant la première commande exécutée.
          @CodeLearner1:
          C'est une bonne occasion d'apprendre le 'switch'. Tu pourrais le faire sur l'opération.

          -
          Edité par PierrotLeFou 18 janvier 2020 à 17:42:34

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            18 janvier 2020 à 21:24:55

            Merci a tout les deux pour vos réponses !

            Qu'est ce que le switch exactement @PierrotLeFou ?

            • Partager sur Facebook
            • Partager sur Twitter
              18 janvier 2020 à 22:19:07

              PierrotLeFou a écrit:

              Avant 1999, il fallait déclarer comme 'local' les variables déclarées localement dans un bloc.

              Tu confonds sans doute avec autre chose.

              La règle depuis C89 (le premier standard) c'était que les variables devaient être déclarées en _début de bloc_.  Le faire un peu plus loin, c'est depuis C99.

              dans le K&R, (standard ANSI) la définition de "compound statement' (bloc), c'est

              compound_statement:
                  { declaration-list_opt statement-list_opt }
              

              même si on n'en trouve pas dans le code des exemples présentés.





              -
              Edité par michelbillaud 18 janvier 2020 à 22:21:58

              • Partager sur Facebook
              • Partager sur Twitter
                19 janvier 2020 à 1:23:07

                En fait, je ne me rappelle pas si le mot clé 'local' était nécessaire.
                Je me rappelle seulement d'avoir construit un bloc local pour faire une modification dans GNU sed au milieu des années '90.
                Je savais exactement où faire la modif mais je ne voulais pas me taper tout le code.
                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  19 janvier 2020 à 14:27:17

                  Merci de votre aide !

                  J'ai rajouté la division et un menu a mon projet et je suis perplexe...ça ne marche plus ! Toute les opération qui sont faite sont mtn des divisions :(

                  #define _CRT_SECURE_NO_WARNINGS
                  #define _CRT_SECURE_NO_DEPRECATE  
                  #define _CRT_NONSTDC_NO_DEPRECATE
                  #include <stdio.h>
                  #include <stdlib.h>
                  
                  int main()
                  {
                      printf("Choisissez une option\n1 : Calculette\t2 : Ensemble des diviseurs d'un entier naturel\n3 : Qqch\t4 : Qqcch\n  : ");/*Menu*/
                      int Choix=0;/*declare les varables des menus*/
                      scanf("%d", &Choix);
                      if (Choix == 1);
                      {
                          printf("Saisissez un premier nombre : "); // premier nombre
                          int premierNombre = 0, secondNombre = 0, resultat = 0, reste = 0; // on déclare les variables
                          scanf("%d", &premierNombre);
                          printf("Saisissez un second nombre : "); // second nombre
                          scanf("%d", &secondNombre);
                          printf("Saisissez une operation : "); // signe opération
                          int operation = 'qqch';
                          scanf("%d", &operation);
                          if (operation == '+'); //si le signe est +
                          {
                              resultat = premierNombre + secondNombre;
                          }
                          if (operation == '-');// si le signe est -
                          {
                              resultat = premierNombre - secondNombre;
                          }
                          if (operation == '*');// si le signe est *
                          {
                              resultat = premierNombre * secondNombre;
                          }
                          if (operation == '/');//si le signe est /
                          {
                              resultat = premierNombre / secondNombre;
                              if (resultat != premierNombre * secondNombre);/*si la division nest pas euclidienne*/
                              {
                                  reste = premierNombre - resultat * secondNombre;
                              }
                          }
                  
                          printf("Le resultat est %d, avec un reste de %d", resultat, reste);/*on annonce le résultat*/
                      }
                  
                      return 0;
                  }

                  Si quelqu'un y comprend qqch...

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 janvier 2020 à 14:34:42

                    Salut,

                    De base déjà ça ne marchait pas ton code.

                    Tu as mis un ';' a la fin de chacun de tes if, il n'en faut pas.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 janvier 2020 à 14:42:30

                      Hey

                      Maintenant que j'ai fait ça, le programme donne tt le temps 0...

                      #define _CRT_SECURE_NO_DEPRECATE  
                      #define _CRT_NONSTDC_NO_DEPRECATE
                      #include <stdio.h>
                      #include <stdlib.h>
                      
                      int main()
                      {
                          printf("Choisissez une option\n1 : Calculette\t2 : Ensemble des diviseurs d'un entier naturel\n3 : Qqch\t4 : Qqcch\n  : ");/*Menu*/
                          int Choix=0;/*declare la variable du menu*/
                          scanf("%d", &Choix);
                          if (Choix == 1);
                          {
                              printf("Saisissez un premier nombre : "); // premier nombre
                              int premierNombre = 0, secondNombre = 0, resultat = 0, reste = 0, operation = 'qqch'; // on déclare les variables
                              scanf("%d", &premierNombre);
                              printf("Saisissez un second nombre : "); // second nombre
                              scanf("%d", &secondNombre);
                              printf("Saisissez une operation : "); // signe opération
                              scanf("%d", &operation);
                              if (operation == '+') //si le signe est +
                              {
                                  resultat = premierNombre + secondNombre;
                              }
                              if (operation == '-')// si le signe est -
                              {
                                  resultat = premierNombre - secondNombre;
                              }
                              if (operation == '*')// si le signe est *
                              {
                                  resultat = premierNombre * secondNombre;
                              }
                              if (operation == '/')//si le signe est /
                              {
                                  resultat = premierNombre / secondNombre;
                                  if (resultat != premierNombre * secondNombre)/*si la division nest pas euclidienne*/
                                  {
                                      reste = premierNombre - resultat * secondNombre;
                                  }
                              }
                      
                              printf("Le resultat est %d, avec un reste de %d", resultat, reste);/*on annonce le résultat*/
                          }
                      
                          return 0;
                      }
                      



                      -
                      Edité par CodeLearner1 19 janvier 2020 à 14:46:25

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 janvier 2020 à 15:23:39

                        Essaie de comprendre pourquoi le résultat est toujours 0. Par exemple fais afficher 'resultat' à l'intérieur de chaque 'if'. Tu découvriras alors dans quel 'if' il est passé (nan, je ne spoilerai pas !), ce qui expliquera pourquoi la valeur initiale est restée inchangée.

                        (J'ajoute que la façon dont tu as initialisé 'operation' n'a pas dû plaire au compilateur. Il n'y a pas eu de message ? Indication : c'est cette variable qui est à l'origine du bug.)

                        -
                        Edité par robun 19 janvier 2020 à 15:26:11

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 janvier 2020 à 16:22:47

                          Ok j'utilise char pour déclarer la variable opération, mais après le problème persiste.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 janvier 2020 à 19:00:57

                            Tu penses que lorsque je te conseille d'afficher 'resultat' dans les 'if' ça ne servira à rien ? Moi je pense que si !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 janvier 2020 à 18:47:36

                              Si j'affiche les résultats dans les ifs, la valeur est toujours la meme soit 0
                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 janvier 2020 à 19:08:11

                                Essaies d'afficher l'opération juste après le scanf.

                                Pourquoi initialiser tes valeur et ton opération si tu les lis ensuite?

                                -
                                Edité par PierrotLeFou 20 janvier 2020 à 19:10:25

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Le Tout est souvent plus grand que la somme de ses parties.

                                  20 janvier 2020 à 20:53:44

                                  CodeLearner1 a écrit:

                                  Si j'affiche les résultats dans les ifs, la valeur est toujours la meme soit 0

                                  Tu nous dis que ce que tu as modifié ne marche pas. C'est gentil, mais sans le nouveau code, on va rien pouvoir en dire.

                                  -
                                  Edité par michelbillaud 20 janvier 2020 à 20:54:05

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    20 janvier 2020 à 22:53:15

                                    Je me demande si robun a délibérément omis de parler de la ligne suivante:
                                            scanf("%d", &operation);
                                    Ça nous en explique beaucoup ...

                                    -
                                    Edité par PierrotLeFou 20 janvier 2020 à 23:24:15

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Le Tout est souvent plus grand que la somme de ses parties.

                                      21 janvier 2020 à 12:53:30

                                      CodeLearner1 a écrit:

                                      Si j'affiche les résultats dans les ifs, la valeur est toujours la meme soit 0


                                      Je sais. Mon but n'était pas de donner la solution mais de suggérer une méthode pour la trouver.

                                      Normalement, grâce à ces 'printf', tu as dû remarquer que le programme ne passe dans aucun 'if'. Autrement dit, aucune des conditions n'est réalisée. Ceci doit te suggérer qu'il y a un problème avec la variable 'operation', que tu pourrais alors contrôler par un 'printf'. Et là, constatant que 'operation' n'a pas la valeur prévue, tu vas forcément aller voir comment cette variable a été saisie : c'est la ligne citée par PierrotLeFou, que tu sauras alors corriger.

                                      -
                                      Edité par robun 21 janvier 2020 à 12:56:59

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        26 janvier 2020 à 11:53:29

                                        Bonjour a tous,

                                        Merci de m'aider ainsi a progresser. Voici le code, mais depuis que j'ai fait des modifs, une erreur qui s'affiche...

                                        Le code :

                                        #define _CRT_SECURE_NO_WARNINGS
                                        #define _CRT_SECURE_NO_DEPRECATE  
                                        #define _CRT_NONSTDC_NO_DEPRECATE
                                        #include <stdio.h>
                                        #include <stdlib.h>
                                        
                                        int main(int argc, char* argv[])
                                        {
                                            printf("Choisissez une option\n1 : Calculette\t2 : Ensemble des diviseurs d'un entier naturel\n3 : Qqch\t4 : Qqcch\n  : ");/*Menu*/
                                            int Choix=0;/*declare la variable du menu*/
                                            scanf("%d", &Choix);
                                            if (Choix == 1)
                                            {
                                                printf("Saisissez un premier nombre : "); // premier nombre
                                                int premierNombre = 0, secondNombre = 0, resultat = 0, reste = 0; // on déclare les variables
                                                scanf("%d", &premierNombre);
                                                printf("Saisissez un second nombre : "); // second nombre
                                                scanf("%d", &secondNombre);
                                                printf("Saisissez une operation : "); // signe opération
                                                char operation = '+';
                                                scanf("%c/n", &operation);
                                                if (operation == '+') //si le signe est +
                                                {
                                                    resultat = premierNombre + secondNombre;
                                                }
                                                if (operation == '-')// si le signe est -
                                                {
                                                    resultat = premierNombre - secondNombre;
                                                }
                                                if (operation == '*')// si le signe est *
                                                {
                                                    resultat = premierNombre * secondNombre;
                                                }
                                        
                                        
                                                printf("Le resultat est %d, avec un reste de %d et %s", resultat, reste, operation);/*on annonce le résultat*/
                                            }
                                        
                                            return 0;
                                        }

                                        Merci !

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          26 janvier 2020 à 12:24:51

                                          Pour un caractère, c'est %c
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            26 janvier 2020 à 12:44:34

                                            Tu pourrais poster l'erreur ? Il suffit de copier-coller le message d'erreur. (L'image que tu as inséré dans ton dernier message n'a visiblement rien à voir.)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              26 janvier 2020 à 13:09:17

                                              Oh si, probablement.

                                              En mettant un %s à laplace d'un %c, la fonction printf a essayé de déréfencer une petite adresse genre 0x0000 002B si l'opération était +. Ou peut être Ox0000 000A si c'était le caractère \n

                                              D'où accès dans une zone protégée.

                                              Incidemment, ça ne serait pas compilé comme du C++ au lieu du C ? Parce que tous ces templates, bon...

                                              Tiens ligne 20, il y a /n au lieu de \n probablement (keskifout dans un scanf ?)

                                              -
                                              Edité par michelbillaud 26 janvier 2020 à 13:10:17

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                26 janvier 2020 à 13:54:50

                                                Yep mais du coup j'ai fait les modifs mais il ya toujours le même erreur...

                                                #define _CRT_SECURE_NO_WARNINGS
                                                #define _CRT_SECURE_NO_DEPRECATE  
                                                #define _CRT_NONSTDC_NO_DEPRECATE
                                                #include <stdio.h>
                                                #include <stdlib.h>
                                                
                                                int main(int argc, char* argv[])
                                                {
                                                    printf("Choisissez une option\n1 : Calculette\t2 : Ensemble des diviseurs d'un entier naturel\n3 : Qqch\t4 : Qqcch\n  : ");/*Menu*/
                                                    int Choix=0;/*declare la variable du menu*/
                                                    scanf("%d", &Choix);
                                                    if (Choix == 1)
                                                    {
                                                        printf("Saisissez un premier nombre : "); // premier nombre
                                                        int premierNombre = 0, secondNombre = 0, resultat = 0, reste = 0; // on déclare les variables
                                                        scanf("%d", &premierNombre);
                                                        printf("Saisissez un second nombre : "); // second nombre
                                                        scanf("%d", &secondNombre);
                                                        printf("Saisissez une operation : "); // signe opération
                                                        char operation = '+';
                                                        scanf("%c", &operation);
                                                        if (operation == '+') //si le signe est +
                                                        {
                                                            resultat = premierNombre + secondNombre;
                                                        }
                                                        if (operation == '-')// si le signe est -
                                                        {
                                                            resultat = premierNombre - secondNombre;
                                                        }
                                                        if (operation == '*')// si le signe est *
                                                        {
                                                            resultat = premierNombre * secondNombre;
                                                        }
                                                
                                                
                                                        printf("Le resultat est %d, avec un reste de %d et %c", resultat, reste, operation);/*on annonce le résultat*/
                                                    }
                                                
                                                    return 0;
                                                }
                                                

                                                l'erreur : Une exception non gérée a été levée : violation d'accès en lecture.
                                                **it** a été 0x2B. a eu lieu

                                                -
                                                Edité par CodeLearner1 26 janvier 2020 à 13:55:49

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  26 janvier 2020 à 14:01:50

                                                  Je viens de compiler le programme. Je n'ai pas d'erreur. Le seul problème, c'est que la saisie de l'opérateur est « sautée » : je crois qu'il lit le dernier '\n', cas classique du tampon à vider avant un 'scanf'. Tiens, d'ailleurs vidons le tampon pour voir... Oui, cette fois ça marche !

                                                  Est-ce que tu as vérifié la suggestion de michelbillaud (que la compilation se fait bien en C et non en C++) ?

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    26 janvier 2020 à 14:18:00

                                                    Ok merci !

                                                    Et donc concrètement que dois je faire ?

                                                    Parce que bon vider un tampon...

                                                    -
                                                    Edité par CodeLearner1 26 janvier 2020 à 14:19:17

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      26 janvier 2020 à 14:57:34

                                                      Le message d'erreur que tu as eu n'a rien à voir avec le vidage de tampon. D'où ma question : as-tu vérifié la suggestion de michelbillaud (que la compilation se fait bien en C et non en C++) ?
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        26 janvier 2020 à 17:34:14

                                                        Ok

                                                        Et comment je vérifie ca ? Parce qu'avec VisualStudio on est obligé de créer des projets avec le format C++ et apres le modifier en .c

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          26 janvier 2020 à 17:49:03

                                                          @CodeLearner1:
                                                          » Et comment je vérifie ca ? Parce qu'avec VisualStudio on est obligé de créer des projets avec le format C++ et apres le modifier en .c
                                                          Comment modifies-tu en .c ...?
                                                          La suggestion que j'ai vue est de changer le suffixe .cpp par .c
                                                          Je ne connais ni VS, ni C++
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Le Tout est souvent plus grand que la somme de ses parties.

                                                            26 janvier 2020 à 18:19:10

                                                            Curieusement, 0x2B, c'est le code ascii du caractère '+'.

                                                            Comme le monde est petit.

                                                            Quand je fait tourner ton programme, j'obtiens ceci

                                                            $ ./a.out 
                                                            Choisissez une option
                                                            1 : Calculette	2 : Ensemble des diviseurs d'un entier naturel
                                                            3 : Qqch	4 : Qqcch
                                                              : 1
                                                            Saisissez un premier nombre : 12
                                                            Saisissez un second nombre : 34
                                                            Saisissez une operation : Le resultat est 0, avec un reste de 0 et 
                                                            

                                                            Il ne melaisse pas le temps de taper le caractère pour l'opération.

                                                            Rafistolage (assez laid)

                                                            		do {
                                                            			scanf("%c", &operation);
                                                            		} while (operation != '+'
                                                            				 && operation != '-'
                                                            				 && operation != '*');


                                                            Une autre solution (que je préfère) serait de lire l'operation sous forme d'une chaine.

                                                             Qui plus est on pourrait même faire

                                                            printf("Saisissez une expression, exemple 3+2\n");
                                                            
                                                            int a, b;
                                                            char op[5];
                                                            
                                                            scanf("%d%s%d", &a, op, &b")



                                                            -
                                                            Edité par michelbillaud 26 janvier 2020 à 18:53:00

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              26 janvier 2020 à 19:04:17

                                                              Au chapitre des corrections laides, j'ai fait:
                                                              char line[10];
                                                              scanf("%s", line);
                                                              operation = line[0];
                                                              et ça marche. Je sais maintenant que 1 + 1 = 2 ...
                                                              Ça devrait marcher avec le %c, qu'est-ce qui ne va pas.
                                                              @michelbillaud: et le 0x2b c'est si mystérieux? Tu m'as devancé de peu!
                                                              @robun:
                                                              Comment tu fais pour vider le tampon?
                                                              J'ai fait des getchar() à répétition et ça ne marche pas.
                                                              Es-tu allé du côté de getch() et kbhit()?

                                                              -
                                                              Edité par PierrotLeFou 26 janvier 2020 à 19:11:15

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Le Tout est souvent plus grand que la somme de ses parties.

                                                              Contrariétés avec une calculatrice réticente

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown