Convertisseur de nombre en lettres, en Espagnol
Ce petit programme s'exécute en ligne de commande pour donner, pour un chiffre et un genre, sa correspondance en toutes lettres, en Espagnol.
#include <stdio.h> #include <string.h> #include <values.h> #include <math.h> #define FALSE 0 #define TRUE 1 static char Unite[2][10][30]={{"CERO", "UNA", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE"}, {"CERO", "UNO", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE"}}; static char Dizaine[10][30]={"", "DIEZ", "VEINTE", "TREINTA", "CUARANTA", "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA", "NOVENTA"}; static char Centaine[2][10][30]={{"", "CIENTO", "DOSCIENTAS", "TRESCIENTAS", "CUATROCIENTAS", "QUINIENTAS", "SEISCIENTAS", "SETECIENTAS", "OCHOCIENTAS", "NOVECIENTAS"}, {"", "CIENTO", "DOSCIENTOS", "TRESCIENTOS", "CUATROCIENTOS", "QUINIENTOS", "SEISCIENTOS", "SETECIENTOS", "OCHOCIENTOS", "NOVECIENTOS"}}; static char Derive_Dix[10][30]={"DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIEZ Y SEIS", "DIEZ Y SEITE", "DIEZ Y OCHO", "DIEZ Y NUEVE"}; static char Vingtaine[2][10][30]={{"VEINTE", "VEINTIUNA", "VEINTIDOS", "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", "VEINTISIETE", "VEINTIOCHO", "VEINTINUEVE"}, {"VEINTE", "VEINTIUN", "VEINTIDOS", "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", "VEINTISIETE", "VEINTIOCHO", "VEINTINUEVE"}}; int CentToChar (char* Chiffre_A_Traduire, int Genre, char* Resultat, char* Quantite_Singulier, char* Quantite_Pluriel, int Cent_Raccourci, int Un_Necessaire, int Un_Raccourci) { int Position; char Chiffre1, Chiffre2, Chiffre3; Position = strlen (Resultat); Chiffre1=Chiffre_A_Traduire[0]; // Cas particulier de 100 raccourci ? if ((strcmp(Chiffre_A_Traduire, "100") == 0) && Cent_Raccourci) { Position += sprintf (Resultat+Position, " CIEN"); } else if (Chiffre1 != '0') { Position += sprintf (Resultat+Position, " %s", Centaine[Genre][Chiffre1-'0']); } // dizaine et unité Chiffre2=Chiffre_A_Traduire[1]; Chiffre3=Chiffre_A_Traduire[2]; switch (Chiffre2) { case '0' : if ((Chiffre1 =='0') && (Chiffre3 == '1')) { if (strlen(Quantite_Singulier) == 0) { Position += sprintf (Resultat+Position, " %s", Unite[Genre][Chiffre3-'0']); } else { if (Un_Necessaire) { Position += sprintf (Resultat+Position, " UN %s", Quantite_Singulier); } else { Position += sprintf (Resultat+Position, " %s", Quantite_Singulier); } } } else if (Chiffre3 != '0') { Position += sprintf (Resultat+Position, " %s %s", Unite[Genre][Chiffre3-'0'], Quantite_Pluriel); } else if (Chiffre1 != '0') { Position += sprintf (Resultat+Position, " %s", Quantite_Pluriel); } break; case '1' : Position += sprintf (Resultat+Position, " %s %s", Derive_Dix[Chiffre3-'0'], Quantite_Pluriel); break; case '2' : if ((Chiffre3 == '1') && (Un_Raccourci)) { Position += sprintf (Resultat+Position, " VEINTIUN %s", Quantite_Pluriel); } else { Position += sprintf (Resultat+Position, " %s %s", Vingtaine[Genre][Chiffre3-'0'], Quantite_Pluriel); } break; default : if (Chiffre3 != '0') { if (((Genre == 1) || (Un_Raccourci)) && (Chiffre3 == '1')) { Position += sprintf (Resultat+Position, " %s Y UN %s", Dizaine[Chiffre2-'0'], Quantite_Pluriel); } else { Position += sprintf (Resultat+Position, " %s Y %s %s", Dizaine[Chiffre2-'0'], Unite[Genre][Chiffre3-'0'], Quantite_Pluriel); } } else { Position += sprintf (Resultat+Position, " %s %s", Dizaine[Chiffre2-'0'], Quantite_Pluriel); } } return 0; } int NumToChar (char* Chiffre_A_Traduire, int Genre, char* Resultat) { char Chiffre_Complet[20]; int Position; char Cent[4]; int i; for (i = 0; i < 12-strlen(Chiffre_A_Traduire); i++) { Chiffre_Complet[i] = '0'; } Chiffre_Complet[12-strlen(Chiffre_A_Traduire)] = 0; strcat (Chiffre_Complet+12-strlen(Chiffre_A_Traduire), Chiffre_A_Traduire); Resultat [0]=0; Position = 0; // Centaine de milliard sprintf (Cent, "%.3s", Chiffre_Complet); CentToChar (Cent, Genre, Resultat+Position, "MIL", "MIL", TRUE, FALSE, TRUE); Position = strlen(Resultat); // Centaine de million sprintf (Cent, "%.3s", Chiffre_Complet+3); if (strcmp(Cent, "000") != 0) { CentToChar (Cent, Genre, Resultat+Position, "MILLON", "MILLONES", TRUE, TRUE, TRUE); } else { // Pour les milliards if (Position > 0) { strcat(Resultat, "MILLONES"); } } Position = strlen(Resultat); // Centaine de millier sprintf (Cent, "%.3s", Chiffre_Complet+6); CentToChar (Cent, Genre, Resultat+Position, "MIL", "MIL", TRUE, FALSE, FALSE); Position = strlen(Resultat); // Centaine sprintf (Cent, "%.3s", Chiffre_Complet+9); CentToChar (Cent, Genre, Resultat+Position, "", "", TRUE, FALSE, FALSE); Position = strlen(Resultat); return 0; } void Usage (char* Nom) { printf ("Usage : %s <F|M> <chiffre>\n", Nom); } int main (int argc, char** argv) { char Lettre[255]; int i; int Genre; if (argc != 3) { Usage (argv[0]); return 1; } if (strcmp(argv[1],"F") == 0) { Genre=0; } else if (strcmp(argv[1],"M") == 0) { Genre=1; } else { Usage (argv[0]); return 3; } for (i=0; i< strlen(argv[1]); i++) { if ((argv[2][i] < '0') || (argv[2][i] > '9')) { printf ("Il faut un chiffre!\n"); return 2; } } NumToChar (argv[2], Genre, Lettre); printf ("%s\n", Lettre); return 0; }