Problème de calcul en C
Résolu
-L0Lock-
Messages postés
5998
Date d'inscription
Statut
Membre
Dernière intervention
-
-L0Lock- Messages postés 5998 Date d'inscription Statut Membre Dernière intervention -
-L0Lock- Messages postés 5998 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
C'est tout simple: l'utilisateur indique les nombres a, b et c. Le programme calcule le discriminant, etc...
Voici mon programme :
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
Il me renvoie un
puis
Problème : Les solutions de ce polynôme sont normalement
Alors soit je dois me soucier pour mon bac de maths, soit mon programme a un problème.
Je remarque que
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. :)
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=-3et
c=1:
Il me renvoie un
discriminant = 1 > 0
puis
x1 = 0.75et
x2 = 0.75.
Problème : Les solutions de ce polynôme sont normalement
x1 = 0.5et
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:
- Problème de calcul en C
- Calcul moyenne excel - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
- Calcul charpente bois gratuit - Télécharger - Architecture & Déco
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel gratuit calcul surface m2 - Télécharger - Outils professionnels
2 réponses
Bonsoir
Un très grand classique
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
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
=.
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 :
- 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.
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.
°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 :
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.
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
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
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à?