#include <stdio.h> #include <math.h> #include <ctype.h> main() {/* Déclarations */ char CH[100]; /* chaîne numérique à convertir */ double N; /* résultat numérique */ int I; /* indice courant */ int SIG; /* signe de la valeur rationnelle */ int DEC; /* nombre de décimales */ int SIGE; /* signe de l'exposant */ int EXP; /* valeur de l'exposant */ int OK; /* indicateur logique précisant si la */ /* chaîne a été convertie avec succès */ /* Saisie de la chaîne */ printf("Entrez un nombre rationnel : "); gets(CH); /* Conversion de la chaîne */ /* Initialisation des variables */ OK=1; N=0.0; I=0; SIG=1; SIGE=1; /* Traitement du signe */ if (CH[I]=='-') SIG=-1; if (CH[I]=='-' || CH[I]=='+') I++; /* Positions devant le point décimal */ for ( ; isdigit(CH[I]); I++) N = N*10.0 + (CH[I]-'0'); /* Traitement du point décimal */ if (CH[I]=='.') I++; /* Traitement et comptage des décimales */ for (DEC=0; isdigit(CH[I]); I++, DEC++) N = N*10.0 + (CH[I]-'0'); /* Traitement de la marque exponentielle */ if (CH[I]=='e'||CH[I]=='E') I++; else if (CH[I]) OK=0; /* Traitement du signe de l'exposant */ if (CH[I]=='-') SIGE=-1; if (CH[I]=='-' || CH[I]=='+') I++; /* Traitement de la valeur de l'exposant */ for (EXP=0; isdigit(CH[I]); I++) EXP = EXP*10 + (CH[I]-'0'); if (CH[I]) OK=0; /* Calcul de l'exposant à partir du signe */ /* SIGE, de la valeur de l'exposant EXP et */ /* du nombre de positions rationnelles DEC */ EXP = SIGE*EXP - DEC; /* Calcul de la valeur à partir du signe et */ /* de l'exposant. */ N = SIG*N*pow(10,EXP); /* Affichage de la chaîne convertie */ if (OK) printf("Valeur numérique : %f\n", N); else printf("\a\"%s\" n'est pas une valeur " "rationnelle correcte.\n", CH); return 0; }