degré^^
Bonjour tout le monde, je dois faire un programme sur devcpp pour résoudre une équation du deuxième degré.
Voici mon programme mais j´ai un problème c´est quand mon delta=0, il m´affiche X1 X2 et X1, bien que les valeurs soient logiquement les mêmes je ne comprend pourquoi il me les affiches 3 fois. De même, quand delta>0, il m´affiche X1, X2 et encore une fois X1, X2 comme si delta>0 rentrez dans 2 blocs!
Si vous voyez quelque chose de faux, cela serait sympa de me dire ce qui ne vas pas.
merci
int main(void)
{
double A, B, C;
double D, X1, X2, Re, Img, X;
printf("\nVeuillez saisir votre variable A: \n" );
scanf("%lf", &A);
printf("\nVeuillez saisir votre variable B: \n" );
scanf("%lf", &B);
printf("\nVeuillez saisir votre variable C: \n" );
scanf("%lf", &C);
X=-C/B;
if (A!=0)
{D=B*B-4*A*C;
printf("\ndelta=%lf\n", D);
if(D>=0)
{X1=(-B+sqrt(D))/2*A;
X2=(-B-sqrt(D))/2*A;
printf("\nX1=%lf, X2=%lf\n", X1, X2);
if (D!=0)
{
printf("\nX1=%lf, X2=%lf\n", X1, X2);
}
else
{
printf("\nX1=%lf\n", X1);
}
}
else
{Re=B/2*A;
Img=sqrt(-D);
printf("\nRe=%lf, Img=%lf\n", Re, Img);
printf("\nZ1=%lf+%lf*j, Img=%lf-%lf*j\n", Re, Img, Re, Img);
}
}
else
{
if(B!=0)
{
printf("\nX=%lf\n", X);
}
else
{
if(C==0)
{
printf("\n0=0, ensemble des solutions infini\n" );
}
else
{
printf("\n Il n´y a donc pas de solution\n" );
}
}
}
system("pause" );
return 0;
}
ahah, le probleme est classique.
Les nombres flottants sont soumis a une imprecision.
ainsi, 1/3*3 peut etre different de 1. C´est pourquoi on ne teste jamais l´egalité sur les nombres flottants. A la place, de tester l´egalité entre D et 0 on test si la valeure absolue de D-0 est inférieur a epsilon. et on prends epsilon une valeure petite. (sur les nombres flottant simple précision, c´est de l´ordre de 10^-5)
donc D-0>10^-5? poutant sa marche toujours pas
tu testes abs(nombre)<0.00001 par exemple ![]()
merci fvirtman mais j´ai pas compris ce que signifé abs
valeur absolue
Soit tu utilises math.h, soit une macro :
if (ABS(nombre)<0.00001) ....
en l´occurence ici, ce n´est pas le problème.
C´est juste la logique du programme qui est fausse :
regarde par exemple ces quelques lignes :
if(D>=0)
{X1=(-B+sqrt(D))/2*A;
X2=(-B-sqrt(D))/2*A;
printf("\nX1=%lf, X2=%lf\n", X1, X2);
if (D!=0)
{
printf("\nX1=%lf, X2=%lf\n", X1, X2);
}
...
tu calcule x1 et x2, puis tu les affiche, et puis si delta est non nul, tu les réaffiche.
Ton programme devrait ressembler à ça :
calcule de delta;
if (D>0)
{
calcule et affichage de x1 et x2 dans ce cas.
}
else if (D<0)
{
affichage pas de solution
}
else //cas D==0
{
calcule de x1 et affichage de cette valeur.
}
Et bien sûr, dans les tests, tu peut utiliser les méthodes de godrik et fvirtman.
Pourtant il faut quand même que si D<0 il y est les solutions imaginaires...
"Pourtant il faut quand même que si D<0 il y est les solutions imaginaires...", non, car si D < 0, il n´y a aucune solution verifiant ax²+bx+c = 0
Ben on ne compte pas les solutions de la forme Z=re+ img*i
La question est dans quoi résout tu ton équation ? Dans R ? Dans C ?
toutes les solutions et donc même quand delta<0 j´ai traité cette partie la
else
{Re=B/2*A;
Img=sqrt(-D);
printf("\nRe=%lf, Img=%lf\n", Re, Img);
printf("\nZ1=%lf+%lf*j, Img=%lf-%lf*j\n", Re, Img, Re, Img);
}
Un script php en cli qui résoud un polynome :
<?php
echo "------------------- RESOLVEUR DE POLYNOMES DU DECOND DEGRE -------------------\n";
echo "\n";
echo "Format du polynome : ax^2 + bx + c\n";
echo "\n";
echo "Les variables a, b et c :\n";
echo "a : (entrez un nombre) ";
$a = trim(fgets(STDIN));
echo "b : (entrez un nombre) ";
$b = trim(fgets(STDIN));
echo "c : (entrez un nombre) ";
$c = trim(fgets(STDIN));
if(is_numeric($a) && is_numeric($b) && is_numeric($c)) {
echo "\nLe polynome a resoudre est ".$a."x^2 + ".$b."x + ".$c."\n";
echo "\nCalcule du Delta (D) :\n";
$delta = (int)$b*(int)$b-4*(int)$a*(int)$c;
echo "D = $delta\n\n";
if($delta < 0) {
echo "D < 0 donc aucune racine !\ n";
}
if($delta == 0) {
echo "Il existe une racine : -$b/".(2*(int)$a)." = ".(-$b/(2*(int)$a))."\n";
}
if($delta > 0) {
echo "Il existe 2 racines :\n\n* -$b-rac(".$delta.")/".(2*(int)$a)." = ".round(((-(int)$b-sqrt($delta))/(2*(int)$a)), 3)."\n";
echo "* -$b+rac(".$delta.")/".(2*(int)$a)." = ".round(((-(int)$b+sqrt($delta))/(2*(int)$a)), 3)."\n";
}
}
else {
echo "\n/!\ Une ou des variables ne sont pas des nombres !\ n";
}
echo "\nAppuyer sur une touche pour quitter...";
trim(fgets(STDIN));
?>
Okami83 : "Pourtant il faut quand même que si D<0 il y est les solutions imaginaires..."
Pas de problème. Dans mon dernier message tu remplace la ligne :
affichage pas de solution
Par la ligne :
calcule et affichage de x1 et x2 dans le cas où les solutions sont imaginaires.
Le reste de mon message reste vrai.
alors j´ai essayé avec ce programme
int main(void)
{
double A, B, C;
double D, X1, X2, Re, Img, X;
printf("\nVeuillez saisir votre variable A: \n" );
scanf("%lf", &A);
printf("\nVeuillez saisir votre variable B: \n" );
scanf("%lf", &B);
printf("\nVeuillez saisir votre variable C: \n" );
scanf("%lf", &C);
D=B*B-4*A*C;
if (D>0)
{
X1=(-B+sqrt(D))/2*A;
X2=(-B-sqrt(D))/2*A;
printf("\nX1=%lf, X2=%lf\n", X1, X2);
}
else if (D<0)
{
Re=B/2*A;
Img=sqrt(-D);
printf("\nRe=%lf, Img=%lf\n", Re, Img);
printf("\nZ1=%lf+%lf*j, Img=%lf-%lf*j\n", Re, Img, Re, Img);
}
else //cas D==0
{
printf("\nX1=%lf\n", X1);
}
system("pause" );
return 0;
}
toujours le même problème, et en plus mon énoncé dit de traité tous les cas possibles en suivant l´organigramme que j´ai retranscri en programme au premier post
"toujours le même problème"
Qu´est ce que ça veut dire ?
Là, il est certain qu´il n´affichera plus plusieurs fois la même chose. PAr contre il y a quelques erreurs : tu ne calcule pas X1 dans le cas D==0 et pour diviser par 2*A il faut écrire .../(2*A), sinon tu divise pas 2 et tu multiplie par A.
Mais pour le reste, ça doit fonctionner. Par contre, la logique de ton premier programme était complétement fausse. Relit le, tu verras bien. Poste sur le forum (par exemple en le scannant si tu peux) ton énoncé car tu as du mal le comprendre.
ok j´essaierai de le scanner ce week , en fait je dois faire un programme qui résout les équations du seconde degré en évoquant TOUTES les possibilité et à coté j´ai un organigramme que l´on peut suivre pour répondre à l´énoncé
ben oui, et le dernier programme que tu as posté le fait bien (aux erreurs pret que je t´ai montré). Je ne vois pas ce que tu voudrais en plus.
Ben moi pour ce programme, j´ai encore le même problème avec pour un delta par exemple = à 12, l´affichage de X1,X2 puis encore X1....
int main(void)
{
double A, B, C;
double D, X1, X2, Re, Img, X;
printf("\nVeuillez saisir votre variable A: \n" );
scanf("%lf", &A);
printf("\nVeuillez saisir votre variable B: \n" );
scanf("%lf", &B);
printf("\nVeuillez saisir votre variable C: \n" );
scanf("%lf", &C);
D=B*B-4*A*C;
if (D>0)
{
X1=(-B+sqrt(D))/(2*A);
X2=(-B-sqrt(D))/(2*A);
printf("\nX1=%lf, X2=%lf\n", X1, X2);
}
else if (D<0)
{
Re=B/2*A;
Img=sqrt(-D);
printf("\nRe=%lf, Img=%lf\n", Re, Img);
printf("\nZ1=%lf+%lf*j, Img=%lf-%lf*j\n", Re, Img, Re, Img);
}
else if (D==0)
{X1=(-B+sqrt(D))/(2*A);
printf("\nX1=%lf\n", X1);
}
system("pause" );
return 0;
}