Problème de calcul en C

Résolu/Fermé
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 - 20 nov. 2014 à 00:00
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 - 28 nov. 2014 à 20:00
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. :)
A voir également:

2 réponses

Utilisateur anonyme
20 nov. 2014 à 00:04
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
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 164
20 nov. 2014 à 00:29
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
Utilisateur anonyme
20 nov. 2014 à 09:05
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
20 nov. 2014 à 10:47
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
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 164
20 nov. 2014 à 18:24
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
20 nov. 2014 à 18:37
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
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 164
20 nov. 2014 à 18:45
°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
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
Modifié par Lapourax le 20/11/2014 à 21:25
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
-L0Lock- Messages postés 5998 Date d'inscription dimanche 10 février 2013 Statut Membre Dernière intervention 18 mars 2018 1 164
20 nov. 2014 à 21:27
Merci de ce lien.
0