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++Builder Discussion :

prbleme de resolution d'equation de 2eme degres ds builder c++


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 162
    Par défaut prbleme de resolution d'equation de 2eme degres ds builder c++
    ça fait 2 jours que je teste mon equation sur le compilateur builder c++.mon equation est: a*x*x+b*x+c=0
    j'ai tenter ce program mais j sais ou est l'erreur car j suis un debutant s'il y a une proposition ou une rq dite le svp
    voici le program que j'ai teste:
    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
    //---------------------------------------------------------------------------
    #include <vcl\condefs.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <conio.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    USERES("equation.res");
    //---------------------------------------------------------------------------
    int main(int argc, char **argv)
     
    {int a,b,c;
    printf("donner les valeurs de a, b, c\n");
    scanf("%d%d%d", &a, &b, &c);
    float delta,x,y; char R;
    if (a=0)
      if (b=0)                         
         if (c=0)
           printf("la solution est R");                   
          else printf("pas de solution ");
     
     
       else                                                 
            printf("la solution est:%f\n", -c/b);
     
    else 
         delta=b*b-4*a*c;
           if (delta<0) printf("la solution est vide");
           else x=-(b+sqrt(delta))/(2*a);
                  y=(-b+sqrt(delta))/(2*a);
                  printf("les deux solution sont:%5.2f %5.2f\n", x, y);
           if (delta=0)
           x=-b/(2*a) ;
            printf("la solution est:%f\n", x);
            system("pause");
     
         	return 0;
    }
    //-------------------------------------------------------------------------
    merci bien.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Le problème des calculs avec les float en C c'est que l'opérateurs de divison (/) caste automatiquement le résulat en integer avec un arrondi a la vigule inférieure.
    Donc quand tu fait a/b+c/d, soit (a/b)+(c/d) le compilateur convertira (a/b) en integer et (c/d) en integer avant de faire l'addition.

    Pour obtenir un résulat décimal il faut tout caster:
    float f = (float)a/(float)b;

    Dans l'exemple ci-dessus:
    (float)((float)a/(float)b) + (float)((float)c/(float)d)

    C'est très élégant

    Il y a des librairies de calcul pour float (recherche google avec "decimal point library" ou "floating point library").
    Mais franchement pour faire des calculs basics tu peux les écrire toi-même (avec des macros).

    Avec un telle librairie tu aurais:
    FDIV(a,b) + FDIV(c,d)

    ou FDIV est définie ainsi:

    #define FDIV(n,d) ((float)((float)n/(float)d))

    C'est déja plus présentable.

    Pour résoudre ton problème je te conseille de vérifier individuellement le résulat de chaque opération et tu constateras que l'une ou l'autre arrondi le résulat, renvoi 0 alors que tu croyais avoir 0,9 etc...

    Regarde le résulat de /(2*a), regarde aussi ce que donne b+sqrt.
    Et je doute fortement que x=-b/(2*a) donne ce que tu en attende.

    ps Il y aussi un problème d'arrondi pour les calculs avec entiers ou float : 3/4 = 0 mais (float)(3.0f/4.0f)=0.75f et à toi d'arrondir.

    yarp
    www.senosoft.com

  3. #3
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    bonjour,

    tu as oublié les accolades dans tes if. La syntaxe est la suivante :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (condition)
    {
     
     
    }
    else
    {
     
    }

    Ensuite pour éviter des problèmes décrits ci-dessus avec les divisions, tu peut utiliser ce truc :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
    x = -(1.0 * b+sqrt(delta)) / (2.0*a);
    
    y=(-b*1.0+sqrt(delta)) / (2.0*a);
    
    
    x=(-b*1.0) / (2.0*a) ;

    Les résultats de (b*1.0) et de (2.0*a) seront des float et donc tu feras une division avec des flottants qui retournera un nombre flottant.
    Pour moi c'est plus élégant que les (float)a / (float)b

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Par défaut
    Bonjour,

    '=' est l'opérateur d'affectation.
    '==' est l'opérateur d'égualité.

    Donc pour toute tes comparaisons :
    Cordialement,
    Benjamin

  5. #5
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Bonjour,

    Je te donne rapidement les correctiosn :

    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
    51
    52
    53
    54
    55
    56
     
    //---------------------------------------------------------------------------
    #include <stdio.h>
    #include <math.h>
    #include <conio.h>
    int main(int argc, char **argv)
    {
    //
    // DECLARATION DES VARIABLES
    //
       int a = 0,
           b = 0,
           c = 0;
       float delta = 0,
             x     = 0,
             y     = 0;
       char R;
    //
    // LECTURES DES VALEURS
    //
       printf("Donner la valeur de A :") ;  scanf("%d", &a) ;
       printf("Donner la valeur de B :") ;  scanf("%d", &b) ;
       printf("Donner la valeur de C :") ;  scanf("%d", &c) ;
    //
    // RECHERCHE DES SOLUTIONS
    //
       if(a == 0)
          if(b == 0)
             if(c ==0)
                printf("la solution est R");
             else
                printf("pas de solution ");
          else
             printf("la solution est:%f\n", -c/b);
       else
         {
           delta = b*b - 4*a*c ;
           if(delta<0)
             printf("la solution est vide");
           else
              if(delta ==0 )
                 {
                   x = -b/(2*a) ;
                   printf("la solution est:%f\n", x);
                 }
              else
                 {
                    x = (-b-sqrt(delta))/(2*a);
                    y = (-b+sqrt(delta))/(2*a);
                    printf("Les deux solution sont:%5.2f %5.2f\n", x, y);
                 }
         }
      printf("\n\n");
      system("pause");
      return 0;
    }

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 162
    Par défaut
    merci tous sur vos réponse c'était formidable !! je veux ajouter qqchose au program de kmaniche que les variable a,b,c doivent être declarer ss la forme float car int ne retourne pas les bnne resultat cad (0.0000).Pour mon program il me faut la suggestion de monsieur grosbenji cad au lieu de (=) je dois mettre (==) . je vous salut tous et à bientôt

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Par défaut et les complexes ?
    Si a est nul, il y a déjà 3 solutions, x=-b/c, si c n'est pas nul, tout x est solution si b et c sont nul, et impossible si b est nul et c non nul, c'est un système du premier ordre.

    Si delta est négatif, il y a la solution en complexe.... non ? et il ne faut pas faire de complexes devant, la partie réelle vaut -b / 2a, et la partie réelle -+ racine(-delta)/2a, et à l'affichage, ajouter le i ou j des complexes : partiereel +- i partiecomplexe

    Ensuite pourquoi utiliser des entiers sur les coefficients a,b,c ? les déclarer en float élimine vos problèmes.

    Bon courage.

  8. #8
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Citation Envoyé par nabilfaouzi Voir le message
    merci tous sur vos réponse c'était formidable !! je veux ajouter qqchose au program de kmaniche que les variable a,b,c doivent être declarer ss la forme float car int ne retourne pas les bnne resultat cad (0.0000).Pour mon program il me faut la suggestion de monsieur grosbenji cad au lieu de (=) je dois mettre (==) . je vous salut tous et à bientôt
    Oui d'accord, j'ai faut une connerie , a,b,c doivent être déclarés comme des réels.

  9. #9
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Voici ala version modifiée et améliorée :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    //---------------------------------------------------------------------------
    #include <stdio.h>
    #include <math.h>
    #include <conio.h>
    int main(int argc, char **argv)
    {
    //
    // DECLARATION DES VARIABLES
    //
       int a = 0,
           b = 0,
           c = 0;
       float delta = 0,
             x     = 0,
             y     = 0;
       char R;
    //
    // LECTURES DES VALEURS
    //
       printf("Donner la valeur de A :") ;  scanf("%d", &a) ;
       printf("Donner la valeur de B :") ;  scanf("%d", &b) ;
       printf("Donner la valeur de C :") ;  scanf("%d", &c) ;
    //
    // RECHERCHE DES SOLUTIONS
    //
       if(a == 0)
          if(b == 0)
             if(c ==0)
                printf("la solution est R");
             else
                printf("pas de solution ");
          else
             printf("la solution est:%f\n", -c/b);
       else
         {
           delta = b*b - 4*a*c ;
           if(delta < 0)
             {
                 x = -b/(2*a);
                 y = sqrt(delta)/(2*a);
                 printf("x1 = %5.2f +j %5.2f\n", x, y);
                 printf("x2 = %5.2f -j %5.2f\n", x, y);
             }
           else
              if(delta == 0)
                 {
                   x = -b/(2*a) ;
                   printf("x1 = x2 = %f\n", x);
                 }
              else
                 {
                    x = (-b-sqrt(delta))/(2*a);
                    y = (-b+sqrt(delta))/(2*a);
                    printf("x1 = %5.2f\n", x);
                    printf("x2 = %5.2f\n", y);
                 }
         }
      printf("\n\n");
      system("pause");
      return 0;
    }

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

Discussions similaires

  1. Resolution d'equation du quatrieme degré
    Par Lucie Mor dans le forum Mathématiques
    Réponses: 6
    Dernier message: 03/04/2008, 00h31
  2. Réponses: 6
    Dernier message: 17/11/2007, 13h17
  3. [TP] Equation du second degré
    Par WhiteTigerZ dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 08/11/2006, 22h00
  4. [VB] Résolution d'equation
    Par alfie2006 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/05/2006, 13h31

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