Problème Calculatrice

Résolu
Bonjour,
Alors voila, j'ai 2 soucis, j'ai programmer cette calculatrice qui me permet de faire les opération + , - , / , * et ^ . Je devais ajouter à cette calculatrice une fonction pour savoir si un nombre entier positif entré est premier ou non, le premier problème est que lorsque l'on rentre un nombre négatif la caculatrice demande de rentrer un nouveau nombre (ça c'est normal) mais lorsque l'on tape un nombre nombre positif la caculatrice va nous dire si il est premier ou non mais va tourner en boucle comme cela par exemple :



Mon deuxième soucis et qu'il faut que mon programme affiche un message d'erreur aussi si la personne entre un nombre à virgule, or je ne sais pas comment faire :/

Voila mon programme et merci de votre aide :


#include <stdio.h>
#include <stdlib.h>

float addition (float valeur1,float valeur2)
{
float res;
res=valeur1+valeur2;
return(res);
}

float soustraction (float valeur1,float valeur2)
{
float res;
res=valeur1-valeur2;
return(res);
}

float division (float valeur1,float valeur2)
{
float res;
res=valeur1/valeur2;
return(res);
}

float multiplication (float valeur1,float valeur2)
{
float res;
res=valeur1*valeur2;
return(res);
}

float puissance (float valeur1,float valeur2)
{
float res;
res=pow(valeur1,valeur2);
return(res);
}

char premier (int valeur1)
{
int compter=0;
int n;

if(valeur1<0);
for(n=2;n<valeur1;n++)
{
if(valeur1%n==0)
compter=1;
}
if(compter==1)
printf("%d n'est pas un nombre premier\n",valeur1);
else if(compter==0)
printf("%d est un nombre premier\n", valeur1);
}

int main()
{
float donnee1;
float donnee2;
char operateur;
float egale;
debut:
printf("\n ? ");
scanf("%f %c %f", &donnee1,&operateur,&donnee2);
while (operateur!='S'){
switch (operateur){
case '+' : egale=addition(donnee1,donnee2); printf("%f", egale); break;
case '-' : egale=soustraction(donnee1,donnee2); printf("%f", egale); break;
case '*' : egale=multiplication(donnee1,donnee2); printf("%f", egale); break;
case '^' : egale=puissance(donnee1,donnee2); printf("%f", egale); break;
case '/' :
if (donnee2!=0)
{egale=division(donnee1,donnee2);
printf("%f", egale);}
else printf("Erreur: division par 0"); break;

default : printf("Operateur %c inconnu", operateur);
case 'p' : if (donnee1<0)
{printf("Resaisir un nombre \n");
scanf("%f", &donnee1);}

egale=premier(donnee1);

}
goto debut;
}
printf("Fin du programme");
return 0;
}


8 réponses

Résumé de la discussion

Cette discussion porte sur une calculatrice en C capable d’effectuer les opérations +, -, /, *, et ^ et d’ajouter une fonction pour déterminer si un entier positif est premier. Le premier problème est une boucle infinie lors de l’entrée d’un nombre positif et l’affichage d’un message d’erreur pour les nombres à virgule, tandis que les négatifs déclenchent une reprise. La meilleure réponse propose de supprimer goto au profit d’une boucle while, d’utiliser powf et des doubles, et de faire revenir premier sur un int. En pratique, le programme corrige la primalité en renvoyant 0 ou 1 et améliore la gestion des saisies pour éviter les décimales et les boucles infinies.

Bobot (l’IA à votre service)
  1. Bonjour
    Alors il y' a une chose en informatique qu'il faut que tu comprennes c'est que la syntaxe
    goto
    qui est à évité absolument j'en sais quelque chose et pour les nombres premiers je te conseille ce lien : https://forums.commentcamarche.net/forum/affich-37604400-verifier-si-un-nombre-entier-est-un-nombre-premier-en-c
    Et surtout pas de
    goto
    sauf cas extrême et même là "je doute"
    à bientôt
    0
    1. Le goto permet d'effectuer plusieurs calcul d'affilé ici, je ne sais pas comment faire autrement. Et pour les nombres premiers mon programme fonctionne c'est juste qu'il y a une boucle infini quelque part mais je ne la trouve pas :/
      0
  2. Personne pour m'aider ? svp
    0
    1. Calmes toi les gens qui interviennent sur ce forum ont se quand appel une vie sociale donc, soit patient ce n'est pas en insistant que ton problème va se régler.
      Pour commencer la syntaxe
      goto
      est à supprimer
      deuxièmement il y a une autre solution qui est celle des fonction c'est à dire découper la complexité de ton programme en créant des fonctions en claire, une fonction menus ou bidule pour évité ton
      goto

      et aussi une autre fonction qui contrôle la saisie car si je rentre un caractère à la place de ta première variable ton programme qui est un
      float
      , ton programme plante complètement bref pas mal de choses à revoir avant même de passer au nombre premier
      à bientôt
      0
      1. Contributeur
        Bonjour,

        Trop de chose à voir avant de bien regarder d'où vient précisément le problème. Mes remarques :

        Effectivement, déjà oublie les goto.
        Ici tu peux le remplacer facilement par un while().
        Ensuite, il vaut mieux utiliser des double que des float sauf raison particulière.

        if(valeur1<0);
        Surtout pas de ; à la fin d'un if. Sinon les instructions d'après ne sont pas exécutées.

        N'oublie pas de mettre un '\n' avant le return 0; final.

        case 'p' : if (donnee1<0)
        Il ne faut pas mettre ce case après le default.
        De plus, n'oublie pas le break.

        egale=premier(donnee1);
        donner est de type float et en argument, il faut mettre un int...

        Dans ta fonction premier(), je ne vois pas de return...

        pow() c'est plutôt pour les double, donc utilise plutôt powf() si tu souhaites rester en float.
        N'oublie pas d'inclure le header math.h.

        Ensuite, revois bien l'indentation (utilisation des accolades, etc.) pour plus de lisibilité.

        Reposte ton code avec toutes ses corrections et utilise bien la balise "code c". Par exemple :
        <code c>ici tu mets ton code</code>

        Cdlt,

        Google is your friend
        1
        1. #include <stdio.h>
          #include <stdlib.h>
          #include <math.h>

          float addition (float valeur1,float valeur2)
          {
          float res;
          res=valeur1+valeur2;
          return(res);
          }

          float soustraction (float valeur1,float valeur2)
          {
          float res;
          res=valeur1-valeur2;
          return(res);
          }

          float division (float valeur1,float valeur2)
          {
          float res;
          res=valeur1/valeur2;
          return(res);
          }

          float multiplication (float valeur1,float valeur2)
          {
          float res;
          res=valeur1*valeur2;
          return(res);
          }

          float puissance (float valeur1,float valeur2)
          {
          float res;
          res=powf(valeur1,valeur2);
          return(res);
          }

          int premier (int valeur1)
          {
          int i;

          if (valeur1 <= 1)
          return 0;
          for (i=2; i*i<=valeur1; i++)
          {
          if (valeur1 % i == 0)
          return 0;
          }
          return 1;
          }

          int main()
          {
          float donnee1;
          float donnee2;
          char operateur;
          float egale;
          debut:
          printf("\n ? ");
          scanf("%f %c %f", &donnee1,&operateur,&donnee2);
          while (operateur!='S'){
          switch (operateur){
          case '+' : egale=addition(donnee1,donnee2); printf("%f", egale); break;
          case '-' : egale=soustraction(donnee1,donnee2); printf("%f", egale); break;
          case '*' : egale=multiplication(donnee1,donnee2); printf("%f", egale); break;
          case '^' : egale=puissance(donnee1,donnee2); printf("%f", egale); break;
          case '/' :
          if (donnee2!=0)
          {egale=division(donnee1,donnee2);
          printf("%f", egale);}
          else printf("Erreur: division par 0"); break;

          case 'p' : while (donnee1<0)
          {printf("Resaisir un nombre \n");
          scanf("%f", &donnee1);}
          egale=premier(donnee1);
          if (egale=0)
          printf("Le nombre est premier");
          else
          printf("Le nombre n'est pas premier");
          break;
          case 'S' : return 0;
          default : printf("Operateur %c inconnu", operateur);

          }
          goto debut;
          }
          printf("Fin du programme \n");
          return 0;
          }


          Voila je pense avoir corrigé, a part pour le go to je n'arrive pas à trouver comment mettre le while.
          0
          1. Contributeur
            Pour la balise, j'ai dit "code <gras>c" et non "code" tout simplement. Ca sera encore plus lisible.

            egale=premier(donnee1);
            Tu as oublié de régler ce problème. donnee1 est un float et ta fonction premier a pour prototype char premier(<gras>int</gra>)...
            Il faut régler ce problème.

            Ensuite tu n'as pas remis en forme tout ton code. Cela ne nous facilite pas la lecture...

            case 'S' :
            Il sert à rien ton case 'S' puisque tu as mis un while(opérateur!='S') juste au dessus...
            if (egale=0)
            L'opérateur de comparaison est == (pas =).

            Pour le goto, pour faire l'équivalent, tu mets un while(1) { à la place de debut:
            Et } à la place de goto debut;
            Ensuite, à toi de voir quelle condition mettre à la place de 1 dans le while() pour quitter le programme.

            Et enfin, dis-nous si ton problème est corrigé...
            0
          2. comment je fais pour que le donnee1 devienne un entier juste pour une fonction ?
            0
          3. donnee1=donnee1-(donne1%1) ?
            0
          4. Contributeur
            Un petit cast suffit.
            premier((int)donnee1);
            0
          5. Ah ok merci :)
            0
        2. Voila le programme corrigé :

          #include <stdio.h>
          #include <stdlib.h>
          #include <math.h>
          
          float addition (float valeur1,float valeur2)
          {
              float res;
              res=valeur1+valeur2;
              return(res);
          }
          
          float soustraction (float valeur1,float valeur2)
          {
              float res;
              res=valeur1-valeur2;
              return(res);
          }
          
          float division (float valeur1,float valeur2)
          {
              float res;
              res=valeur1/valeur2;
              return(res);
          }
          
          float multiplication (float valeur1,float valeur2)
          {
              float res;
              res=valeur1*valeur2;
              return(res);
          }
          
          float puissance (float valeur1,float valeur2)
          {
              float res;
              res=powf(valeur1,valeur2);
              return(res);
          }
          
          int premier (int valeur1)
          {
            int i;
          
            if (valeur1 <= 1)
              return 0;
            for (i=2; i*i<=valeur1; i++)
              {
                if (valeur1 % i == 0)
                return 0;
              }
            return 1;
          }
          
          
          
          int main()
          {
              float donnee1;
              float donnee2;
              char operateur;
              float egale;
              while (operateur!='S') {
                                      printf("\n ? ");
                                      scanf("%f  %c  %f", &donnee1,&operateur,&donnee2);
          
                                      switch (operateur){
                                                          case '+' : egale=addition(donnee1,donnee2);
                                                              printf("%f", egale);
                                                              break;
          
                                                          case '-' : egale=soustraction(donnee1,donnee2);
                                                              printf("%f", egale);
                                                              break;
          
                                                          case '*' : egale=multiplication(donnee1,donnee2);
                                                              printf("%f", egale);
                                                              break;
          
                                                          case '^' : egale=puissance(donnee1,donnee2);
                                                              printf("%f", egale);
                                                              break;
          
                                                          case '/' :
                                                              if (donnee2!=0)
                                                                  {
                                                                      egale=division(donnee1,donnee2);
                                                                      printf("%f", egale);
                                                                  }
                                                              else
                                                                      printf("Erreur: division par 0");
                                                              break;
          
                                                          case 'p' :
                                                              while (donnee1<0)
                                                                      {
                                                                          printf("Resaisir un nombre \n");
                                                                          scanf("%f", &donnee1);
                                                                      }
                                                              egale=premier((int)donnee1);
                                                              if (egale==0)
                                                                  printf("Le nombre n'est pas premier");
                                                              else
                                                                  printf("Le nombre est premier");
                                                              break;
                 
                                                          default : printf("Operateur %c inconnu", operateur);
          
                                                          }
                                      }
          
              printf("Fin du programme \n");
              return 0;
          }
          0
          1. Ya plus personne ? :/ sa boucle toujours :
            0
            1. Euh je ne sais pas se que représente le getchar; mais il fait faire des choses bizare au programme ^^ :


              le problème que j'avais au début n'est plus la mais après il prend le premier chiffre comme opérateur et lorsque je met un nombre négatif il concidère le "p" comme un "+" :/
              0
              1. Contributeur
                Hum. Quand tu fais -6p9, tu rentres dans la boucle scanf("%f"). On te demande donc un seul nombre et toi tu remets 12p9...
                Il faudrait revoir l'algorithme.
                Tu peux t'en sortir à la place du getchar() en flushant proprement le buffet clavier :
                int c;
                while ( (c=getchar()) != '\n' && c != EOF);
                

                Tu peux mettre ce code dans une fonction (purgeClavier()) et appeler cette fonction à la place de getchar().

                Mais réfléchis bien à la question : est-ce normal que tu tapes 12p9 alors que tu demandes un seul nombre ? ;-)
                0
              2. AHHHHHH OUI,!!!! je suis vraiment con, il suffit que je tappe juste un nombre est c'est bon....Merci de ton aide! et désolé du dérangement ^^
                0
              3. Par contre un dernier truc
                0
              4. Tu ne saurais pas comment je peux faire pour que si je rentre un nombre à virgule il me demande de resaisir un nombre ou alors qu'il prenne juste la partie entière de ce nombre car la quand je tape un nombre à virgule il concidère la virgule comme l'opérateur du cou il me sort "Opérateur , inconnu" :/
                0
              5. Ah nan c'est bon merci jai jsute mis case',' devant case 'p' : ^^ Merci pour ton aide encore une fois :)
                0