Code erroner

Fermé
abdinelick - Modifié par baladur13 le 8/02/2017 à 20:44
Desperaxe Messages postés 138 Date d'inscription dimanche 22 février 2015 Statut Membre Dernière intervention 11 novembre 2021 - 12 févr. 2017 à 14:55
je suis un nouveau programmeur dans le langage C et je veux ecrire un programme pour une calculatrice mais quand je compile il y a toujours une repetition dans la boucle voila mon code
svp quelqu'un pour m'aider a l'affichage on me demande de faire mon choix de l'operation et rien ne se passe
#include<stdio.h>
#include<stdlib.h>

int main(){
float b,a;
char op;

do { printf("choosen an operation\n \n");
printf(" 1: addition \n 2: soustration \n 3: multiplication \n 4: division \n");
scanf("%c",&op);
} while ((op !=1) && (op !=2) && (op !=3) && (op !=4));
printf("type the first number");
scanf("%f",a);
printf("type the second number");
scanf("%f",b);

switch(op){
   case '+' : printf("%f + %f=%f",a,b,a+b);
   break;
    case '-' : 
    if (a<b){
     printf("operation impossible a must be compelsary supertior to b");
    }
    else {
     printf(" %f - %f= %f",a,b,a-b);
    }
    break;
    case '*' : printf("%f * %f = %f",a,b,a*b);
    break;
    case'/':
     if(b==0){
      printf("the division by zero is impossible");
     }
     else{
      printf(" %f / %f= %f",a,b,a/b);
     }
     break;
     default: printf("operation incorrect \n");


}


system ("pause");
 return 0;
}

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 9/02/2017 à 10:15
Salut abdinelick,

Il y a de nombreux problèmes :

11 scanf("%c",&op);

Tu captures donc un caractère sur le flux stdin

12 } while ((op !=1) && (op !=2) && (op !=3) && (op !=4));

Tu compares op à l'entier : 1, et non au caractère '1'. Corrige ces comparaisons. De plus, on est bien d'accord que tu as fait le choix que
op
est sensé contenir les caractères
'1'
,
'2'
,
'3'
ou
'4'
, et pas
'+'
,
'-'
,
'*'
ou
'/'
...

14 scanf("%f",a);

Ton compilateur a dû t'avertir avec un warning là dessus, ainsi qu'en ligne 16. C'est un pointeur sur float que tu dois passer, donc l'adresse de a. Préfixe le avec &, et corrige aussi la ligne 16.

19 case '+' : printf("%f + %f=%f",a,b,a+b);

Dans ton switch, tu compares op à
'+'
, alors qu'il n'aura jamais cette valeur à cette ligne, puisque tu as exigé que op contienne
'1'
,
'2'
,
'3'
ou
'4'
pour sortir du while précédent.

Tes printf devraient être tous terminés par
\n


Ton prototype main devrait être
int main(void)
ou
int main(int argc, char **argv)
pour être du C standard.

Compile avec les warnings, et traite chaque warning. Les avertissements n'empêchent pas la compilation, mais signalent la plupart du temps des erreurs.

Dal
0
Desperaxe Messages postés 138 Date d'inscription dimanche 22 février 2015 Statut Membre Dernière intervention 11 novembre 2021 7
12 févr. 2017 à 14:55
#include<stdio.h>
#include<stdlib.h>

int main()
{
    float b,a;
    int op;

    do
    {
        puts("Choisissez une operation\n");
        puts(" 1: addition \n 2: soustration \n 3: multiplication \n 4: division");
        scanf("%d",&op);
    } while ((op !=1) && (op !=2) && (op !=3) && (op !=4));
    printf("Inscrivez le premier nombre");
    scanf("%f",&a);
    printf("Inscrivez le second nombre");
    scanf("%f",&b);

    switch(op)
    {
        case 1: printf("%f + %f=%f",a,b,a+b);
        break;
        case 2:
        if (a<b)
        {
            printf("A doit etre strictement superieur a B");
        }
        else
        {
            printf(" %f - %f= %f",a,b,a-b);
        }
        break;
        case 3: printf("%f * %f = %f",a,b,a*b);
        break;
        case 4:
         if(b==0)
         {
            printf("La division par 0 est impossible");
         }
         else
         {
            printf(" %f / %f= %f",a,b,a/b);
         }
         break;
         default: printf("Operation Incorrecte \n");
    }
    return 0;
}


Salut. Je vais pas être agressif, ne le prend donc pas comme tel ok ?
Ce code, tu l'as pris sur Internet ? Ou tu l'as fais toi même ? J'ai un doute avec les printf écrits en Anglais..
Justement quand tu fais un affichage d'un texte tout simple, pour t'éviter le "\n" de fin de ligne, utilises plutôt un "puts" à la place du "printf" ( C'est juste un conseil )
Tu fais appel à "op" comme une variable " caractère ", mais ta première boucle while demande à ce que ce soit un nombre entre 1 et 4 inclus qui doivent être saisis. Et ton switch pourtant demande les caractères saisir, ça commence pas très bien malheureusement, là était le problème de ta boucle infinie.
Tes scanf n'appelaient pas les adresses de a et b, donc niveau saisie, tu as forcément dû avoir un warning ou une erreur toute simple.

Le code au dessus est ton code placé dans ce topic, corrigé, fonctionnel et ne contenant plus de warnings ou d'erreurs ( du moins de mon côté ), inspires en-toi pour tes prochains codes !
0