1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
#include <stdio.h>
#include <math.h> /* pour la racine ==> sqrt(); */
#include <string.h>
#include <errno.h>
#include <stdlib.h>
/* saisie d'une ligne (chaine de caracteres) */
int get_s (char *const s, size_t const size)
{
/* lecture d'une ligne */
int err = fgets (s, size, stdin) == NULL;
if (!err)
{
/* si il n'y a pas eu d'erreur de lecture
* recherche du '\n'' final
*/
char *p = strchr (s, '\n');
if (p != NULL)
{
/* Si on l'a trouve, destruction */
*p = 0;
}
else
{
/* sinon, c'est que la chaine de destination est trop courte.
* lecture de tous les caracteres non lus (nettoyage de stdin)
*/
int c;
while ((c = getchar ()) != '\n' && c != EOF)
{
}
err = 1; /* ligne incomplete */
}
}
return err;
}
/* saisie d'un flottant */
int get_d (double *const p)
{
int err;
if (p != NULL)
{
/* Si on a bien passe un pointeur non NULL */
char s[64];
/* lecture d'une ligne */
err = get_s (s, sizeof s);
/*
* L'etat de la globale 'C' errno est incertain.
* On le force a 0 (= pas d'erreur).
* En effet au demarrage du programme, errno est initialisee a 0,
* mais aucune fonction standard ne positionne errno a 0, alors
* que beaucoup d'entre elles, (y compris des fonctions
* non-standard ou applicatives) peuvent le modifier a une autre valeur.
*/
errno = 0;
if (*s != 0)
{
/* Si la chaine saisie n'est pas vide ("") */
/* ce pointeur sera mis a jour par strtod().
* Il indiquera la position du premier caractere non converti
*/
char *p_end;
/* Conversion de la chaine en double */
double x = strtod (s, &p_end);
/* On verifie que tout c'est bien passe :
* - p_end pointe bien sur 0, c'est a dire la fin de la chaine
* - errno n'indique pas d'erreur
*/
if (*p_end == 0 && errno == 0)
{
/* on retourne la valeur a l'appelant */
*p = x;
}
else
{
err = 1; /* erreur de conversion */
}
}
else
{
err = 1; /* chaine vide */
}
}
return err;
}
int saisie (double *const pa, double *const pb, double *const pc)
{
int err;
printf ("ENTRER A:");
err = get_d (pa);
if (!err)
{
printf ("ENTRER B:");
err = get_d (pb);
if (!err)
{
printf ("ENTRER C:");
if (!err)
{
err = get_d (pc);
}
}
}
return err;
}
void calcul (double const a, double const b, double const c)
{
double delta = ((b * b) - (4 * a * c));
printf ("delta=%f\n", delta);
if (delta < 0)
{
printf ("il n'y a pas de solution Reelle\n");
}
else if (delta == 0)
{
printf ("X=%f\n", (-b) / (2 * a));
}
else
{
printf ("X1=%f\n"
"X2=%f\n"
,((-b) - (sqrt (delta))) / (2 * a)
,((-b) + (sqrt (delta))) / (2 * a)
);
}
}
int main (void)
{
double a, b, c;
int err = saisie (&a, &b, &c);
if (!err)
{
calcul (a, b, c);
}
return 0;
} |
Partager