IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

J'obtiens un résultat incompréhensible en faisant des opérations arithmétiques


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut J'obtiens un résultat incompréhensible en faisant des opérations arithmétiques
    Bonjour tout le monde,

    J'essaie de créer un petit programme qui résoud une équation.

    Je demande à l'utilisateur la valeur de a et b.

    Si a est supérieur à zéro, je multiplie b par - 1 autrement je multiplie b par 0,1.

    L'encodage de a et b fonctionnent bien mais c'est le résultat final qui est incorrecte.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <BasicConsole.h>
     
    void main()
    {
     
    double a,b,x,y;
     
    x = 1;
     
    printf("Ce programme calcule a partir de deux points, la position d'une droite\n");
     
    printf("Veuillez entrer la valeur de A\n");
    scanf("%ld",&a);
    printf("voici la valeur de A: %ld\n",a);
    printf("Veuillez entrer maintenant la valeur de B\n");
    scanf("%ld",&b);
    printf("voici la valeur de B: %ld\n",b);
     
    //printf("voici les deux valeurs %ld et %ld",a,b);
     
    if (a>0)
    {
    	x = (b * -1)/a;
    }
    else
    {
    	x = (b * 0,1)/a;
    }
     
     
    printf("x vaut %ld",x);
    }
    Voici le résultat si a vaut 3 et b vaut 4 : -265120541

    Je ne sais même pas à quoi pourrait correspondre ce numéro.

    Sauriez-vous m'aider svp ?

    Merci d'avance.

    beegees

  2. #2
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Salut,

    Pour afficher un double avec printf, ça n'est pas %ld mais %f.

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par odsen.s Voir le message
    Salut,

    Pour afficher un double avec printf, ça n'est pas %ld mais %f.
    Salut,

    Merci pour ta réponse.

    ça va déjà un peu mieux mais maintenant, quoi que je met dans les variables a et b j'obtiens toujours -0,00000

    beegees

  4. #4
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Remarques diverses :

    • As-tu pensé à corriger le format des scanf() (même si le mieux serait de ne pas utiliser scanf() mais plutôt fgets() et strtod()) ?
    • Attention, pour séparer la partie décimale de la partie entière d'un nombre, c'est le point (.) et non la virgule (,) qu'il faut utiliser en C.
    • main() doit renvoyer un int.
    • Pourquoi inclure ce fichier d'en-tête ? Il faut inclure <stdio.h>

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beegees Voir le message
    L'encodage de a et b fonctionnent bien mais c'est le résultat final qui est incorrecte.
    Tu peux déjà commencer par corriger ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:1:26: BasicConsole.h: No such file or directory
    main.c:4: warning: function declaration isn't a prototype
    main.c:4: warning: return type of 'main' is not `int'
    main.c: In function `main':
    main.c:10: warning: implicit declaration of function `printf'
    main.c:13: warning: implicit declaration of function `scanf'
    main.c:13: warning: long int format, double arg (arg 2)
    main.c:14: warning: long int format, double arg (arg 2)
    main.c:16: warning: long int format, double arg (arg 2)
    main.c:17: warning: long int format, double arg (arg 2)
    main.c:27: warning: left-hand operand of comma expression has no effect
    main.c:31: warning: long int format, double arg (arg 2)
    main.c:6: warning: unused variable `y'
    main.c:32:2: warning: no newline at end of file
    Process terminated with status 1 (0 minutes, 0 seconds)
    1 errors, 12 warnings
    après avoir reglé correctement ton compilateur :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    après, on verra...

  6. #6
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par odsen.s Voir le message
    Remarques diverses :

    • As-tu pensé à corriger le format des scanf() (même si le mieux serait de ne pas utiliser scanf() mais plutôt fgets() et strtod()) ?
    • Attention, pour séparer la partie décimale de la partie entière d'un nombre, c'est le point (.) et non la virgule (,) qu'il faut utiliser en C.
    • main() doit renvoyer un int.
    • Pourquoi inclure ce fichier d'en-tête ? Il faut inclure <stdio.h>
    Re,

    Merci pour ton aide.

    Pour ce qui est du format du scanf(), c'était en effet cela le problème !, donc merci !

    Pour ce qui est du main et le fichier d'en-tête, c'est notre professeur qui a créé son propre fichier d'entête qui renvoi d'office un int et qui inclue le stdio.

    Merci encore, ça fonctionne nikel

    beegees

  7. #7
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Bonjour le prof... bref pour corriger ce qu'à dit Emmanuel (et les autres d'ailleurs) voici un code un peu plus propre (c'est pas la perfection j'en conviens mais c'est déjà mieux).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    int main(void)
    {
        double  a       = 0.0,
                b       = 0.0,
                x       = 1.0;
        int     retour  = 0;
     
        do
        {
            printf( "Ce programme calcule a partir de deux points, la position d'une droite\n"
                    "Veuillez entrer la valeur de A\n");
            retour = scanf("%lf",&a);
            if( retour != 1 ) 
                scanf("%*[^\n]"),getchar();
        }
        while ( retour != 1 );
     
        do
        {
            printf( "voici la valeur de A: %g\n"
                    "Veuillez entrer maintenant la valeur de B\n",a);
            retour = scanf("%lf",&b);
            if( retour != 1 ) 
                scanf("%*[^\n]"),getchar();
        }
        while ( retour != 1 );
     
        printf("voici la valeur de B: %g\n",b);
     
        if (isgreater(a,0.0))
    	    x = (b * -1.0)/a;
        else
    	    x = (b * 0.1)/a;
     
        printf("x vaut %g\n",x);
        return EXIT_SUCCESS;
    }
    Cordialement.

  8. #8
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour Nicolas,

    Merci pour ton code propre et claire.

    Je l'analyse de plus près.

    Merci encore.

    beegees

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Bonjour le prof... bref pour corriger ce qu'à dit Emmanuel (et les autres d'ailleurs) voici un code un peu plus propre (c'est pas la perfection j'en conviens mais c'est déjà mieux).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    int main(void)
    {
        double  a       = 0.0,
                b       = 0.0,
                x       = 1.0;
        int     retour  = 0;
     
        do
        {
            printf( "Ce programme calcule a partir de deux points, la position d'une droite\n"
                    "Veuillez entrer la valeur de A\n");
            retour = scanf("%lf",&a);
            if( retour != 1 ) 
                scanf("%*[^\n]"),getchar();
        }
        while ( retour != 1 );
     
        do
        {
            printf( "voici la valeur de A: %g\n"
                    "Veuillez entrer maintenant la valeur de B\n",a);
            retour = scanf("%lf",&b);
            if( retour != 1 ) 
                scanf("%*[^\n]"),getchar();
        }
        while ( retour != 1 );
     
        printf("voici la valeur de B: %g\n",b);
     
        if (isgreater(a,0.0))
    	    x = (b * -1.0)/a;
        else
    	    x = (b * 0.1)/a;
     
        printf("x vaut %g\n",x);
        return EXIT_SUCCESS;
    }
    Cordialement.
    A part le fait que ta fonction isgreater() n'est pas définie (EDIT: suite à la remarque d'Emmanuel: fonction standard C99) et que l'usage massif de l'opérateur ',' me dérange, je ne comprends pas pourquoi tu ne purge le tampon du flux d'entrée standard que lorsque retour est différent de 1. Lorsque l'utilisateur entre correctement une valeur (et que retour vaut 1), le tampon de stdin contient encore (au minimum) le caractère de fin de ligne '\n'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    void purge_stdin(void)
    {
        scanf("%*[^\n]");
        getchar();
    }
     
    int main(void)
    {
        double  a = 0.0;
        double b = 0.0;
        double x = 1.0;
        int retour = 0;
     
        do
        {
            printf( "Ce programme calcule a partir de deux points, la position d'une droite\n"
                    "Veuillez entrer la valeur de A\n");
            retour = scanf("%lf",&a);
            purge_stdin();
        }
        while (retour != 1);
     
        do
        {
            printf( "voici la valeur de A: %g\n"
                    "Veuillez entrer maintenant la valeur de B\n",a);
            retour = scanf("%lf",&b);
            purge_stdin();
        }
        while (retour != 1);
     
        printf("voici la valeur de B: %g\n",b);
     
        if (isgreater(a, 0.0))
        {
            x = (b * -1.0) / a;
        }
        else
        {
            x = (b * 0.1) / a;
        }
     
        printf("x vaut %g\n",x);
     
        return EXIT_SUCCESS;
    }

    Thierry

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    A part le fait que ta fonction isgreater() n'est pas définie<...>
    isgreater() est une fonction de C99 pour les réels à utiliser s'il y a du NaN dans l'air...

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    isgreater() est une fonction de C99 pour les réels à utiliser s'il y a du NaN dans l'air...
    Au temps pour moi, cela m'apprendra à faire une confiance aveugle en mon compilo qui est configuré pour C90 (-ansi -pedantic -std=c89). Je corrige mon post précédent.

    Thierry

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    le tampon de stdin contient encore (au minimum) le caractère de fin de ligne '\n'.
    Oui mais le scanf suivant l'ignore, néanmoins dans le cas ou l'utilisateur taperais quelque chose comme ça : 12a le scanf prendrait le 12 mais pas le a et le laisserai au scanf suivant donc tu as raison, il vaut mieux vider dans tous les cas le buffer histoire d'être propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    int main(void)
    {
        double  a       = 0.0,
                b       = 0.0,
                x       = 1.0;
        int     retour  = 0;
     
        do
        {
            printf( "Ce programme calcule a partir de deux points, la position d'une droite\n"
                    "Veuillez entrer la valeur de A\n");
            retour = scanf("%lf",&a); 
            scanf("%*[^\n]");
            getchar();
        }
        while ( retour != 1 );
        //getchar();
        do
        {
            printf( "voici la valeur de A: %g\n"
                    "Veuillez entrer maintenant la valeur de B\n",a);
            retour = scanf("%lf",&b); 
            scanf("%*[^\n]");
            getchar();
        }
        while ( retour != 1 );
     
        printf("voici la valeur de B: %g\n",b);
     
        if (isgreater(a,0.0))
    	    x = (b * -1.0)/a;
        else
    	    x = (b * 0.1)/a;
     
        printf("x vaut %g\n",x);
        return EXIT_SUCCESS;
    }
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/10/2014, 12h34
  2. calculs des opérations arithmétiques en java
    Par monalise dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 05/11/2009, 11h35
  3. [MySQL] Problème tout simple mais résultat incompréhensible
    Par KaXz dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 25/02/2007, 00h48
  4. Réponses: 13
    Dernier message: 16/11/2005, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo