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
| #include <stdio.h>
#include <math.h>
#ifdef _DEBUG
unsigned dec_dbg(long n, int indent);
#define dec(x) dec_dbg((x), 0)
#else
unsigned dec(long n);
#endif
/* Fonction ajoutée pour purger convenablement stdin.
Cette fonction purge la ligne courante de stdin
et s'arrête aussi si on tombe sur EOF.
Elle peut aussi être utilisée pour attendre un appui sur ENTREE. */
void PurgeStream(FILE *pfIn)
{
int c;
while((c=fgetc(pfIn)) != '\n' && c != EOF)
{}
}
/* Prototype de main() invalide. main() retourne TOUJOURS un int. */
int main(void)
{
long n;
int res;
printf("donner votre chiffre:");
/* fflush() est nécessaire si printf() ne se termine pas par \n. */
fflush(stdout);
/* Le retour de scanf() doit être vérifié, et il faut purger stdin après. */
res = scanf("%ld",&n);
PurgeStream(stdin);
if(res == 1)
{
/* dec() retourne un unsigned int, donc %d suffit.
\n Ajouté. */
printf("%d\n", dec(n));
}
else
puts("Mauvais chiffre!");
/* getch() n'est pas portable et inutile ici.
On va juste demander de presser ENTREE. */
printf("Presser [Entree] pour quitter:");
fflush(stdout);
PurgeStream(stdin);
/* main() retourne toujours un int. */
return 0;
}
/* Fonction de débogage */
#ifdef _DEBUG
#undef dec
#define dec(x) dec_dbg(x, int indent)
#endif
//definition de la focntion NB9
unsigned dec(long n)
{
#ifdef _DEBUG
#undef dec
#define dec(x) dec_dbg((x), indent+1)
#endif
static const long dix9 = 1000000000;
static const long dix6 = 1000000;
static const long dix3 = 1000;
static const long dix2 = 100;
#ifdef _DEBUG
{
int i;
for(i=0 ; i<indent ; i++)
putchar(' ');
printf("dec(%ld)\n", n);
}
#endif
if(n >= dix9)
return dec(n/dix9) * dix9 + dec(n%dix9);
else if(n >= dix6)
return dec(n/dix6) * dix6 + dec(n%dix6);
else if(n >= dix3)
return dec(n/dix3) * dix3 + dec(n%dix3);
else if(n >= dix2)
return dec(n/dix2) * dix2 + dec(n%dix2);
else if(n >= 60)
return dec(n/20) * 20 + dec(n%20);
else if (n >= 10)
return dec(n/10) * 10 + dec(n%10);
else
{
/* Puisqu'on retourne un unsigned,
autant montrer explicitement la conversion,
surtout qu'on passe de long à int. */
return (unsigned int)n;
}
} |
Partager