/*************************************************************************
Résolution simplifiée d'une équation du second degré ax^2 + bx + c = 0
**************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h> // contient la déclaration de sqrt
#define EPS 1e-10 // constante "très petite" pour la comparaison de delta avec 0.
// Déclaration des fonctions utilisées (« prototypes » = mode d’emploi)
double calculer_delta(double a, double b, double c);
int calculer_nb_solutions(double delta);
void calculer_afficher_solutions(double a, double b, double c, int nb_sol, double delta);
// Programme principal : fonction main
int main(int argc, char **argv) {
// variables locales
double a, b, c; // coefficients réels de l’équation
double delta;
int nb_sol_reelles;
if (argc >= 4) {
// les coefficients ont été passé en argument du programme
a = atof(argv[1]);
b = atof(argv[2]);
c = atof(argv[3]);
printf("a = %lf\nb = %lf\nc = %lf\n", a, b, c);
} else {
// les coefficients sont saisis par l'utilisateur au clavier
printf("a = ");
scanf("%lf", &a);
printf("b = ");
scanf("%lf", &b);
printf("c = ");
scanf("%lf", &c);
}
printf("\n"); // afficher une ligne vide de séparation
delta = calculer_delta(a, b, c) ;
nb_sol_reelles = calculer_nb_solutions(delta) ;
calculer_afficher_solutions(a, b, c, nb_sol_reelles, delta);
}
// Calcule le discriminant
double calculer_delta(double a, double b, double c) {
return b * b - 4. * a * c ;
}
// Calcule le nombre de solutions réelles de l'équation en fonction du discriminant
int calculer_nb_solutions(double d) {
int nb_sol ;
if (d > EPS) {
// 2 solutions réelles
nb_sol = 2;
} else if (d < -EPS) {
// pas de soluion réelle
nb_sol = 0;
} else {
// une solution réelle double
nb_sol = 1;
}
return nb_sol ;
}
// Affiche les solutions réelles de l'équation
void calculer_afficher_solutions(double a, double b, double c, int nb_sol, double delta) {
double rac, x1, x2; // variables locales
switch (nb_sol) {
// comportement différent en fonction du nombre de solutions
case 0 :
printf("Pas de racines reelles.\n") ;
break ;
case 1 :
printf("Une racine double : %lf\n", -b / (2. * a)) ;
break ;
case 2 :
rac = sqrt(delta);
x1 = (-b + rac) / (2. * a);
x2 = (-b - rac) / (2. * a);
printf("Deux racines réelles :\n");
printf(" x1 = %lf\n", x1);
printf(" x2 = %lf\n", x2);
break ;
}
}