Problème de calcul en C

Résolu
-L0Lock- Messages postés 6597 Date d'inscription   Statut Membre Dernière intervention   -  
-L0Lock- Messages postés 6597 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, pour vendredi j'ai une liste de programmes à faire en C, dont l'un consiste à résoudre un polynôme du second degrés (sans aller dans les nombres complexes) de forme
ax²+bx+c
.

C'est tout simple: l'utilisateur indique les nombres a, b et c. Le programme calcule le discriminant, etc...
Voici mon programme :
#include <stdio.h>
#include <math.h>

int main(void)
{
    float a,b,c,delta,rdelta,x1,x2;
    printf("Coucou! Tu veux connaitre la solution d'une equation du second degre?\n C'est assez simple, tu vas voir. Commence par indiquer le nombre a et appuie sur ENTREE :\n\n");
    scanf("%f" ,&a);
    printf("\nMaintenant, saisis le nombre b et appuie sur ENTREE :\n\n");
    scanf("%f" ,&b);
    printf("\nMaintenant, saisis le nombre c et appuie sur ENTREE :\n\n");
    scanf("%f" ,&c);
    printf("Youpi! Laisse-moi calculer ca...\n...\n....\n.....\n");
    delta = b * b - 4 * a * c;
    printf("Discriminant = %.2f",delta);
    if (delta < 0)
    {
        printf(" < 0, donc l'equation n'a pas de racine reelle.");
    }
    else if (delta = 0)
    {
        x1 = (-b) / (2 * a);
        printf(" = 0 donc l'equation a une racine double : %f.2",x1);
    }
    else // delta >0, deux racines
    {
        x1 = (-b - sqrt(delta) / (2 * a);
        x2 = (-b + sqrt(delta)) / (2 * a);
        printf(" > 0 donc l'equation a deux racines :\n x1 = %.2f et x2 = %.2f",x1,x2);
    }
    return 0;
}


En faisans plusieurs tests, les deux premières conditions fonctionnent (quand le discriminant et inférieur ou égal à zéro).
Mais en testant la troisième condition... Alors là, rien ne va plus!

Par exemple, si j'ai
a=2
,
b=-3
et
c=1
:
Il me renvoie un
discriminant = 1 > 0

puis
x1 = 0.75
et
x2 = 0.75
.
Problème : Les solutions de ce polynôme sont normalement
x1 = 0.5
et
x2 = 1
.
Alors soit je dois me soucier pour mon bac de maths, soit mon programme a un problème.
Je remarque que
(-b)/(2*a) = 0.75
, mais ce calcul ne doit s'effectuer que pour delta = 0

Je suis perdu. J'aimerais bien réussir ce programme pour vendredi sans regarder la correction du prof. Merci donc à toute personne qui pourra m'aider. Même après vendredi. :)

--
Si je vous fait des reproches sur votre post, rendez-vous sur mon profil et lisez la section Devise/Proverbe, ça va vous aider.

2 réponses

  1. Utilisateur anonyme
     
    Bonsoir

    Un très grand classique
      else if (delta = 0)

    Cette ligne ne teste pas si delta est égal à 0, mais force la valeur de delta à 0. D'où la suite des calculs fausse.
    La comparaison en C, c'est
    ==
    , pas simplement
    =
    .
    1
    1. -L0Lock- Messages postés 6597 Date d'inscription   Statut Membre Dernière intervention   1 188
       
      Arf... Une erreur bête et méchante que je pensais avoir vérifiée cent fois... Comme quoi il faut que je change de lunettes. ^^'
      Merci à toi, au moins j'ai un programme qui fonctionne.

      Par ailleurs, est-ce que qu'il y a moyen de simplifier ce programme par-ci par-là?
      0
    2. Utilisateur anonyme
       
      Il n'y a pas grand chose à simplifier, tu pourrais sûrement retirer quelques parenthèses (tiens, elle ne sont pas correctes dans ton calcul de x1) mais c'est sans grand intérêt. Par contre, un petit test pour vérifier si a est nul ne ferait pas de mal.
      0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,

    Ma petite contribution pour améliorer ton programme :

    - Utilise double plutôt que float. D'une manière générale, il vaut mieux n'utiliser que des double (les float sont plutôt à utiliser dans des cas particuliers). Néanmoins, si tu souhaites vraiment utiliser les floats, utilise au moins sqrtf() au lieu de sqrt() pour le calcul de la racine

    - float a,b,c,delta,rdelta,x1,x2; Pour la lisibilité, en général il est conseillé de faire une ligne par variables sauf si elles sont de même type et de même usage. Donc ici plutôt :
    double a,b,c;
    double delta, rdelta;
    double x1, x2;
    


    - Tu ne te sers pas de rdelta. Tu peux donc le supprimer.

    - Vérifie si a est différent de 0 avant de diviser par a.

    - Mets un '\n' avant la fin de ton return 0; (ou au moins un fflush(stdout).

    - x1 = (-b - sqrt(delta) / (2 * a);
    Il manque une parenthèse.

    Après, tu peux mieux sécuriser les entrées. Par exemple, si l'utilisateur rentre une lettre, ton programme ne fonctionnera pas.
    0
    1. -L0Lock- Messages postés 6597 Date d'inscription   Statut Membre Dernière intervention   1 188
       
      Merci! :)

      Si je mets des variables "double", j'ai un problème lorsque le programme me retourne les résultats du polynôme : les chiffres après la virgule sont changés par "#J".
      Je reste donc en float, à moins que tu aies une solution à ce problème.
      0
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Bien sûr qu'il y a une solution : il ne faut pas oublier de mettre %lf (L minuscule) au lieu de %f dans le scanf() (et uniquement dans le scanf())
      0
    3. -L0Lock- Messages postés 6597 Date d'inscription   Statut Membre Dernière intervention   1 188
       
      °u°
      Merki, j'ai un super programme maintenant! :D
      Sinon, une idée pour faire le calcul des racines complexes?
      Je vois pas trop comment créer le nombre non-réel i tel que :
       i²=-1
      .
      0
    4. Lapourax Messages postés 2970 Date d'inscription   Statut Contributeur Dernière intervention   336
       
      Lu' !

      Si je ne m'abuse tu as besoin de la librairie complex pour ça.... J'ai pas d'exemple sous la main pour le moment

      EDIT : Autant pour moi ça c'est en C++... '-______-

      Du coup début de réponse ici
      0
    5. -L0Lock- Messages postés 6597 Date d'inscription   Statut Membre Dernière intervention   1 188
       
      Merci de ce lien.
      0