Partage
  • Partager sur Facebook
  • Partager sur Twitter

Contrariétés avec une calculatrice réticente

Sujet résolu
    26 janvier 2020 à 19:13:56

    Le vidage de tampon est un grand classique du forum. Voici un copier-coller d'une vieille discussion :

    void viderBuffer()
    {
        int c = 0;
        while (c != '\n' && c != EOF)
        {
            c = getchar();
        }
    }



    • Partager sur Facebook
    • Partager sur Twitter
      26 janvier 2020 à 20:26:40

      Nice

      Merci a tous pour votre aide, et surtout votre patience.

      Merci beaucoup de m'aider a progresser comme ca ! Juste une petite question Michelbilaud, a quoi correspond les lignes que tu ajoute, moi je lis que quand operation n'est pas égal a +...et pourtant ca marche ! La magie de la programmation.

      Une autre question, je veux ajouter un programme qui permet que si l'opération rentrée n'est pas valide ca affiche un message d'erreur :

              if (operation != '+' || '-' || '*' || '/')/*Si l'opération n'est pas valide*/
              {
                  printf("Je crois que l'operation que tu as rentree n'est pas valide !");
              }

      Je crois que l’opération que tu as rentrée n'est pas valide ! s'affiche a chaque fois même quand l'opération rentrée est bonne...

      -
      Edité par CodeLearner1 26 janvier 2020 à 21:07:07

      • Partager sur Facebook
      • Partager sur Twitter
        26 janvier 2020 à 22:23:22

        Ta ligne 1 n'est pas bonne. Elle est syntaxiquement valide mais ne fait pas du tout ce que tu crois. Il faut écrire :

        if (operation != '+' && operation != '-' && operation != '*' && operation != '/')

        Il faut à chaque fois rappeler la variable. Et du coup l'opérateur est && je crois. (Sinon, il évalue '+' || '-' || '*' (évaluation qui n'a pas grand sens ici − mais c'est ce qu'il fait) et, ensuite, vérifie si 'operation' est différent du résultat de cette évaluation.)

        • Partager sur Facebook
        • Partager sur Twitter
          26 janvier 2020 à 23:37:39

          Hello,

          Dans un cas pareil, j'écris

          #include <stdio.h>
          #include <string.h>
          
          char c;
          
          do {
          	scanf("%c",&c);
          } while(strchr("+-*/",c)==NULL);
          
          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            27 janvier 2020 à 7:07:18

            Plutôt

            do {
               ....
            } while (! is_an_operator(c));


            Les details techniques, plus loin.

            Mais bon, apparemment on n'en n'est ni au découpage en fonctions, ni à la connaissance de string.h.

            -
            Edité par michelbillaud 27 janvier 2020 à 7:09:42

            • Partager sur Facebook
            • Partager sur Twitter
              27 janvier 2020 à 7:19:41

              » Les details techniques, plus loin.
              Suite au prochain numéro ...
              Tu t'es fait une fonction, ou c'est une macro?
              Ça donne la possibilité d'ajouter des opérateurs.
              • Partager sur Facebook
              • Partager sur Twitter

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

                27 janvier 2020 à 9:45:20

                Evidemment, c'est pour découpler

                • la logique du programme
                • les détails techniques.

                Ca peut être une macro, une fonction, une fonction inline. Who cares?

                • Partager sur Facebook
                • Partager sur Twitter
                  27 janvier 2020 à 19:22:10

                  Je suis d'accord, ça apporte de la clarté.
                  • Partager sur Facebook
                  • Partager sur Twitter

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

                    28 janvier 2020 à 21:43:37

                    Bonsoir

                    Je veux maintenant calculer tout les diviseurs d'un nombre, j'ai donc agrandi mon programme.

                    Sauf que j'ai un message d'erreur Windows...

                    #include <stdio.h>
                    #include <stdlib.h>
                    #include <math.h>
                    
                    int main(int argc, char* argv[])
                    
                        if (Choix == 2)
                        {
                            printf("Rentrez un nombre pour connaitre ses diviseurs !");
                            int nombreChoisi=0, diviseurs=0;
                            scanf("%d", nombreChoisi);
                            do
                            {
                              nombreChoisi / diviseurs++;
                            } while (diviseurs > sqrt(nombreChoisi));
                        }
                        return 0;
                    }

                    et l'erreur :

                    Qui correspond a ca :

                    Merci d'avance

                    -
                    Edité par CodeLearner1 28 janvier 2020 à 22:06:15

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 janvier 2020 à 1:49:21

                      Où est le '{' à la fin de la ligne 'main'?
                      Tu n'as pas défini la variable 'Choix'.
                      L'expression à la ligne 14 est censé faire quoi?
                      Tu initialises encore des variables que tu vas lire juste après.
                      La condition dans ton 'while' est l'inverse de ce qu'elle devrait être.
                      Je mettrais le résultat du sqrt() dans une variable avant la boucle et c'est avec celle-ci que je ferais le test dans le 'while'.
                      Où places-tu la liste de tes diviseurs?
                      Si j'ai choisi 60, que me donneras-tu: 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60?
                      Je ne vois pas de 'printf' pour les diviseurs.
                      En principe, tu aurais dû créer un nouveau sujet car c'est un nouveau problème.

                      -
                      Edité par PierrotLeFou 29 janvier 2020 à 1:52:11

                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        29 janvier 2020 à 13:05:35

                        Je crois que cette ligne n'est pas correcte :

                        scanf("%d", nombreChoisi);

                        Il faut passer en argument l'adresse de nombreChoisi.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 janvier 2020 à 14:32:25

                          Comme ca ?

                              if (Choix == 2)
                              {
                                  printf("Rentrez un nombre pour connaitre ses diviseurs !");
                                  int nombreChoisi = 0, a=0;
                                  void * diviseurs;
                                  diviseurs = &a;
                                  scanf("%d", nombreChoisi);
                                  diviseurs == nombreChoisi / a;
                                  do
                                  {
                                    nombreChoisi / a++;
                                    printf("%d", diviseurs);
                                  } while (a > sqrt(nombreChoisi));
                              }
                              return 0;
                          }



                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 janvier 2020 à 16:37:07

                            Hello,

                            CodeLearner1 a écrit:

                            Comme ca ?

                                if (Choix == 2)
                                {
                                    printf("Rentrez un nombre pour connaitre ses diviseurs !");
                                    int nombreChoisi = 0, a=0;
                                    void * diviseurs;
                                    diviseurs = &a;
                                    scanf("%d", nombreChoisi);
                                    diviseurs == nombreChoisi / a;
                                    do
                                    {
                                      nombreChoisi / a++;
                                      printf("%d", diviseurs);
                                    } while (a > sqrt(nombreChoisi));
                                }
                                return 0;
                            }




                            Non !

                            As-tu seulement compilé ce code ?

                            -
                            Edité par edgarjacobs 29 janvier 2020 à 16:48:59

                            • Partager sur Facebook
                            • Partager sur Twitter

                            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                              29 janvier 2020 à 16:50:36

                              As-tu testé ton code ou joues-tu aux devinettes?
                              Une fois que tu as trouvé un diviseur du nombre choisi, tu dois:
                              + modifier le nombre choisi comme  étant le quotient de la division.
                              + ajouter le diviseur dans une liste ou l'imprimer immédiatement.
                              Pourquoi void * diviseur alors que ce devrait être un entier, et pourquoi le '*'?
                              Tu mets 'a' à 0 et tu essaies de diviser par 'a'.
                              Le '==' n'est pas une assignation, mais une comparaison.
                              Où apprend-tu à programmer en C?
                              • Partager sur Facebook
                              • Partager sur Twitter

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

                                30 janvier 2020 à 13:38:13

                                CodeLearner1 a écrit:

                                Comme ca ?

                                    if (Choix == 2)
                                    {
                                        printf("Rentrez un nombre pour connaitre ses diviseurs !");
                                        int nombreChoisi = 0, a=0;
                                        void * diviseurs;
                                        diviseurs = &a;
                                        scanf("%d", nombreChoisi);
                                        diviseurs == nombreChoisi / a;
                                        do
                                        {
                                          nombreChoisi / a++;
                                          printf("%d", diviseurs);
                                        } while (a > sqrt(nombreChoisi));
                                    }
                                    return 0;
                                }



                                Je crois que cette ligne n'est pas correcte :

                                scanf("%d", nombreChoisi);

                                Il faut passer en argument l'adresse de nombreChoisi.

                                -
                                Edité par robun 30 janvier 2020 à 13:38:44

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 janvier 2020 à 17:19:44

                                  @robun:
                                  Tu n'as vu que la pointe de l'iceberg ...
                                  > diviseurs == nombreChoisi / a;
                                  C'est supposé faire quoi? À cet endroit 'a' vaut 0 en plus.
                                  Tel que ça se présente, le nombre 1 est considéré comme diviseur. On ne l'inclut pas normalement.
                                  Ensuite, on devrait faire nombreChoisi /= a;
                                  pour ne pas recommencer avec le même diviseur.
                                  Je pose la question à nouveau à CodeLearner1: est-ce que tu testes ton code?
                                  • Partager sur Facebook
                                  • Partager sur Twitter

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

                                    4 février 2020 à 19:48:16

                                    Du coup j'ai modifié mon programme et je l'ai testé ;) ...

                                    if (Choix == 2)
                                        {
                                            printf("Rentrez un nombre pour connaitre ses diviseurs !\n  : ");
                                            int nombreChoisi = 0, a=2;
                                     
                                                scanf("%d", &nombreChoisi);
                                                   
                                    
                                               if(nombreChoisi % a == 0)
                                               {
                                                printf("Les diviseurs de %d sont : ", nombreChoisi);
                                                while (a <= sqrt(nombreChoisi))
                                                    
                                                {
                                                    if (nombreChoisi % a == 0) 
                                                    {
                                                        printf("%d; ", a);
                                                        if (a != (nombreChoisi % a))
                                                        {
                                                            printf("%d; ", nombreChoisi / a);
                                                        }
                                                    }
                                    
                                                    a++;
                                    
                                                }      
                                               }
                                    
                                               if(nombreChoisi % 2 != 0)
                                               {
                                                 printf("Ton nombre est premier !");
                                               }
                                        }

                                    Je ne trouve pas d'erreur ou d’exceptions mais je ne sais pas par quoi remplacer le 2 pour savoir si un nombre est premier, si il y a des exceptions.

                                    Bon bah voila, j'ai maintenant une calculette qui me fait aussi la liste des diviseurs d'un nombre :)

                                    #include <stdio.h>
                                    #include <stdlib.h>
                                    #include <math.h>
                                    
                                    int main(int argc, char* argv[])
                                    
                                    {
                                        printf("         ==Menu==\nChoisissez 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 && Choix != 3 && Choix != 2 && Choix != 4)/*On cancel les petits malins*/
                                        {
                                            printf("Le menu que tu as choisi n'existe pas !");
                                        }
                                        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 line[10];/*on corrige les erreurs*/
                                            char operation = '+';/*on declare operation*/
                                            scanf("%s", line);
                                            operation = line[0];
                                    
                                            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;
                                                }
                                            }
                                    
                                    
                                            if (operation != '+' && operation != '-' && operation != '*' && operation != '/')/*Si l'opération n'est pas valide*/
                                            {
                                                printf("Je crois que l'operation que tu as rentree n'est pas valide !\n\n");
                                            }
                                            if (operation == '+' && operation == '-' && operation == '*' && operation == '/')
                                            {
                                                printf("\nLe resultat est %d, avec un reste de %d\n\n", resultat, reste);/*on annonce le résultat*/
                                        }
                                            }
                                    
                                        if (Choix == 2)
                                        {
                                            printf("Rentrez un nombre pour connaitre ses diviseurs !\n  : ");
                                            int nombreChoisi = 0, a=2;
                                     
                                                scanf("%d", &nombreChoisi);
                                                   
                                    
                                               if(nombreChoisi % a == 0)
                                               {
                                                printf("Les diviseurs de %d sont : ", nombreChoisi);
                                                while (a <= sqrt(nombreChoisi))
                                                    
                                                {
                                                    if (nombreChoisi % a == 0) 
                                                    {
                                                        printf("%d; ", a);
                                                        if (a != (nombreChoisi % a))
                                                        {
                                                            printf("%d; ", nombreChoisi / a);
                                                        }
                                                    }
                                    
                                                    a++;
                                    
                                                }      
                                               }
                                    
                                               if(nombreChoisi % 2 != 0)
                                               {
                                                 printf("Ton nombre est premier !");
                                               }
                                        }
                                                
                                                               
                                                      
                                        
                                        return 0;
                                    }



                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    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