Convertisseur de nombres en lettres, en espagnol
Ce petit programme s'exécute en ligne de commande et permet d'obtenir, pour un nombre donné et un genre (masculin ou féminin), 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; }