gillig
Messages postés32Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 4 décembre 2003 27 oct. 2003 à 16:49
- pour les solutions complexes : effectivement, j'ai oublié de préciser qu'il faut inverser delta pour pouvoir calculer la racine carrée.
- je maintiens qu'il manque un signe = dans "while(z=1);"
D'ailleurs, avec "while(z==1)", la ligne "if (z==2) break;" devient inutile.
- optimisations possibles :
la variable Acarre est inutile (déclarée, affectée, mais pas utilisée)
la variable Bcarre n'est utilisée qu'une fois, donc elle n'est pas indispensable
les nouveaux calculs pour x0 x1 et x2 sont bien pratiques ; juste, on peut écrire x2 = -x1, voire carrément ne pas utiliser de variable x2 (du coup, la variable rcarre devient inutile à son tour, puisque utilisée une seule fois également)
Par ailleurs, il faudrait tester les valeurs de A B et C; si par exemple A=0, il s'agit d'une équation du 1er degré, il faut éviter de calculer x1 (division par 0)
Bref, en utilisant cin et cout et quelques autres petites modifs, je propose :
#include
#include <math.h>
int main(int argc, char* argv[])
{
int z;
do
{
cout << "****************************************" << endl;
cout << "** Discriminant pour IR, ** By ReYvaX **" << endl;
cout << "****************************************" << endl << endl;
double A, B, C;
cout << " Entrez la valeur de A : ";
cin >> A;
cout << " Entrez la valeur de B : ";
cin >> B;
cout << " Entrez la valeur de C : ";
cin >> C;
cout << " L'equation est donc : ";
cout << A << " x^2 + " << B << "x + " << C << " = 0" << endl;
if (A == 0.f)
{
if (B == 0.f)
if (C == 0.f)
cout << " 0 = 0 ! Tout x de R est solution !" << endl;
else
cout << C << " = 0 ! Pas de solution !" << endl;
else
cout << " Equation du 1er degre !" << endl << " x = " << -C/B << endl;
}
else
{
double delta = B*B - 4*A*C;
cout << " Delta a pour valeur " << delta << endl;
double x0 = -B / (2*A);
if (delta > 0) // 1,2,-2 S=-3 et 1
{
double x1 = sqrt(delta) / (2*A);
cout << " Il y a deux solutions car delta est positif, X1 " << x1+x0 << " et X2 " << x0-x1 << endl;
}
else if (delta == 0) // 1.2.1 S=- 1
cout << " Il y'a qu'une solution car delta est nul, X0 a donc pour valeur " << x0 << endl;
else // delta < 0 2.2.2 S=.
{
double x1 = sqrt(-delta) / (2*A);
if (x1 < 0) x1 = -x1; // on pose x1 solution positive pour éviter pbs de signe à l'affichage
cout << " Il y a deux solutions complexes conjuguees car delta est negatif" << endl;
cout << " X1 = " << x0 << " + " << x1 << "i" << endl;
cout << " X2 = " << x0 << " - " << x1 << "i" << endl;
}
}
cout << " Voulez vous recommencer? oui 1 / non 2 " << endl;
cin >> z;
} while (z == 1);
supair_hobbit
Messages postés1Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention23 octobre 2003 23 oct. 2003 à 21:57
salut :o)
gillig t'es sur pour les complexes parce que rcarre c'est une racine d'un nombre négatif et je ne suis pas sur que cela marche.
en tout cas sinon le code suivant fonctionne :
printf("
L'equation est donc:
");
printf("
%lf x^2 + %lfx + %lf
a",A,B,C);
printf ("
Delta a donc pour valeur %lf
", delta);
if(delta > 0) // 1,2,-2 S=-3 et 1 //
printf(" Il y'a deux solutions car delta est positif, X1 %lf et X2 %lf
", x1+x0, x2+x0);
if(delta == 0) // 1.2.1 S=- 1
printf("
Il y'a qu'une solution car delta est nul, X0 a donc pour valeur %lf
", x0);
if(delta < 0) // 2.2.2 S=.
printf(" Il y a deux solutions complexes conjuguées car delta est negatif, X1 %lf+%lfi et X2 %lf+%lfi
", x0, x1, x0, x2);
gillig
Messages postés32Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 4 décembre 2003 23 oct. 2003 à 16:20
* Petit bug : while(z==1); (test) et non while(z=1); (affectation)
* Petites optimisations possibles :
- Acarre ne sert à rien
- rcarre = sqrt(delta), pas la peine de recalculer b²-4ac
- x0 ne sert à rien : si delta=0, x0 = x1 = x2
* Pour les complexes, c'est tout simple : les solutions sont (-b +- i * rcarre) / (2a), ou (-b/2a) +- i * (rcarre/2a)
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 22 oct. 2003 à 19:03
pourquoi tu utilise les e/s standard printf et scanf avec cout?
yen a qui diront que c chipoter, d'autres que c un affront de melanger c et c++, moi g dit que c une mauvaise habitude car c un coup a avoir des affichage vide et des saisie erroner car ca pe parasiter les tampon
sinon t pas obliger de foutre des parantheses ds les cout
MoDDiB
Messages postés546Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention 4 mai 20071 22 oct. 2003 à 17:02
Tu as % qui te donne le reste d'une division .
Donc s'il est != 0 alors ca tombe pas juste Donc a partir de la...
ex a = 7%5 ;
a vaut 2;
ensuite Discriminant Ax²+B+C=0
je crois que c'est
Discriminant Ax²+Bx+C=0 que tu voulais car sinon b et c ne font q'un ^^
sinon j'ai pas tout vérifié mais ca me paré pas mal pour un 1er prog !!
27 oct. 2003 à 16:49
- je maintiens qu'il manque un signe = dans "while(z=1);"
D'ailleurs, avec "while(z==1)", la ligne "if (z==2) break;" devient inutile.
- optimisations possibles :
la variable Acarre est inutile (déclarée, affectée, mais pas utilisée)
la variable Bcarre n'est utilisée qu'une fois, donc elle n'est pas indispensable
les nouveaux calculs pour x0 x1 et x2 sont bien pratiques ; juste, on peut écrire x2 = -x1, voire carrément ne pas utiliser de variable x2 (du coup, la variable rcarre devient inutile à son tour, puisque utilisée une seule fois également)
Par ailleurs, il faudrait tester les valeurs de A B et C; si par exemple A=0, il s'agit d'une équation du 1er degré, il faut éviter de calculer x1 (division par 0)
Bref, en utilisant cin et cout et quelques autres petites modifs, je propose :
#include
#include <math.h>
int main(int argc, char* argv[])
{
int z;
do
{
cout << "****************************************" << endl;
cout << "** Discriminant pour IR, ** By ReYvaX **" << endl;
cout << "****************************************" << endl << endl;
double A, B, C;
cout << " Entrez la valeur de A : ";
cin >> A;
cout << " Entrez la valeur de B : ";
cin >> B;
cout << " Entrez la valeur de C : ";
cin >> C;
cout << " L'equation est donc : ";
cout << A << " x^2 + " << B << "x + " << C << " = 0" << endl;
if (A == 0.f)
{
if (B == 0.f)
if (C == 0.f)
cout << " 0 = 0 ! Tout x de R est solution !" << endl;
else
cout << C << " = 0 ! Pas de solution !" << endl;
else
cout << " Equation du 1er degre !" << endl << " x = " << -C/B << endl;
}
else
{
double delta = B*B - 4*A*C;
cout << " Delta a pour valeur " << delta << endl;
double x0 = -B / (2*A);
if (delta > 0) // 1,2,-2 S=-3 et 1
{
double x1 = sqrt(delta) / (2*A);
cout << " Il y a deux solutions car delta est positif, X1 " << x1+x0 << " et X2 " << x0-x1 << endl;
}
else if (delta == 0) // 1.2.1 S=- 1
cout << " Il y'a qu'une solution car delta est nul, X0 a donc pour valeur " << x0 << endl;
else // delta < 0 2.2.2 S=.
{
double x1 = sqrt(-delta) / (2*A);
if (x1 < 0) x1 = -x1; // on pose x1 solution positive pour éviter pbs de signe à l'affichage
cout << " Il y a deux solutions complexes conjuguees car delta est negatif" << endl;
cout << " X1 = " << x0 << " + " << x1 << "i" << endl;
cout << " X2 = " << x0 << " - " << x1 << "i" << endl;
}
}
cout << " Voulez vous recommencer? oui 1 / non 2 " << endl;
cin >> z;
} while (z == 1);
cout << "****************************************" << endl;
cout << " <13/10/03> * ~~~~~~~~~~~~~ ***" << endl;
cout << "...................* ~ By ReyVaX ~ ***" << endl;
cout << " Discriminant * ~~~~~~~~~~~~~ ***" << endl;
cout << "****************************************" << endl << endl;
return 0;
}
23 oct. 2003 à 21:57
gillig t'es sur pour les complexes parce que rcarre c'est une racine d'un nombre négatif et je ne suis pas sur que cela marche.
en tout cas sinon le code suivant fonctionne :
#include <stdio.h>
#include
#include <stdlib.h>
#include <math.h>
/* By reyvax
Discriminant Ax²+B+C=0 */
double main(double argc, char *argv[])
{
double A, B, C, x0, x1, x2, delta, Acarre, Bcarre,rcarre;
char x, debut , oui ;
int z;
do
{
cout << ("**************************************** ") << endl ;
cout << ("** Discriminant pour IR, ** By ReYvaX **") << endl ;
cout << ("****************************************") << endl ;
cout << (" ") << endl;
printf("
Entrez la valeur de A
");
scanf("%lf", &A);
printf ("
Entrez la valeur de B
");
scanf("%lf", &B);
printf("
Entrez la valeur de C
");
scanf("%lf", &C);
Acarre = pow(A,2); //declaration du carré
Bcarre = pow(B,2);
delta = (Bcarre-4*A*C); //calcul de delta
if (delta >= 0) {
rcarre = sqrt(delta); //racine carre de delta
}
else {
rcarre = sqrt(-delta);
}
x0 =(-B/2*A);
x1= ( - rcarre / 2*A);
x2= ( rcarre / 2*A);
printf("
L'equation est donc:
");
printf("
%lf x^2 + %lfx + %lf
a",A,B,C);
printf ("
Delta a donc pour valeur %lf
", delta);
if(delta > 0) // 1,2,-2 S=-3 et 1 //
printf(" Il y'a deux solutions car delta est positif, X1 %lf et X2 %lf
", x1+x0, x2+x0);
if(delta == 0) // 1.2.1 S=- 1
printf("
Il y'a qu'une solution car delta est nul, X0 a donc pour valeur %lf
", x0);
if(delta < 0) // 2.2.2 S=.
printf(" Il y a deux solutions complexes conjuguées car delta est negatif, X1 %lf+%lfi et X2 %lf+%lfi
", x0, x1, x0, x2);
cout << ("
Voulez vous recommencer? oui 1 /non 2
") << endl;
scanf("%i", &z);
cout << ("****************************************") << endl ;
cout << (" <13/10/03> * ~~~~~~~~~~~~~ ***") << endl ;
cout << ("...................* ~ By ReyVaX ~ ***") << endl ;
cout << (" Discriminant * ~~~~~~~~~~~~~ ***") << endl ;
cout << ("****************************************") << endl ;
cout << (" ") << endl ;
if (z==2)
{
break;
}
}while(z=1);
return 0;
}
23 oct. 2003 à 16:20
* Petites optimisations possibles :
- Acarre ne sert à rien
- rcarre = sqrt(delta), pas la peine de recalculer b²-4ac
- x0 ne sert à rien : si delta=0, x0 = x1 = x2
* Pour les complexes, c'est tout simple : les solutions sont (-b +- i * rcarre) / (2a), ou (-b/2a) +- i * (rcarre/2a)
22 oct. 2003 à 19:03
yen a qui diront que c chipoter, d'autres que c un affront de melanger c et c++, moi g dit que c une mauvaise habitude car c un coup a avoir des affichage vide et des saisie erroner car ca pe parasiter les tampon
sinon t pas obliger de foutre des parantheses ds les cout
22 oct. 2003 à 17:02
Donc s'il est != 0 alors ca tombe pas juste Donc a partir de la...
ex a = 7%5 ;
a vaut 2;
ensuite Discriminant Ax²+B+C=0
je crois que c'est
Discriminant Ax²+Bx+C=0 que tu voulais car sinon b et c ne font q'un ^^
sinon j'ai pas tout vérifié mais ca me paré pas mal pour un 1er prog !!