Problème Calculatrice

Résolu/Fermé
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014 - Modifié par MirakRIM le 16/11/2014 à 15:15
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 16 nov. 2014 à 19:36
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;
}


A voir également:

8 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 16/11/2014 à 17:20
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
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
16 nov. 2014 à 15:30
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
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 16:06
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
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 16:34
Personne pour m'aider ? svp
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
16 nov. 2014 à 17:19
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 17:35
#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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
16 nov. 2014 à 17:58
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
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 18:07
comment je fais pour que le donnee1 devienne un entier juste pour une fonction ?
0
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
Modifié par MirakRIM le 16/11/2014 à 18:11
donnee1=donnee1-(donne1%1) ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 16/11/2014 à 18:11
Un petit cast suffit.
premier((int)donnee1);
0
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 18:16
Ah ok merci :)
0
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 18:29
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
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 19:05
Ya plus personne ? :/ sa boucle toujours :
0
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 19:19
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
16 nov. 2014 à 19:25
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
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 19:28
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
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 19:29
Par contre un dernier truc
0
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 19:31
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
MirakRIM Messages postés 22 Date d'inscription jeudi 23 octobre 2014 Statut Membre Dernière intervention 16 novembre 2014
16 nov. 2014 à 19:34
Ah nan c'est bon merci jai jsute mis case',' devant case 'p' : ^^ Merci pour ton aide encore une fois :)
0