CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C]Résolution d'une équation du second

Okami83
Okami83
Niveau 6
24 septembre 2007 à 16:58:03

degré^^

Okami83
Okami83
Niveau 6
24 septembre 2007 à 16:59:20

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

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <math.h>

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;
}

godrik
godrik
Niveau 30
24 septembre 2007 à 17:42:32

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)

Okami83
Okami83
Niveau 6
24 septembre 2007 à 17:47:05

donc D-0>10^-5? poutant sa marche toujours pas

Fvirtman
Fvirtman
Niveau 10
24 septembre 2007 à 21:39:12

tu testes abs(nombre)<0.00001 par exemple :)

Okami83
Okami83
Niveau 6
24 septembre 2007 à 22:15:16

merci fvirtman mais j´ai pas compris ce que signifé abs

Fvirtman
Fvirtman
Niveau 10
24 septembre 2007 à 23:03:25

valeur absolue :)

Soit tu utilises math.h, soit une macro :

  1. define ABS(X) (((X)<0)?(-X):(X))

if (ABS(nombre)<0.00001) ....

dnob700
dnob700
Niveau 10
25 septembre 2007 à 16:29:19

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.

Okami83
Okami83
Niveau 6
25 septembre 2007 à 18:33:16

Pourtant il faut quand même que si D<0 il y est les solutions imaginaires...

deepblue
deepblue
Niveau 16
25 septembre 2007 à 21:00:16

"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

Okami83
Okami83
Niveau 6
25 septembre 2007 à 21:56:03

Ben on ne compte pas les solutions de la forme Z=re+ img*i

saleGauss
saleGauss
Niveau 9
25 septembre 2007 à 22:26:44

La question est dans quoi résout tu ton équation ? Dans R ? Dans C ?

Okami83
Okami83
Niveau 6
25 septembre 2007 à 22:28:16

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);
}

deepblue
deepblue
Niveau 16
25 septembre 2007 à 22:43:20

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));
?>

dnob700
dnob700
Niveau 10
25 septembre 2007 à 23:37:34

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.

Okami83
Okami83
Niveau 6
26 septembre 2007 à 18:20:02

alors j´ai essayé avec ce programme

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <math.h>

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

dnob700
dnob700
Niveau 10
26 septembre 2007 à 22:51:24

"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.

Okami83
Okami83
Niveau 6
27 septembre 2007 à 18:44:59

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é

dnob700
dnob700
Niveau 10
27 septembre 2007 à 19:09:46

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.

Okami83
Okami83
Niveau 6
27 septembre 2007 à 19:31:08

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....

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <math.h>

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;
}

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment